int geDrawingMode(int mode){ int last = libge_context->drawing_mode; if(mode != libge_context->drawing_mode || mode & 0xF0000000){ if(mode & GE_DRAWING_MODE_2D){ glActiveTexture(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); glDisable(GL_CULL_FACE); glEnable(GL_ALPHA_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); geMatrixMode(GE_MATRIX_PROJECTION); geLoadIdentity(); geOrthogonal(0.0, libge_context->width, libge_context->height, 0.0, -2049.0, 2049.0); geMatrixMode(GE_MATRIX_VIEW); geLoadIdentity(); geMatrixMode(GE_MATRIX_MODEL); geLoadIdentity(); geMatrixMode(GE_MATRIX_MODELVIEW); geLoadIdentity(); geMatrixMode(GE_MATRIX_TEXTURE0); geLoadIdentity(); geUpdateMatrix(); if(mode & GE_DRAWING_2D_DEPTH){ glEnable(GL_DEPTH_TEST); geClearMode(GE_CLEAR_COLOR_BUFFER | GE_CLEAR_DEPTH_BUFFER); }else{ glDisable(GL_DEPTH_TEST); geClearMode(GE_CLEAR_COLOR_BUFFER); } geShaderUse(_ge_GetVideoContext()->shader2d); glActiveTexture(GL_TEXTURE0); } if(mode & GE_DRAWING_MODE_3D){ glEnable(GL_CULL_FACE); glFrontFace(GL_CW); glEnable(GL_DEPTH_TEST); geClearMode(GE_CLEAR_COLOR_BUFFER | GE_CLEAR_DEPTH_BUFFER); geMatrixMode(GE_MATRIX_PROJECTION); geLoadIdentity(); if(libge_context->projection_matrix[0] == (float)0xFFFFFFFF){ gePerspective(60.0, (float)libge_context->width / (float)libge_context->height, 0.1, 100000.0); }else{ geLoadMatrix(libge_context->projection_matrix); } } } libge_context->drawing_mode = mode; return last; }
static int clearMode(lua_State *L){ int argc = lua_gettop(L); if(argc != 1) return luaL_error(L, "Argument error: screen.ClearMode(mode) takes one argument."); geClearMode(luaL_checkint(L, 1)); return 0; }