rm model samplers;

This commit is contained in:
bjorn 2022-05-01 15:41:34 -07:00
parent f13bfabb5d
commit 203a60c63a
3 changed files with 21 additions and 108 deletions

View File

@ -31,29 +31,6 @@ typedef enum {
DRAW_TRIANGLE_FAN
} DrawMode;
typedef enum {
FILTER_NEAREST,
FILTER_BILINEAR,
FILTER_TRILINEAR
} FilterMode;
typedef struct {
FilterMode mode;
float anisotropy;
} TextureFilter;
typedef enum {
WRAP_CLAMP,
WRAP_REPEAT,
WRAP_MIRRORED_REPEAT
} WrapMode;
typedef struct {
WrapMode s;
WrapMode t;
WrapMode r;
} TextureWrap;
typedef enum {
SCALAR_METALNESS,
SCALAR_ROUGHNESS,
@ -145,8 +122,6 @@ typedef struct {
float scalars[MAX_MATERIAL_SCALARS];
float colors[MAX_MATERIAL_COLORS][4];
uint32_t images[MAX_MATERIAL_TEXTURES];
TextureFilter filters[MAX_MATERIAL_TEXTURES];
TextureWrap wraps[MAX_MATERIAL_TEXTURES];
} ModelMaterial;
typedef struct {

View File

@ -48,14 +48,8 @@ typedef struct {
uint32_t primitiveCount;
} gltfMesh;
typedef struct {
TextureFilter filter;
TextureWrap wrap;
} gltfSampler;
typedef struct {
uint32_t image;
uint32_t sampler;
} gltfTexture;
typedef struct {
@ -79,6 +73,22 @@ static int nomValue(const char* data, jsmntok_t* token, int count, int sum) {
}
}
static jsmntok_t* nomTexture(const char* json, jsmntok_t* token, ModelMaterial* material, MaterialTexture textureType, gltfTexture* textures) {
for (int k = (token++)->size; k > 0; k--) {
gltfString key = NOM_STR(json, token);
if (STR_EQ(key, "index")) {
uint32_t index = NOM_INT(json, token);
gltfTexture* texture = &textures[index];
material->images[textureType] = texture->image;
} else if (STR_EQ(key, "texCoord")) {
lovrAssert(NOM_INT(json, token) == 0, "Only one set of texture coordinates is supported");
} else {
token += NOM_VALUE(json, token);
}
}
return token;
}
static void* decodeBase64(char* str, size_t length, size_t* decodedLength) {
char* s = memchr(str, ',', length);
if (!s) {
@ -131,25 +141,6 @@ static void* decodeBase64(char* str, size_t length, size_t* decodedLength) {
return data;
}
static jsmntok_t* resolveTexture(const char* json, jsmntok_t* token, ModelMaterial* material, MaterialTexture textureType, gltfTexture* textures, gltfSampler* samplers) {
for (int k = (token++)->size; k > 0; k--) {
gltfString key = NOM_STR(json, token);
if (STR_EQ(key, "index")) {
uint32_t index = NOM_INT(json, token);
gltfTexture* texture = &textures[index];
gltfSampler* sampler = texture->sampler == ~0u ? NULL : &samplers[texture->sampler];
material->images[textureType] = texture->image;
material->filters[textureType] = sampler ? sampler->filter : (TextureFilter) { .mode = FILTER_BILINEAR };
material->wraps[textureType] = sampler ? sampler->wrap : (TextureWrap) { .s = WRAP_REPEAT, .t = WRAP_REPEAT, .r = WRAP_REPEAT };
} else if (STR_EQ(key, "texCoord")) {
lovrAssert(NOM_INT(json, token) == 0, "Only one set of texture coordinates is supported");
} else {
token += NOM_VALUE(json, token);
}
}
return token;
}
ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io) {
uint8_t* data = source->data;
gltfHeader* header = (gltfHeader*) data;
@ -234,7 +225,6 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
gltfAnimationSampler* animationSamplers = NULL;
gltfMesh* meshes = NULL;
gltfSampler* samplers = NULL;
gltfTexture* textures = NULL;
gltfScene* scenes = NULL;
int rootScene = 0;
@ -311,63 +301,16 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
model->imageCount = token->size;
token += NOM_VALUE(json, token);
} else if (STR_EQ(key, "samplers")) {
samplers = malloc(token->size * sizeof(gltfSampler));
lovrAssert(samplers, "Out of memory");
gltfSampler* sampler = samplers;
for (int i = (token++)->size; i > 0; i--, sampler++) {
sampler->filter.mode = FILTER_BILINEAR;
sampler->wrap.s = sampler->wrap.t = sampler->wrap.r = WRAP_REPEAT;
int min = -1;
int mag = -1;
for (int k = (token++)->size; k > 0; k--) {
gltfString key = NOM_STR(json, token);
if (STR_EQ(key, "minFilter")) { min = NOM_INT(json, token); }
else if (STR_EQ(key, "magFilter")) { mag = NOM_INT(json, token); }
else if (STR_EQ(key, "wrapS")) {
switch (NOM_INT(json, token)) {
case 33071: sampler->wrap.s = WRAP_CLAMP; break;
case 33648: sampler->wrap.s = WRAP_MIRRORED_REPEAT; break;
case 10497: sampler->wrap.s = WRAP_REPEAT; break;
default: lovrThrow("Unknown sampler wrapS mode for sampler %d", i);
}
} else if (STR_EQ(key, "wrapT")) {
switch (NOM_INT(json, token)) {
case 33071: sampler->wrap.t = WRAP_CLAMP; break;
case 33648: sampler->wrap.t = WRAP_MIRRORED_REPEAT; break;
case 10497: sampler->wrap.t = WRAP_REPEAT; break;
default: lovrThrow("Unknown sampler wrapT mode for sampler %d", i);
}
} else {
token += NOM_VALUE(json, token);
}
}
if (min == 9728 || min == 9984 || min == 9986 || mag == 9728) {
sampler->filter.mode = FILTER_NEAREST;
} else {
switch (min) {
case 9729: sampler->filter.mode = FILTER_BILINEAR; break;
case 9985: sampler->filter.mode = FILTER_BILINEAR; break;
case 9987: sampler->filter.mode = FILTER_TRILINEAR; break;
}
}
}
} else if (STR_EQ(key, "textures")) {
textures = malloc(token->size * sizeof(gltfTexture));
lovrAssert(textures, "Out of memory");
gltfTexture* texture = textures;
for (int i = (token++)->size; i > 0; i--, texture++) {
texture->image = ~0u;
texture->sampler = ~0u;
for (int k = (token++)->size; k > 0; k--) {
gltfString key = NOM_STR(json, token);
if (STR_EQ(key, "source")) {
texture->image = NOM_INT(json, token);
} else if (STR_EQ(key, "sampler")) {
texture->sampler = NOM_INT(json, token);
} else {
token += NOM_VALUE(json, token);
}
@ -719,26 +662,24 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
material->colors[COLOR_DIFFUSE][2] = NOM_FLOAT(json, token);
material->colors[COLOR_DIFFUSE][3] = NOM_FLOAT(json, token);
} else if (STR_EQ(key, "baseColorTexture")) {
token = resolveTexture(json, token, material, TEXTURE_DIFFUSE, textures, samplers);
token = nomTexture(json, token, material, TEXTURE_DIFFUSE, textures);
} else if (STR_EQ(key, "metallicFactor")) {
material->scalars[SCALAR_METALNESS] = NOM_FLOAT(json, token);
} else if (STR_EQ(key, "roughnessFactor")) {
material->scalars[SCALAR_ROUGHNESS] = NOM_FLOAT(json, token);
} else if (STR_EQ(key, "metallicRoughnessTexture")) {
token = resolveTexture(json, token, material, TEXTURE_METALNESS, textures, samplers);
token = nomTexture(json, token, material, TEXTURE_METALNESS, textures);
material->images[TEXTURE_ROUGHNESS] = material->images[TEXTURE_METALNESS];
material->filters[TEXTURE_ROUGHNESS] = material->filters[TEXTURE_METALNESS];
material->wraps[TEXTURE_ROUGHNESS] = material->wraps[TEXTURE_METALNESS];
} else {
token += NOM_VALUE(json, token);
}
}
} else if (STR_EQ(key, "normalTexture")) {
token = resolveTexture(json, token, material, TEXTURE_NORMAL, textures, samplers);
token = nomTexture(json, token, material, TEXTURE_NORMAL, textures);
} else if (STR_EQ(key, "occlusionTexture")) {
token = resolveTexture(json, token, material, TEXTURE_OCCLUSION, textures, samplers);
token = nomTexture(json, token, material, TEXTURE_OCCLUSION, textures);
} else if (STR_EQ(key, "emissiveTexture")) {
token = resolveTexture(json, token, material, TEXTURE_EMISSIVE, textures, samplers);
token = nomTexture(json, token, material, TEXTURE_EMISSIVE, textures);
} else if (STR_EQ(key, "emissiveFactor")) {
token++; // Enter array
material->colors[COLOR_EMISSIVE][0] = NOM_FLOAT(json, token);
@ -942,7 +883,6 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
free(animationSamplers);
free(meshes);
free(samplers);
free(textures);
free(scenes);
free(heapTokens);

View File

@ -75,8 +75,6 @@ static void parseMtl(char* path, char* base, ModelDataIO* io, arr_image_t* image
lovrAssert(materials->length > 0, "Tried to set a material property without declaring a material first");
ModelMaterial* material = &materials->data[materials->length - 1];
material->images[TEXTURE_DIFFUSE] = (uint32_t) images->length;
material->filters[TEXTURE_DIFFUSE].mode = FILTER_TRILINEAR;
material->wraps[TEXTURE_DIFFUSE] = (TextureWrap) { .s = WRAP_REPEAT, .t = WRAP_REPEAT };
arr_push(images, image);
lovrRelease(blob, lovrBlobDestroy);
}