145 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //-----------------------------------------------------------------------------
 | |
| // Torque Game Engine
 | |
| // Copyright (C) GarageGames.com, Inc.
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| #include "math/mMatrix.h"
 | |
| #include "dgl/dgl.h"
 | |
| #include "console/console.h"
 | |
| 
 | |
| void dglLoadMatrix(const MatrixF *m)
 | |
| {
 | |
|    //F32 mat[16];
 | |
|    //m->transposeTo(mat);
 | |
|    const_cast<MatrixF*>(m)->transpose();
 | |
|    glLoadMatrixf(*m);
 | |
|    const_cast<MatrixF*>(m)->transpose();
 | |
| }
 | |
| 
 | |
| void dglMultMatrix(const MatrixF *m)
 | |
| {
 | |
|    //F32 mat[16];
 | |
|    //m->transposeTo(mat);
 | |
| //   const F32* mp = *m;
 | |
| //   Con::errorf(ConsoleLogEntry::General, "Mult: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g",
 | |
| //      mp[0],
 | |
| //      mp[1],
 | |
| //      mp[2],
 | |
| //      mp[3],
 | |
| //      mp[4],
 | |
| //      mp[5],
 | |
| //      mp[6],
 | |
| //      mp[7],
 | |
| //      mp[8],
 | |
| //      mp[9],
 | |
| //      mp[10],
 | |
| //      mp[11],
 | |
| //      mp[12],
 | |
| //      mp[13],
 | |
| //      mp[14],
 | |
| //      mp[15]);
 | |
| 
 | |
| 
 | |
|    const_cast<MatrixF*>(m)->transpose();
 | |
|    glMultMatrixf(*m);
 | |
|    const_cast<MatrixF*>(m)->transpose();
 | |
| }
 | |
| 
 | |
| void dglGetModelview(MatrixF *m)
 | |
| {
 | |
|    glGetFloatv(GL_MODELVIEW_MATRIX, *m);
 | |
|    m->transpose();
 | |
| }
 | |
| 
 | |
| void dglGetProjection(MatrixF *m)
 | |
| {
 | |
|    glGetFloatv(GL_PROJECTION_MATRIX, *m);
 | |
|    m->transpose();
 | |
| }
 | |
| 
 | |
| static F64 frustLeft = 0, frustRight = 1, frustBottom, frustTop, frustNear, frustFar;
 | |
| static RectI viewPort;
 | |
| static F32 pixelScale;
 | |
| static F32 worldToScreenScale;
 | |
| static bool isOrtho;
 | |
| 
 | |
| void dglSetFrustum(F64 left, F64 right, F64 bottom, F64 top, F64 nearPlane, F64 farPlane, bool ortho)
 | |
| {
 | |
|    // this converts from a coord system looking down the pos-y axis
 | |
|    // to ogl's down neg z axis.
 | |
|    // it's stored in OGL matrix form
 | |
|    static F32 darkToOGLCoord[16] = { 1, 0,  0, 0,
 | |
|                                      0, 0, -1, 0,
 | |
|                                      0, 1,  0, 0,
 | |
|                                      0, 0,  0, 1 };
 | |
| 
 | |
|    frustLeft = left;
 | |
|    frustRight = right;
 | |
|    frustBottom = bottom;
 | |
|    frustTop = top;
 | |
|    frustNear = nearPlane;
 | |
|    frustFar = farPlane;
 | |
|    isOrtho = ortho;
 | |
|    if (ortho)
 | |
|    {
 | |
|       glOrtho(left, right, bottom, top, nearPlane, farPlane);
 | |
|       worldToScreenScale = viewPort.extent.x / (frustRight - frustLeft);
 | |
|    }
 | |
|    else
 | |
|    {
 | |
|       glFrustum(left, right, bottom, top, nearPlane, farPlane);
 | |
|       worldToScreenScale = (frustNear * viewPort.extent.x) / (frustRight - frustLeft);
 | |
|    }
 | |
|    glMultMatrixf(darkToOGLCoord);
 | |
| }
 | |
| 
 | |
| void dglGetFrustum(F64 *left, F64 *right, F64 *bottom, F64 *top, F64 *nearPlane, F64 *farPlane)
 | |
| {
 | |
|    *left = frustLeft;
 | |
|    *right = frustRight;
 | |
|    *bottom = frustBottom;
 | |
|    *top = frustTop;
 | |
|    *nearPlane = frustNear;
 | |
|    *farPlane = frustFar;
 | |
| }
 | |
| 
 | |
| bool dglIsOrtho()
 | |
| {
 | |
|    return isOrtho;
 | |
| }
 | |
| 
 | |
| void dglSetViewport(const RectI &aViewPort)
 | |
| {
 | |
|    viewPort = aViewPort;
 | |
|    U32 screenHeight = Platform::getWindowSize().y;
 | |
|    //glViewport(viewPort.point.x, viewPort.point.y + viewPort.extent.y,
 | |
|    //           viewPort.extent.x, -viewPort.extent.y);
 | |
| 
 | |
|    glViewport(viewPort.point.x, screenHeight - (viewPort.point.y + viewPort.extent.y),
 | |
|               viewPort.extent.x, viewPort.extent.y);
 | |
|    pixelScale = viewPort.extent.x / 640.0;
 | |
|    worldToScreenScale = (frustNear * viewPort.extent.x) / (frustRight - frustLeft);
 | |
| }
 | |
| 
 | |
| void dglGetViewport(RectI* outViewport)
 | |
| {
 | |
|    AssertFatal(outViewport != NULL, "Error, bad point in GetViewport");
 | |
|    *outViewport = viewPort;
 | |
| }
 | |
| 
 | |
| F32 dglGetPixelScale()
 | |
| {
 | |
|    return pixelScale;
 | |
| }
 | |
| 
 | |
| F32 dglGetWorldToScreenScale()
 | |
| {
 | |
|    return worldToScreenScale;
 | |
| }
 | |
| 
 | |
| F32 dglProjectRadius(F32 dist, F32 radius)
 | |
| {
 | |
|    return (radius / dist) * worldToScreenScale;
 | |
| }
 | |
| 
 | 
