mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-06 15:08:36 +01:00
fix(renderer): guard replacable skin lookup and light colour access (#200)
This commit is contained in:
@@ -31,6 +31,23 @@ int constexpr EU07_PICKBUFFERSIZE { 1024 }; // size of (square) textures bound w
|
|||||||
int constexpr EU07_ENVIRONMENTBUFFERSIZE { 256 }; // size of (square) environmental cube map texture
|
int constexpr EU07_ENVIRONMENTBUFFERSIZE { 256 }; // size of (square) environmental cube map texture
|
||||||
int constexpr EU07_REFLECTIONFIDELITYOFFSET { 250 }; // artificial increase of range for reflection pass detail reduction
|
int constexpr EU07_REFLECTIONFIDELITYOFFSET { 250 }; // artificial increase of range for reflection pass detail reduction
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
// returns material assigned to the submodel, resolving replacable skins. null_handle if no skin set is bound
|
||||||
|
material_handle
|
||||||
|
submodel_material( TSubModel const *Submodel ) {
|
||||||
|
|
||||||
|
if( Submodel->m_material >= 0 ) {
|
||||||
|
return Submodel->m_material;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
TSubModel::ReplacableSkinId != nullptr ?
|
||||||
|
TSubModel::ReplacableSkinId[ -Submodel->m_material ] :
|
||||||
|
null_handle );
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
float const EU07_OPACITYDEFAULT { 0.5f };
|
float const EU07_OPACITYDEFAULT { 0.5f };
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -1790,8 +1807,7 @@ opengl_renderer::Material( material_handle const Material ) const {
|
|||||||
opengl_material const &
|
opengl_material const &
|
||||||
opengl_renderer::Material( TSubModel const * Submodel ) const {
|
opengl_renderer::Material( TSubModel const * Submodel ) const {
|
||||||
|
|
||||||
auto const material { Submodel->m_material >= 0 ? Submodel->m_material : Submodel->ReplacableSkinId[ -Submodel->m_material ] };
|
return m_materials.material( submodel_material( Submodel ) );
|
||||||
return m_materials.material( material );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// shader methods
|
// shader methods
|
||||||
@@ -2768,10 +2784,7 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// material configuration:
|
// material configuration:
|
||||||
auto const material{ (
|
auto const material{ submodel_material( Submodel ) }; // zmienialne skóry, również 0
|
||||||
Submodel->m_material < 0 ?
|
|
||||||
Submodel->ReplacableSkinId[ -Submodel->m_material ] : // zmienialne skóry
|
|
||||||
Submodel->m_material ) }; // również 0
|
|
||||||
// textures...
|
// textures...
|
||||||
Bind_Material( material );
|
Bind_Material( material );
|
||||||
// ...colors and opacity...
|
// ...colors and opacity...
|
||||||
@@ -2879,7 +2892,7 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
// material configuration:
|
// material configuration:
|
||||||
// textures...
|
// textures...
|
||||||
if( Submodel->m_material < 0 ) { // zmienialne skóry
|
if( Submodel->m_material < 0 ) { // zmienialne skóry
|
||||||
Bind_Material( TSubModel::ReplacableSkinId[ -Submodel->m_material ], Submodel );
|
Bind_Material( submodel_material( Submodel ), Submodel );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// również 0
|
// również 0
|
||||||
@@ -2897,7 +2910,7 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
::glColor3fv( glm::value_ptr( pick_color( m_pickcontrolsitems.size() ) ) );
|
::glColor3fv( glm::value_ptr( pick_color( m_pickcontrolsitems.size() ) ) );
|
||||||
// textures...
|
// textures...
|
||||||
if( Submodel->m_material < 0 ) { // zmienialne skóry
|
if( Submodel->m_material < 0 ) { // zmienialne skóry
|
||||||
Bind_Material( TSubModel::ReplacableSkinId[ -Submodel->m_material ], Submodel );
|
Bind_Material( submodel_material( Submodel ), Submodel );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// również 0
|
// również 0
|
||||||
@@ -2971,10 +2984,10 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
auto const unitstate = m_unitstate;
|
auto const unitstate = m_unitstate;
|
||||||
switch_units( m_unitstate.diffuse, false, false );
|
switch_units( m_unitstate.diffuse, false, false );
|
||||||
|
|
||||||
auto const *lightcolor {
|
glm::vec3 const lightcolor {
|
||||||
Submodel->DiffuseOverride.r < 0.f ? // -1 indicates no override
|
Submodel->DiffuseOverride.r < 0.f ? // -1 indicates no override
|
||||||
glm::value_ptr( Submodel->f4Diffuse ) :
|
glm::vec3( Submodel->f4Diffuse ) :
|
||||||
glm::value_ptr( Submodel->DiffuseOverride ) };
|
Submodel->DiffuseOverride };
|
||||||
|
|
||||||
// main draw call
|
// main draw call
|
||||||
if( Global.Overcast > 1.f ) {
|
if( Global.Overcast > 1.f ) {
|
||||||
@@ -2987,9 +3000,9 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
|
|
||||||
::glPointSize( pointsize * fogfactor );
|
::glPointSize( pointsize * fogfactor );
|
||||||
::glColor4f(
|
::glColor4f(
|
||||||
lightcolor[ 0 ],
|
lightcolor.r,
|
||||||
lightcolor[ 1 ],
|
lightcolor.g,
|
||||||
lightcolor[ 2 ],
|
lightcolor.b,
|
||||||
Submodel->fVisible * std::min( 1.f, lightlevel ) * 0.5f );
|
Submodel->fVisible * std::min( 1.f, lightlevel ) * 0.5f );
|
||||||
::glDepthMask( GL_FALSE );
|
::glDepthMask( GL_FALSE );
|
||||||
m_geometry.draw( Submodel->m_geometry.handle );
|
m_geometry.draw( Submodel->m_geometry.handle );
|
||||||
@@ -2997,9 +3010,9 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
}
|
}
|
||||||
::glPointSize( pointsize );
|
::glPointSize( pointsize );
|
||||||
::glColor4f(
|
::glColor4f(
|
||||||
lightcolor[ 0 ],
|
lightcolor.r,
|
||||||
lightcolor[ 1 ],
|
lightcolor.g,
|
||||||
lightcolor[ 2 ],
|
lightcolor.b,
|
||||||
Submodel->fVisible * std::min( 1.f, lightlevel ) );
|
Submodel->fVisible * std::min( 1.f, lightlevel ) );
|
||||||
m_geometry.draw( Submodel->m_geometry.handle );
|
m_geometry.draw( Submodel->m_geometry.handle );
|
||||||
|
|
||||||
@@ -3845,10 +3858,7 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
|
|||||||
#endif
|
#endif
|
||||||
// material configuration:
|
// material configuration:
|
||||||
// textures...
|
// textures...
|
||||||
auto const material { (
|
auto const material { submodel_material( Submodel ) }; // zmienialne skóry, również 0
|
||||||
Submodel->m_material < 0 ?
|
|
||||||
Submodel->ReplacableSkinId[ -Submodel->m_material ] : // zmienialne skóry
|
|
||||||
Submodel->m_material ) }; // również 0
|
|
||||||
// textures...
|
// textures...
|
||||||
Bind_Material( material );
|
Bind_Material( material );
|
||||||
// ...colors and opacity...
|
// ...colors and opacity...
|
||||||
@@ -3923,7 +3933,7 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
|
|||||||
// material configuration:
|
// material configuration:
|
||||||
// textures...
|
// textures...
|
||||||
if( Submodel->m_material < 0 ) { // zmienialne skóry
|
if( Submodel->m_material < 0 ) { // zmienialne skóry
|
||||||
Bind_Material( TSubModel::ReplacableSkinId[ -Submodel->m_material ], Submodel );
|
Bind_Material( submodel_material( Submodel ), Submodel );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// również 0
|
// również 0
|
||||||
@@ -3986,14 +3996,14 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
|
|||||||
auto const unitstate = m_unitstate;
|
auto const unitstate = m_unitstate;
|
||||||
switch_units( unitstate.diffuse, false, false );
|
switch_units( unitstate.diffuse, false, false );
|
||||||
|
|
||||||
auto const *lightcolor {
|
glm::vec3 const lightcolor {
|
||||||
Submodel->DiffuseOverride.r < 0.f ? // -1 indicates no override
|
Submodel->DiffuseOverride.r < 0.f ? // -1 indicates no override
|
||||||
glm::value_ptr( Submodel->f4Diffuse ) :
|
glm::vec3( Submodel->f4Diffuse ) :
|
||||||
glm::value_ptr( Submodel->DiffuseOverride ) };
|
Submodel->DiffuseOverride };
|
||||||
::glColor4f(
|
::glColor4f(
|
||||||
lightcolor[ 0 ],
|
lightcolor.r,
|
||||||
lightcolor[ 1 ],
|
lightcolor.g,
|
||||||
lightcolor[ 2 ],
|
lightcolor.b,
|
||||||
Submodel->fVisible * glarelevel );
|
Submodel->fVisible * glarelevel );
|
||||||
|
|
||||||
// main draw call
|
// main draw call
|
||||||
|
|||||||
Reference in New Issue
Block a user