From b92a1e58ae9b91713f789b8be3f58b86198b87a5 Mon Sep 17 00:00:00 2001 From: VB Date: Mon, 20 Mar 2017 17:51:40 +0100 Subject: [PATCH] uniform mvp optimizations --- Globals.cpp | 5 +- Model3d.cpp | 241 +++++++++++++++++++++++----------------------------- Model3d.h | 6 +- Texture.cpp | 4 +- shader.cpp | 17 ++++ shader.h | 4 + stdafx.h | 5 +- 7 files changed, 137 insertions(+), 145 deletions(-) diff --git a/Globals.cpp b/Globals.cpp index 7d8080fa..55e8c117 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -145,7 +145,7 @@ int Global::iDefaultFiltering = 9; // domyÅ›lne rozmywanie tekstur TGA bez alfa int Global::iBallastFiltering = 9; // domyÅ›lne rozmywanie tekstur podsypki int Global::iRailProFiltering = 5; // domyÅ›lne rozmywanie tekstur szyn int Global::iDynamicFiltering = 5; // domyÅ›lne rozmywanie tekstur pojazdów -bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy użyć) +bool Global::bUseVBO = true; // czy jest VBO w karcie graficznej (czy użyć) GLint Global::iMaxTextureSize = 16384; // maksymalny rozmiar tekstury bool Global::bSmoothTraction = false; // wygÅ‚adzanie drutów starym sposobem std::string Global::szDefaultExt = Global::szTexturesDDS; // domyÅ›lnie od DDS @@ -492,9 +492,10 @@ void Global::ConfigParse(cParser &Parser) } else if( token == "usevbo" ) { - + /* Parser.getTokens(); Parser >> Global::bUseVBO; + */ } else if (token == "feedbackmode") { diff --git a/Model3d.cpp b/Model3d.cpp index cc51713c..05b08007 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -953,56 +953,57 @@ TSubModel *TSubModel::GetFromName(char const *search, bool i) // WORD hbIndices[18]={3,0,1,5,4,2,1,0,4,1,5,3,2,3,5,2,4,0}; -void TSubModel::RaAnimation(TAnimType a) +void TSubModel::RaAnimation(glm::mat4 &m, TAnimType a) { // wykonanie animacji niezależnie od renderowania switch (a) { // korekcja poÅ‚ożenia, jeÅ›li submodel jest animowany case at_Translate: // Ra: byÅ‚o "true" if (iAnimOwner != iInstance) break; // cudza animacja - glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z); + m = glm::translate(m, glm::vec3(v_TransVector.x, v_TransVector.y, v_TransVector.z)); break; case at_Rotate: // Ra: byÅ‚o "true" if (iAnimOwner != iInstance) break; // cudza animacja - glRotatef(f_Angle, v_RotateAxis.x, v_RotateAxis.y, v_RotateAxis.z); + m = glm::rotate(m, glm::radians(f_Angle), glm::vec3(v_RotateAxis.x, v_RotateAxis.y, v_RotateAxis.z)); break; case at_RotateXYZ: if (iAnimOwner != iInstance) break; // cudza animacja - glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z); - glRotatef(v_Angles.x, 1.0, 0.0, 0.0); - glRotatef(v_Angles.y, 0.0, 1.0, 0.0); - glRotatef(v_Angles.z, 0.0, 0.0, 1.0); + m = glm::translate(m, glm::vec3(v_TransVector.x, v_TransVector.y, v_TransVector.z)); + m = glm::rotate(m, glm::radians(v_Angles.x), glm::vec3(1.0f, 0.0f, 0.0f)); + m = glm::rotate(m, glm::radians(v_Angles.y), glm::vec3(0.0f, 1.0f, 0.0f)); + m = glm::rotate(m, glm::radians(v_Angles.z), glm::vec3(0.0f, 0.0f, 1.0f)); break; case at_SecondsJump: // sekundy z przeskokiem - glRotatef(floor(GlobalTime->mr) * 6.0, 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians((float)floor(GlobalTime->mr) * 6.0f), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_MinutesJump: // minuty z przeskokiem - glRotatef(GlobalTime->mm * 6.0, 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians(GlobalTime->mm * 6.0f), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_HoursJump: // godziny skokowo 12h/360° - glRotatef(GlobalTime->hh * 30.0 * 0.5, 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians(GlobalTime->hh * 30.0f * 0.5f), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_Hours24Jump: // godziny skokowo 24h/360° - glRotatef(GlobalTime->hh * 15.0 * 0.25, 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians(GlobalTime->hh * 15.0f * 0.25f), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_Seconds: // sekundy pÅ‚ynnie - glRotatef(GlobalTime->mr * 6.0, 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians((float)GlobalTime->mr * 6.0f), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_Minutes: // minuty pÅ‚ynnie - glRotatef(GlobalTime->mm * 6.0 + GlobalTime->mr * 0.1, 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians((float)(GlobalTime->mm * 6.0 + GlobalTime->mr * 0.1)), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_Hours: // godziny pÅ‚ynnie 12h/360° // glRotatef(GlobalTime->hh*30.0+GlobalTime->mm*0.5+GlobalTime->mr/120.0,0.0,1.0,0.0); - glRotatef(2.0 * Global::fTimeAngleDeg, 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians(2.0f * (float)Global::fTimeAngleDeg), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_Hours24: // godziny pÅ‚ynnie 24h/360° // glRotatef(GlobalTime->hh*15.0+GlobalTime->mm*0.25+GlobalTime->mr/240.0,0.0,1.0,0.0); - glRotatef(Global::fTimeAngleDeg, 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians((float)Global::fTimeAngleDeg), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_Billboard: // obrót w pionie do kamery { + /* matrix4x4 mat; // potrzebujemy współrzÄ™dne przesuniÄ™cia Å›rodka ukÅ‚adu // współrzÄ™dnych submodelu glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy @@ -1013,20 +1014,19 @@ void TSubModel::RaAnimation(TAnimType a) // zmian glRotated(atan2(gdzie.x, gdzie.z) * 180.0 / M_PI, 0.0, 1.0, 0.0); // jedynie obracamy w pionie o kÄ…t + */ //m7todo: restore } break; case at_Wind: // ruch pod wpÅ‚ywem wiatru (wiatr bÄ™dziemy liczyć potem...) - glRotated(1.5 * sin(M_PI * GlobalTime->mr / 6.0), 0.0, 1.0, 0.0); + m = glm::rotate(m, glm::radians(1.5f * (float)sin(M_PI * GlobalTime->mr / 6.0)), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_Sky: // animacja nieba - glRotated(Global::fLatitudeDeg, 1.0, 0.0, 0.0); // ustawienie osi OY na północ - // glRotatef(Global::fTimeAngleDeg,0.0,1.0,0.0); //obrót dobowy osi OX - glRotated(-fmod(Global::fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX + m = glm::rotate(m, glm::radians((float)Global::fLatitudeDeg), glm::vec3(0.0f, 1.0f, 0.0f)); // ustawienie osi OY na północ + m = glm::rotate(m, glm::radians((float)-fmod(Global::fTimeAngleDeg, 360.0)), glm::vec3(0.0f, 1.0f, 0.0f)); break; case at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa) - glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót wzglÄ™dem osi pionowej - // (azymut) - glRotatef(v_Angles.x, 1.0, 0.0, 0.0); // obrót wzglÄ™dem poziomu (deklinacja) + m = glm::rotate(m, glm::radians(v_Angles.z), glm::vec3(0.0f, 1.0f, 0.0f)); // obrót wzglÄ™dem osi pionowej (azymut) + m = glm::rotate(m, glm::radians(v_Angles.x), glm::vec3(1.0f, 0.0f, 0.0f)); // obrót wzglÄ™dem poziomu (deklinacja) break; case at_DigiClk: // animacja zegara cyfrowego { // ustawienie animacji w submodelach potomnych @@ -1047,7 +1047,7 @@ void TSubModel::RaAnimation(TAnimType a) } if (mAnimMatrix) // można by to dać np. do at_Translate { - glMultMatrixf(mAnimMatrix->readArray()); + m *= glm::make_mat4(mAnimMatrix->e); mAnimMatrix = NULL; // jak animator bÄ™dzie potrzebowaÅ‚, to ustawi ponownie } }; @@ -1063,8 +1063,8 @@ void TSubModel::RenderDL() glPushMatrix(); if (fMatrix) glMultMatrixf(fMatrix->readArray()); - if (b_Anim) - RaAnimation(b_Anim); +// if (b_Anim) +// RaAnimation(b_Anim); } if (eType < TP_ROTATOR) { // renderowanie obiektów OpenGL @@ -1162,8 +1162,8 @@ void TSubModel::RenderAlphaDL() glPushMatrix(); if (fMatrix) glMultMatrixf(fMatrix->readArray()); - if (b_aAnim) - RaAnimation(b_aAnim); +// if (b_aAnim) +// RaAnimation(b_aAnim); } if (eType < TP_ROTATOR) { // renderowanie obiektów OpenGL @@ -1233,21 +1233,21 @@ void TSubModel::RenderAlphaDL() Next->RenderAlphaDL(); }; // RenderAlpha -void TSubModel::RenderVBO() +void TSubModel::RenderVBO(glm::mat4 m) { // główna procedura renderowania przez VBO if( ( iVisible ) && ( fSquareDist >= (fSquareMinDist / Global::fDistanceFactor) ) && ( fSquareDist <= (fSquareMaxDist * Global::fDistanceFactor) ) ) { + glm::mat4 mm = m; if (iFlags & 0xC000) { - glPushMatrix(); - if (fMatrix) - glMultMatrixf(fMatrix->readArray()); + if (fMatrix) + mm *= glm::make_mat4(fMatrix->e); if (b_Anim) - RaAnimation(b_Anim); + RaAnimation(mm, b_Anim); + World.shader.set_mv(mm); } - World.shader.copy_gl_mvp(); if (eType < TP_ROTATOR) { // renderowanie obiektów OpenGL if (iAlpha & iFlags & 0x1F) // rysuj gdy element nieprzezroczysty @@ -1255,19 +1255,16 @@ void TSubModel::RenderVBO() if (TextureID < 0) // && (ReplacableSkinId!=0)) { // zmienialne skóry GfxRenderer.Bind(ReplacableSkinId[-TextureID]); - // TexAlpha=!(iAlpha&1); //zmiana tylko w przypadku wymienej tekstury } else GfxRenderer.Bind(TextureID); // również 0 - glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub - // glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo, - // co glColor + //glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub if (Global::fLuminance < fLight) { - glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo + //glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo glDrawArrays(eType, iVboPtr, iNumVerts); // narysuj naraz wszystkie trójkÄ…ty z VBO - glMaterialfv(GL_FRONT, GL_EMISSION, emm2); + //glMaterialfv(GL_FRONT, GL_EMISSION, emm2); } else glDrawArrays(eType, iVboPtr, @@ -1291,62 +1288,23 @@ void TSubModel::RenderVBO() (fCosHotspotAngle - fCosViewAngle) / (fCosHotspotAngle - fCosFalloffAngle); - /* TODO: poprawic to zeby dzialalo - - 2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where - R0 is - the radial source of the light if no attenuation is - used, or the Near End - value of the light if Attenuation is used. R is the - radial distance of the - illuminated surface from R0.) - - 3- Inverse Square (Applies inverse-square decay. The formula for this is - (R0/R)^2. - This is actually the "real-world" decay of light, but - you might find it too dim - in the world of computer graphics.) - - .DecayRadius -- The distance over which the decay occurs. - - if (iFarAttenDecay>0) - switch (iFarAttenDecay) - { - case 1: - Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); - //dorobic od kata - break; - case 2: - Distdimm=fFarDecayRadius/(1+fSquareDist); - //dorobic od kata - break; - } - if (Distdimm>1) - Distdimm=1; - - */ GfxRenderer.Bind(0); // nie teksturować - // glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); - // glColorMaterial(GL_FRONT,GL_EMISSION); + float color[4] = { (float)(f4Diffuse[0] * Distdimm), (float)(f4Diffuse[1] * Distdimm), (float)(f4Diffuse[2] * Distdimm), 0 }; - // glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm); - glColorMaterial(GL_FRONT, GL_EMISSION); - glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie - // blendowaly - glColor3fv(color); // inaczej sÄ… biaÅ‚e - glMaterialfv(GL_FRONT, GL_EMISSION, color); - glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj wierzchoÅ‚ek z - // VBO - glEnable(GL_LIGHTING); - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiać glColor - glMaterialfv(GL_FRONT, GL_EMISSION, emm2); // bez tego sÅ‚upy siÄ™ Å›wiecÄ… + + //glColorMaterial(GL_FRONT, GL_EMISSION); + //glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly + //glColor3fv(color); // inaczej sÄ… biaÅ‚e + //glMaterialfv(GL_FRONT, GL_EMISSION, color); + glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj wierzchoÅ‚ek z VBO + //glEnable(GL_LIGHTING); + //glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiać glColor + //glMaterialfv(GL_FRONT, GL_EMISSION, emm2); // bez tego sÅ‚upy siÄ™ Å›wiecÄ… } } else if (eType == TP_STARS) { - // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie - // blendowaly if (Global::fLuminance < fLight) { // Ra: pewnie można by to zrobić // lepiej, bez powtarzania StartVBO() @@ -1370,61 +1328,35 @@ void TSubModel::RenderVBO() } } } - /*Ra: tu coÅ› jest bez sensu... - else - { - glBindTexture(GL_TEXTURE_2D, 0); - // if (eType==smt_FreeSpotLight) - // { - // if (iFarAttenDecay==0) - // glColor3f(Diffuse[0],Diffuse[1],Diffuse[2]); - // } - // else - //TODO: poprawic zeby dzialalo - glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); - glColorMaterial(GL_FRONT,GL_EMISSION); - glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty - swiecace sie blendowaly - //glBegin(GL_POINTS); - glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj - wierzchoÅ‚ek z VBO - // glVertex3f(0,0,0); - //glEnd(); - glEnable(GL_LIGHTING); - glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); - glMaterialfv(GL_FRONT,GL_EMISSION,emm2); - //glEndList(); - } - */ if (Child != NULL) if (iAlpha & iFlags & 0x001F0000) - Child->RenderVBO(); - if (iFlags & 0xC000) - glPopMatrix(); + Child->RenderVBO(mm); + if (iFlags & 0xC000) + World.shader.set_mv(m); } if (b_Anim < at_SecondsJump) b_Anim = at_None; // wyłączenie animacji dla kolejnego użycia submodelu if (Next) if (iAlpha & iFlags & 0x1F000000) - Next->RenderVBO(); // dalsze rekurencyjnie + Next->RenderVBO(m); // dalsze rekurencyjnie }; // RaRender -void TSubModel::RenderAlphaVBO() +void TSubModel::RenderAlphaVBO(glm::mat4 m) { // renderowanie przezroczystych przez VBO if( ( iVisible ) && ( fSquareDist >= (fSquareMinDist / Global::fDistanceFactor) ) && ( fSquareDist <= (fSquareMaxDist * Global::fDistanceFactor) ) ) { + glm::mat4 mm = m; if (iFlags & 0xC000) { - glPushMatrix(); // zapamiÄ™tanie matrycy - if (fMatrix) - glMultMatrixf(fMatrix->readArray()); - if (b_aAnim) - RaAnimation(b_aAnim); + if (fMatrix) + mm *= glm::make_mat4(fMatrix->e); + if (b_Anim) + RaAnimation(mm, b_Anim); + World.shader.set_mv(mm); } - World.shader.copy_gl_mvp(); - glColor3fv(f4Diffuse); + if (eType < TP_ROTATOR) { // renderowanie obiektów OpenGL if (iAlpha & iFlags & 0x2F) // rysuj gdy element przezroczysty @@ -1438,10 +1370,10 @@ void TSubModel::RenderAlphaVBO() GfxRenderer.Bind(TextureID); // również 0 if (Global::fLuminance < fLight) { - glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo + //glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo glDrawArrays(eType, iVboPtr, iNumVerts); // narysuj naraz wszystkie trójkÄ…ty z VBO - glMaterialfv(GL_FRONT, GL_EMISSION, emm2); + //glMaterialfv(GL_FRONT, GL_EMISSION, emm2); } else glDrawArrays(eType, iVboPtr, @@ -1454,15 +1386,15 @@ void TSubModel::RenderAlphaVBO() } if (Child) if (iAlpha & iFlags & 0x002F0000) - Child->RenderAlphaVBO(); - if (iFlags & 0xC000) - glPopMatrix(); + Child->RenderAlphaVBO(mm); + if (iFlags & 0xC000) + World.shader.set_mv(m); } if (b_aAnim < at_SecondsJump) b_aAnim = at_None; // wyłączenie animacji dla kolejnego użycia submodelu if (Next) if (iAlpha & iFlags & 0x2F000000) - Next->RenderAlphaVBO(); + Next->RenderAlphaVBO(m); }; // RaRenderAlpha //--------------------------------------------------------------------------- @@ -2265,7 +2197,14 @@ void TModel3d::RaRender(double fSquareDistance, texture_manager::size_type *Repl { // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste Root->ReplacableSet(ReplacableSkinId, iAlpha); Root->pRoot = this; - Root->RenderVBO(); + + float mv[16], p[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, mv); + glGetFloatv(GL_PROJECTION_MATRIX, p); + World.shader.set_mv(glm::make_mat4(mv)); + World.shader.set_p(glm::make_mat4(p)); + Root->RenderVBO(glm::make_mat4(mv)); + EndVBO(); } } @@ -2279,7 +2218,14 @@ void TModel3d::RaRenderAlpha(double fSquareDistance, texture_manager::size_type if (StartVBO()) { Root->ReplacableSet(ReplacableSkinId, iAlpha); - Root->RenderAlphaVBO(); + + float mv[16], p[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, mv); + glGetFloatv(GL_PROJECTION_MATRIX, p); + World.shader.set_mv(glm::make_mat4(mv)); + World.shader.set_p(glm::make_mat4(p)); + Root->RenderAlphaVBO(glm::make_mat4(mv)); + EndVBO(); } } @@ -2358,7 +2304,14 @@ void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, texture_manager::si if (StartVBO()) { // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste Root->ReplacableSet(ReplacableSkinId, iAlpha ^ 0x0F0F000F); - Root->RenderVBO(); + + float mv[16], p[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, mv); + glGetFloatv(GL_PROJECTION_MATRIX, p); + World.shader.set_mv(glm::make_mat4(mv)); + World.shader.set_p(glm::make_mat4(p)); + Root->RenderVBO(glm::make_mat4(mv)); + EndVBO(); } glPopMatrix(); @@ -2379,7 +2332,14 @@ void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manage if (StartVBO()) { Root->ReplacableSet(ReplacableSkinId, iAlpha); - Root->RenderAlphaVBO(); + + float mv[16], p[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, mv); + glGetFloatv(GL_PROJECTION_MATRIX, p); + World.shader.set_mv(glm::make_mat4(mv)); + World.shader.set_p(glm::make_mat4(p)); + Root->RenderAlphaVBO(glm::make_mat4(mv)); + EndVBO(); } glPopMatrix(); @@ -2416,6 +2376,13 @@ TSubModel *TModel3d::TerrainSquare(int n) void TModel3d::TerrainRenderVBO(int n) { // renderowanie terenu z VBO glPushMatrix(); + + float mv[16], p[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, mv); + glGetFloatv(GL_PROJECTION_MATRIX, p); + World.shader.set_mv(glm::make_mat4(mv)); + World.shader.set_p(glm::make_mat4(p)); + // glTranslated(vPosition->x,vPosition->y,vPosition->z); // if (vAngle->y!=0.0) glRotated(vAngle->y,0.0,1.0,0.0); // if (vAngle->x!=0.0) glRotated(vAngle->x,1.0,0.0,0.0); @@ -2430,7 +2397,7 @@ void TModel3d::TerrainRenderVBO(int n) { if (r->iVisible == n) // tylko jeÅ›li ma być widoczny w danej ramce (problem dla 0==false) - r->RenderVBO(); // sub kolejne (Next) siÄ™ nie wyrenderujÄ… + r->RenderVBO(glm::make_mat4(mv)); // sub kolejne (Next) siÄ™ nie wyrenderujÄ… r = r->NextGet(); } EndVBO(); diff --git a/Model3d.h b/Model3d.h index a67bd66f..d20a71e9 100644 --- a/Model3d.h +++ b/Model3d.h @@ -218,7 +218,7 @@ private: // int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX // *Vertices); int SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, float8 *Vertices); - void RaAnimation(TAnimType a); + void RaAnimation(glm::mat4 &m, TAnimType a); public: static size_t iInstance; // identyfikator egzemplarza, który aktualnie renderuje model @@ -255,8 +255,8 @@ public: TSubModel * GetFromName(char const *search, bool i = true); void RenderDL(); void RenderAlphaDL(); - void RenderVBO(); - void RenderAlphaVBO(); + void RenderVBO(glm::mat4 m); + void RenderAlphaVBO(glm::mat4 m); // inline matrix4x4* GetMatrix() {return dMatrix;}; inline float4x4 * GetMatrix() { diff --git a/Texture.cpp b/Texture.cpp index b3b6732c..4cbc4ee1 100644 --- a/Texture.cpp +++ b/Texture.cpp @@ -741,7 +741,7 @@ texture_manager::GetTextureId( std::string Filename, std::string const &Dir, int void texture_manager::Bind( texture_manager::size_type const Id ) { -/* + // NOTE: this optimization disabled for the time being, until the render code is reviewed // having it active would lead to some terrain and spline chunks receiving wrong // (the most recent?) texture, instead of the proper one. It'd also affect negatively @@ -750,7 +750,7 @@ texture_manager::Bind( texture_manager::size_type const Id ) { // don't bind again what's already active return; } -*/ + // TODO: do binding in texture object, add support for other types if( Id != 0 ) { diff --git a/shader.cpp b/shader.cpp index 7396aef6..d43bc9eb 100644 --- a/shader.cpp +++ b/shader.cpp @@ -103,10 +103,21 @@ void gl_program_mvp::copy_gl_mvp() glUniformMatrix4fv(p_uniform, 1, GL_FALSE, p.e); } +void gl_program_mvp::set_mv(glm::mat4 &m) +{ + glUniformMatrix4fv(mv_uniform, 1, GL_FALSE, glm::value_ptr(m)); +} + +void gl_program_mvp::set_p(glm::mat4 &m) +{ + glUniformMatrix4fv(p_uniform, 1, GL_FALSE, glm::value_ptr(m)); +} + gl_program_light::gl_program_light(std::vector v) : gl_program_mvp(v) { ambient_uniform = glGetUniformLocation(id, "ambient"); lcount_uniform = glGetUniformLocation(id, "lights_count"); + specular_uniform = glGetUniformLocation(id, "specular"); for (size_t i = 0; i < MAX_LIGHTS; i++) { @@ -157,4 +168,10 @@ void gl_program_light::set_light(GLuint i, type t, float3 &pos, float3 &dir, glUniform3fv(lights_uniform[i].color, 1, &color.x); glUniform1f(lights_uniform[i].linear, linear); glUniform1f(lights_uniform[i].quadratic, quadratic); +} + +void gl_program_light::set_object(float specular) +{ + glUseProgram(id); + glUniform1f(specular_uniform, specular); } \ No newline at end of file diff --git a/shader.h b/shader.h index 7656baec..22545423 100644 --- a/shader.h +++ b/shader.h @@ -35,6 +35,8 @@ public: gl_program_mvp() = default; gl_program_mvp(std::vector); + void set_mv(glm::mat4 &); + void set_p(glm::mat4 &); void copy_gl_mvp(); }; @@ -57,10 +59,12 @@ public: void set_light_count(GLuint count); void set_light(GLuint id, type t, float3 &pos, float3 &dir, float in_cutoff, float out_cutoff, float3 &color, float linear, float quadratic); + void set_object(float specular); private: GLuint lcount_uniform; GLuint ambient_uniform; + GLuint specular_uniform; struct light_s { GLuint type; diff --git a/stdafx.h b/stdafx.h index ebd4c0b8..98658b8f 100644 --- a/stdafx.h +++ b/stdafx.h @@ -67,4 +67,7 @@ #endif #define GLFW_INCLUDE_GLU //m7todo: jest tu bo nie chcia³o mi siê wpychaæ do wszystkich plików -#include \ No newline at end of file +#include +#include +#include +#include \ No newline at end of file