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
|
DRAW_TRIANGLE_FAN
|
||||||
} DrawMode;
|
} 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 {
|
typedef enum {
|
||||||
SCALAR_METALNESS,
|
SCALAR_METALNESS,
|
||||||
SCALAR_ROUGHNESS,
|
SCALAR_ROUGHNESS,
|
||||||
|
@ -145,8 +122,6 @@ typedef struct {
|
||||||
float scalars[MAX_MATERIAL_SCALARS];
|
float scalars[MAX_MATERIAL_SCALARS];
|
||||||
float colors[MAX_MATERIAL_COLORS][4];
|
float colors[MAX_MATERIAL_COLORS][4];
|
||||||
uint32_t images[MAX_MATERIAL_TEXTURES];
|
uint32_t images[MAX_MATERIAL_TEXTURES];
|
||||||
TextureFilter filters[MAX_MATERIAL_TEXTURES];
|
|
||||||
TextureWrap wraps[MAX_MATERIAL_TEXTURES];
|
|
||||||
} ModelMaterial;
|
} ModelMaterial;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -48,14 +48,8 @@ typedef struct {
|
||||||
uint32_t primitiveCount;
|
uint32_t primitiveCount;
|
||||||
} gltfMesh;
|
} gltfMesh;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TextureFilter filter;
|
|
||||||
TextureWrap wrap;
|
|
||||||
} gltfSampler;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t image;
|
uint32_t image;
|
||||||
uint32_t sampler;
|
|
||||||
} gltfTexture;
|
} gltfTexture;
|
||||||
|
|
||||||
typedef struct {
|
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) {
|
static void* decodeBase64(char* str, size_t length, size_t* decodedLength) {
|
||||||
char* s = memchr(str, ',', length);
|
char* s = memchr(str, ',', length);
|
||||||
if (!s) {
|
if (!s) {
|
||||||
|
@ -131,25 +141,6 @@ static void* decodeBase64(char* str, size_t length, size_t* decodedLength) {
|
||||||
return data;
|
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) {
|
ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io) {
|
||||||
uint8_t* data = source->data;
|
uint8_t* data = source->data;
|
||||||
gltfHeader* header = (gltfHeader*) data;
|
gltfHeader* header = (gltfHeader*) data;
|
||||||
|
@ -234,7 +225,6 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
|
||||||
|
|
||||||
gltfAnimationSampler* animationSamplers = NULL;
|
gltfAnimationSampler* animationSamplers = NULL;
|
||||||
gltfMesh* meshes = NULL;
|
gltfMesh* meshes = NULL;
|
||||||
gltfSampler* samplers = NULL;
|
|
||||||
gltfTexture* textures = NULL;
|
gltfTexture* textures = NULL;
|
||||||
gltfScene* scenes = NULL;
|
gltfScene* scenes = NULL;
|
||||||
int rootScene = 0;
|
int rootScene = 0;
|
||||||
|
@ -311,63 +301,16 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
|
||||||
model->imageCount = token->size;
|
model->imageCount = token->size;
|
||||||
token += NOM_VALUE(json, token);
|
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")) {
|
} else if (STR_EQ(key, "textures")) {
|
||||||
textures = malloc(token->size * sizeof(gltfTexture));
|
textures = malloc(token->size * sizeof(gltfTexture));
|
||||||
lovrAssert(textures, "Out of memory");
|
lovrAssert(textures, "Out of memory");
|
||||||
gltfTexture* texture = textures;
|
gltfTexture* texture = textures;
|
||||||
for (int i = (token++)->size; i > 0; i--, texture++) {
|
for (int i = (token++)->size; i > 0; i--, texture++) {
|
||||||
texture->image = ~0u;
|
texture->image = ~0u;
|
||||||
texture->sampler = ~0u;
|
|
||||||
for (int k = (token++)->size; k > 0; k--) {
|
for (int k = (token++)->size; k > 0; k--) {
|
||||||
gltfString key = NOM_STR(json, token);
|
gltfString key = NOM_STR(json, token);
|
||||||
if (STR_EQ(key, "source")) {
|
if (STR_EQ(key, "source")) {
|
||||||
texture->image = NOM_INT(json, token);
|
texture->image = NOM_INT(json, token);
|
||||||
} else if (STR_EQ(key, "sampler")) {
|
|
||||||
texture->sampler = NOM_INT(json, token);
|
|
||||||
} else {
|
} else {
|
||||||
token += NOM_VALUE(json, token);
|
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][2] = NOM_FLOAT(json, token);
|
||||||
material->colors[COLOR_DIFFUSE][3] = NOM_FLOAT(json, token);
|
material->colors[COLOR_DIFFUSE][3] = NOM_FLOAT(json, token);
|
||||||
} else if (STR_EQ(key, "baseColorTexture")) {
|
} 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")) {
|
} else if (STR_EQ(key, "metallicFactor")) {
|
||||||
material->scalars[SCALAR_METALNESS] = NOM_FLOAT(json, token);
|
material->scalars[SCALAR_METALNESS] = NOM_FLOAT(json, token);
|
||||||
} else if (STR_EQ(key, "roughnessFactor")) {
|
} else if (STR_EQ(key, "roughnessFactor")) {
|
||||||
material->scalars[SCALAR_ROUGHNESS] = NOM_FLOAT(json, token);
|
material->scalars[SCALAR_ROUGHNESS] = NOM_FLOAT(json, token);
|
||||||
} else if (STR_EQ(key, "metallicRoughnessTexture")) {
|
} 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->images[TEXTURE_ROUGHNESS] = material->images[TEXTURE_METALNESS];
|
||||||
material->filters[TEXTURE_ROUGHNESS] = material->filters[TEXTURE_METALNESS];
|
|
||||||
material->wraps[TEXTURE_ROUGHNESS] = material->wraps[TEXTURE_METALNESS];
|
|
||||||
} else {
|
} else {
|
||||||
token += NOM_VALUE(json, token);
|
token += NOM_VALUE(json, token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (STR_EQ(key, "normalTexture")) {
|
} 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")) {
|
} 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")) {
|
} 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")) {
|
} else if (STR_EQ(key, "emissiveFactor")) {
|
||||||
token++; // Enter array
|
token++; // Enter array
|
||||||
material->colors[COLOR_EMISSIVE][0] = NOM_FLOAT(json, token);
|
material->colors[COLOR_EMISSIVE][0] = NOM_FLOAT(json, token);
|
||||||
|
@ -942,7 +883,6 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
|
||||||
|
|
||||||
free(animationSamplers);
|
free(animationSamplers);
|
||||||
free(meshes);
|
free(meshes);
|
||||||
free(samplers);
|
|
||||||
free(textures);
|
free(textures);
|
||||||
free(scenes);
|
free(scenes);
|
||||||
free(heapTokens);
|
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");
|
lovrAssert(materials->length > 0, "Tried to set a material property without declaring a material first");
|
||||||
ModelMaterial* material = &materials->data[materials->length - 1];
|
ModelMaterial* material = &materials->data[materials->length - 1];
|
||||||
material->images[TEXTURE_DIFFUSE] = (uint32_t) images->length;
|
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);
|
arr_push(images, image);
|
||||||
lovrRelease(blob, lovrBlobDestroy);
|
lovrRelease(blob, lovrBlobDestroy);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue