📄 dgl.cc
字号:
}
void dglSetClipRect(const RectI &clipRect)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
U32 screenWidth = Platform::getWindowSize().x;
U32 screenHeight = Platform::getWindowSize().y;
glOrtho(clipRect.point.x, clipRect.point.x + clipRect.extent.x,
clipRect.extent.y, 0,
0, 1);
glTranslatef(0, -clipRect.point.y, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(clipRect.point.x, screenHeight - (clipRect.point.y + clipRect.extent.y),
clipRect.extent.x, clipRect.extent.y);
sgCurrentClipRect = clipRect;
}
const RectI& dglGetClipRect()
{
return sgCurrentClipRect;
}
bool dglPointToScreen( Point3F &point3D, Point3F &screenPoint )
{
GLdouble glMV[16];
GLdouble glPR[16];
GLint glVP[4];
glGetDoublev(GL_PROJECTION_MATRIX, glPR);
glGetDoublev(GL_MODELVIEW_MATRIX, glMV);
RectI viewport;
dglGetViewport(&viewport);
glVP[0] = viewport.point.x;
glVP[1] = viewport.point.y + viewport.extent.y;
glVP[2] = viewport.extent.x;
glVP[3] = -viewport.extent.y;
MatrixF mv;
dglGetModelview(&mv);
MatrixF pr;
dglGetProjection(&pr);
F64 x, y, z;
int result = gluProject( (GLdouble)point3D.x, (GLdouble)point3D.y, (GLdouble)point3D.z, (const F64 *)&glMV, (const F64 *)&glPR, (const GLint *)&glVP, &x, &y, &z );
screenPoint.x = x;
screenPoint.y = y;
screenPoint.z = z;
return (result == GL_TRUE);
}
bool dglIsInCanonicalState()
{
bool ret = true;
// Canonical state:
// BLEND disabled
// TEXTURE_2D disabled on both texture units.
// ActiveTexture set to 0
// LIGHTING off
// winding : clockwise ?
// cullface : disabled
ret &= glIsEnabled(GL_BLEND) == GL_FALSE;
ret &= glIsEnabled(GL_CULL_FACE) == GL_FALSE;
GLint temp;
if (dglDoesSupportARBMultitexture() == true) {
glActiveTextureARB(GL_TEXTURE1_ARB);
ret &= glIsEnabled(GL_TEXTURE_2D) == GL_FALSE;
glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &temp);
ret &= temp == GL_REPLACE;
glActiveTextureARB(GL_TEXTURE0_ARB);
ret &= glIsEnabled(GL_TEXTURE_2D) == GL_FALSE;
glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &temp);
ret &= temp == GL_REPLACE;
glClientActiveTextureARB(GL_TEXTURE1_ARB);
ret &= glIsEnabled(GL_TEXTURE_COORD_ARRAY) == GL_FALSE;
glClientActiveTextureARB(GL_TEXTURE0_ARB);
ret &= glIsEnabled(GL_TEXTURE_COORD_ARRAY) == GL_FALSE;
} else {
ret &= glIsEnabled(GL_TEXTURE_2D) == GL_FALSE;
glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &temp);
ret &= temp == GL_REPLACE;
ret &= glIsEnabled(GL_TEXTURE_COORD_ARRAY) == GL_FALSE;
}
ret &= glIsEnabled(GL_LIGHTING) == GL_FALSE;
ret &= glIsEnabled(GL_COLOR_ARRAY) == GL_FALSE;
ret &= glIsEnabled(GL_VERTEX_ARRAY) == GL_FALSE;
ret &= glIsEnabled(GL_NORMAL_ARRAY) == GL_FALSE;
if (dglDoesSupportFogCoord())
ret &= glIsEnabled(GL_FOG_COORDINATE_ARRAY_EXT) == GL_FALSE;
return ret;
}
void dglSetCanonicalState()
{
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
glBlendFunc(GL_ONE, GL_ZERO);
glDisable(GL_LIGHTING);
if (dglDoesSupportARBMultitexture() == true) {
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
} else {
glDisable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
}
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
if (dglDoesSupportFogCoord())
glDisableClientState(GL_FOG_COORDINATE_ARRAY_EXT);
}
void dglGetTransformState(S32* mvDepth,
S32* pDepth,
S32* t0Depth,
F32* t0Matrix,
S32* t1Depth,
F32* t1Matrix,
S32* vp)
{
glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, (GLint*)mvDepth);
glGetIntegerv(GL_PROJECTION_STACK_DEPTH, (GLint*)pDepth);
glGetIntegerv(GL_TEXTURE_STACK_DEPTH, (GLint*)t0Depth);
glGetFloatv(GL_TEXTURE_MATRIX, t0Matrix);
if (dglDoesSupportARBMultitexture())
{
glActiveTextureARB(GL_TEXTURE1_ARB);
glGetIntegerv(GL_TEXTURE_STACK_DEPTH, (GLint*)t1Depth);
glGetFloatv(GL_TEXTURE_MATRIX, t1Matrix);
glActiveTextureARB(GL_TEXTURE0_ARB);
}
else
{
*t1Depth = 0;
for (U32 i = 0; i < 16; i++)
t1Matrix[i] = 0;
}
RectI v;
dglGetViewport(&v);
vp[0] = v.point.x;
vp[1] = v.point.y;
vp[2] = v.extent.x;
vp[3] = v.extent.y;
}
bool dglCheckState(const S32 mvDepth, const S32 pDepth,
const S32 t0Depth, const F32* t0Matrix,
const S32 t1Depth, const F32* t1Matrix,
const S32* vp)
{
GLint md, pd;
RectI v;
glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &md);
glGetIntegerv(GL_PROJECTION_STACK_DEPTH, &pd);
GLint t0d, t1d;
GLfloat t0m[16], t1m[16];
glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &t0d);
glGetFloatv(GL_TEXTURE_MATRIX, t0m);
if (dglDoesSupportARBMultitexture())
{
glActiveTextureARB(GL_TEXTURE1_ARB);
glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &t1d);
glGetFloatv(GL_TEXTURE_MATRIX, t1m);
glActiveTextureARB(GL_TEXTURE0_ARB);
}
else
{
t1d = 0;
for (U32 i = 0; i < 16; i++)
t1m[i] = 0;
}
dglGetViewport(&v);
return ((md == mvDepth) &&
(pd == pDepth) &&
(t0d == t0Depth) &&
(dMemcmp(t0m, t0Matrix, sizeof(F32) * 16) == 0) &&
(t1d == t1Depth) &&
(dMemcmp(t1m, t1Matrix, sizeof(F32) * 16) == 0) &&
((v.point.x == vp[0]) &&
(v.point.y == vp[1]) &&
(v.extent.x == vp[2]) &&
(v.extent.y == vp[3])));
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- //
// Advanced hardware functionality.
// now owns the global stuff for FSAA, rather than sceneGraph.
// define the globals first. don't bracket them, as it doesn't hurt to have
// them defined always...
S32 gFSAASamples = 1; ///< 1==no FSAA.
#if defined(TORQUE_OS_MAC)
// new FSAA simple-method handling
ConsoleFunctionGroupBegin( MacFSAA, "Mac-specific FSAA control functions.");
//------------------------------------------------------------------------------
ConsoleFunction( setFSAA, void, 2, 2, "setFSAA(int);")
{
argc;
gFSAASamples = dAtoi(argv[1]);
if (gFSAASamples<1)
gFSAASamples = 1;
else if (gFSAASamples>gGLState.maxFSAASamples)
gFSAASamples = gGLState.maxFSAASamples;
dglSetFSAASamples(gFSAASamples);
}
//------------------------------------------------------------------------------
ConsoleFunction( increaseFSAA, void, 1, 1, "increaseFSAA()" )
{
if (gFSAASamples<gGLState.maxFSAASamples)
{
gFSAASamples<<=1;
dglSetFSAASamples(gFSAASamples);
}
}
//------------------------------------------------------------------------------
ConsoleFunction( decreaseFSAA, void, 1, 1, "decreaseFSAA()" )
{
if (gFSAASamples>1)
{
gFSAASamples>>=1;
dglSetFSAASamples(gFSAASamples);
}
}
ConsoleFunctionGroupEnd( MacFSAA );
#endif
//------------------------------------------------------------------------------
ConsoleFunction(png2jpg, S32, 2, 3, "png2jpg(pngName,[quality=0-100])")
{
extern U32 gJpegQuality;
const char * rgbname = NULL;
const char * alphaname = NULL;
const char * basname = NULL;
const char * bmpname = argv[1];
if(argc == 3)
gJpegQuality = dAtoi(argv[2]);
else
gJpegQuality = 90;
bool basOpt = false;
Con::printf("Converting file: %s", argv[1]);
if (!rgbname)
{
char * buf = new char[dStrlen(bmpname)+32];
dStrcpy(buf,bmpname);
char * pos = dStrstr((const char*)buf,".png");
if (!pos)
pos = buf + dStrlen(buf);
dStrcpy(pos,".jpg");
rgbname = buf;
}
if (!alphaname)
{
char * buf = new char[dStrlen(bmpname)+32];
dStrcpy(buf,bmpname);
char * pos = dStrstr((const char*)buf,".png");
if (!pos)
pos = buf + dStrlen(buf);
dStrcpy(pos,".alpha.jpg");
alphaname = buf;
}
GBitmap bmp;
FileStream fs;
if (fs.open(bmpname, FileStream::Read) == false) {
Con::printf("Error: unable to open file: %s for reading\n", bmpname);
return -1;
}
if (bmp.readPNG(fs) == false) {
Con::printf("Error: unable to read %s as a .PNG\n", bmpname);
return -1;
}
fs.close();
if (bmp.getFormat() != GBitmap::RGB &&
bmp.getFormat() != GBitmap::RGBA) {
Con::printf("Error: %s is not a 24 or 32-bit .PNG\n", bmpname);
return false;
}
GBitmap * outRGB = NULL;
GBitmap * outAlpha = NULL;
GBitmap workRGB, workAlpha;
if (bmp.getFormat() == GBitmap::RGB)
outRGB = &bmp;
else
{
S32 w = bmp.getWidth();
S32 h = bmp.getHeight();
workRGB.allocateBitmap(w,h,false,GBitmap::RGB);
workAlpha.allocateBitmap(w,h,false,GBitmap::Alpha);
U8 * rgbBits = workRGB.getWritableBits();
U8 * alphaBits = workAlpha.getWritableBits();
U8 * bmpBits = bmp.getWritableBits();
for (S32 i=0; i<w; i++)
{
for (S32 j=0; j<h; j++)
{
rgbBits[i*3 + j*3*w + 0] = bmpBits[i*4 + j*4*w + 0];
rgbBits[i*3 + j*3*w + 1] = bmpBits[i*4 + j*4*w + 1];
rgbBits[i*3 + j*3*w + 2] = bmpBits[i*4 + j*4*w + 2];
alphaBits[i + j*w] = bmpBits[i*4 + j*4*w + 3];
}
}
Con::printf("texture: width=%i, height=%i\n",w,h);
outRGB = &workRGB;
outAlpha = &workAlpha;
}
if (outRGB)
{
FileStream fws;
if (fws.open(rgbname, FileStream::Write) == false)
{
Con::printf("Error: unable to open file: %s for writing\n", rgbname);
return -1;
}
if (dStrstr(rgbname,".png"))
{
if (outRGB->writePNG(fws) == false)
{
fws.close();
Con::printf("Error: couldn't write RGB as a png\n");
return -1;
}
}
else if (outRGB->writeJPEG(fws) == false)
{
Con::printf("Error: couldn't write RGB as a jpg\n");
return -1;
}
fws.close();
}
if (outAlpha)
{
gJpegQuality = 60;
FileStream fws;
if (fws.open(alphaname, FileStream::Write) == false)
{
Con::printf("Error: unable to open file: %s for writing\n", alphaname);
return -1;
}
if (dStrstr(alphaname,".png"))
{
if (outAlpha->writePNG(fws) == false)
{
fws.close();
Con::printf("Error: couldn't write alpha as a png\n");
return -1;
}
}
else if (outAlpha->writeJPEG(fws) == false)
{
Con::printf("Error: couldn't write alpha as a jpg\n");
return -1;
}
fws.close();
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -