58 {
60
61
62 {
63 if (primitive.POSITION < 0)
64 {
65 SPICES_CORE_ERROR("Positions buffer invalid.")
66 return false;
67 }
68 const GltfAccessors::Item& positionAccessor = accessors->m_AccessorsData[primitive.POSITION];
69 const GltfBufferViews::Item& positionBufferView = bufferViews->m_BufferViewsData[positionAccessor.bufferView];
70 const GltfBuffers::Item& positionBuffer = buffers->m_BuffersData[positionBufferView.buffer];
71
72 const VkFormat format = GltfHelper::GetFormat(positionAccessor.type, positionAccessor.componentType);
73 const uint32_t bytes = GltfHelper::SizeOfFormat(format);
74
75 pack->m_MeshResource.positions.attributes->resize(positionAccessor.
count);
76 for (uint32_t i = 0; i < pack->m_MeshResource.positions.attributes->size(); i++)
77 {
78 const uint32_t offset = i * bytes;
79
80 auto p = reinterpret_cast<glm::vec3*>(&(*positionBuffer.buffer)[positionAccessor.byteOffset + positionBufferView.byteOffset + offset]);
81 (*pack->m_MeshResource.positions.attributes)[i] = *p;
82
83 glm::vec3& pos = (*pack->m_MeshResource.positions.attributes)[i];
84 pos.z = -pos.z;
85 }
86 }
87
88
89 bool hasNormal = false;
90 {
91 if (primitive.NORMAL < 0)
92 {
93 pack->m_MeshResource.normals.attributes->resize(1);
94 (*pack->m_MeshResource.normals.attributes)[0] = glm::vec3(0.0f, 1.0f, 0.0f);
95 }
96 else
97 {
98 hasNormal = true;
99
100 const GltfAccessors::Item& normalAccessor = accessors->m_AccessorsData[primitive.NORMAL];
101 const GltfBufferViews::Item& normalBufferView = bufferViews->m_BufferViewsData[normalAccessor.bufferView];
102 const GltfBuffers::Item& normalBuffer = buffers->m_BuffersData[normalBufferView.buffer];
103
106
107 pack->m_MeshResource.normals.attributes->resize(normalAccessor.count);
108 for (uint32_t i = 0; i < pack->m_MeshResource.normals.attributes->size(); i++)
109 {
110 const uint32_t offset = i * bytes;
111
112 auto n = reinterpret_cast<glm::vec3*>(&(*normalBuffer.buffer)[normalAccessor.byteOffset + normalBufferView.byteOffset + offset]);
113 (*pack->m_MeshResource.normals.attributes)[i] = *n;
114
115 glm::vec3& nor = (*pack->m_MeshResource.normals.attributes)[i];
116 nor.z = -nor.z;
117 }
118 }
119 }
120
121
122 bool hasColor = false;
123 {
124 pack->m_MeshResource.colors.attributes->resize(1);
125 (*pack->m_MeshResource.colors.attributes)[0] = glm::vec3(0.0f);
126 }
127
128
129 bool hasTexCoords = false;
130 {
131 if (primitive.TEXCOORD_0 < 0)
132 {
133 pack->m_MeshResource.texCoords.attributes->resize(1);
134 (*pack->m_MeshResource.texCoords.attributes)[0] = glm::vec2(0.0f);
135 }
136 else
137 {
138 hasTexCoords = true;
139
140 const GltfAccessors::Item& texCoordAccessor = accessors->m_AccessorsData[primitive.TEXCOORD_0];
141 const GltfBufferViews::Item& texCoordBufferView = bufferViews->m_BufferViewsData[texCoordAccessor.bufferView];
142 const GltfBuffers::Item& texCoordBuffer = buffers->m_BuffersData[texCoordBufferView.buffer];
143
144 const VkFormat format =
GltfHelper::GetFormat(texCoordAccessor.type, texCoordAccessor.componentType);
146
147 pack->m_MeshResource.texCoords.attributes->resize(texCoordAccessor.count);
148 for (uint32_t i = 0; i < pack->m_MeshResource.texCoords.attributes->size(); i++)
149 {
150 const uint32_t offset = i * bytes;
151
152 auto u = reinterpret_cast<glm::vec2*>(&(*texCoordBuffer.buffer)[texCoordAccessor.byteOffset + texCoordBufferView.byteOffset + offset]);
153 (*pack->m_MeshResource.texCoords.attributes)[i] = *u;
154
155 glm::vec2& uv = (*pack->m_MeshResource.texCoords.attributes)[i];
156
157 }
158 }
159 }
160
161
162 {
163 const GltfAccessors::Item& positionAccessor = accessors->m_AccessorsData[primitive.POSITION];
164
165 pack->m_MeshResource.vertices.attributes->resize(positionAccessor.count);
166
167 for(uint32_t i = 0; i < pack->m_MeshResource.vertices.attributes->size(); i++)
168 {
169 (*pack->m_MeshResource.vertices.attributes)[i] = glm::uvec4(i, hasNormal ? i : 0, hasColor ? i : 0, hasTexCoords ? i: 0);
170 }
171 }
172
173
174 {
175 if (primitive.indices < 0)
176 {
177 SPICES_CORE_ERROR("indices buffer invalid.")
178 return false;
179 }
180 const GltfAccessors::Item& indicesAccessor = accessors->m_AccessorsData[primitive.indices];
181 const GltfBufferViews::Item& indicesBufferView = bufferViews->m_BufferViewsData[indicesAccessor.bufferView];
182 const GltfBuffers::Item& indicesBuffer = buffers->m_BuffersData[indicesBufferView.buffer];
183
184 const VkFormat format = GltfHelper::GetFormat(indicesAccessor.type, indicesAccessor.componentType);
185 const uint32_t bytes = GltfHelper::SizeOfFormat(format);
186
187 pack->m_MeshResource.primitiveVertices.attributes->resize(indicesAccessor.
count / 3);
188 for (uint32_t i = 0; i < pack->m_MeshResource.primitiveVertices.attributes->size(); i++)
189 {
190 const uint32_t offset = i * 3 * bytes;
191
192 auto x = reinterpret_cast<unsigned short*>(&(*indicesBuffer.buffer)[indicesAccessor.byteOffset + indicesBufferView.byteOffset + offset + 0]);
193 auto y = reinterpret_cast<unsigned short*>(&(*indicesBuffer.buffer)[indicesAccessor.byteOffset + indicesBufferView.byteOffset + offset + bytes]);
194 auto z = reinterpret_cast<unsigned short*>(&(*indicesBuffer.buffer)[indicesAccessor.byteOffset + indicesBufferView.byteOffset + offset + bytes * 2]);
195
196 (*pack->m_MeshResource.primitiveVertices.attributes)[i] = glm::uvec3(*x, *y, *z);
197 }
198 }
199
200 return true;
201 }
#define SPICES_PROFILE_ZONE
static uint32_t SizeOfFormat(VkFormat format)
static VkFormat GetFormat(const std::string &str, int id)
constexpr int count
Calculate count that meets requirement.