From d8937c58794119889cf299736dd7f6bf86ca62eb Mon Sep 17 00:00:00 2001 From: VB Date: Wed, 26 Apr 2017 21:50:09 +0200 Subject: [PATCH] emission, temporary enabled nonshader billboard and freespot (without stars) --- Model3d.cpp | 17 ++------- renderer.cpp | 105 ++++++++++++++++++++++++--------------------------- shader.cpp | 19 ++++++---- shader.h | 4 +- 4 files changed, 68 insertions(+), 77 deletions(-) diff --git a/Model3d.cpp b/Model3d.cpp index fb0b16e3..615131b4 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -931,20 +931,11 @@ void TSubModel::RaAnimation(glm::mat4 &m, TAnimType a) 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 - - matrix4x4 mat; mat.OpenGL_Matrix( OpenGLMatrices.data_array( GL_MODELVIEW ) ); + matrix4x4 mat; mat.OpenGL_Matrix( glm::value_ptr(m) ); float3 gdzie = float3(mat[3][0], mat[3][1], mat[3][2]); // początek układu współrzędnych submodelu względem kamery - glLoadIdentity(); // macierz jedynkowa - glTranslatef(gdzie.x, gdzie.y, gdzie.z); // początek układu zostaje bez - // 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 + m = glm::mat4(1.0f); + m = glm::translate(m, glm::vec3(gdzie.x, gdzie.y, gdzie.z)); // początek układu zostaje bez zmian + m = glm::rotate(m, atan2(gdzie.x, gdzie.y), glm::vec3(0.0f, 1.0f, 0.0f)); // jedynie obracamy w pionie o kąt } break; case at_Wind: // ruch pod wpływem wiatru (wiatr będziemy liczyć potem...) diff --git a/renderer.cpp b/renderer.cpp index e6ebcfc9..c4afe384 100644 --- a/renderer.cpp +++ b/renderer.cpp @@ -483,32 +483,22 @@ opengl_renderer::Render( TSubModel *Submodel, glm::mat4 m) { // również 0 Bind( Submodel->TextureID ); } - /* - ::glColor3fv( Submodel->f4Diffuse ); // McZapkie-240702: zamiast ub - // ...luminance - if( Global::fLuminance < Submodel->fLight ) { - // zeby swiecilo na kolorowo - ::glMaterialfv( GL_FRONT, GL_EMISSION, Submodel->f4Diffuse ); - } - */ + + if (Global::fLuminance < Submodel->fLight) + World.shader.set_material(glm::make_vec3(Submodel->f4Diffuse)); // main draw call. TODO: generic buffer base class, specialized for vbo, dl etc ::glDrawArrays( Submodel->eType, Submodel->iVboPtr, Submodel->iNumVerts ); - /* - // post-draw reset - if( Global::fLuminance < Submodel->fLight ) { - // restore default (lack of) brightness - glm::vec4 const noemission( 0.0f, 0.0f, 0.0f, 1.0f ); - ::glMaterialfv( GL_FRONT, GL_EMISSION, glm::value_ptr( noemission ) ); - } - */ + if (Global::fLuminance < Submodel->fLight) + World.shader.set_material(glm::vec3(0.0f)); } } - //m7todo: restore - /* + else if( Submodel->eType == TP_FREESPOTLIGHT ) { - auto const &modelview = OpenGLMatrices.data( GL_MODELVIEW ); + //m7todo: shaderize + + auto const &modelview = mm; auto const lightcenter = modelview * glm::vec4( 0.0f, 0.0f, -0.05f, 1.0f ); // pozycja punktu świecącego względem kamery Submodel->fCosViewAngle = glm::dot( glm::normalize( modelview * glm::vec4( 0.0f, 0.0f, -1.0f, 1.0f ) - lightcenter ), glm::normalize( -lightcenter ) ); @@ -522,6 +512,11 @@ opengl_renderer::Render( TSubModel *Submodel, glm::mat4 m) { float const distancefactor = std::max( 0.5, ( Submodel->fSquareMaxDist - TSubModel::fSquareDist ) / ( Submodel->fSquareMaxDist * Global::fDistanceFactor ) ); if( lightlevel > 0.0f ) { + glUseProgram(0); + glEnableClientState(GL_VERTEX_ARRAY); + glLoadMatrixf(glm::value_ptr(mm)); + glVertexPointer(3, GL_FLOAT, sizeof(CVertNormTex), static_cast(nullptr)); // pozycje + // material configuration: ::glPushAttrib( GL_ENABLE_BIT | GL_CURRENT_BIT | GL_COLOR_BUFFER_BIT | GL_POINT_BIT ); @@ -536,12 +531,18 @@ opengl_renderer::Render( TSubModel *Submodel, glm::mat4 m) { // post-draw reset ::glPopAttrib(); + glDisableClientState(GL_VERTEX_ARRAY); + + glUseProgram(World.shader); } } + } else if( Submodel->eType == TP_STARS ) { - + //m7todo: reenable + /* if( Global::fLuminance < Submodel->fLight ) { + glUseProgram(0); // material configuration: ::glPushAttrib( GL_ENABLE_BIT | GL_CURRENT_BIT ); @@ -552,23 +553,26 @@ opengl_renderer::Render( TSubModel *Submodel, glm::mat4 m) { // main draw call. TODO: generic buffer base class, specialized for vbo, dl etc // NOTE: we're doing manual switch to color vbo setup, because there doesn't seem to be any convenient way available atm // TODO: implement easier way to go about it - ::glDisableClientState( GL_NORMAL_ARRAY ); - ::glDisableClientState( GL_TEXTURE_COORD_ARRAY ); - ::glEnableClientState( GL_COLOR_ARRAY ); - ::glColorPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) + 12 ); // kolory - ::glDrawArrays( GL_POINTS, Submodel->iVboPtr, Submodel->iNumVerts ); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState( GL_COLOR_ARRAY ); + glLoadMatrixf(glm::value_ptr(mm)); - ::glDisableClientState( GL_COLOR_ARRAY ); - ::glEnableClientState( GL_NORMAL_ARRAY ); - ::glEnableClientState( GL_TEXTURE_COORD_ARRAY ); + glVertexPointer(3, GL_FLOAT, sizeof(CVertNormTex), static_cast(nullptr)); // pozycje + glColorPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) + 12 ); // kolory + + glDrawArrays( GL_POINTS, Submodel->iVboPtr, Submodel->iNumVerts ); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState( GL_COLOR_ARRAY ); // post-draw reset ::glPopAttrib(); + + glUseProgram(World.shader); } - + */ } - */ if( Submodel->Child != NULL ) if( Submodel->iAlpha & Submodel->iFlags & 0x001F0000 ) @@ -740,35 +744,24 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel, glm::mat4 m) { // również 0 Bind( Submodel->TextureID ); } - /* - ::glColor3fv( Submodel->f4Diffuse ); // McZapkie-240702: zamiast ub - // ...luminance - if( Global::fLuminance < Submodel->fLight ) { - // zeby swiecilo na kolorowo - ::glMaterialfv( GL_FRONT, GL_EMISSION, Submodel->f4Diffuse ); - } - */ - // main draw call. TODO: generic buffer base class, specialized for vbo, dl etc + if (Global::fLuminance < Submodel->fLight) + World.shader.set_material(glm::make_vec3(Submodel->f4Diffuse)); + + // main draw call. TODO: generic buffer base class, specialized for vbo, dl etc ::glDrawArrays( Submodel->eType, Submodel->iVboPtr, Submodel->iNumVerts ); - /* - // post-draw reset - if( Global::fLuminance < Submodel->fLight ) { - // restore default (lack of) brightness - glm::vec4 const noemission( 0.0f, 0.0f, 0.0f, 1.0f ); - ::glMaterialfv( GL_FRONT, GL_EMISSION, glm::value_ptr( noemission ) ); - } - */ + if (Global::fLuminance < Submodel->fLight) + World.shader.set_material(glm::vec3(0.0f)); } } -#if 0 + else if( Submodel->eType == TP_FREESPOTLIGHT ) { if( Global::fLuminance < Submodel->fLight ) { // NOTE: we're forced here to redo view angle calculations etc, because this data isn't instanced but stored along with the single mesh // TODO: separate instance data from reusable geometry - auto const &modelview = OpenGLMatrices.data( GL_MODELVIEW ); + auto const &modelview = mm; auto const lightcenter = modelview * glm::vec4( 0.0f, 0.0f, -0.05f, 1.0f ); // pozycja punktu świecącego względem kamery Submodel->fCosViewAngle = glm::dot( glm::normalize( modelview * glm::vec4( 0.0f, 0.0f, -1.0f, 1.0f ) - lightcenter ), glm::normalize( -lightcenter ) ); @@ -779,6 +772,7 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel, glm::mat4 m) { glarelevel = std::max( 0.0f, glarelevel - static_cast(Global::fLuminance) ); if( glarelevel > 0.0f ) { + glUseProgram(0); ::glPushAttrib( GL_ENABLE_BIT | GL_CURRENT_BIT | GL_COLOR_BUFFER_BIT ); @@ -787,10 +781,10 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel, glm::mat4 m) { ::glDisable( GL_LIGHTING ); ::glBlendFunc( GL_SRC_ALPHA, GL_ONE ); - ::glPushMatrix(); - ::glLoadIdentity(); // macierz jedynkowa - ::glTranslatef( lightcenter.x, lightcenter.y, lightcenter.z ); // początek układu zostaje bez zmian - ::glRotated( atan2( lightcenter.x, lightcenter.z ) * 180.0 / M_PI, 0.0, 1.0, 0.0 ); // jedynie obracamy w pionie o kąt + glm::mat4 x = glm::mat4(1.0f); + x = glm::translate(x, glm::vec3(lightcenter.x, lightcenter.y, lightcenter.z)); // początek układu zostaje bez zmian + x = glm::rotate(x, atan2(lightcenter.x, lightcenter.y), glm::vec3(0.0f, 1.0f, 0.0f)); // jedynie obracamy w pionie o kąt + glLoadMatrixf(glm::value_ptr(x)); // TODO: turn the drawing instructions into a compiled call / array ::glBegin( GL_TRIANGLE_STRIP ); @@ -808,14 +802,13 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel, glm::mat4 m) { // ...etc instead IF we had easy access to camera's forward and right vectors. TODO: check if Camera matrix is accessible */ ::glEnd(); - - ::glPopMatrix(); ::glPopAttrib(); + + glUseProgram(World.shader); } } } } -#endif if( Submodel->Child != NULL ) if( Submodel->iAlpha & Submodel->iFlags & 0x002F0000 ) diff --git a/shader.cpp b/shader.cpp index b336616a..4a20d180 100644 --- a/shader.cpp +++ b/shader.cpp @@ -6,6 +6,7 @@ #include "shader.h" #include "Float3d.h" #include "Logs.h" +#include "openglmatrixstack.h" #include #include @@ -95,12 +96,8 @@ gl_program_mvp::gl_program_mvp(std::vector v) : gl_program(v) void gl_program_mvp::copy_gl_mvp() { - float4x4 mv, p; - glGetFloatv(GL_MODELVIEW_MATRIX, mv.e); - glGetFloatv(GL_PROJECTION_MATRIX, p.e); - - glUniformMatrix4fv(mv_uniform, 1, GL_FALSE, mv.e); - glUniformMatrix4fv(p_uniform, 1, GL_FALSE, p.e); + glUniformMatrix4fv(mv_uniform, 1, GL_FALSE, glm::value_ptr(OpenGLMatrices.data(GL_MODELVIEW))); + glUniformMatrix4fv(p_uniform, 1, GL_FALSE, glm::value_ptr(OpenGLMatrices.data(GL_PROJECTION))); } void gl_program_mvp::set_mv(const glm::mat4 &m) @@ -116,6 +113,7 @@ void gl_program_mvp::set_p(const glm::mat4 &m) gl_program_light::gl_program_light(std::vector v) : gl_program_mvp(v) { ambient_uniform = glGetUniformLocation(id, "ambient"); + emission_uniform = glGetUniformLocation(id, "emission"); lcount_uniform = glGetUniformLocation(id, "lights_count"); for (size_t i = 0; i < MAX_LIGHTS; i++) @@ -131,7 +129,8 @@ gl_program_light::gl_program_light(std::vector v) : gl_program_mvp(v) } glUseProgram(id); - glUniform3f(ambient_uniform, 1.0f, 1.0f, 1.0f); + glUniform3f(ambient_uniform, 0.0f, 0.0f, 0.0f); + glUniform3f(emission_uniform, 0.0f, 0.0f, 0.0f); glUniform1ui(lcount_uniform, 0); } @@ -165,4 +164,10 @@ void gl_program_light::set_light(GLuint i, type t, glm::vec3 &pos, glm::vec3 &di glUniform3fv(lights_uniform[i].color, 1, glm::value_ptr(color)); glUniform1f(lights_uniform[i].linear, linear); glUniform1f(lights_uniform[i].quadratic, quadratic); +} + +void gl_program_light::set_material(glm::vec3 &emission) +{ + glUseProgram(id); + glUniform3fv(emission_uniform, 1, glm::value_ptr(emission)); } \ No newline at end of file diff --git a/shader.h b/shader.h index 304ebe56..e2b1cbd3 100644 --- a/shader.h +++ b/shader.h @@ -56,13 +56,15 @@ public: gl_program_light(std::vector); void set_ambient(glm::vec3 &ambient); + void set_material(glm::vec3 &emission); void set_light_count(GLuint count); void set_light(GLuint id, type t, glm::vec3 &pos, glm::vec3 &dir, float in_cutoff, float out_cutoff, glm::vec3 &color, float linear, float quadratic); private: - GLuint lcount_uniform; GLuint ambient_uniform; + GLuint emission_uniform; + GLuint lcount_uniform; struct light_s { GLuint type;