2
0
Эх сурвалжийг харах

Thekla: redo reduz's changes from 8b01b2e85cb7ed60209c925f1e123374272bd8c8

But this time without messing up the code style and with proper
comments documenting changed code.
Rémi Verschelde 7 жил өмнө
parent
commit
3f7f65cd1c

+ 20 - 10
thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.cpp

@@ -142,9 +142,11 @@ AtlasPacker::AtlasPacker(Atlas * atlas) : m_atlas(atlas), m_bitmap(256, 256)
 {
     m_width = 0;
     m_height = 0;
-    
-    m_debug_bitmap.allocate(256, 256);
-    m_debug_bitmap.fill(Color32(0,0,0,0));
+
+    // -- GODOT start --
+    //m_debug_bitmap.allocate(256, 256);
+    //m_debug_bitmap.fill(Color32(0,0,0,0));
+    // -- GODOT end --
 }
 
 AtlasPacker::~AtlasPacker()
@@ -597,8 +599,10 @@ void AtlasPacker::packCharts(int quality, float texelsPerUnit, bool blockAligned
     m_bitmap.clearAll();
     if (approximateExtent > m_bitmap.width()) {
         m_bitmap.resize(approximateExtent, approximateExtent, false);
-        m_debug_bitmap.resize(approximateExtent, approximateExtent);
-        m_debug_bitmap.fill(Color32(0,0,0,0));
+        // -- GODOT start --
+        //m_debug_bitmap.resize(approximateExtent, approximateExtent);
+        //m_debug_bitmap.fill(Color32(0,0,0,0));
+        // -- GODOT end --
     }
 
     
@@ -680,20 +684,24 @@ void AtlasPacker::packCharts(int quality, float texelsPerUnit, bool blockAligned
         {
             //nvDebug("Resize bitmap (%d, %d).\n", nextPowerOfTwo(w), nextPowerOfTwo(h));
             m_bitmap.resize(nextPowerOfTwo(U32(w)), nextPowerOfTwo(U32(h)), false);
-            m_debug_bitmap.resize(nextPowerOfTwo(U32(w)), nextPowerOfTwo(U32(h)));
+            // -- GODOT start --
+            //m_debug_bitmap.resize(nextPowerOfTwo(U32(w)), nextPowerOfTwo(U32(h)));
+            // -- GODOT end --
         }
 
         //nvDebug("Add chart at (%d, %d).\n", best_x, best_y);
 
         addChart(&chart_bitmap, w, h, best_x, best_y, best_r, /*debugOutput=*/NULL);
 
+        // -- GODOT start --
         // IC: Output chart again to debug bitmap.
-        if (chart->isVertexMapped()) {
+        /*if (chart->isVertexMapped()) {
             addChart(&chart_bitmap, w, h, best_x, best_y, best_r, &m_debug_bitmap);
         }
         else {
             addChart(chart, w, h, best_x, best_y, best_r, &m_debug_bitmap);
-        }
+        }*/
+        // -- GODOT end --
 
         //float best_angle = 2 * PI * best_r;
 
@@ -842,8 +850,10 @@ void AtlasPacker::packCharts(int quality, float texelsPerUnit, bool blockAligned
     nvCheck(isAligned(m_width, 4));
     nvCheck(isAligned(m_height, 4));
 
-    m_debug_bitmap.resize(m_width, m_height);
-    m_debug_bitmap.setFormat(Image::Format_ARGB);
+    // -- GODOT start --
+    //m_debug_bitmap.resize(m_width, m_height);
+    //m_debug_bitmap.setFormat(Image::Format_ARGB);
+    // -- GODOT end --
 
 #if DEBUG_OUTPUT
     //outputDebugBitmap("debug_packer_final.tga", m_bitmap, w, h);

+ 3 - 1
thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h

@@ -48,7 +48,9 @@ namespace nv
 
         Atlas * m_atlas;
         BitMap m_bitmap;
-        Image m_debug_bitmap;
+        // -- GODOT start --
+        //Image m_debug_bitmap;
+        // -- GODOT end --
         RadixSort m_radix;
 
         uint m_width;

+ 20 - 3
thirdparty/thekla_atlas/thekla/thekla_atlas.cpp

@@ -2,6 +2,9 @@
 #include "thekla_atlas.h"
 
 #include <cfloat>
+// -- GODOT start --
+#include <stdio.h>
+// -- GODOT end --
 
 #include "nvmesh/halfedge/Edge.h"
 #include "nvmesh/halfedge/Mesh.h"
@@ -112,6 +115,8 @@ static Atlas_Output_Mesh * mesh_atlas_to_output(const HalfEdge::Mesh * mesh, con
     output->index_count = face_count * 3;
     output->index_array = new int[face_count * 3];
 
+    // -- GODOT start --
+    int face_ofs = 0;
     // Set face indices.
     for (int f = 0; f < face_count; f++) {
         uint c = charts->faceChartAt(f);
@@ -121,14 +126,26 @@ static Atlas_Output_Mesh * mesh_atlas_to_output(const HalfEdge::Mesh * mesh, con
         const Chart * chart = charts->chartAt(c);
         nvDebugCheck(chart->faceAt(i) == f);
 
+        if (i >= chart->chartMesh()->faceCount()) {
+            printf("WARNING: Faces may be missing in the final vertex, which could not be packed\n");
+            continue;
+        }
+
         const HalfEdge::Face * face = chart->chartMesh()->faceAt(i);
         const HalfEdge::Edge * edge = face->edge;
 
-        output->index_array[3*f+0] = vertexOffset + edge->vertex->id;
-        output->index_array[3*f+1] = vertexOffset + edge->next->vertex->id;
-        output->index_array[3*f+2] = vertexOffset + edge->next->next->vertex->id;
+        //output->index_array[3*f+0] = vertexOffset + edge->vertex->id;
+        //output->index_array[3*f+1] = vertexOffset + edge->next->vertex->id;
+        //output->index_array[3*f+2] = vertexOffset + edge->next->next->vertex->id;
+        output->index_array[3 * face_ofs + 0] = vertexOffset + edge->vertex->id;
+        output->index_array[3 * face_ofs + 1] = vertexOffset + edge->next->vertex->id;
+        output->index_array[3 * face_ofs + 2] = vertexOffset + edge->next->next->vertex->id;
+        face_ofs++;
     }
 
+    output->index_count = face_ofs * 3;
+    // -- GODOT end --
+
     *error = Atlas_Error_Success;
     output->atlas_width = w;
     output->atlas_height = h;