| 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(); |