Parse textures;

This commit is contained in:
bjorn 2018-12-18 19:36:16 -08:00 committed by Bjorn Swenson
parent 39ce68f2be
commit c66a7468bb
2 changed files with 34 additions and 6 deletions

View File

@ -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);

View File

@ -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;