Mercurial > games > semicongine
comparison semicongine/resources/mesh.nim @ 870:b975eab2b694
did: improve dynamic array, mesh and material APIs a ton, changes in material attributes are now detected and will trigger uniform-updates
| author | Sam <sam@basx.dev> |
|---|---|
| date | Sun, 07 Jan 2024 00:56:44 +0700 |
| parents | 65afec4cb6c6 |
| children | 1ee397815b0b |
comparison
equal
deleted
inserted
replaced
| 869:65afec4cb6c6 | 870:b975eab2b694 |
|---|---|
| 114 raise newException(Exception, "Sparce accessors are currently not implemented") | 114 raise newException(Exception, "Sparce accessors are currently not implemented") |
| 115 | 115 |
| 116 let accessorOffset = if accessor.hasKey("byteOffset"): accessor["byteOffset"].getInt() else: 0 | 116 let accessorOffset = if accessor.hasKey("byteOffset"): accessor["byteOffset"].getInt() else: 0 |
| 117 let length = bufferView["byteLength"].getInt() | 117 let length = bufferView["byteLength"].getInt() |
| 118 let bufferOffset = bufferView["byteOffset"].getInt() + accessorOffset | 118 let bufferOffset = bufferView["byteOffset"].getInt() + accessorOffset |
| 119 var dstPointer = result.getRawData()[0] | 119 var dstPointer = result.getPointer() |
| 120 | 120 |
| 121 if bufferView.hasKey("byteStride"): | 121 if bufferView.hasKey("byteStride"): |
| 122 warn "Congratulations, you try to test a feature (loading buffer data with stride attributes) that we have no idea where it is used and how it can be tested (need a coresponding *.glb file)." | 122 warn "Congratulations, you try to test a feature (loading buffer data with stride attributes) that we have no idea where it is used and how it can be tested (need a coresponding *.glb file)." |
| 123 # we don't support stride, have to convert stuff here... does this even work? | 123 # we don't support stride, have to convert stuff here... does this even work? |
| 124 for i in 0 ..< int(result.len): | 124 for i in 0 ..< int(result.len): |
| 168 | 168 |
| 169 # color | 169 # color |
| 170 if defaultMaterial.attributes.contains("color"): | 170 if defaultMaterial.attributes.contains("color"): |
| 171 attributes["color"] = initDataList(thetype=Vec4F32) | 171 attributes["color"] = initDataList(thetype=Vec4F32) |
| 172 if pbr.hasKey(GLTF_MATERIAL_MAPPING["color"]): | 172 if pbr.hasKey(GLTF_MATERIAL_MAPPING["color"]): |
| 173 setValue(attributes["color"], @[newVec4f( | 173 attributes["color"] = @[newVec4f( |
| 174 pbr[GLTF_MATERIAL_MAPPING["color"]][0].getFloat(), | 174 pbr[GLTF_MATERIAL_MAPPING["color"]][0].getFloat(), |
| 175 pbr[GLTF_MATERIAL_MAPPING["color"]][1].getFloat(), | 175 pbr[GLTF_MATERIAL_MAPPING["color"]][1].getFloat(), |
| 176 pbr[GLTF_MATERIAL_MAPPING["color"]][2].getFloat(), | 176 pbr[GLTF_MATERIAL_MAPPING["color"]][2].getFloat(), |
| 177 pbr[GLTF_MATERIAL_MAPPING["color"]][3].getFloat(), | 177 pbr[GLTF_MATERIAL_MAPPING["color"]][3].getFloat(), |
| 178 )]) | 178 )] |
| 179 else: | 179 else: |
| 180 setValue(attributes["color"], @[newVec4f(1, 1, 1, 1)]) | 180 attributes["color"] = @[newVec4f(1, 1, 1, 1)] |
| 181 | 181 |
| 182 # pbr material values | 182 # pbr material values |
| 183 for factor in ["metallic", "roughness"]: | 183 for factor in ["metallic", "roughness"]: |
| 184 if defaultMaterial.attributes.contains(factor): | 184 if defaultMaterial.attributes.contains(factor): |
| 185 attributes[factor] = initDataList(thetype=Float32) | 185 attributes[factor] = initDataList(thetype=Float32) |
| 186 if pbr.hasKey(GLTF_MATERIAL_MAPPING[factor]): | 186 if pbr.hasKey(GLTF_MATERIAL_MAPPING[factor]): |
| 187 setValue(attributes[factor], @[float32(pbr[GLTF_MATERIAL_MAPPING[factor]].getFloat())]) | 187 attributes[factor] = @[float32(pbr[GLTF_MATERIAL_MAPPING[factor]].getFloat())] |
| 188 else: | 188 else: |
| 189 setValue(attributes[factor], @[0.5'f32]) | 189 attributes[factor] = @[0.5'f32] |
| 190 | 190 |
| 191 # pbr material textures | 191 # pbr material textures |
| 192 for texture in ["baseTexture", "metallicRoughnessTexture"]: | 192 for texture in ["baseTexture", "metallicRoughnessTexture"]: |
| 193 if defaultMaterial.attributes.contains(texture): | 193 if defaultMaterial.attributes.contains(texture): |
| 194 attributes[texture] = initDataList(thetype=TextureType) | 194 attributes[texture] = initDataList(thetype=TextureType) |
| 195 # attributes[texture & "Index"] = initDataList(thetype=UInt8) | 195 # attributes[texture & "Index"] = initDataList(thetype=UInt8) |
| 196 if pbr.hasKey(GLTF_MATERIAL_MAPPING[texture]): | 196 if pbr.hasKey(GLTF_MATERIAL_MAPPING[texture]): |
| 197 setValue(attributes[texture], @[loadTexture(root, pbr[GLTF_MATERIAL_MAPPING[texture]]["index"].getInt(), mainBuffer)]) | 197 attributes[texture] = @[loadTexture(root, pbr[GLTF_MATERIAL_MAPPING[texture]]["index"].getInt(), mainBuffer)] |
| 198 # setValue(attributes[texture & "Index"], @[pbr[GLTF_MATERIAL_MAPPING[texture]].getOrDefault("texCoord").getInt(0).uint8]) | |
| 199 else: | 198 else: |
| 200 setValue(attributes[texture], @[EMPTY_TEXTURE]) | 199 attributes[texture] = @[EMPTY_TEXTURE] |
| 201 # setValue(attributes[texture & "Index"], @[0'u8]) | |
| 202 | 200 |
| 203 # generic material textures | 201 # generic material textures |
| 204 for texture in ["normalTexture", "occlusionTexture", "emissiveTexture"]: | 202 for texture in ["normalTexture", "occlusionTexture", "emissiveTexture"]: |
| 205 if defaultMaterial.attributes.contains(texture): | 203 if defaultMaterial.attributes.contains(texture): |
| 206 attributes[texture] = initDataList(thetype=TextureType) | 204 attributes[texture] = initDataList(thetype=TextureType) |
| 207 # attributes[texture & "Index"] = initDataList(thetype=UInt8) | 205 # attributes[texture & "Index"] = initDataList(thetype=UInt8) |
| 208 if materialNode.hasKey(GLTF_MATERIAL_MAPPING[texture]): | 206 if materialNode.hasKey(GLTF_MATERIAL_MAPPING[texture]): |
| 209 setValue(attributes[texture], @[loadTexture(root, materialNode[texture]["index"].getInt(), mainBuffer)]) | 207 attributes[texture] = @[loadTexture(root, materialNode[texture]["index"].getInt(), mainBuffer)] |
| 210 # setValue(attributes[texture & "Index"], @[materialNode[texture].getOrDefault("texCoord").getInt(0).uint8]) | |
| 211 else: | 208 else: |
| 212 setValue(attributes[texture], @[EMPTY_TEXTURE]) | 209 attributes[texture] = @[EMPTY_TEXTURE] |
| 213 # setValue(attributes[texture & "Index"], @[0'u8]) | |
| 214 | 210 |
| 215 # emissiv color | 211 # emissiv color |
| 216 if defaultMaterial.attributes.contains("emissiveColor"): | 212 if defaultMaterial.attributes.contains("emissiveColor"): |
| 217 attributes["emissiveColor"] = initDataList(thetype=Vec3F32) | 213 attributes["emissiveColor"] = initDataList(thetype=Vec3F32) |
| 218 if materialNode.hasKey(GLTF_MATERIAL_MAPPING["emissiveColor"]): | 214 if materialNode.hasKey(GLTF_MATERIAL_MAPPING["emissiveColor"]): |
| 219 setValue(attributes["emissiveColor"], @[newVec3f( | 215 attributes["emissiveColor"] = @[newVec3f( |
| 220 materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][0].getFloat(), | 216 materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][0].getFloat(), |
| 221 materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][1].getFloat(), | 217 materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][1].getFloat(), |
| 222 materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][2].getFloat(), | 218 materialNode[GLTF_MATERIAL_MAPPING["emissiveColor"]][2].getFloat(), |
| 223 )]) | 219 )] |
| 224 else: | 220 else: |
| 225 setValue(attributes["emissiveColor"], @[newVec3f(1'f32, 1'f32, 1'f32)]) | 221 attributes["emissiveColor"] = @[newVec3f(1'f32, 1'f32, 1'f32)] |
| 226 | 222 |
| 227 result = initMaterialData(theType=defaultMaterial, name=materialNode["name"].getStr(), attributes=attributes) | 223 result = initMaterialData(theType=defaultMaterial, name=materialNode["name"].getStr(), attributes=attributes) |
| 228 | 224 |
| 229 proc loadMesh(meshname: string, root: JsonNode, primitiveNode: JsonNode, defaultMaterial: MaterialType, mainBuffer: seq[uint8]): Mesh = | 225 proc loadMesh(meshname: string, root: JsonNode, primitiveNode: JsonNode, defaultMaterial: MaterialType, mainBuffer: seq[uint8]): Mesh = |
| 230 if primitiveNode.hasKey("mode") and primitiveNode["mode"].getInt() != 4: | 226 if primitiveNode.hasKey("mode") and primitiveNode["mode"].getInt() != 4: |
