diff --git a/src/data/modelData.c b/src/data/modelData.c index ee8b5cb3..59f7c1ca 100644 --- a/src/data/modelData.c +++ b/src/data/modelData.c @@ -21,6 +21,7 @@ typedef struct { jsmntok_t* views; jsmntok_t* images; jsmntok_t* samplers; + jsmntok_t* textures; jsmntok_t* nodes; jsmntok_t* meshes; jsmntok_t* skins; @@ -381,6 +382,7 @@ static void parseSamplers(const char* json, jsmntok_t* token, ModelData* model) default: lovrThrow("Unknown sampler wrapT mode for sampler %d", i); } break; + default: token += nomValue(json, token, 1, 0); break; } } @@ -396,6 +398,23 @@ static void parseSamplers(const char* json, jsmntok_t* token, ModelData* model) } } +static void parseTextures(const char* json, jsmntok_t* token, ModelData* model) { + if (!token) return; + + int count = (token++)->size; + for (int i = 0; i < count; i++) { + ModelTexture* texture = &model->textures[i]; + int keyCount = (token++)->size; + for (int k = 0; k < keyCount; k++) { + switch (NOM_KEY(json, token)) { + case HASH16("source"): texture->image = NOM_INT(json, token); break; + case HASH16("sampler"): texture->sampler = NOM_INT(json, token); break; + default: token += nomValue(json, token, 1, 0); break; + } + } + } +} + static jsmntok_t* parsePrimitive(const char* json, jsmntok_t* token, int index, ModelData* model) { ModelPrimitive* primitive = &model->primitives[index]; memset(primitive->attributes, 0xff, sizeof(primitive->attributes)); @@ -605,6 +624,7 @@ ModelData* lovrModelDataInit(ModelData* model, Blob* blob, ModelDataIO io) { model->views = (ModelView*) (model->data + offset), offset += model->viewCount * sizeof(ModelView); model->images = (TextureData**) (model->data + offset), offset += model->imageCount * sizeof(TextureData*); model->samplers = (ModelSampler*) (model->data + offset), offset += model->samplerCount * sizeof(ModelSampler); + model->textures = (ModelTexture*) (model->data + offset), offset += model->textureCount * sizeof(ModelTexture); model->primitives = (ModelPrimitive*) (model->data + offset), offset += model->primitiveCount * sizeof(ModelPrimitive); model->meshes = (ModelMesh*) (model->data + offset), offset += model->meshCount * sizeof(ModelMesh); model->nodes = (ModelNode*) (model->data + offset), offset += model->nodeCount * sizeof(ModelNode); @@ -618,6 +638,7 @@ ModelData* lovrModelDataInit(ModelData* model, Blob* blob, ModelDataIO io) { parseViews(jsonData, info.views, model); parseImages(jsonData, info.images, model, io); parseSamplers(jsonData, info.samplers, model); + parseTextures(jsonData, info.textures, model); parseMeshes(jsonData, info.meshes, model); parseNodes(jsonData, info.nodes, model); parseSkins(jsonData, info.skins, model); diff --git a/src/data/modelData.h b/src/data/modelData.h index 87ff51fb..5faa52a7 100644 --- a/src/data/modelData.h +++ b/src/data/modelData.h @@ -141,6 +141,17 @@ typedef struct { int stride; } ModelView; +typedef struct { + TextureFilter filter; + TextureWrap wrap; + bool mipmaps; +} ModelSampler; + +typedef struct { + int image; + int sampler; +} ModelTexture; + typedef struct { float scalars[MAX_MATERIAL_SCALARS]; Color colors[MAX_MATERIAL_COLORS]; @@ -167,12 +178,6 @@ typedef struct { int skin; } ModelNode; -typedef struct { - TextureFilter filter; - TextureWrap wrap; - bool mipmaps; -} ModelSampler; - typedef struct { uint32_t* joints; uint32_t jointCount; @@ -215,6 +220,7 @@ typedef struct { ModelView* views; TextureData** images; ModelSampler* samplers; + ModelTexture* textures; ModelMaterial* materials; ModelPrimitive* primitives; ModelMesh* meshes; @@ -228,6 +234,7 @@ typedef struct { int viewCount; int imageCount; int samplerCount; + int textureCount; int materialCount; int primitiveCount; int meshCount;