diff options
Diffstat (limited to 'thirdparty/thekla_atlas')
-rw-r--r-- | thirdparty/thekla_atlas/nvcore/Debug.cpp | 14 | ||||
-rw-r--r-- | thirdparty/thekla_atlas/nvcore/DefsGnucWin32.h | 2 | ||||
-rw-r--r-- | thirdparty/thekla_atlas/nvmath/ftoi.h | 5 | ||||
-rw-r--r-- | thirdparty/thekla_atlas/nvmath/nvmath.h | 17 | ||||
-rw-r--r-- | thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.cpp | 30 | ||||
-rw-r--r-- | thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h | 4 | ||||
-rw-r--r-- | thirdparty/thekla_atlas/thekla/thekla_atlas.cpp | 23 |
7 files changed, 75 insertions, 20 deletions
diff --git a/thirdparty/thekla_atlas/nvcore/Debug.cpp b/thirdparty/thekla_atlas/nvcore/Debug.cpp index 113c551de8..4980ffa916 100644 --- a/thirdparty/thekla_atlas/nvcore/Debug.cpp +++ b/thirdparty/thekla_atlas/nvcore/Debug.cpp @@ -14,6 +14,7 @@ # define VC_EXTRALEAN # include <windows.h> # include <direct.h> +// -- GODOT start - # include <crtdbg.h> # if _MSC_VER < 1300 # define DECLSPEC_DEPRECATED @@ -24,6 +25,7 @@ // VC7: ships with updated headers # include <dbghelp.h> # endif +// -- GODOT end - # pragma comment(lib,"dbghelp.lib") #endif @@ -107,8 +109,9 @@ namespace #endif - +// -- GODOT start - #if NV_OS_WIN32 || NV_OS_DURANGO +// -- GODOT end - // We should try to simplify the top level filter as much as possible. // http://www.nynaeve.net/?p=128 @@ -391,8 +394,10 @@ namespace #pragma warning(disable:4748) static NV_NOINLINE int backtrace(void * trace[], int maxcount) { CONTEXT ctx = { 0 }; +// -- GODOT start -- #if NV_CPU_X86 && !NV_CPU_X86_64 ctx.ContextFlags = CONTEXT_CONTROL; +#if NV_CC_MSVC _asm { call x x: pop eax @@ -401,6 +406,13 @@ namespace mov ctx.Esp, esp } #else + register long unsigned int ebp asm("ebp"); + ctx.Eip = (DWORD) __builtin_return_address(0); + ctx.Ebp = ebp; + ctx.Esp = (DWORD) __builtin_frame_address(0); +#endif +// -- GODOT end -- +#else RtlCaptureContext(&ctx); // Not implemented correctly in x86. #endif diff --git a/thirdparty/thekla_atlas/nvcore/DefsGnucWin32.h b/thirdparty/thekla_atlas/nvcore/DefsGnucWin32.h index 4f97b90f3a..e1c8d6e4f8 100644 --- a/thirdparty/thekla_atlas/nvcore/DefsGnucWin32.h +++ b/thirdparty/thekla_atlas/nvcore/DefsGnucWin32.h @@ -19,7 +19,9 @@ #endif #define NV_FASTCALL __attribute__((fastcall)) +// -- GODOT start - #define NV_FORCEINLINE __attribute__((always_inline)) inline +// -- GODOT end - #define NV_DEPRECATED __attribute__((deprecated)) #if __GNUC__ > 2 diff --git a/thirdparty/thekla_atlas/nvmath/ftoi.h b/thirdparty/thekla_atlas/nvmath/ftoi.h index bee15c0908..182c56d1c3 100644 --- a/thirdparty/thekla_atlas/nvmath/ftoi.h +++ b/thirdparty/thekla_atlas/nvmath/ftoi.h @@ -53,7 +53,10 @@ namespace nv return (val<0) ? ftoi_ceil_xs(val) : ftoi_floor_xs(val); } -#if NV_CPU_X86 || NV_CPU_X86_64 +// -- GODOT start -- +//#if NV_CPU_X86 || NV_CPU_X86_64 +#if NV_USE_SSE +// -- GODOT end -- NV_FORCEINLINE int ftoi_round_sse(float f) { return _mm_cvt_ss2si(_mm_set_ss(f)); diff --git a/thirdparty/thekla_atlas/nvmath/nvmath.h b/thirdparty/thekla_atlas/nvmath/nvmath.h index 695f452c1d..f2b69426e1 100644 --- a/thirdparty/thekla_atlas/nvmath/nvmath.h +++ b/thirdparty/thekla_atlas/nvmath/nvmath.h @@ -14,10 +14,12 @@ #include <float.h> // finite, isnan #endif -#if NV_CPU_X86 || NV_CPU_X86_64 - //#include <intrin.h> - #include <xmmintrin.h> -#endif +// -- GODOT start -- +//#if NV_CPU_X86 || NV_CPU_X86_64 +// //#include <intrin.h> +// #include <xmmintrin.h> +//#endif +// -- GODOT end -- @@ -65,6 +67,13 @@ #endif +// -- GODOT start -- +#if NV_USE_SSE + //#include <intrin.h> + #include <xmmintrin.h> +#endif +// -- GODOT end -- + #ifndef PI #define PI float(3.1415926535897932384626433833) diff --git a/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.cpp b/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.cpp index 5ce452cb9e..fd37b8c59c 100644 --- a/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.cpp +++ b/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); diff --git a/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h b/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h index 2d305f38cd..845dbfb6f3 100644 --- a/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h +++ b/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; diff --git a/thirdparty/thekla_atlas/thekla/thekla_atlas.cpp b/thirdparty/thekla_atlas/thekla/thekla_atlas.cpp index d6f0accf54..de1953db8a 100644 --- a/thirdparty/thekla_atlas/thekla/thekla_atlas.cpp +++ b/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; |