Browse Source

Added rest of geometry types. Closes #413.

Lasse Öörni 11 years ago
parent
commit
e68c051a35

+ 48 - 39
Source/Engine/Graphics/Direct3D9/D3D9Graphics.cpp

@@ -197,6 +197,42 @@ static unsigned GetD3DColor(const Color& color)
     return (((a) & 0xff) << 24) | (((r) & 0xff) << 16) | (((g) & 0xff) << 8) | ((b) & 0xff);
 }
 
+static void GetD3DPrimitiveType(unsigned elementCount, PrimitiveType type, unsigned& primitiveCount, D3DPRIMITIVETYPE& d3dPrimitiveType)
+{
+    switch (type)
+    {
+    case TRIANGLE_LIST:
+        primitiveCount = elementCount / 3;
+        d3dPrimitiveType = D3DPT_TRIANGLELIST;
+        break;
+        
+    case LINE_LIST:
+        primitiveCount = elementCount / 2;
+        d3dPrimitiveType = D3DPT_LINELIST;
+        break;
+
+    case POINT_LIST:
+        primitiveCount = elementCount;
+        d3dPrimitiveType = D3DPT_POINTLIST;
+        break;
+        
+    case TRIANGLE_STRIP:
+        primitiveCount = elementCount - 2;
+        d3dPrimitiveType = D3DPT_TRIANGLESTRIP;
+        break;
+        
+    case LINE_STRIP:
+        primitiveCount = elementCount - 1;
+        d3dPrimitiveType = D3DPT_LINESTRIP;
+        break;
+        
+    case TRIANGLE_FAN:
+        primitiveCount = elementCount - 2;
+        d3dPrimitiveType = D3DPT_TRIANGLEFAN;
+        break;
+    }
+}
+
 static HWND GetWindowHandle(SDL_Window* window)
 {
     SDL_SysWMinfo sysInfo;
@@ -835,20 +871,11 @@ void Graphics::Draw(PrimitiveType type, unsigned vertexStart, unsigned vertexCou
     
     ResetStreamFrequencies();
     
-    unsigned primitiveCount = 0;
+    unsigned primitiveCount;
+    D3DPRIMITIVETYPE d3dPrimitiveType;
     
-    switch (type)
-    {
-    case TRIANGLE_LIST:
-        primitiveCount = vertexCount / 3;
-        impl_->device_->DrawPrimitive(D3DPT_TRIANGLELIST, vertexStart, primitiveCount);
-        break;
-        
-    case LINE_LIST:
-        primitiveCount = vertexCount / 2;
-        impl_->device_->DrawPrimitive(D3DPT_LINELIST, vertexStart, primitiveCount);
-        break;
-    }
+    GetD3DPrimitiveType(vertexCount, type, primitiveCount, d3dPrimitiveType);
+    impl_->device_->DrawPrimitive(d3dPrimitiveType, vertexStart, primitiveCount);
     
     numPrimitives_ += primitiveCount;
     ++numBatches_;
@@ -861,20 +888,11 @@ void Graphics::Draw(PrimitiveType type, unsigned indexStart, unsigned indexCount
     
     ResetStreamFrequencies();
     
-    unsigned primitiveCount = 0;
+    unsigned primitiveCount;
+    D3DPRIMITIVETYPE d3dPrimitiveType;
     
-    switch (type)
-    {
-    case TRIANGLE_LIST:
-        primitiveCount = indexCount / 3;
-        impl_->device_->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, minVertex, vertexCount, indexStart, primitiveCount);
-        break;
-        
-    case LINE_LIST:
-        primitiveCount = indexCount / 2;
-        impl_->device_->DrawIndexedPrimitive(D3DPT_LINELIST, 0, minVertex, vertexCount, indexStart, primitiveCount);
-        break;
-    }
+    GetD3DPrimitiveType(indexCount, type, primitiveCount, d3dPrimitiveType);
+    impl_->device_->DrawIndexedPrimitive(d3dPrimitiveType, 0, minVertex, vertexCount, indexStart, primitiveCount);
     
     numPrimitives_ += primitiveCount;
     ++numBatches_;
@@ -898,20 +916,11 @@ void Graphics::DrawInstanced(PrimitiveType type, unsigned indexStart, unsigned i
         }
     }
     
-    unsigned primitiveCount = 0;
+    unsigned primitiveCount;
+    D3DPRIMITIVETYPE d3dPrimitiveType;
     
-    switch (type)
-    {
-    case TRIANGLE_LIST:
-        primitiveCount = indexCount / 3;
-        impl_->device_->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, minVertex, vertexCount, indexStart, primitiveCount);
-        break;
-        
-    case LINE_LIST:
-        primitiveCount = indexCount / 2;
-        impl_->device_->DrawIndexedPrimitive(D3DPT_LINELIST, 0, minVertex, vertexCount, indexStart, primitiveCount);
-        break;
-    }
+    GetD3DPrimitiveType(indexCount, type, primitiveCount, d3dPrimitiveType);
+    impl_->device_->DrawIndexedPrimitive(d3dPrimitiveType, 0, minVertex, vertexCount, indexStart, primitiveCount);
     
     numPrimitives_ += instanceCount * primitiveCount;
     ++numBatches_;

+ 5 - 1
Source/Engine/Graphics/GraphicsDefs.h

@@ -34,7 +34,11 @@ class Vector3;
 enum PrimitiveType
 {
     TRIANGLE_LIST = 0,
-    LINE_LIST
+    LINE_LIST,
+    POINT_LIST,
+    TRIANGLE_STRIP,
+    LINE_STRIP,
+    TRIANGLE_FAN
 };
 
 /// %Geometry type.

+ 57 - 61
Source/Engine/Graphics/OpenGL/OGLGraphics.cpp

@@ -180,6 +180,41 @@ bool CheckExtension(String& extensions, const String& name)
     return extensions.Contains(name);
 }
 
+static void GetGLPrimitiveType(unsigned elementCount, PrimitiveType type, unsigned& primitiveCount, GLenum& glPrimitiveType)
+{
+    switch (type)
+    {
+    case TRIANGLE_LIST:
+        primitiveCount = elementCount / 3;
+        glPrimitiveType = GL_TRIANGLES;
+        break;
+        
+    case LINE_LIST:
+        primitiveCount = elementCount / 2;
+        glPrimitiveType = GL_LINES;
+        break;
+
+    case POINT_LIST:
+        primitiveCount = elementCount;
+        glPrimitiveType = GL_POINTS;
+        break;
+        
+    case TRIANGLE_STRIP:
+        primitiveCount = elementCount - 2;
+        glPrimitiveType = GL_TRIANGLE_STRIP;
+        break;
+        
+    case LINE_STRIP:
+        primitiveCount = elementCount - 1;
+        glPrimitiveType = GL_LINE_STRIP;
+        break;
+        
+    case TRIANGLE_FAN:
+        primitiveCount = elementCount - 2;
+        glPrimitiveType = GL_TRIANGLE_FAN;
+        break;
+    }
+}
 Graphics::Graphics(Context* context_) :
     Object(context_),
     impl_(new GraphicsImpl()),
@@ -730,20 +765,11 @@ void Graphics::Draw(PrimitiveType type, unsigned vertexStart, unsigned vertexCou
     if (impl_->fboDirty_)
         CommitFramebuffer();
     
-    unsigned primitiveCount = 0;
+    unsigned primitiveCount;
+    GLenum glPrimitiveType;
     
-    switch (type)
-    {
-    case TRIANGLE_LIST:
-        primitiveCount = vertexCount / 3;
-        glDrawArrays(GL_TRIANGLES, vertexStart, vertexCount);
-        break;
-        
-    case LINE_LIST:
-        primitiveCount = vertexCount / 2;
-        glDrawArrays(GL_LINES, vertexStart, vertexCount);
-        break;
-    }
+    GetGLPrimitiveType(vertexCount, type, primitiveCount, glPrimitiveType);
+    glDrawArrays(glPrimitiveType, vertexStart, vertexCount);
     
     numPrimitives_ += primitiveCount;
     ++numBatches_;
@@ -757,27 +783,15 @@ void Graphics::Draw(PrimitiveType type, unsigned indexStart, unsigned indexCount
     if (impl_->fboDirty_)
         CommitFramebuffer();
     
-    unsigned primitiveCount = 0;
     unsigned indexSize = indexBuffer_->GetIndexSize();
+    unsigned primitiveCount;
+    GLenum glPrimitiveType;
     
-    switch (type)
-    {
-    case TRIANGLE_LIST:
-        primitiveCount = indexCount / 3;
-        if (indexSize == sizeof(unsigned short))
-            glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, reinterpret_cast<const GLvoid*>(indexStart * indexSize));
-        else
-            glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, reinterpret_cast<const GLvoid*>(indexStart * indexSize));
-        break;
-        
-    case LINE_LIST:
-        primitiveCount = indexCount / 2;
-        if (indexSize == sizeof(unsigned short))
-            glDrawElements(GL_LINES, indexCount, GL_UNSIGNED_SHORT, reinterpret_cast<const GLvoid*>(indexStart * indexSize));
-        else
-            glDrawElements(GL_LINES, indexCount, GL_UNSIGNED_INT, reinterpret_cast<const GLvoid*>(indexStart * indexSize));
-        break;
-    }
+    GetGLPrimitiveType(indexCount, type, primitiveCount, glPrimitiveType);
+    if (indexSize == sizeof(unsigned short))
+        glDrawElements(glPrimitiveType, indexCount, GL_UNSIGNED_SHORT, reinterpret_cast<const GLvoid*>(indexStart * indexSize));
+    else
+        glDrawElements(glPrimitiveType, indexCount, GL_UNSIGNED_INT, reinterpret_cast<const GLvoid*>(indexStart * indexSize));
     
     numPrimitives_ += primitiveCount;
     ++numBatches_;
@@ -792,38 +806,20 @@ void Graphics::DrawInstanced(PrimitiveType type, unsigned indexStart, unsigned i
     if (impl_->fboDirty_)
         CommitFramebuffer();
     
-    unsigned primitiveCount = 0;
     unsigned indexSize = indexBuffer_->GetIndexSize();
+    unsigned primitiveCount;
+    GLenum glPrimitiveType;
     
-    switch (type)
+    GetGLPrimitiveType(indexCount, type, primitiveCount, glPrimitiveType);
+    if (indexSize == sizeof(unsigned short))
     {
-    case TRIANGLE_LIST:
-        primitiveCount = indexCount / 3;
-        if (indexSize == sizeof(unsigned short))
-        {
-            glDrawElementsInstancedARB(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, reinterpret_cast<const GLvoid*>(indexStart * indexSize),
-                instanceCount);
-        }
-        else
-        {
-            glDrawElementsInstancedARB(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, reinterpret_cast<const GLvoid*>(indexStart * indexSize),
-                instanceCount);
-        }
-        break;
-        
-    case LINE_LIST:
-        primitiveCount = indexCount / 2;
-        if (indexSize == sizeof(unsigned short))
-        {
-            glDrawElementsInstancedARB(GL_LINES, indexCount, GL_UNSIGNED_SHORT, reinterpret_cast<const GLvoid*>(indexStart * indexSize),
-                instanceCount);
-        }
-        else
-        {
-            glDrawElementsInstancedARB(GL_LINES, indexCount, GL_UNSIGNED_INT, reinterpret_cast<const GLvoid*>(indexStart * indexSize),
-                instanceCount);
-        }
-        break;
+        glDrawElementsInstancedARB(glPrimitiveType, indexCount, GL_UNSIGNED_SHORT, reinterpret_cast<const GLvoid*>(indexStart * indexSize),
+            instanceCount);
+    }
+    else
+    {
+        glDrawElementsInstancedARB(glPrimitiveType, indexCount, GL_UNSIGNED_INT, reinterpret_cast<const GLvoid*>(indexStart * indexSize),
+            instanceCount);
     }
     
     numPrimitives_ += instanceCount * primitiveCount;

+ 5 - 1
Source/Engine/LuaScript/pkgs/Graphics/GraphicsDefs.pkg

@@ -3,7 +3,11 @@ $#include "GraphicsDefs.h"
 enum PrimitiveType
 {
     TRIANGLE_LIST = 0,
-    LINE_LIST
+    LINE_LIST,
+    POINT_LIST,
+    TRIANGLE_STRIP,
+    LINE_STRIP,
+    TRIANGLE_FAN
 };
 
 enum GeometryType

+ 4 - 0
Source/Engine/Script/GraphicsAPI.cpp

@@ -1166,6 +1166,10 @@ static void RegisterCustomGeometry(asIScriptEngine* engine)
     engine->RegisterEnum("PrimitiveType");
     engine->RegisterEnumValue("PrimitiveType", "TRIANGLE_LIST", TRIANGLE_LIST);
     engine->RegisterEnumValue("PrimitiveType", "LINE_LIST", LINE_LIST);
+    engine->RegisterEnumValue("PrimitiveType", "POINT_LIST", POINT_LIST);
+    engine->RegisterEnumValue("PrimitiveType", "TRIANGLE_STRIP", TRIANGLE_STRIP);
+    engine->RegisterEnumValue("PrimitiveType", "LINE_STRIP", LINE_STRIP);
+    engine->RegisterEnumValue("PrimitiveType", "TRIANGLE_FAN", TRIANGLE_FAN);
     
     RegisterDrawable<CustomGeometry>(engine, "CustomGeometry");
     engine->RegisterObjectMethod("CustomGeometry", "void Clear()", asMETHOD(CustomGeometry, Clear), asCALL_THISCALL);