diff --git a/src/HamsterGame.cpp b/src/HamsterGame.cpp index acd7c82..afd4436 100644 --- a/src/HamsterGame.cpp +++ b/src/HamsterGame.cpp @@ -425,7 +425,7 @@ const double HamsterGame::GetRuntime()const{ void HamsterGame::Apply3DTransform(std::vector&decals){ std::vectoroldDecals; - std::vectorforegroundDecals; + //std::vectorforegroundDecals; oldDecals.reserve(decals.size()); std::copy(decals.begin(),decals.end(),std::back_inserter(oldDecals)); decals.clear(); @@ -446,10 +446,7 @@ void HamsterGame::Apply3DTransform(std::vector&decals){ for(DecalInstance&decal:oldDecals){ SetDecalMode(decal.mode); - if(decal.transform==GFX3DTransform::NO_TRANSFORM){ - foregroundDecals.emplace_back(decal); - } - else + if(decal.points==0)continue; 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]}}; tri.p[0].z+=zIncrementer; @@ -477,34 +474,13 @@ void HamsterGame::Apply3DTransform(std::vector&decals){ renderer.Render({tri,tri2},decal.decal,GFX3D::RENDER_TEXTURED|GFX3D::RENDER_DEPTH); } }else{ - std::vectortris; - std::vectorshadowTris; - 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};i0.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); zIncrementer+=0.000001f; } 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){ diff --git a/src/Menu.cpp b/src/Menu.cpp index c3aafd8..a06ff43 100644 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -62,6 +62,7 @@ void Menu::UpdateAndDraw(HamsterGame&game,const float fElapsedTime){ }break; case MAIN_MENU:{ if(game.GetKey(SPACE).bPressed||game.GetMouse(Mouse::LEFT).bPressed){ + Transition(FADE_OUT,GAMEPLAY,0.5f); game.SetupAndStartRace(); } }break; @@ -79,7 +80,10 @@ void Menu::UpdateAndDraw(HamsterGame&game,const float fElapsedTime){ if(menuTransitionRefreshTimer<=0.f){ 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){ if(menuTimer>0.f)return; diff --git a/src/olcPGEX_Graphics3D.h b/src/olcPGEX_Graphics3D.h index d05de53..981d4eb 100644 --- a/src/olcPGEX_Graphics3D.h +++ b/src/olcPGEX_Graphics3D.h @@ -1072,7 +1072,7 @@ namespace olc olc::Decal* dec, 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); } diff --git a/src/olcPixelGameEngine.h b/src/olcPixelGameEngine.h index fd3c6a7..5015b59 100644 --- a/src/olcPixelGameEngine.h +++ b/src/olcPixelGameEngine.h @@ -919,6 +919,7 @@ namespace olc olc::Renderable pDrawTarget; uint32_t nResID = 0; std::vector vecDecalInstance; + std::vector vecForegroundDecalInstance; olc::Pixel tint = olc::WHITE; std::function funcHook = nullptr; }; @@ -2881,7 +2882,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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) @@ -2911,7 +2913,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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.transform=transform; 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) @@ -2981,7 +2985,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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& pos, const std::vector& uv, const olc::Pixel tint,const GFX3DTransform transform) @@ -3004,7 +3009,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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& pos, const std::vector& uv, const std::vector &tint,const GFX3DTransform transform) @@ -3027,7 +3033,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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& pos, const std::vector& uv, const std::vector& colours, const olc::Pixel tint,const GFX3DTransform transform) @@ -3059,7 +3066,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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& pos, const std::vector& depth, const std::vector& uv, const std::vector& colours, const olc::Pixel tint,const GFX3DTransform transform) @@ -3082,7 +3090,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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.structure = DecalStructure::LIST; 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>& pos, const olc::Pixel& tint) @@ -3151,7 +3161,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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 @@ -3264,7 +3275,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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.structure = nDecalStructure; 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) @@ -3330,7 +3343,8 @@ namespace olc di.mode = nDecalMode; di.structure = nDecalStructure; 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.structure = nDecalStructure; 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); } layer->vecDecalInstance.clear(); + for (auto& decal : layer->vecForegroundDecalInstance){ + renderer->DrawDecal(decal); + } + layer->vecForegroundDecalInstance.clear(); } else {