Fix requirement to sort and re-copy all foreground decals back into a decal rendering list unnecessarily.

sigonasr2 6 months ago
parent 6851b76f6a
commit e4af1b9e43
  1. 30
      src/HamsterGame.cpp
  2. 6
      src/Menu.cpp
  3. 2
      src/olcPGEX_Graphics3D.h
  4. 47
      src/olcPixelGameEngine.h

@ -425,7 +425,7 @@ const double HamsterGame::GetRuntime()const{
void HamsterGame::Apply3DTransform(std::vector<DecalInstance>&decals){ void HamsterGame::Apply3DTransform(std::vector<DecalInstance>&decals){
std::vector<DecalInstance>oldDecals; std::vector<DecalInstance>oldDecals;
std::vector<DecalInstance>foregroundDecals; //std::vector<DecalInstance>foregroundDecals;
oldDecals.reserve(decals.size()); oldDecals.reserve(decals.size());
std::copy(decals.begin(),decals.end(),std::back_inserter(oldDecals)); std::copy(decals.begin(),decals.end(),std::back_inserter(oldDecals));
decals.clear(); decals.clear();
@ -446,10 +446,7 @@ void HamsterGame::Apply3DTransform(std::vector<DecalInstance>&decals){
for(DecalInstance&decal:oldDecals){ for(DecalInstance&decal:oldDecals){
SetDecalMode(decal.mode); SetDecalMode(decal.mode);
if(decal.transform==GFX3DTransform::NO_TRANSFORM){ if(decal.points==0)continue;
foregroundDecals.emplace_back(decal);
}
else
if(decal.points==3){ if(decal.points==3){
GFX3D::triangle tri{{{decal.pos[0].x,decal.pos[0].y,decal.z[0],1.f},{decal.pos[1].x,decal.pos[1].y,decal.z[1],1.f},{decal.pos[2].x,decal.pos[2].y,decal.z[2],1.f}},{{decal.uv[0].x,decal.uv[0].y,0.f},{decal.uv[1].x,decal.uv[1].y,0.f},{decal.uv[2].x,decal.uv[2].y,0.f}},{decal.tint[0],decal.tint[1],decal.tint[2]}}; GFX3D::triangle tri{{{decal.pos[0].x,decal.pos[0].y,decal.z[0],1.f},{decal.pos[1].x,decal.pos[1].y,decal.z[1],1.f},{decal.pos[2].x,decal.pos[2].y,decal.z[2],1.f}},{{decal.uv[0].x,decal.uv[0].y,0.f},{decal.uv[1].x,decal.uv[1].y,0.f},{decal.uv[2].x,decal.uv[2].y,0.f}},{decal.tint[0],decal.tint[1],decal.tint[2]}};
tri.p[0].z+=zIncrementer; tri.p[0].z+=zIncrementer;
@ -477,34 +474,13 @@ void HamsterGame::Apply3DTransform(std::vector<DecalInstance>&decals){
renderer.Render({tri,tri2},decal.decal,GFX3D::RENDER_TEXTURED|GFX3D::RENDER_DEPTH); renderer.Render({tri,tri2},decal.decal,GFX3D::RENDER_TEXTURED|GFX3D::RENDER_DEPTH);
} }
}else{ }else{
std::vector<GFX3D::triangle>tris;
std::vector<GFX3D::triangle>shadowTris;
tris.reserve(decal.points/3);
if(decal.structure!=DecalStructure::LIST)throw std::runtime_error{std::format("WARNING! Using triangle structure type {} is unsupported! Please only use DecalStructure::LIST!!",int(decal.structure))};
if(decal.points%3!=0)throw std::runtime_error{std::format("WARNING! Number of decal structure points is not a multiple of 3! Points provided: {}. THIS SHOULD NOT BE HAPPENING!",decal.points)};
for(int i{0};i<decal.points;i+=3){
GFX3D::triangle tri{{{decal.pos[i+0].x,decal.pos[i+0].y,decal.z[i+0],1.f},{decal.pos[i+1].x,decal.pos[i+1].y,decal.z[i+1],1.f},{decal.pos[i+2].x,decal.pos[i+2].y,decal.z[i+2],1.f}},{{decal.uv[i+0].x,decal.uv[i+0].y,0.f},{decal.uv[i+1].x,decal.uv[i+1].y,0.f},{decal.uv[i+2].x,decal.uv[i+2].y,0.f}},{decal.tint[i+0],decal.tint[i+1],decal.tint[i+2]}};
tri.p[0].z+=zIncrementer;
tri.p[1].z+=zIncrementer;
tri.p[2].z+=zIncrementer;
tris.emplace_back(tri);
if(decal.z[i+0]>0.1f||decal.z[i+1]>0.1f||decal.z[i+2]>0.1f){
tri.col[0]=tri.col[1]=tri.col[2]={0,0,0,uint8_t(util::lerp(0,160,(1/std::pow(decal.z[0]/10.f+1,4))))};
tri.p[0].z=tri.p[1].z=tri.p[2].z=0.1f+zIncrementer;
shadowTris.emplace_back(tri);
}
}
renderer.Render(tris,decal.decal,GFX3D::RENDER_TEXTURED|GFX3D::RENDER_DEPTH);
if(shadowTris.size()>0){
renderer.Render(shadowTris,decal.decal,GFX3D::RENDER_TEXTURED|GFX3D::RENDER_DEPTH);
}
} }
SetDecalMode(DecalMode::NORMAL); SetDecalMode(DecalMode::NORMAL);
zIncrementer+=0.000001f; zIncrementer+=0.000001f;
} }
std::sort(decals.begin(),decals.end(),[](const DecalInstance&d1,const DecalInstance&d2){return d1.z[0]>d2.z[0];}); std::sort(decals.begin(),decals.end(),[](const DecalInstance&d1,const DecalInstance&d2){return d1.z[0]>d2.z[0];});
std::copy(foregroundDecals.begin(),foregroundDecals.end(),std::back_inserter(decals));
} }
const Animate2D::FrameSequence&HamsterGame::GetAnimation(const std::string&img,const AnimationState::AnimationState state){ const Animate2D::FrameSequence&HamsterGame::GetAnimation(const std::string&img,const AnimationState::AnimationState state){

@ -62,6 +62,7 @@ void Menu::UpdateAndDraw(HamsterGame&game,const float fElapsedTime){
}break; }break;
case MAIN_MENU:{ case MAIN_MENU:{
if(game.GetKey(SPACE).bPressed||game.GetMouse(Mouse::LEFT).bPressed){ if(game.GetKey(SPACE).bPressed||game.GetMouse(Mouse::LEFT).bPressed){
Transition(FADE_OUT,GAMEPLAY,0.5f);
game.SetupAndStartRace(); game.SetupAndStartRace();
} }
}break; }break;
@ -79,7 +80,10 @@ void Menu::UpdateAndDraw(HamsterGame&game,const float fElapsedTime){
if(menuTransitionRefreshTimer<=0.f){ if(menuTransitionRefreshTimer<=0.f){
menuTransitionRefreshTimer=MENU_TRANSITION_REFRESH_RATE; menuTransitionRefreshTimer=MENU_TRANSITION_REFRESH_RATE;
} }
}else Draw(game,currentMenu,game.SCREEN_FRAME.pos); }else{
game.SetDrawTarget(nullptr);
Draw(game,currentMenu,game.SCREEN_FRAME.pos);
}
} }
void Menu::Transition(const TransitionType type,const MenuType gotoMenu,const float transitionTime){ void Menu::Transition(const TransitionType type,const MenuType gotoMenu,const float transitionTime){
if(menuTimer>0.f)return; if(menuTimer>0.f)return;

@ -1072,7 +1072,7 @@ namespace olc
olc::Decal* dec, olc::Decal* dec,
uint32_t nFlags) uint32_t nFlags)
{ {
pge->FillTexturedTriangleDecal(dec,{x1,y1},{x2,y2},{x3,y3},z1,z2,z3,{u1,v1},{u2,v2},{u3,v3},w1,w2,w3,c1,c2,c3); pge->FillTexturedTriangleDecal(dec,{x1,y1},{x2,y2},{x3,y3},z1,z2,z3,{u1,v1},{u2,v2},{u3,v3},w1,w2,w3,c1,c2,c3,GFX3DTransform::TRANSFORM_REQUIRED);
} }

@ -919,6 +919,7 @@ namespace olc
olc::Renderable pDrawTarget; olc::Renderable pDrawTarget;
uint32_t nResID = 0; uint32_t nResID = 0;
std::vector<DecalInstance> vecDecalInstance; std::vector<DecalInstance> vecDecalInstance;
std::vector<DecalInstance> vecForegroundDecalInstance;
olc::Pixel tint = olc::WHITE; olc::Pixel tint = olc::WHITE;
std::function<void()> funcHook = nullptr; std::function<void()> funcHook = nullptr;
}; };
@ -2881,7 +2882,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
void PixelGameEngine::DrawPartialDecal(const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint,const GFX3DTransform transform) void PixelGameEngine::DrawPartialDecal(const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint,const GFX3DTransform transform)
@ -2911,7 +2913,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
@ -2940,7 +2943,8 @@ namespace olc
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
di.z = {z,z,z,z}; di.z = {z,z,z,z};
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
void PixelGameEngine::DrawExplicitDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d* uv, const olc::Pixel* col, uint32_t elements,const GFX3DTransform transform) void PixelGameEngine::DrawExplicitDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d* uv, const olc::Pixel* col, uint32_t elements,const GFX3DTransform transform)
@ -2981,7 +2985,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector<olc::vf2d>& pos, const std::vector<olc::vf2d>& uv, const olc::Pixel tint,const GFX3DTransform transform) void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector<olc::vf2d>& pos, const std::vector<olc::vf2d>& uv, const olc::Pixel tint,const GFX3DTransform transform)
@ -3004,7 +3009,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector<olc::vf2d>& pos, const std::vector<olc::vf2d>& uv, const std::vector<olc::Pixel> &tint,const GFX3DTransform transform) void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector<olc::vf2d>& pos, const std::vector<olc::vf2d>& uv, const std::vector<olc::Pixel> &tint,const GFX3DTransform transform)
@ -3027,7 +3033,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector<olc::vf2d>& pos, const std::vector<olc::vf2d>& uv, const std::vector<olc::Pixel>& colours, const olc::Pixel tint,const GFX3DTransform transform) void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector<olc::vf2d>& pos, const std::vector<olc::vf2d>& uv, const std::vector<olc::Pixel>& colours, const olc::Pixel tint,const GFX3DTransform transform)
@ -3059,7 +3066,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector<olc::vf2d>& pos, const std::vector<float>& depth, const std::vector<olc::vf2d>& uv, const std::vector<olc::Pixel>& colours, const olc::Pixel tint,const GFX3DTransform transform) void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector<olc::vf2d>& pos, const std::vector<float>& depth, const std::vector<olc::vf2d>& uv, const std::vector<olc::Pixel>& colours, const olc::Pixel tint,const GFX3DTransform transform)
@ -3082,7 +3090,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
@ -3109,7 +3118,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = DecalStructure::LIST; di.structure = DecalStructure::LIST;
di.depth = true; di.depth = true;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
void PixelGameEngine::LW3D_DrawWarpedDecal(olc::Decal* decal, const std::vector<std::array<float, 3>>& pos, const olc::Pixel& tint) void PixelGameEngine::LW3D_DrawWarpedDecal(olc::Decal* decal, const std::vector<std::array<float, 3>>& pos, const olc::Pixel& tint)
@ -3151,7 +3161,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.depth = true; di.depth = true;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
} }
#endif #endif
@ -3264,7 +3275,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
@ -3295,7 +3307,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
void PixelGameEngine::DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint,const GFX3DTransform transform) void PixelGameEngine::DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint,const GFX3DTransform transform)
@ -3330,7 +3343,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
} }
@ -3364,7 +3378,8 @@ namespace olc
di.mode = nDecalMode; di.mode = nDecalMode;
di.structure = nDecalStructure; di.structure = nDecalStructure;
di.transform=transform; di.transform=transform;
vLayers[nTargetLayer].vecDecalInstance.emplace_back(di); if(transform==GFX3DTransform::TRANSFORM_REQUIRED)vLayers[nTargetLayer].vecDecalInstance.emplace_back(di);
else vLayers[nTargetLayer].vecForegroundDecalInstance.emplace_back(di);
} }
} }
@ -4092,6 +4107,10 @@ namespace olc
renderer->DrawDecal(decal); renderer->DrawDecal(decal);
} }
layer->vecDecalInstance.clear(); layer->vecDecalInstance.clear();
for (auto& decal : layer->vecForegroundDecalInstance){
renderer->DrawDecal(decal);
}
layer->vecForegroundDecalInstance.clear();
} }
else else
{ {

Loading…
Cancel
Save