Ticket #3233: color_sprite.diff
File color_sprite.diff, 11.8 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/simulation/components/StatusBars.js
138 138 139 139 var AddBar = function(type, amount) 140 140 { 141 cmpOverlayRenderer.Add Sprite(142 " art/textures/ui/session/icons/"+type+"_bg.png",141 cmpOverlayRenderer.AddColorSprite( 142 "255 0 0 255", 143 143 { "x": -width/2, "y":yoffset }, 144 144 { "x": width/2, "y": height + yoffset }, 145 145 offset 146 146 ); 147 147 148 cmpOverlayRenderer.Add Sprite(149 " art/textures/ui/session/icons/"+type+"_fg.png",148 cmpOverlayRenderer.AddColorSprite( 149 "255 0 0 255", 150 150 { "x": -width/2, "y": yoffset }, 151 151 { "x": width*(amount - 0.5), "y": height + yoffset }, 152 152 offset -
source/graphics/Overlay.h
1 /* Copyright (C) 201 2Wildfire Games.1 /* Copyright (C) 2015 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * 4 4 * 0 A.D. is free software: you can redistribute it and/or modify … … 141 141 }; 142 142 143 143 /** 144 * Similar to SOverlaySprite, but with custom defined colors instead of texturs 145 */ 146 struct SOverlayColoredSprite 147 { 148 CColor m_Color; 149 CVector3D m_Position; // base position 150 float m_X0, m_Y0, m_X1, m_Y1; // billboard corner coordinates, relative to base position 151 }; 152 153 /** 144 154 * Rectangular single-quad terrain overlay, in world space coordinates. The vertices of the quad 145 155 * are not required to be coplanar; the quad is arbitrarily triangulated with no effort being made 146 156 * to find a best fit to the underlying terrain. -
source/renderer/OverlayRenderer.cpp
29 29 #include "maths/Quaternion.h" 30 30 #include "ps/Game.h" 31 31 #include "ps/Profile.h" 32 #include "ps/CLogger.h" 32 33 #include "renderer/Renderer.h" 33 34 #include "renderer/TexturedLineRData.h" 34 35 #include "renderer/VertexArray.h" … … 87 88 std::vector<SOverlayLine*> lines; 88 89 std::vector<SOverlayTexturedLine*> texlines; 89 90 std::vector<SOverlaySprite*> sprites; 91 std::vector<SOverlayColoredSprite*> coloredSprites; 90 92 std::vector<SOverlayQuad*> quads; 91 93 std::vector<SOverlaySphere*> spheres; 92 94 … … 224 226 m->sprites.push_back(overlay); 225 227 } 226 228 229 void OverlayRenderer::Submit(SOverlayColoredSprite* overlay) 230 { 231 m->coloredSprites.push_back(overlay); 232 } 233 227 234 void OverlayRenderer::Submit(SOverlayQuad* overlay) 228 235 { 229 236 m->quads.push_back(overlay); … … 640 647 g_Renderer.GetStats().m_DrawCalls++; 641 648 g_Renderer.GetStats().m_OverlayTris += 2; 642 649 } 650 651 for (size_t i = 0; i < m->coloredSprites.size(); ++i) 652 { 653 SOverlayColoredSprite* sprite = m->coloredSprites[i]; 654 655 shader->Uniform(str_color, sprite->m_Color); 656 657 LOGWARNING("r: %f, g:%f, b: %f,a: %f", sprite->m_Color.r, sprite->m_Color.g, sprite->m_Color.b, sprite->m_Color.a); 658 CVector3D pos[4] = { 659 sprite->m_Position + right*sprite->m_X0 + up*sprite->m_Y0, 660 sprite->m_Position + right*sprite->m_X1 + up*sprite->m_Y0, 661 sprite->m_Position + right*sprite->m_X1 + up*sprite->m_Y1, 662 sprite->m_Position + right*sprite->m_X0 + up*sprite->m_Y1 663 }; 664 665 if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) 666 shader->VertexPointer(3, GL_FLOAT, sizeof(float)*3, &pos[0].X); 667 else 668 glVertexPointer(3, GL_FLOAT, sizeof(float)*3, &pos[0].X); 669 670 glDrawArrays(GL_QUADS, 0, (GLsizei)4); 671 672 g_Renderer.GetStats().m_DrawCalls++; 673 g_Renderer.GetStats().m_OverlayTris += 2; 674 } 643 675 644 676 if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) 645 677 tech->EndPass(); -
source/renderer/OverlayRenderer.h
23 23 struct SOverlayLine; 24 24 struct SOverlayTexturedLine; 25 25 struct SOverlaySprite; 26 struct SOverlayColoredSprite; 26 27 struct SOverlayQuad; 27 28 struct SOverlaySphere; 28 29 class CCamera; … … 69 70 void Submit(SOverlaySprite* overlay); 70 71 71 72 /** 73 * Add a colored sprite overlay for rendering in this frame. 74 * @param overlay Must be non-null. The pointed-to object must remain valid at least 75 * until the end of the frame. 76 */ 77 void Submit(SOverlayColoredSprite* overlay); 78 79 /** 72 80 * Add a textured quad overlay for rendering in this frame. 73 81 * @param overlay Must be non-null. The pointed-to object must remain valid at least 74 82 * until the end of the frame. -
source/renderer/Renderer.cpp
1739 1739 m->overlayRenderer.Submit(overlay); 1740 1740 } 1741 1741 1742 void CRenderer::Submit(SOverlayColoredSprite* overlay) 1743 { 1744 if (m_CurrentCullGroup == CULL_DEFAULT) 1745 m->overlayRenderer.Submit(overlay); 1746 } 1747 1742 1748 void CRenderer::Submit(SOverlayQuad* overlay) 1743 1749 { 1744 1750 if (m_CurrentCullGroup == CULL_DEFAULT) -
source/renderer/Renderer.h
356 356 void Submit(SOverlayLine* overlay); 357 357 void Submit(SOverlayTexturedLine* overlay); 358 358 void Submit(SOverlaySprite* overlay); 359 void Submit(SOverlayColoredSprite* overlay); 359 360 void Submit(SOverlayQuad* overlay); 360 361 void Submit(CModelDecal* decal); 361 362 void Submit(CParticleEmitter* emitter); -
source/renderer/Scene.h
39 39 struct SOverlayLine; 40 40 struct SOverlayTexturedLine; 41 41 struct SOverlaySprite; 42 struct SOverlayColoredSprite; 42 43 struct SOverlayQuad; 43 44 struct SOverlaySphere; 44 45 … … 106 107 virtual void Submit(SOverlaySprite* overlay) = 0; 107 108 108 109 /** 110 * Submit a colored sprite overlay. 111 */ 112 virtual void Submit(SOverlayColoredSprite* overlay) = 0; 113 114 /** 109 115 * Submit a textured quad overlay. 110 116 */ 111 117 virtual void Submit(SOverlayQuad* overlay) = 0; -
source/simulation2/components/CCmpOverlayRenderer.cpp
27 27 #include "graphics/TextureManager.h" 28 28 #include "renderer/Renderer.h" 29 29 30 #include "ps/CLogger.h" 31 30 32 class CCmpOverlayRenderer : public ICmpOverlayRenderer 31 33 { 32 34 public: … … 38 40 39 41 // Currently-enabled set of sprites 40 42 std::vector<SOverlaySprite> m_Sprites; 43 std::vector<SOverlayColoredSprite> m_ColorSprites; 41 44 42 45 // For each entry in m_Sprites, store the offset of the sprite from the unit's position 43 46 // (so we can recompute the sprite position after the unit moves) 44 47 std::vector<CVector3D> m_SpriteOffsets; 48 std::vector<CVector3D> m_ColorSpriteOffsets; 45 49 46 50 // Whether the sprites should be drawn (only valid between Interpolate and RenderSubmit) 47 51 bool m_Enabled; … … 98 102 */ 99 103 void UpdateMessageSubscriptions() 100 104 { 101 bool needRender = !m_Sprites.empty() ;105 bool needRender = !m_Sprites.empty() || !m_ColorSprites.empty(); 102 106 103 107 GetSimContext().GetComponentManager().DynamicSubscriptionNonsync(MT_Interpolate, this, needRender); 104 108 GetSimContext().GetComponentManager().DynamicSubscriptionNonsync(MT_RenderSubmit, this, needRender); … … 107 111 virtual void Reset() 108 112 { 109 113 m_Sprites.clear(); 114 m_ColorSprites.clear(); 110 115 m_SpriteOffsets.clear(); 116 m_ColorSpriteOffsets.clear(); 111 117 112 118 UpdateMessageSubscriptions(); 113 119 } … … 129 135 UpdateMessageSubscriptions(); 130 136 } 131 137 138 virtual void AddColorSprite(std::string color, CFixedVector2D corner0, CFixedVector2D corner1, CFixedVector3D position) 139 { 140 CColor colorObj; 141 if (!colorObj.ParseString(color, 1)) 142 LOGERROR("OverlayRenderer: Error parsing '%s'", color); 143 144 SOverlayColoredSprite sprite; 145 sprite.m_Color = colorObj; 146 sprite.m_X0 = corner0.X.ToFloat(); 147 sprite.m_Y0 = corner0.Y.ToFloat(); 148 sprite.m_X1 = corner1.X.ToFloat(); 149 sprite.m_Y1 = corner1.Y.ToFloat(); 150 151 m_ColorSprites.push_back(sprite); 152 m_ColorSpriteOffsets.push_back(CVector3D(position)); 153 154 UpdateMessageSubscriptions(); 155 } 156 132 157 void Interpolate(float UNUSED(frameTime), float frameOffset) 133 158 { 134 159 // Skip all the following computations if we have no sprites 135 if (m_Sprites.empty() )160 if (m_Sprites.empty() && m_ColorSprites.empty()) 136 161 { 137 162 m_Enabled = false; 138 163 return; … … 154 179 for (size_t i = 0; i < m_Sprites.size(); ++i) 155 180 m_Sprites[i].m_Position = position + m_SpriteOffsets[i]; 156 181 182 for (size_t i = 0; i < m_ColorSprites.size(); ++i) 183 m_ColorSprites[i].m_Position = position + m_ColorSpriteOffsets[i]; 184 157 185 m_Enabled = true; 158 186 } 159 187 … … 164 192 165 193 for (size_t i = 0; i < m_Sprites.size(); ++i) 166 194 collector.Submit(&m_Sprites[i]); 195 196 for (size_t i = 0; i < m_ColorSprites.size(); ++i) 197 collector.Submit(&m_ColorSprites[i]); 167 198 } 168 199 }; 169 200 -
source/simulation2/components/ICmpOverlayRenderer.cpp
24 24 BEGIN_INTERFACE_WRAPPER(OverlayRenderer) 25 25 DEFINE_INTERFACE_METHOD_0("Reset", void, ICmpOverlayRenderer, Reset) 26 26 DEFINE_INTERFACE_METHOD_4("AddSprite", void, ICmpOverlayRenderer, AddSprite, VfsPath, CFixedVector2D, CFixedVector2D, CFixedVector3D) 27 DEFINE_INTERFACE_METHOD_4("AddColorSprite", void, ICmpOverlayRenderer, AddColorSprite, std::string, CFixedVector2D, CFixedVector2D, CFixedVector3D) 27 28 END_INTERFACE_WRAPPER(OverlayRenderer) -
source/simulation2/components/ICmpOverlayRenderer.h
1 /* Copyright (C) 201 0Wildfire Games.1 /* Copyright (C) 2015 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * 4 4 * 0 A.D. is free software: you can redistribute it and/or modify … … 26 26 #include "maths/FixedVector2D.h" 27 27 #include "maths/FixedVector3D.h" 28 28 29 struct CColor; 30 29 31 /** 30 32 * Interface for rendering 'overlay' objects (typically sprites), automatically 31 33 * positioned relative to the entity. … … 45 47 /** 46 48 * Add a new textured billboard sprite to be rendered. 47 49 * @param textureName filename of texture to render. 48 * @param corner0,corner1 coordinates of sprite's corners, in world-space units oriented with the camera plane, 50 * @param corner0,corner1 coordinates of sprite's corners, 51 * in world-space units oriented with the camera plane, 49 52 * relative to the sprite position. 50 53 * @param offset world-space offset of sprite position from the entity's base position. 51 54 */ 52 55 virtual void AddSprite(VfsPath textureName, CFixedVector2D corner0, CFixedVector2D corner1, CFixedVector3D offset) = 0; 53 56 57 /** 58 * Add a new colored billboard sprite to be rendered. 59 * @param color color to use on the sprite, 60 * coded as r,g,b[,a] values separated with spaces 61 * @param corner0,corner1 coordinates of sprite's corners, 62 * in world-space units oriented with the camera plane, 63 * relative to the sprite position. 64 * @param offset world-space offset of sprite position from the entity's base position. 65 */ 66 virtual void AddColorSprite(std::string color, CFixedVector2D corner0, CFixedVector2D corner1, CFixedVector3D offset) = 0; 67 54 68 DECLARE_INTERFACE_TYPE(OverlayRenderer) 55 69 }; 56 70