├── README.md ├── .gitmodules ├── external └── meshoptimizer.lib └── meshoptimizer.odin /README.md: -------------------------------------------------------------------------------- 1 | # odin-meshoptimizer 2 | 3 | Binding for https://github.com/zeux/meshoptimizer 4 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "meshoptimizer"] 2 | path = meshoptimizer 3 | url = https://github.com/zeux/meshoptimizer 4 | -------------------------------------------------------------------------------- /external/meshoptimizer.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DanielGavin/odin-meshoptimizer/HEAD/external/meshoptimizer.lib -------------------------------------------------------------------------------- /meshoptimizer.odin: -------------------------------------------------------------------------------- 1 | package meshopt 2 | 3 | import _c "core:c" 4 | 5 | 6 | MESHOPTIMIZER_VERSION :: 220 7 | 8 | EncodeExpMode :: enum { 9 | /* When encoding exponents, use separate values for each component (maximum quality) */ 10 | meshopt_EncodeExpSeparate, 11 | /* When encoding exponents, use shared value for all components of each vector (better compression) */ 12 | meshopt_EncodeExpSharedVector, 13 | /* When encoding exponents, use shared value for each component of all vectors (best compression) */ 14 | meshopt_EncodeExpSharedComponent, 15 | /* Experimental: When encoding exponents, use separate values for each component, but clamp to 0 (good quality if very small values are not important) */ 16 | meshopt_EncodeExpClamped, 17 | } 18 | 19 | SimplifyLockBorder :: 1 20 | SimplifySparse :: 2 21 | SimplifyErrorAbsolute :: 4 22 | SimplifyPrune :: 8 23 | 24 | 25 | Stream :: struct { 26 | data: rawptr, 27 | size: uint, 28 | stride: uint, 29 | } 30 | 31 | VertexCacheStatistics :: struct { 32 | vertices_transformed: _c.uint, 33 | warps_executed: _c.uint, 34 | acmr: _c.float, 35 | atvr: _c.float, 36 | } 37 | 38 | OverdrawStatistics :: struct { 39 | pixels_covered: _c.uint, 40 | pixels_shaded: _c.uint, 41 | overdraw: _c.float, 42 | } 43 | 44 | VertexFetchStatistics :: struct { 45 | bytes_fetched: _c.uint, 46 | overfetch: _c.float, 47 | } 48 | 49 | Meshlet :: struct { 50 | vertex_offset: _c.uint, 51 | triangle_offset: _c.uint, 52 | vertex_count: _c.uint, 53 | triangle_count: _c.uint, 54 | } 55 | 56 | Bounds :: struct { 57 | center: [3]_c.float, 58 | radius: _c.float, 59 | cone_apex: [3]_c.float, 60 | cone_axis: [3]_c.float, 61 | cone_cutoff: _c.float, 62 | cone_axis_s8: [3]_c.schar, 63 | cone_cutoff_s8: _c.schar, 64 | } 65 | 66 | 67 | /***** meshoptimizer *****/ 68 | foreign import meshoptimizer "external/meshoptimizer.lib" 69 | 70 | /* Procedures */ 71 | @(link_prefix = "meshopt_") 72 | foreign meshoptimizer { 73 | generateVertexRemap :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertices: rawptr, vertex_count: uint, vertex_size: uint) -> uint --- 74 | generateVertexRemapMulti :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_count: uint, streams: ^Stream, stream_count: uint) -> uint --- 75 | remapVertexBuffer :: proc(destination: rawptr, vertices: rawptr, vertex_count: uint, vertex_size: uint, remap: ^_c.uint) --- 76 | remapIndexBuffer :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, remap: ^_c.uint) --- 77 | generateShadowIndexBuffer :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertices: rawptr, vertex_count: uint, vertex_size: uint, vertex_stride: uint) --- 78 | generateShadowIndexBufferMulti :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_count: uint, streams: ^Stream, stream_count: uint) --- 79 | generateAdjacencyIndexBuffer :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint) --- 80 | generateTessellationIndexBuffer :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint) --- 81 | optimizeVertexCache :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_count: uint) --- 82 | optimizeVertexCacheStrip :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_count: uint) --- 83 | optimizeVertexCacheFifo :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_count: uint, cache_size: _c.uint) --- 84 | optimizeOverdraw :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint, threshold: _c.float) --- 85 | optimizeVertexFetch :: proc(destination: rawptr, indices: ^_c.uint, index_count: uint, vertices: rawptr, vertex_count: uint, vertex_size: uint) -> uint --- 86 | optimizeVertexFetchRemap :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_count: uint) -> uint --- 87 | encodeIndexBuffer :: proc(buffer: ^_c.uchar, buffer_size: uint, indices: ^_c.uint, index_count: uint) -> uint --- 88 | encodeIndexBufferBound :: proc(index_count: uint, vertex_count: uint) -> uint --- 89 | encodeIndexVersion :: proc(version: int) --- 90 | decodeIndexBuffer :: proc(destination: rawptr, index_count: uint, index_size: uint, buffer: ^_c.uchar, buffer_size: uint) -> int --- 91 | encodeIndexSequence :: proc(buffer: ^_c.uchar, buffer_size: uint, indices: ^_c.uint, index_count: uint) -> uint --- 92 | encodeIndexSequenceBound :: proc(index_count: uint, vertex_count: uint) -> uint --- 93 | decodeIndexSequence :: proc(destination: rawptr, index_count: uint, index_size: uint, buffer: ^_c.uchar, buffer_size: uint) -> int --- 94 | encodeVertexBuffer :: proc(buffer: ^_c.uchar, buffer_size: uint, vertices: rawptr, vertex_count: uint, vertex_size: uint) -> uint --- 95 | encodeVertexBufferBound :: proc(vertex_count: uint, vertex_size: uint) -> uint --- 96 | encodeVertexVersion :: proc(version: int) --- 97 | decodeVertexBuffer :: proc(destination: rawptr, vertex_count: uint, vertex_size: uint, buffer: ^_c.uchar, buffer_size: uint) -> int --- 98 | stripify :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_count: uint, restart_index: _c.uint) -> uint --- 99 | stripifyBound :: proc(index_count: uint) -> uint --- 100 | unstripify :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, restart_index: _c.uint) -> uint --- 101 | unstripifyBound :: proc(index_count: uint) -> uint --- 102 | analyzeVertexCache :: proc(indices: ^_c.uint, index_count: uint, vertex_count: uint, cache_size: _c.uint, warp_size: _c.uint, primgroup_size: _c.uint) -> VertexCacheStatistics --- 103 | analyzeOverdraw :: proc(indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint) -> OverdrawStatistics --- 104 | analyzeVertexFetch :: proc(indices: ^_c.uint, index_count: uint, vertex_count: uint, vertex_size: uint) -> VertexFetchStatistics --- 105 | buildMeshlets :: proc(meshlets: ^Meshlet, meshlet_vertices: ^_c.uint, meshlet_triangles: ^_c.uchar, indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint, max_vertices: uint, max_triangles: uint, cone_weight: _c.float) -> uint --- 106 | buildMeshletsScan :: proc(meshlets: ^Meshlet, meshlet_vertices: ^_c.uint, meshlet_triangles: ^_c.uchar, indices: ^_c.uint, index_count: uint, vertex_count: uint, max_vertices: uint, max_triangles: uint) -> uint --- 107 | buildMeshletsBound :: proc(index_count: uint, max_vertices: uint, max_triangles: uint) -> uint --- 108 | computeClusterBounds :: proc(indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint) -> Bounds --- 109 | computeMeshletBounds :: proc(meshlet_vertices: ^_c.uint, meshlet_triangles: ^_c.uchar, triangle_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint) -> Bounds --- 110 | setAllocator :: proc(allocate: (proc "c" (_: uint) -> rawptr), deallocate: proc "c" (_: rawptr)) --- 111 | decodeFilterOct :: proc(buffer: rawptr, count: uint, stride: uint) --- 112 | decodeFilterQuat :: proc(buffer: rawptr, count: uint, stride: uint) --- 113 | decodeFilterExp :: proc(buffer: rawptr, count: uint, stride: uint) --- 114 | encodeFilterOct :: proc(destination: rawptr, count: uint, stride: uint, bits: int, data: ^_c.float) --- 115 | encodeFilterQuat :: proc(destination: rawptr, count: uint, stride: uint, bits: int, data: ^_c.float) --- 116 | encodeFilterExp :: proc(destination: rawptr, count: uint, stride: uint, bits: int, data: ^_c.float) --- 117 | simplifyWithAttributes :: proc(destination: rawptr, indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint, vertex_attributes: ^_c.float, vertex_attributes_stride: uint, attribute_weights: ^_c.float, attribute_count: uint, vertex_lock: ^u8, target_index_count: uint, target_error: f32, options: _c.uint, result_error: ^_c.float) --- 118 | simplify :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint, target_index_count: uint, target_error: _c.float, options: _c.uint, result_error: ^_c.float) -> uint --- 119 | simplifySloppy :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint, target_index_count: uint, target_error: _c.float, result_error: ^_c.float) -> uint --- 120 | simplifyPoints :: proc(destination: ^_c.uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint, target_vertex_count: uint) -> uint --- 121 | simplifyScale :: proc(vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint) -> _c.float --- 122 | spatialSortRemap :: proc(destination: ^_c.uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint) --- 123 | spatialSortTriangles :: proc(destination: ^_c.uint, indices: ^_c.uint, index_count: uint, vertex_positions: ^_c.float, vertex_count: uint, vertex_positions_stride: uint) --- 124 | } 125 | --------------------------------------------------------------------------------