mirror of https://github.com/bjornbytes/lovr.git
rm model samplers;
This commit is contained in:
parent
f13bfabb5d
commit
203a60c63a
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue