Browse Source

Light2D and Renderer2D updates

Josh Engebretson 10 years ago
parent
commit
ea2a304a8b

+ 22 - 15
Source/Atomic/Atomic2D/Light2D.cpp

@@ -388,7 +388,7 @@ void PositionalLight2D::UpdateVertices()
     }
 }
 
-PointLight2D::PointLight2D(Context* context) : PositionalLight2D(context),    
+PointLight2D::PointLight2D(Context* context) : PositionalLight2D(context),
     radius_(1.0f)
 {
     lightType_ = LIGHT2D_POINT;
@@ -452,7 +452,7 @@ void Light2DGroup::OnNodeSet(Node* node)
         if (renderer_.Null())
         {
             renderer_ = node->GetOrCreateComponent<Renderer2D>();
-            //renderer_->SetUseTris(true);
+            renderer_->SetUseTris(true);
         }
 
         if (light2DMaterial_.Null())
@@ -481,12 +481,13 @@ Light2DGroup::Light2DGroup(Context* context) : Drawable2D(context),
     ambientColor_(0, 0, 0, 0),
     frustum_(0)
 {
+    sourceBatches_.Resize(1);
     SubscribeToEvent(E_BEGINRENDERING, HANDLER(Light2DGroup, HandleBeginRendering));
     SubscribeToEvent(E_BEGINVIEWUPDATE, HANDLER(Light2DGroup, HandleBeginViewUpdate));
 }
 
 Light2DGroup::~Light2DGroup()
-{   
+{
     Renderer* renderer = GetSubsystem<Renderer>();
 
     if (renderer)
@@ -527,7 +528,7 @@ void Light2DGroup::HandleBeginViewUpdate(StringHash eventType, VariantMap& event
 
 void Light2DGroup::HandleBeginRendering(StringHash eventType, VariantMap& eventData)
 {
-    //verticesDirty_ = true;
+    sourceBatchesDirty_ = true;
 }
 
 void Light2DGroup::OnWorldBoundingBoxUpdate()
@@ -536,24 +537,32 @@ void Light2DGroup::OnWorldBoundingBoxUpdate()
     worldBoundingBox_.Define(-M_LARGE_VALUE, M_LARGE_VALUE);
 }
 
-void Light2DGroup::UpdateVertices()
+void Light2DGroup::OnDrawOrderChanged()
+{
+    sourceBatches_[0].drawOrder_ = GetDrawOrder();
+}
+
+void Light2DGroup::UpdateSourceBatches()
 {
-    // This is the shadow map
-    //if (!verticesDirty_)
-    //    return;
+    if (!sourceBatchesDirty_)
+        return;
 
-    //vertices_.Clear();
+    Vector<Vertex2D>& vertices = sourceBatches_[0].vertices_;
+    vertices.Clear();
 
     for (Vector<WeakPtr<Light2D> >::Iterator itr = lights_.Begin(); itr != lights_.End(); itr++)
     {
         Light2D* light = *itr;
+
         if (!light->IsEnabled())
             continue;
+
         light->UpdateVertices();
-      //  light->AddVertices(vertices_);
+        light->AddVertices(vertices);
     }
 
-    //verticesDirty_ = false;
+    sourceBatchesDirty_ = false;
+
 
 }
 
@@ -653,9 +662,8 @@ void Light2DGroup::CreateLight2DMaterial()
     light2DMaterial_ = new Material(context_);
     light2DMaterial_->SetName("Light2DMaterial");
 
-    /*
     Technique* tech = new Technique(context_);
-    Pass* pass = tech->CreatePass(PASS_LIGHT2D);
+    Pass* pass = tech->CreatePass("light2d");
     pass->SetBlendMode(BLEND_ADDALPHA);
     pass->SetDepthTestMode(CMP_ALWAYS);
 
@@ -667,8 +675,7 @@ void Light2DGroup::CreateLight2DMaterial()
     light2DMaterial_->SetTechnique(0, tech);
     light2DMaterial_->SetCullMode(CULL_NONE);
 
-    SetCustomMaterial(light2DMaterial_);
-    */
+    sourceBatches_[0].material_ = light2DMaterial_;
 
 }
 

+ 3 - 3
Source/Atomic/Atomic2D/Light2D.h

@@ -185,13 +185,13 @@ protected:
 
     /// Recalculate the world-space bounding box.
     void OnWorldBoundingBoxUpdate();
-    void UpdateVertices();
+
     void OnNodeSet(Node* node);
 
     /// Handle draw order changed.
-    virtual void OnDrawOrderChanged(){}
+    virtual void OnDrawOrderChanged();
     /// Update source batches.
-    virtual void UpdateSourceBatches(){}
+    virtual void UpdateSourceBatches();
 
 
 private:

+ 32 - 14
Source/Atomic/Atomic2D/Renderer2D.cpp

@@ -62,7 +62,8 @@ Renderer2D::Renderer2D(Context* context) :
     Drawable(context, DRAWABLE_GEOMETRY),
     material_(new Material(context)),
     indexBuffer_(new IndexBuffer(context_)),
-    frustum_(0)
+    frustum_(0),
+    useTris_(false)
 {
     material_->SetName("Atomic2D");
 
@@ -141,20 +142,26 @@ void Renderer2D::UpdateGeometry(const FrameInfo& frame)
         void* buffer = indexBuffer_->Lock(0, indexCount, true);
         if (buffer)
         {
-            unsigned quadCount = indexCount / 6;
+            unsigned quadCount =  useTris_ ? indexCount/3 : indexCount / 6;
             if (largeIndices)
             {
                 unsigned* dest = reinterpret_cast<unsigned*>(buffer);
+
                 for (unsigned i = 0; i < quadCount; ++i)
                 {
-                    unsigned base = i * 4;
+                    unsigned base = i * (useTris_ ? 3 : 4);
                     dest[0] = base;
                     dest[1] = base + 1;
                     dest[2] = base + 2;
-                    dest[3] = base;
-                    dest[4] = base + 2;
-                    dest[5] = base + 3;
-                    dest += 6;
+                    if (!useTris_)
+                    {
+                        dest[3] = base;
+                        dest[4] = base + 2;
+                        dest[5] = base + 3;
+                        dest += 6;
+                    }
+                    else
+                        dest += 3;
                 }
             }
             else
@@ -162,14 +169,19 @@ void Renderer2D::UpdateGeometry(const FrameInfo& frame)
                 unsigned short* dest = reinterpret_cast<unsigned short*>(buffer);
                 for (unsigned i = 0; i < quadCount; ++i)
                 {
-                    unsigned base = i * 4;
+                    unsigned base = i * (useTris_ ? 3 : 4);
                     dest[0] = (unsigned short)(base);
                     dest[1] = (unsigned short)(base + 1);
                     dest[2] = (unsigned short)(base + 2);
-                    dest[3] = (unsigned short)(base);
-                    dest[4] = (unsigned short)(base + 2);
-                    dest[5] = (unsigned short)(base + 3);
-                    dest += 6;
+                    if (!useTris_)
+                    {
+                        dest[3] = (unsigned short)(base);
+                        dest[4] = (unsigned short)(base + 2);
+                        dest[5] = (unsigned short)(base + 3);
+                        dest += 6;
+                    }
+                    else
+                        dest += 3;
                 }
             }
 
@@ -186,7 +198,7 @@ void Renderer2D::UpdateGeometry(const FrameInfo& frame)
     ViewBatchInfo2D& viewBatchInfo = viewBatchInfos_[camera];
 
     if (viewBatchInfo.vertexBufferUpdateFrameNumber_ != frame_.frameNumber_)
-    {       
+    {
         unsigned vertexCount = viewBatchInfo.vertexCount_;
         VertexBuffer* vertexBuffer = viewBatchInfo.vertexBuffer_;
         if (vertexBuffer->GetVertexCount() < vertexCount)
@@ -455,7 +467,13 @@ void Renderer2D::UpdateViewBatchInfo(ViewBatchInfo2D& viewBatchInfo, Camera* cam
             currMaterial = material;
         }
 
-        iCount += vertices.Size() * 6 / 4;
+        unsigned indices;
+        if (useTris_)
+            indices = vertices.Size();
+        else
+            indices = vertices.Size() * 6 / 4;
+
+        iCount += indices;
         vCount += vertices.Size();
     }
 

+ 6 - 0
Source/Atomic/Atomic2D/Renderer2D.h

@@ -94,6 +94,10 @@ public:
     /// Check visibility.
     bool CheckVisibility(Drawable2D* drawable) const;
 
+    /// Whether this renderer uses triangles (instead of quads)
+    void SetUseTris(bool useTris) { useTris_ = useTris; }
+    bool GetUseTris() const { return useTris_; }
+
 private:
     /// Recalculate the world-space bounding box.
     virtual void OnWorldBoundingBoxUpdate();
@@ -124,6 +128,8 @@ private:
     BoundingBox frustumBoundingBox_;
     /// Cached materials.
     HashMap<Texture2D*, HashMap<int, SharedPtr<Material> > > cachedMaterials_;
+    /// Whether or not the renderer containts tris (default is quads)
+    bool useTris_;
 };
 
 }