Ticket #3233: color_sprite.diff

File color_sprite.diff, 11.8 KB (added by sanderd17, 9 years ago)
  • binaries/data/mods/public/simulation/components/StatusBars.js

     
    138138
    139139    var AddBar = function(type, amount)
    140140    {
    141         cmpOverlayRenderer.AddSprite(
    142             "art/textures/ui/session/icons/"+type+"_bg.png",
     141        cmpOverlayRenderer.AddColorSprite(
     142            "255 0 0 255",
    143143            { "x": -width/2, "y":yoffset },
    144144            { "x": width/2, "y": height + yoffset },
    145145            offset
    146146        );
    147147
    148         cmpOverlayRenderer.AddSprite(
    149             "art/textures/ui/session/icons/"+type+"_fg.png",
     148        cmpOverlayRenderer.AddColorSprite(
     149            "255 0 0 255",
    150150            { "x": -width/2, "y": yoffset },
    151151            { "x": width*(amount - 0.5), "y": height + yoffset },
    152152            offset
  • source/graphics/Overlay.h

     
    1 /* Copyright (C) 2012 Wildfire Games.
     1/* Copyright (C) 2015 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
     
    141141};
    142142
    143143/**
     144 * Similar to SOverlaySprite, but with custom defined colors instead of texturs
     145 */
     146struct 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/**
    144154 * Rectangular single-quad terrain overlay, in world space coordinates. The vertices of the quad
    145155 * are not required to be coplanar; the quad is arbitrarily triangulated with no effort being made
    146156 * to find a best fit to the underlying terrain.
  • source/renderer/OverlayRenderer.cpp

     
    2929#include "maths/Quaternion.h"
    3030#include "ps/Game.h"
    3131#include "ps/Profile.h"
     32#include "ps/CLogger.h"
    3233#include "renderer/Renderer.h"
    3334#include "renderer/TexturedLineRData.h"
    3435#include "renderer/VertexArray.h"
     
    8788    std::vector<SOverlayLine*> lines;
    8889    std::vector<SOverlayTexturedLine*> texlines;
    8990    std::vector<SOverlaySprite*> sprites;
     91    std::vector<SOverlayColoredSprite*> coloredSprites;
    9092    std::vector<SOverlayQuad*> quads;
    9193    std::vector<SOverlaySphere*> spheres;
    9294
     
    224226    m->sprites.push_back(overlay);
    225227}
    226228
     229void OverlayRenderer::Submit(SOverlayColoredSprite* overlay)
     230{
     231    m->coloredSprites.push_back(overlay);
     232}
     233
    227234void OverlayRenderer::Submit(SOverlayQuad* overlay)
    228235{
    229236    m->quads.push_back(overlay);
     
    640647        g_Renderer.GetStats().m_DrawCalls++;
    641648        g_Renderer.GetStats().m_OverlayTris += 2;
    642649    }
     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    }
    643675   
    644676    if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER)
    645677        tech->EndPass();
  • source/renderer/OverlayRenderer.h

     
    2323struct SOverlayLine;
    2424struct SOverlayTexturedLine;
    2525struct SOverlaySprite;
     26struct SOverlayColoredSprite;
    2627struct SOverlayQuad;
    2728struct SOverlaySphere;
    2829class CCamera;
     
    6970    void Submit(SOverlaySprite* overlay);
    7071
    7172    /**
     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    /**
    7280     * Add a textured quad overlay for rendering in this frame.
    7381     * @param overlay Must be non-null. The pointed-to object must remain valid at least
    7482     *                until the end of the frame.
  • source/renderer/Renderer.cpp

     
    17391739        m->overlayRenderer.Submit(overlay);
    17401740}
    17411741
     1742void CRenderer::Submit(SOverlayColoredSprite* overlay)
     1743{
     1744    if (m_CurrentCullGroup == CULL_DEFAULT)
     1745        m->overlayRenderer.Submit(overlay);
     1746}
     1747
    17421748void CRenderer::Submit(SOverlayQuad* overlay)
    17431749{
    17441750    if (m_CurrentCullGroup == CULL_DEFAULT)
  • source/renderer/Renderer.h

     
    356356    void Submit(SOverlayLine* overlay);
    357357    void Submit(SOverlayTexturedLine* overlay);
    358358    void Submit(SOverlaySprite* overlay);
     359    void Submit(SOverlayColoredSprite* overlay);
    359360    void Submit(SOverlayQuad* overlay);
    360361    void Submit(CModelDecal* decal);
    361362    void Submit(CParticleEmitter* emitter);
  • source/renderer/Scene.h

     
    3939struct SOverlayLine;
    4040struct SOverlayTexturedLine;
    4141struct SOverlaySprite;
     42struct SOverlayColoredSprite;
    4243struct SOverlayQuad;
    4344struct SOverlaySphere;
    4445
     
    106107    virtual void Submit(SOverlaySprite* overlay) = 0;
    107108
    108109    /**
     110     * Submit a colored sprite overlay.
     111     */
     112    virtual void Submit(SOverlayColoredSprite* overlay) = 0;
     113
     114    /**
    109115     * Submit a textured quad overlay.
    110116     */
    111117    virtual void Submit(SOverlayQuad* overlay) = 0;
  • source/simulation2/components/CCmpOverlayRenderer.cpp

     
    2727#include "graphics/TextureManager.h"
    2828#include "renderer/Renderer.h"
    2929
     30#include "ps/CLogger.h"
     31
    3032class CCmpOverlayRenderer : public ICmpOverlayRenderer
    3133{
    3234public:
     
    3840
    3941    // Currently-enabled set of sprites
    4042    std::vector<SOverlaySprite> m_Sprites;
     43    std::vector<SOverlayColoredSprite> m_ColorSprites;
    4144
    4245    // For each entry in m_Sprites, store the offset of the sprite from the unit's position
    4346    // (so we can recompute the sprite position after the unit moves)
    4447    std::vector<CVector3D> m_SpriteOffsets;
     48    std::vector<CVector3D> m_ColorSpriteOffsets;
    4549
    4650    // Whether the sprites should be drawn (only valid between Interpolate and RenderSubmit)
    4751    bool m_Enabled;
     
    98102     */
    99103    void UpdateMessageSubscriptions()
    100104    {
    101         bool needRender = !m_Sprites.empty();
     105        bool needRender = !m_Sprites.empty() || !m_ColorSprites.empty();
    102106
    103107        GetSimContext().GetComponentManager().DynamicSubscriptionNonsync(MT_Interpolate, this, needRender);
    104108        GetSimContext().GetComponentManager().DynamicSubscriptionNonsync(MT_RenderSubmit, this, needRender);
     
    107111    virtual void Reset()
    108112    {
    109113        m_Sprites.clear();
     114        m_ColorSprites.clear();
    110115        m_SpriteOffsets.clear();
     116        m_ColorSpriteOffsets.clear();
    111117
    112118        UpdateMessageSubscriptions();
    113119    }
     
    129135        UpdateMessageSubscriptions();
    130136    }
    131137
     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
    132157    void Interpolate(float UNUSED(frameTime), float frameOffset)
    133158    {
    134159        // Skip all the following computations if we have no sprites
    135         if (m_Sprites.empty())
     160        if (m_Sprites.empty() && m_ColorSprites.empty())
    136161        {
    137162            m_Enabled = false;
    138163            return;
     
    154179        for (size_t i = 0; i < m_Sprites.size(); ++i)
    155180            m_Sprites[i].m_Position = position + m_SpriteOffsets[i];
    156181
     182        for (size_t i = 0; i < m_ColorSprites.size(); ++i)
     183            m_ColorSprites[i].m_Position = position + m_ColorSpriteOffsets[i];
     184
    157185        m_Enabled = true;
    158186    }
    159187
     
    164192
    165193        for (size_t i = 0; i < m_Sprites.size(); ++i)
    166194            collector.Submit(&m_Sprites[i]);
     195
     196        for (size_t i = 0; i < m_ColorSprites.size(); ++i)
     197            collector.Submit(&m_ColorSprites[i]);
    167198    }
    168199};
    169200
  • source/simulation2/components/ICmpOverlayRenderer.cpp

     
    2424BEGIN_INTERFACE_WRAPPER(OverlayRenderer)
    2525DEFINE_INTERFACE_METHOD_0("Reset", void, ICmpOverlayRenderer, Reset)
    2626DEFINE_INTERFACE_METHOD_4("AddSprite", void, ICmpOverlayRenderer, AddSprite, VfsPath, CFixedVector2D, CFixedVector2D, CFixedVector3D)
     27DEFINE_INTERFACE_METHOD_4("AddColorSprite", void, ICmpOverlayRenderer, AddColorSprite, std::string, CFixedVector2D, CFixedVector2D, CFixedVector3D)
    2728END_INTERFACE_WRAPPER(OverlayRenderer)
  • source/simulation2/components/ICmpOverlayRenderer.h

     
    1 /* Copyright (C) 2010 Wildfire Games.
     1/* Copyright (C) 2015 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
     
    2626#include "maths/FixedVector2D.h"
    2727#include "maths/FixedVector3D.h"
    2828
     29struct CColor;
     30
    2931/**
    3032 * Interface for rendering 'overlay' objects (typically sprites), automatically
    3133 * positioned relative to the entity.
     
    4547    /**
    4648     * Add a new textured billboard sprite to be rendered.
    4749     * @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,
    4952     *        relative to the sprite position.
    5053     * @param offset world-space offset of sprite position from the entity's base position.
    5154     */
    5255    virtual void AddSprite(VfsPath textureName, CFixedVector2D corner0, CFixedVector2D corner1, CFixedVector3D offset) = 0;
    5356
     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
    5468    DECLARE_INTERFACE_TYPE(OverlayRenderer)
    5569};
    5670