MCPcopy Create free account
hub / github.com/TombEngine/TombEngine / SortAndPrepareSprites

Method SortAndPrepareSprites

TombEngine/Renderer/RendererSprites.cpp:177–258  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

175 }
176
177 void Renderer::SortAndPrepareSprites(RenderView& view)
178 {
179 if (view.SpritesToDraw.empty())
180 {
181 return;
182 }
183
184 _spriteBuckets.clear();
185
186 // Sort sprites by sprite and blend mode for faster batching.
187 std::sort(
188 view.SpritesToDraw.begin(),
189 view.SpritesToDraw.end(),
190 [](RendererSpriteToDraw& rDrawSprite0, RendererSpriteToDraw& rDrawSprite1)
191 {
192 if (rDrawSprite0.Sprite != rDrawSprite1.Sprite)
193 {
194 return (rDrawSprite0.Sprite > rDrawSprite1.Sprite);
195 }
196 else if (rDrawSprite0.BlendMode != rDrawSprite1.BlendMode)
197 {
198 return (rDrawSprite0.BlendMode > rDrawSprite1.BlendMode);
199 }
200 else
201 {
202 return (rDrawSprite0.Type > rDrawSprite1.Type);
203 }
204 }
205 );
206
207 // Group sprites to draw in buckets for instancing (billboards only).
208 RendererSpriteBucket currentSpriteBucket;
209
210 currentSpriteBucket.Sprite = view.SpritesToDraw[0].Sprite;
211 currentSpriteBucket.BlendMode = view.SpritesToDraw[0].BlendMode;
212 currentSpriteBucket.IsBillboard = view.SpritesToDraw[0].Type != SpriteType::ThreeD;
213 currentSpriteBucket.IsSoftParticle = view.SpritesToDraw[0].SoftParticle;
214 currentSpriteBucket.RenderType = view.SpritesToDraw[0].renderType;
215
216 for (auto& rDrawSprite : view.SpritesToDraw)
217 {
218 bool isBillboard = rDrawSprite.Type != SpriteType::ThreeD;
219
220 if (rDrawSprite.Sprite != currentSpriteBucket.Sprite ||
221 rDrawSprite.BlendMode != currentSpriteBucket.BlendMode ||
222 rDrawSprite.SoftParticle != currentSpriteBucket.IsSoftParticle ||
223 rDrawSprite.renderType != currentSpriteBucket.RenderType ||
224 currentSpriteBucket.SpritesToDraw.size() == INSTANCED_SPRITES_BUCKET_SIZE ||
225 isBillboard != currentSpriteBucket.IsBillboard)
226 {
227 _spriteBuckets.push_back(currentSpriteBucket);
228
229 currentSpriteBucket.Sprite = rDrawSprite.Sprite;
230 currentSpriteBucket.BlendMode = rDrawSprite.BlendMode;
231 currentSpriteBucket.IsBillboard = isBillboard;
232 currentSpriteBucket.IsSoftParticle = rDrawSprite.SoftParticle;
233 currentSpriteBucket.RenderType = rDrawSprite.renderType;
234 currentSpriteBucket.SpritesToDraw.clear();

Callers

nothing calls this directly

Calls 8

emptyMethod · 0.45
clearMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
sizeMethod · 0.45
push_backMethod · 0.45
LengthMethod · 0.45
ToVector3Method · 0.45

Tested by

no test coverage detected