void GraphicEngine::initGL() { // Light init if (game->config->getInt("lighting")) glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glEnable(GL_TEXTURE_2D); setAmbient(MGColor(0.5f, 0.5f, 0.5f, 1.0f)); setClearColor(MGColor(0.0f, 0.0f, 0.0f, 1.0f)); //glPolygonMode(GL_FRONT, GL_LINE); //glPolygonMode(GL_BACK, GL_LINE); glShadeModel (GL_SMOOTH); // ћетод закраски: —√Ћј∆≈Ќџ… glEnable (GL_DEPTH_TEST); // ¬ключаем тест глубины // ¬ Ћ. ј¬“ќћј“»„≈— »… ѕ≈–≈—„≈“ Ќќ–ћјЋ≈… //glEnable (GL_AUTO_NORMAL); glEnable (GL_NORMALIZE); // ¬ Ћ. ќ“—≈„≈Ќ»≈ «јƒЌ»’ √–јЌ≈… glEnable (GL_CULL_FACE); // ¬ключаем отсечение граней glCullFace (GL_BACK); // ”казываем, что отсекать будем задние грани updateScreenSize(); // Init fonts glEnable(GL_BLEND); setBlendFunc(getDefaultBlendFuncS(), getDefaultBlendFuncD()); standart14Normal = FontCache::getInstance()->load("standart_14_normal"); console8Normal = FontCache::getInstance()->load("console_8_normal"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); GLenum err = glGetError (); if (GL_NO_ERROR != err) Log::error("GraphicEngine::initGL(): OpenGL Error: %s", gluErrorString (err)); Log::info("OpenGL initialized"); }
void GraphicEngine::writeText(string text, CVector position, FontStyle style, MGColor color) { glColor4f(color.getR(), color.getG(), color.getB(), color.getA()); switch(style) { case STANDART_14_NORMAL: standart14Normal->Begin(); //standart14Normal->DrawString(text.c_str(), 1.0f, position.x, position.y); standart14Normal->DrawString(text.c_str(), 1.0, position.x, position.y, MGColor(255,128,128,255).getByteComponents(), MGColor(128,255,128,255).getByteComponents()); break; case CONSOLE_8_NORMAL: console8Normal->Begin(); //console8Normal->DrawString(text.c_str(), 1.0f, position.x, position.y); console8Normal->DrawString(text.c_str(), 1.0, position.x, position.y); break; default: Log::error("undefined font style"); } }
MGColor SafeColor(TiXmlElement *pElem, const std::string &sChild, MGColor const &Default = MGColor(0,0,0)) { MGColor uRes = Default; const string &sColor = SafeString(pElem, sChild.c_str()); if (sColor != "") { unsigned color; sscanf_s(sColor.c_str(), "%x", &color); uRes.r = (float)((color>>16) & 0xFF) * 1.f/255.f; uRes.g = (float)((color>> 8) & 0xFF) * 1.f/255.f; uRes.b = (float)((color>> 0) & 0xFF) * 1.f/255.f; }
void GraphicEngine::renderWorld() { glMatrixMode(GL_MODELVIEW); // set modelview matrix glLoadIdentity(); // clear the current matrix // Offsets glTranslatef(masterPositionOffset.x, masterPositionOffset.y, masterPositionOffset.z); glRotatef(masterOrientationOffset.x, 1.0f, 0.0f, 0.0f); glRotatef(masterOrientationOffset.y, 0.0f, 1.0f, 0.0f); glRotatef(masterOrientationOffset.z, 0.0f, 0.0f, 1.0f); gluLookAt(game->camera->position.x, game->camera->position.y, game->camera->position.z, game->camera->lookAt.x + game->camera->position.x, game->camera->lookAt.y + game->camera->position.y, game->camera->lookAt.z + game->camera->position.z, game->camera->up.x, game->camera->up.y, game->camera->up.z); writeDebugText("Camera position: %0.0f %0.0f %0.0f ", game->camera->position.x, game->camera->position.y, game->camera->position.z); //writeDebugText("Camera look: %0.2f %0.2f %0.2f ", game->camera->lookAt.x, game->camera->lookAt.y, game->camera->lookAt.z); static vector<GameObject*> objects_for_drawing; static vector<GOLight*> lights; static vector<GameObject*> opaque_objects; static vector<GameObject*> transparent_objects; static vector<GameObject*> _2d_objects; objects_for_drawing.clear(); lights.clear(); opaque_objects.clear(); transparent_objects.clear(); _2d_objects.clear(); for (unsigned int i = 0; i < game->objects.size(); i++ ) { if (game->objects.at(i)->getNeedDraw()) { objects_for_drawing.push_back(game->objects.at(i)); } } if (Game::instance->drawBBoxes) { if (renderFilter) { renderFilter->debugDraw(); for (unsigned int i = 0; i < objects_for_drawing.size(); i++ ) { GameObject* o = objects_for_drawing.at(i); renderFilter->debugObjectDraw(o); } } else { for (unsigned int i = 0; i < objects_for_drawing.size(); i++ ) { drawBBox(objects_for_drawing.at(i)->getBBox()); } } } for (unsigned int i = 0; i < objects_for_drawing.size(); i++ ) { if (objects_for_drawing.at(i)->type == GO_LIGHT) { lights.push_back((GOLight*)objects_for_drawing.at(i)); } else if (objects_for_drawing.at(i)->is2D) { _2d_objects.push_back(objects_for_drawing.at(i)); } else if (objects_for_drawing.at(i)->opaque) { opaque_objects.push_back(objects_for_drawing.at(i)); } else { transparent_objects.push_back(objects_for_drawing.at(i)); } } if (renderFilter && !Game::instance->editorMode) { opaque_objects = renderFilter->doFilter(opaque_objects); transparent_objects = renderFilter->doFilter(transparent_objects); } game->drawnObjectsCount = opaque_objects.size(); game->drawnObjectsCount += transparent_objects.size(); game->drawnObjectsCount += _2d_objects.size(); sort(transparent_objects.begin(), transparent_objects.end(), sortTransparent); for (unsigned int i = 0; i < lights.size(); i++ ) { lights.at(i)->draw(); } for (unsigned int i = 0; i < opaque_objects.size(); i++ ) { opaque_objects.at(i)->draw(); //writeDebugText("Type: %i, id: %s, z:%f", opaque_objects.at(i)->type, opaque_objects.at(i)->id.c_str(), opaque_objects.at(i)->position.z); } game->transparentObjectsCount = transparent_objects.size(); for (unsigned int i = 0; i < transparent_objects.size(); i++ ) { transparent_objects.at(i)->draw(); //writeDebugText("Type: %i, id: %s, z:%f", transparent_objects.at(i)->type, transparent_objects.at(i)->id.c_str(), (transparent_objects.at(i)->position - game->camera->position).Length()); } if (game->debugPhysDraw) { if (game->debugPhysDrawIn2D) start2D(); game->dynamicsWorld->debugDrawWorld(); if (game->debugPhysDrawIn2D) end2D(); } // Ligt reset for (unsigned int i = 0; i < lights.size(); i++ ) { lights.at(i)->cancel(); } #ifndef OPENGL_ES // for drawibg texts glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); #endif // save previous state of lighting bool lightingEnabled = glIsEnabled(GL_LIGHTING); glDisable(GL_LIGHTING); // Write 2D stuff start2D(); // sort Z sort(_2d_objects.begin(), _2d_objects.end(), sort2D); game->_2dObjectsCount = _2d_objects.size(); for (unsigned int i = 0; i < _2d_objects.size(); i++ ) { _2d_objects.at(i)->draw(); //writeDebugText("Type: %i, id: %s, z:%f", opaque_objects.at(i)->type, opaque_objects.at(i)->id.c_str(), opaque_objects.at(i)->position.z); } // Draw debug texts for (unsigned int i = 0; i < debugStrings.size(); i++ ) { if (game->drawDebugText && !game->console->isOpened()) { std::pair <float, float>* size = new std::pair <float, float>(); standart14Normal->GetStringSize(debugStrings.at(i).c_str(), size); static GOPlate* p = new GOPlate(); p->setPositioningMode(GOPositioningModeTopLeft); p->color = MGColor(0.0f,0.0f,0.0f,0.4f); int h = (int)(size->second * 1.00); p->setSize(CVector(size->first, h)); p->setPosition(CVector(5.0f, game->osAdapter->getScreenHeight() - (h * i))); p->draw(); writeText(debugStrings.at(i), CVector(5.0f, game->osAdapter->getScreenHeight() - (h * i), 0.0f), STANDART_14_NORMAL, MGColor(0.0f, 1.0f, 0.0f, 1.0f)); } } debugStrings.clear(); game->luaVM->doString("_onDraw2D()"); end2D(); if (lightingEnabled) { glEnable(GL_LIGHTING); } else { glDisable(GL_LIGHTING); } }