| 426 | } |
| 427 | |
| 428 | void Renderer::DrawSingleSprite(RendererSortableObject* object, RendererObjectType lastObjectType, RenderView& view) |
| 429 | { |
| 430 | _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); |
| 431 | |
| 432 | BindRenderTargetAsTexture(TextureRegister::GBufferDepthMap, &_depthRenderTarget, SamplerStateRegister::LinearClamp); |
| 433 | |
| 434 | SetDepthState(DepthState::Read); |
| 435 | SetCullMode(CullMode::None); |
| 436 | SetBlendMode(object->Sprite->BlendMode); |
| 437 | SetAlphaTest(AlphaTestMode::GreatherThan, ALPHA_TEST_THRESHOLD); |
| 438 | |
| 439 | _shaders.Bind(Shader::InstancedSprites); |
| 440 | |
| 441 | _stInstancedSpriteBuffer.Sprites[0].World = object->Sprite->Type != SpriteType::ThreeD ? |
| 442 | GetWorldMatrixForSprite(*object->Sprite, view) : |
| 443 | Matrix::Identity; |
| 444 | _stInstancedSpriteBuffer.Sprites[0].PerVertexColor = 1; |
| 445 | _stInstancedSpriteBuffer.Sprites[0].IsSoftParticle = object->Sprite->SoftParticle ? 1 : 0; |
| 446 | _stInstancedSpriteBuffer.Sprites[0].RenderType = (int)object->Sprite->renderType; |
| 447 | |
| 448 | PackSpriteTextureCoordinates(0, object->Sprite->Sprite); |
| 449 | |
| 450 | UpdateConstantBuffer(_stInstancedSpriteBuffer, _cbInstancedSpriteBuffer);; |
| 451 | |
| 452 | BindTexture(TextureRegister::ColorMap, object->Sprite->Sprite->Texture, SamplerStateRegister::LinearClamp); |
| 453 | |
| 454 | // Set up vertex buffer and parameters. |
| 455 | unsigned int stride = sizeof(Vertex); |
| 456 | unsigned int offset = 0; |
| 457 | |
| 458 | if (object->Sprite->Type != SpriteType::ThreeD) |
| 459 | { |
| 460 | _context->IASetVertexBuffers(0, 1, _quadVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); |
| 461 | } |
| 462 | else |
| 463 | { |
| 464 | auto vertex0 = Vertex{}; |
| 465 | vertex0.Position = object->Sprite->vtx1; |
| 466 | vertex0.UV = object->Sprite->Sprite->UV[0]; |
| 467 | vertex0.Color = VectorColorToRGBA_TempToVector4(object->Sprite->c1); |
| 468 | vertex0.Effects = 0 << INDEX_IN_POLY_VERTEX_SHIFT; |
| 469 | |
| 470 | auto vertex1 = Vertex{}; |
| 471 | vertex1.Position = object->Sprite->vtx2; |
| 472 | vertex1.UV = object->Sprite->Sprite->UV[1]; |
| 473 | vertex1.Color = VectorColorToRGBA_TempToVector4(object->Sprite->c2); |
| 474 | vertex1.Effects = 1 << INDEX_IN_POLY_VERTEX_SHIFT; |
| 475 | |
| 476 | auto vertex2 = Vertex{}; |
| 477 | vertex2.Position = object->Sprite->vtx3; |
| 478 | vertex2.UV = object->Sprite->Sprite->UV[2]; |
| 479 | vertex2.Color = VectorColorToRGBA_TempToVector4(object->Sprite->c3); |
| 480 | vertex2.Effects = 2 << INDEX_IN_POLY_VERTEX_SHIFT; |
| 481 | |
| 482 | auto vertex3 = Vertex{}; |
| 483 | vertex3.Position = object->Sprite->vtx4; |
| 484 | vertex3.UV = object->Sprite->Sprite->UV[3]; |
| 485 | vertex3.Color = VectorColorToRGBA_TempToVector4(object->Sprite->c4); |
nothing calls this directly
no test coverage detected