implement model loading

This commit is contained in:
Matthew 2026-02-15 17:53:50 +11:00
parent ef612dcc19
commit b3d1caf18e
659 changed files with 177560 additions and 12 deletions

View File

@ -1,5 +1,5 @@
.git
.gitmodules
SDL
include/SDL3
external
build

292
alloc.cpp Normal file
View File

@ -0,0 +1,292 @@
constexpr u64 DEFAULT_ALIGNMENT = sizeof(void*);
struct ArenaPool
{
ArenaPool *next;
u8 *buffer;
u64 used;
u64 length;
};
struct Arena
{
ArenaPool *pool;
u64 default_size;
u64 active_pool;
};
struct TempArena
{
Arena *arena;
ArenaPool *start_pool;
u64 start_pos;
};
struct Scratch
{
Arena *arena[2];
u64 index;
bool init;
};
Scratch g_scratch;
void *
Malloc(usize size)
{
void *ptr = malloc(size);
memset(ptr, 0, size);
return ptr;
}
void
AddArenaPool(Arena *arena, usize size)
{
usize buffer_size = size+sizeof(ArenaPool);
ArenaPool *pool = (ArenaPool *)Malloc(buffer_size);
pool->buffer = (u8 *)MovePtrForward(pool, sizeof(ArenaPool));
pool->length = buffer_size - PtrSub(pool->buffer, pool);
pool->next = arena->pool;
arena->pool = pool;
}
Arena*
CreateArena(usize size)
{
usize buffer_size = size+sizeof(Arena)+sizeof(ArenaPool);
void *buffer = Malloc(buffer_size);
memset(buffer, 0, buffer_size);
Arena *arena = (Arena *)(buffer);
arena->default_size = size;
arena->active_pool = 0;
buffer = MovePtrForward(buffer, sizeof(Arena));
arena->pool = (ArenaPool *)buffer;
buffer = MovePtrForward(buffer, sizeof(ArenaPool));
arena->pool->buffer = (u8 *)buffer;
arena->pool->length = buffer_size - PtrSub(arena->pool->buffer, arena);
return arena;
}
TempArena
Begin(Arena* arena)
{
TempArena temp_arena = { .arena = arena };
ArenaPool *pool = arena->pool;
u64 pool_index = 0;
for(;;)
{
assert(pool);
if(arena->active_pool == pool_index++)
{
break;
}
pool = pool->next;
}
temp_arena.start_pool = pool;
temp_arena.start_pos = pool->used;
return temp_arena;
}
void
End(TempArena *temp_arena)
{
if(temp_arena->arena)
{
temp_arena->start_pool->used = temp_arena->start_pos;
ArenaPool *pool = temp_arena->start_pool->next;
while(pool)
{
pool->used = 0;
pool = pool->next;
}
}
}
template<typename T> T*
AllocAlign(Arena* arena, usize size, usize alignment)
{
T *ptr = NULL;
uintptr buffer_pos = 0, current = 0, offset = 0;
ArenaPool *pool = arena->pool;
u64 selected_pool = 0;
for(;;)
{
if(!pool)
{
if(size > arena->default_size)
{
size += arena->default_size;
}
AddArenaPool(arena, Max(size, arena->default_size));
pool = arena->pool;
}
buffer_pos = (uintptr)pool->buffer;
current = buffer_pos + pool->used;
offset = AlignPow2(current, alignment) - buffer_pos;
if(selected_pool >= arena->active_pool && offset+size <= pool->length)
{
break;
}
pool = pool->next;
selected_pool += 1;
}
if(selected_pool > arena->active_pool)
{
arena->active_pool = selected_pool;
}
ptr = (T *)((uintptr)(pool->buffer) + offset);
pool->used = offset+size;
return ptr;
}
template<typename T> T*
Alloc(Arena* arena)
{
return AllocAlign<T>(arena, sizeof(T), DEFAULT_ALIGNMENT);
}
template<typename T> Array<T>
Alloc(Arena* arena, u64 length)
{
Array<T> array;
array.ptr = AllocAlign<T>(arena, sizeof(T)*length, DEFAULT_ALIGNMENT);
array.length = length;
return array;
}
template<typename T> T *
AllocPtrArray(Arena *arena, u64 length)
{
return AllocAlign<T>(arena, sizeof(T)*length, DEFAULT_ALIGNMENT);
}
template<typename T> Array<T>
Alloc(TempArena temp_arena, u64 length)
{
return Alloc<T>(temp_arena.arena, length);
}
template<typename T> T *
Alloc(TempArena temp_arena)
{
return Alloc<T>(temp_arena.arena);
}
template<typename T> T *
AllocPtrArray(TempArena temp_arena, u64 length)
{
return AllocPtrArray<T>(temp_arena, length);
}
void
Reset(Arena* arena)
{
arena->active_pool = 0;
ArenaPool *pool = arena->pool;
while(pool)
{
pool->used = 0;
memset(pool->buffer, 0, pool->length);
pool = pool->next;
}
}
void
BeginScratch(u64 size = 0)
{
if(!g_scratch.init)
{
assert(size);
g_scratch.arena[0] = CreateArena(size);
g_scratch.arena[1] = CreateArena(size);
g_scratch.init = true;
}
else
{
g_scratch.index = g_scratch.index%2;
Reset(g_scratch.arena[g_scratch.index]);
}
}
template<typename T> T *
ScratchAlloc()
{
return Alloc<T>(g_scratch.arena[g_scratch.index]);
}
template<typename T> Array<T>
ScratchAlloc(u64 length)
{
return Alloc<T>(g_scratch.arena[g_scratch.index], length);
}
template<typename T> T *
ScratchAllocPtrArray(u64 length)
{
return AllocPtrArray<T>(g_scratch.arena[g_scratch.index], length);
}
template<typename T> T*
Alloc()
{
return (T *)Malloc(sizeof(T));
}
template<typename T> T *
AllocPtrArray(u64 length)
{
return (T *)Malloc(sizeof(T)*length);
}
template<typename T> Array<T>
Alloc(u64 length)
{
Array<T> array;
array.ptr = (T *)Malloc(sizeof(T)*length);
array.length = length;
return array;
}
template<typename T> void
Free(Array<T> *array)
{
free(array->ptr);
array->ptr = NULL;
array->length = 0;
}
template<typename T> void
Free(T **ptr)
{
free(*ptr);
*ptr = NULL;
}

754
assets.cpp Normal file
View File

@ -0,0 +1,754 @@
const u64 IMAGE_MAX = 1024;
#include <bit>
typedef MaterialMapIndex MMI;
struct MaterialMap
{
Vec4 color;
f32 value;
};
struct MaterialSet
{
MaterialMap maps[MMI_Max];
};
ImageBuffer CreateDefaultTexture(u8 *ptr, u64 w, u64 h);
MaterialSet CreateDefaultMaterialSet();
u8 DEFAULT_TEXTURE_DATA[32*32*4];
const ImageBuffer DEFAULT_TEXTURE = CreateDefaultTexture(DEFAULT_TEXTURE_DATA, 32, 32);
const MaterialSet DEFAULT_MATERIAL = CreateDefaultMaterialSet();
struct Vertex
{
Vec4 color;
Vec4 tangent;
Vec3 pos;
Vec3 normal;
Vec2 uv[2];
};
struct Mesh
{
u32 start;
u32 length;
u32 index_start;
u32 index_length;
u32 material_index;
};
struct Material
{
TextureID textures[MMI_Max];
PipelineID pipeline_id;
BufferID buffer_id;
};
struct Model
{
ModelBuffers buffers;
Array<Mesh> meshes;
Array<TextureID> textures;
Array<Material> materials;
};
Array<u8>
OpenFile(String8 file_path)
{
// TODO: get rid of malloc
Array<u8> buffer = {};
FILE *file = fopen((char *)file_path.ptr, "rb");
if(file)
{
fseek(file, 0, SEEK_END);
int length = ftell(file);
if(length)
{
buffer = Alloc<u8>(length+1);
buffer.length = length;
fseek(file, 0, SEEK_SET);
fread(buffer.ptr, 1, length, file);
buffer.ptr[buffer.length] = '\0';
}
fflush(file);
fclose(file);
}
else
{
perror("Unable to open file");
}
return buffer;
}
extern "C" cgltf_result
GLTFLoadCallback(const cgltf_memory_options *memory_opts, const cgltf_file_options *file_opts, const char *path, cgltf_size *size, void **data)
{
cgltf_result result = cgltf_result_io_error;
Array<u8> file_data = OpenFile(String8(path));
if(file_data)
{
*size = (cgltf_size)file_data.length;
*data = file_data.ptr;
result = cgltf_result_success;
}
return result;
}
extern "C" void
GLTFFreeCallback(const cgltf_memory_options *memory_opts, const cgltf_file_options *file_opts, void *data, cgltf_size size)
{
Free(&data);
}
void
UnloadImage(ImageBuffer* image_buffer)
{
stbi_image_free(image_buffer->data.ptr);
image_buffer->data.ptr = NULL;
image_buffer->data.length = 0;
}
MaterialSet
CreateDefaultMaterialSet()
{
MaterialSet set;
set.maps[MMI_Albedo].color = Vec4(1.0);
set.maps[MMI_Metallic].color = Vec4(1.0);
return set;
}
ImageBuffer
CreateDefaultTexture(u8 *ptr, u64 w, u64 h)
{
ImageBuffer image_buffer;
image_buffer.data.ptr = ptr;
image_buffer.data.length = w*h*4;
image_buffer.w = w;
image_buffer.h = h;
image_buffer.ch = 4;
u8 magenta[4] = {255, 0, 255, 255};
u8 black[4] = {0, 0, 0, 255};
u64 size = w*h*4;
u64 half = size/2;
for(u64 i = 0; i < size; i += 32)
{
bool swap = i <= half;
u8 *color0 = swap ? magenta : black;
u8 *color1 = swap ? black : magenta;
for(u64 j = 0; j < 16; j += 4)
{
ptr[i+j+0] = color0[0];
ptr[i+j+1] = color0[1];
ptr[i+j+2] = color0[2];
ptr[i+j+3] = color0[3];
ptr[i+j+16+0] = color0[0];
ptr[i+j+16+1] = color0[1];
ptr[i+j+16+2] = color0[2];
ptr[i+j+16+3] = color0[3];
}
}
return image_buffer;
}
ImageBuffer
LoadImage(void *data, i32 size)
{
ImageBuffer image_buffer;
i32 w, h, ch, desired_channels = 4;
image_buffer.data.ptr = stbi_load_from_memory((const u8 *)data, size, &w, &h, &ch, desired_channels);
if(w > 0 && h > 0 && ch > 0)
{
image_buffer.data.length = w*h*ch;
image_buffer.w = w;
image_buffer.h = h;
image_buffer.ch = ch;
}
else
{
printf("Failed to load image data\n");
image_buffer.data.ptr = NULL;
}
return image_buffer;
}
ImageBuffer
LoadImage(cgltf_image *asset_image, String8 texture_path)
{
ImageBuffer image_buffer;
if(asset_image)
{
String8 uri_path = String8(asset_image->uri);
if(StartsWith(uri_path, String8Lit("data:")))
{
u32 i;
for(i = 0; uri_path[i] != ',' && i < uri_path.length; i += 1);
if(uri_path[i] != 0 && i < uri_path.length-1)
{
u64 base64_length = strlen(asset_image->uri+i+1);
for(; uri_path[i+base64_length] == '='; base64_length -= 1);
u64 bit_count = base64_length*6 - (base64_length*6)%8;
i32 out_size = (i32)(bit_count/8);
void *data;
cgltf_options options;
options.file.read = GLTFLoadCallback;
options.file.release = GLTFFreeCallback;
cgltf_result result = cgltf_load_buffer_base64(&options, out_size, asset_image->uri+i+1, &data);
if(result == cgltf_result_success)
{
image_buffer = LoadImage(data, out_size);
cgltf_free((cgltf_data *)data);
}
}
else
{
printf("GLTF data for URI is not a valid image\n");
}
}
else
{
u8 buffer[512];
String8 file_path = SPrintf(buffer, "%s%s", texture_path.ptr, uri_path.ptr);
Array<u8> image_file = OpenFile(file_path);
image_buffer = LoadImage(image_file.ptr, (i32)image_file.length);
Free(&image_file);
}
}
else if(asset_image->buffer_view != NULL && asset_image->buffer_view->buffer->data != NULL)
{
Array<u8> image_data = Alloc<u8>(asset_image->buffer_view->size);
i32 offset = (i32)asset_image->buffer_view->offset;
i32 stride = (i32)asset_image->buffer_view->stride ? asset_image->buffer_view->stride : 1;
u64 length = asset_image->buffer_view->size - (asset_image->buffer_view->size%stride);
u8 *buffer_data = (u8 *)(asset_image->buffer_view->buffer->data);
memcpy(image_data.ptr, buffer_data, length);
String8 mime_type = String8(asset_image->mime_type);
String8 accepted_types[8] = {
String8Lit("image\\/png"), String8Lit("image/png"), String8Lit("image\\/jpeg"), String8Lit("image/jpeg"),
String8Lit("image\\/tga"), String8Lit("image/tga"), String8Lit("image\\/bmp"), String8Lit("image/bmp"),
};
bool accepted;
for(u64 i = 0; i < Length(accepted_types); i += 1)
{
if(mime_type == accepted_types[i])
{
accepted = true;
break;
}
}
if(accepted)
{
image_buffer = LoadImage(buffer_data, length);
}
else printf("Unable to load image, unknown image type [%s]", mime_type.ptr);
Free(&image_data);
}
if(image_buffer.data.ptr == NULL)
{
printf("Failed to load GLTF image data/file");
}
return image_buffer;
}
TextureID
LoadImageToTexture(cgltf_image *asset_image, String8 texture_path)
{
TextureID texture_id = g_renderer.default_texture;
ImageBuffer image_buffer = LoadImage(asset_image, texture_path);
if(image_buffer.data.ptr)
{
texture_id = CreateTexture(image_buffer);
Free(&image_buffer.data);
}
else Logf("Unable to load texture %s, setting default", asset_image->name);
return texture_id;
}
TextureID FindTexture(cgltf_texture *texture, cgltf_data *data, Model *model)
{
TextureID result = g_renderer.default_texture;
for(u64 i = 0; i < data->textures_count; i += 1)
{
if(texture == data->textures+i)
{
result = model->textures[i];
}
}
return result;
}
template<typename T> T *
GLTFBuffer(cgltf_accessor *accessor)
{
return (T *)(accessor->buffer_view->buffer->data) + (accessor->buffer_view->offset/sizeof(T)) + (accessor->offset/sizeof(T));
}
void
SetMeshData(Mesh *mesh, cgltf_accessor *accessor, u64 *vertex_count)
{
if(mesh->length == 0)
{
mesh->start = (u32)(*vertex_count);
mesh->length = (u32)(accessor->count);
(*vertex_count) += accessor->count;
}
}
#define AdvanceBuffer(T, buffer, accessor) (T *)((u8 *)(buffer) + accessor->stride)
void
SetVerticesWithTransform(cgltf_accessor *accessor, Array<Vertex> vertices, Mesh *mesh, usize offset, Mat4 &world_matrix, u64 *vertex_count)
{
SetMeshData(mesh, accessor, vertex_count);
f32 *buffer = GLTFBuffer<f32>(accessor);
for(u64 i = 0; i < mesh->length; i += 1, buffer = AdvanceBuffer(f32, buffer, accessor))
{
Vec3 *vtx_ptr = (Vec3 *)((u8 *)(&vertices[mesh->start+i]) + offset);
Vec3 vertex = Vec3(buffer[0], buffer[1], buffer[2]);
(*vtx_ptr) = Transform(vertex, world_matrix);
}
}
template<typename T> void
SetIndices(cgltf_accessor *accessor, Array<u32> indices, Mesh *mesh)
{
T *buffer = GLTFBuffer<T>(accessor);
for(u64 i = 0; i < mesh->index_length; i += 1)
{
indices[mesh->index_start+i] = (u32)(mesh->start + buffer[i]);
}
}
bool
LoadGLTF(Arena* arena, Model* model_result, String8 file_name)
{
Model model = {};
TempArena temp_arena = {};
Array<Vertex> vertices = {};
Array<u32> indices = {};
Array<u8> file_data = OpenFile(file_name);
assert(file_data.ptr); // TODO: handle errors
cgltf_options opts = {};
cgltf_data *data = NULL;
opts.file.read = GLTFLoadCallback;
opts.file.release = GLTFFreeCallback;
cgltf_result result = cgltf_parse(&opts, file_data.ptr, file_data.length, &data);
if(result == cgltf_result_success)
{
result = cgltf_load_buffers(&opts, data, file_name.ch_ptr);
if(result != cgltf_result_success)
{
Logf("LoadGLTF failure: Unable to load buffers");
}
u64 primitive_count = 0, vertex_count = 0, index_count = 0;
for(u64 i = 0; i < data->nodes_count; i += 1)
{
cgltf_node *node = data->nodes+i;
if(!node->mesh) continue;
for(u64 j = 0; j < node->mesh->primitives_count; j += 1)
{
auto p = node->mesh->primitives+j;
if(p->type == cgltf_primitive_type_triangles)
{
primitive_count += 1;
if(p->indices && p->indices->buffer_view)
{
index_count += p->indices->count;
}
for(u64 k = 0; k < p->attributes_count; k += 1)
{
if(p->attributes[k].type == cgltf_attribute_type_position)
{
vertex_count += p->attributes[k].data->count;
}
}
}
}
}
model.meshes = Alloc<Mesh>(arena, primitive_count);
model.textures = Alloc<TextureID>(arena, data->textures_count);
model.materials = Alloc<Material>(arena, data->materials_count);
temp_arena = Begin(arena);
String8 file_path = GetFilePath(file_name);
vertices = Alloc<Vertex>(temp_arena, vertex_count);
indices = Alloc<u32>(temp_arena, index_count);
for(u64 i = 0; i < model.textures.length; i += 1)
{
model.textures[i] = LoadImageToTexture(data->textures[i].image, file_path);
}
for(u64 i = 0; i < model.materials.length; i += 1)
{
model.materials[i].buffer_id = g_renderer.default_material;
for(u64 j = 0; j < MMI_Max; j += 1)
{
model.materials[i].textures[j] = g_renderer.default_texture;
}
}
for(u64 i = 0; i < data->materials_count; i += 1)
{
MaterialSet material_set;
TextureID *textures = model.materials[i].textures;
cgltf_material *material = data->materials+i;
if(material->has_pbr_metallic_roughness)
{
auto pbr_mr = &material->pbr_metallic_roughness;
if(pbr_mr->base_color_texture.texture)
{
textures[MMI_Albedo] = FindTexture(pbr_mr->base_color_texture.texture, data, &model);
}
memcpy(material_set.maps[MMI_Albedo].color.v, pbr_mr->base_color_factor, sizeof(f32)*4);
if(pbr_mr->metallic_roughness_texture.texture)
{
TextureID mr_texture = FindTexture(pbr_mr->metallic_roughness_texture.texture, data, &model);
textures[MMI_Metallic] = mr_texture;
textures[MMI_Roughness] = mr_texture;
material_set.maps[MMI_Metallic].value = pbr_mr->metallic_factor;
material_set.maps[MMI_Roughness].value = pbr_mr->roughness_factor;
}
if(material->normal_texture.texture)
{
textures[MMI_Normal] = FindTexture(material->normal_texture.texture, data, &model);
}
if(material->occlusion_texture.texture)
{
textures[MMI_Occlusion] = FindTexture(material->occlusion_texture.texture, data, &model);
}
if(material->emissive_texture.texture)
{
textures[MMI_Emission] = FindTexture(material->emissive_texture.texture, data, &model);
memcpy(material_set.maps[MMI_Emission].color.v, material->emissive_factor, sizeof(f32)*3);
material_set.maps[MMI_Emission].color.a = 1.0;
}
}
model.materials[i].buffer_id = CreateBuffer(&material_set);
}
u64 mesh_index = 0, point_index = 0;
vertex_count = 0;
for(u64 i = 0; i < data->nodes_count; i += 1)
{
cgltf_node *node = data->nodes+i;
cgltf_mesh *mesh = node->mesh;
if(!mesh) continue;
cgltf_float world_transform[16];
cgltf_node_transform_world(node, world_transform);
Mat4 world_matrix = Mat4(world_transform);
for(u64 p = 0; p < mesh->primitives_count; p += 1)
{
if(mesh->primitives[p].type != cgltf_primitive_type_triangles)
{
Logf("Unable to process primitive type [%d]", mesh->primitives[p].type);
continue;
}
auto prim = mesh->primitives+p;
Mesh *model_mesh = model.meshes.ptr+mesh_index;
for(u64 j = 0; j < prim->attributes_count; j += 1)
{
cgltf_accessor *accessor = prim->attributes[j].data;
switch(prim->attributes[j].type)
{
case cgltf_attribute_type_position:
{
SetVerticesWithTransform(accessor, vertices, model_mesh, offsetof(Vertex, pos), world_matrix, &vertex_count);
} break;
case cgltf_attribute_type_normal:
{
SetVerticesWithTransform(accessor, vertices, model_mesh, offsetof(Vertex, normal), world_matrix, &vertex_count);
} break;
case cgltf_attribute_type_tangent:
{
SetMeshData(model_mesh, accessor, &vertex_count);
f32 *buffer = GLTFBuffer<f32>(accessor);
for(u64 i = 0; i < model_mesh->length; i += 1, buffer = AdvanceBuffer(f32, buffer, accessor))
{
vertices[model_mesh->start+i].tangent = world_matrix * Vec4(buffer[0], buffer[1], buffer[2], buffer[3]);
}
} break;
case cgltf_attribute_type_texcoord:
{
if(accessor->type == cgltf_type_vec2)
{
SetMeshData(model_mesh, accessor, &vertex_count);
u32 uv_index = prim->attributes[j].index;
if(uv_index >= 2) // index into UV set
{
Logf("Unable to use more than two UVs, ignoring UV");
}
switch(accessor->component_type)
{
case cgltf_component_type_r_8u:
{
u8 *buffer = GLTFBuffer<u8>(accessor);
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(u8, buffer, accessor))
{
vertices[model_mesh->start+k].uv[uv_index] = Vec2((f32)(buffer[0]&0xFF)/255.0f, (f32)(buffer[1]&0xFF)/255.0f);
}
} break;
case cgltf_component_type_r_16u:
{
u16 *buffer = GLTFBuffer<u16>(accessor);
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(u16, buffer, accessor))
{
vertices[model_mesh->start+k].uv[uv_index] = Vec2((f32)(buffer[0]&0xFFFF)/65535.0f, (f32)(buffer[1]&0xFFFF)/65535.0f);
}
} break;
case cgltf_component_type_r_32f:
{
f32 *buffer = GLTFBuffer<f32>(accessor);
f32 *start_b = buffer;
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(f32, buffer, accessor))
{
vertices[model_mesh->start+k].uv[uv_index] = Vec2(buffer[0], buffer[1]);
}
} break;
default: Logf("Unsupported component type for UV [%llu], ignoring", accessor->component_type); break;
}
}
} break;
case cgltf_attribute_type_color:
{
if(accessor->type == cgltf_type_vec3 || accessor->type == cgltf_type_vec4)
{
SetMeshData(model_mesh, accessor, &vertex_count);
if(accessor->type == cgltf_type_vec3)
{
switch(accessor->component_type)
{
case cgltf_component_type_r_8u:
{
u8 *buffer = GLTFBuffer<u8>(accessor);
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(u8, buffer, accessor))
{
vertices[model_mesh->start+k].color = Vec4(
(f32)(buffer[0]&0xFF)/255.0f,
(f32)(buffer[1]&0xFF)/255.0f,
(f32)(buffer[2]&0xFF)/255.0f,
1.0
);
}
} break;
case cgltf_component_type_r_16u:
{
u16 *buffer = GLTFBuffer<u16>(accessor);
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(u16, buffer, accessor))
{
vertices[model_mesh->start+k].color = Vec4(
(f32)(buffer[0]&0xFFFF)/65535.0f,
(f32)(buffer[1]&0xFFFF)/65535.0f,
(f32)(buffer[2]&0xFFFF)/65535.0f,
1.0
);
}
} break;
case cgltf_component_type_r_32f:
{
f32 *buffer = GLTFBuffer<f32>(accessor);
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(f32, buffer, accessor))
{
vertices[model_mesh->start+k].color = Vec4(buffer[0], buffer[1], buffer[2], 1.0f);
}
} break;
default: Logf("Color component type is not supported [%llu]", accessor->component_type); break;
}
}
else if(accessor->type == cgltf_type_vec4)
{
switch(accessor->component_type)
{
case cgltf_component_type_r_8u:
{
u8 *buffer = GLTFBuffer<u8>(accessor);
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(u8, buffer, accessor))
{
vertices[model_mesh->start+k].color = Vec4(
(f32)(buffer[0]&0xFF)/255.0f,
(f32)(buffer[1]&0xFF)/255.0f,
(f32)(buffer[2]&0xFF)/255.0f,
(f32)(buffer[3]&0xFF)/255.0f
);
}
} break;
case cgltf_component_type_r_16u:
{
u16 *buffer = GLTFBuffer<u16>(accessor);
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(u16, buffer, accessor))
{
vertices[model_mesh->start+k].color = Vec4(
(f32)(buffer[0]&0xFFFF)/65535.0f,
(f32)(buffer[1]&0xFFFF)/65535.0f,
(f32)(buffer[2]&0xFFFF)/65535.0f,
(f32)(buffer[3]&0xFFFF)/65535.0f
);
}
} break;
case cgltf_component_type_r_32f:
{
f32 *buffer = GLTFBuffer<f32>(accessor);
for(u64 k = 0; k < model_mesh->length; k += 1, buffer = AdvanceBuffer(f32, buffer, accessor))
{
vertices[model_mesh->start+k].color = Vec4(buffer[0], buffer[1], buffer[2], buffer[3]);
}
} break;
default: Logf("Color component type is not supported [%llu]", accessor->component_type); break;
}
}
}
} break;
default: Logf("Unsupported attribute type [%llu]", prim->attributes[j].type); break;
}
}
if(prim->indices && prim->indices->buffer_view)
{
cgltf_accessor *accessor = prim->indices;
model_mesh->index_start = point_index;
model_mesh->index_length = accessor->count;
point_index += accessor->count;
switch(accessor->component_type)
{
case cgltf_component_type_r_8u: SetIndices<u8>(accessor, indices, model_mesh); break;
case cgltf_component_type_r_16u: SetIndices<u16>(accessor, indices, model_mesh); break;
case cgltf_component_type_r_32u: SetIndices<u32>(accessor, indices, model_mesh); break;
default: Logf("Unsupported index component type [%llu]", accessor->component_type); break;
}
}
else // Unindexed mesh
{
Logf("Unindexed mesh are currently not supported, ignoring");
}
for(u64 k = 0; k < data->materials_count; k += 1)
{
if(data->materials+k == prim->material)
{
model.meshes[mesh_index].material_index = k;
break;
}
}
mesh_index += 1;
}
}
Free(&file_data);
model.buffers = CreateModelBuffers();
glBindVertexArray(model.buffers.vertex_array);
glBindBuffer(GL_ARRAY_BUFFER, model.buffers.vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*vertices.length, vertices.ptr, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model.buffers.index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(u32)*indices.length, indices.ptr, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, color));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, tangent));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, pos));
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, normal));
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, uv[0]));
glEnableVertexAttribArray(5);
glVertexAttribPointer(5, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)(offsetof(Vertex, uv[1])));
glBindVertexArray(0);
End(&temp_arena);
*model_result = model;
cgltf_free(data);
}
return result == cgltf_result_success;
}

BIN
assets/Avocado.bin Normal file

Binary file not shown.

155
assets/Avocado.gltf Normal file
View File

@ -0,0 +1,155 @@
{
"accessors": [
{
"bufferView": 0,
"componentType": 5126,
"count": 406,
"type": "VEC2"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 406,
"type": "VEC3"
},
{
"bufferView": 2,
"componentType": 5126,
"count": 406,
"type": "VEC4"
},
{
"bufferView": 3,
"componentType": 5126,
"count": 406,
"type": "VEC3",
"max": [
0.02128091,
0.06284806,
0.0138090011
],
"min": [
-0.02128091,
-4.773855E-05,
-0.013809
]
},
{
"bufferView": 4,
"componentType": 5123,
"count": 2046,
"type": "SCALAR"
}
],
"asset": {
"generator": "glTF Tools for Unity",
"version": "2.0"
},
"bufferViews": [
{
"buffer": 0,
"byteLength": 3248
},
{
"buffer": 0,
"byteOffset": 3248,
"byteLength": 4872
},
{
"buffer": 0,
"byteOffset": 8120,
"byteLength": 6496
},
{
"buffer": 0,
"byteOffset": 14616,
"byteLength": 4872
},
{
"buffer": 0,
"byteOffset": 19488,
"byteLength": 4092
}
],
"buffers": [
{
"uri": "Avocado.bin",
"byteLength": 23580
}
],
"images": [
{
"uri": "Avocado_baseColor.png"
},
{
"uri": "Avocado_roughnessMetallic.png"
},
{
"uri": "Avocado_normal.png"
}
],
"meshes": [
{
"primitives": [
{
"attributes": {
"TEXCOORD_0": 0,
"NORMAL": 1,
"TANGENT": 2,
"POSITION": 3
},
"indices": 4,
"material": 0
}
],
"name": "Avocado"
}
],
"materials": [
{
"pbrMetallicRoughness": {
"baseColorTexture": {
"index": 0
},
"metallicRoughnessTexture": {
"index": 1
}
},
"normalTexture": {
"index": 2
},
"name": "2256_Avocado_d"
}
],
"nodes": [
{
"mesh": 0,
"rotation": [
0.0,
1.0,
0.0,
0.0
],
"name": "Avocado"
}
],
"scene": 0,
"scenes": [
{
"nodes": [
0
]
}
],
"textures": [
{
"source": 0
},
{
"source": 1
},
{
"source": 2
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

BIN
assets/Avocado_normal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
assets/Cube.bin Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
assets/Cube_BaseColor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

View File

@ -0,0 +1,22 @@
This is the PRO version of the Stylized Nature Megakit, which contains
all of the models (116/116). You can buy the SOURCE version
which has all the models and also includes Unity(URP), Unreal Engine and Godot projects
with the stylized shader already set up.
You can get the other versions from the website https://quaternius.com
-------------------------------------------------------
License:
CC0 1.0 Universal (CC0 1.0)
Public Domain Dedication
https://creativecommons.org/publicdomain/zero/1.0/
------------------------------------------------------
Models by @Quaternius
Consider supporting me on Patreon!
https://www.patreon.com/quaternius
-------------------------------------------------------
Join the Discord Server:
https://discord.gg/vJqnRUYRfT

Binary file not shown.

After

Width:  |  Height:  |  Size: 584 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

View File

@ -0,0 +1,262 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Birch_1"
}
],
"materials":[
{
"doubleSided":true,
"name":"Bark_Birch",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_Birch",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.003",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_BirchTree_Normal",
"uri":"Bark_BirchTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_BirchTree",
"uri":"Bark_BirchTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_Birch_C",
"uri":"Leaves_Birch_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":7597,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":7597,
"max":[
2.8055684566497803,
11.920513153076172,
2.158252239227295
],
"min":[
-2.412018060684204,
-0.4285776913166046,
-3.071343183517456
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":7597,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":7597,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":14526,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":3072,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":3072,
"max":[
3.4271676540374756,
13.293113708496094,
2.8316140174865723
],
"min":[
-3.0056581497192383,
4.435910701751709,
-3.710219144821167
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":3072,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":3072,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":4608,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":121552,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":91164,
"byteOffset":121552,
"target":34962
},
{
"buffer":0,
"byteLength":91164,
"byteOffset":212716,
"target":34962
},
{
"buffer":0,
"byteLength":60776,
"byteOffset":303880,
"target":34962
},
{
"buffer":0,
"byteLength":29052,
"byteOffset":364656,
"target":34963
},
{
"buffer":0,
"byteLength":49152,
"byteOffset":393708,
"target":34962
},
{
"buffer":0,
"byteLength":36864,
"byteOffset":442860,
"target":34962
},
{
"buffer":0,
"byteLength":36864,
"byteOffset":479724,
"target":34962
},
{
"buffer":0,
"byteLength":24576,
"byteOffset":516588,
"target":34962
},
{
"buffer":0,
"byteLength":9216,
"byteOffset":541164,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":550380,
"uri":"Birch_1.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,262 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Birch_2"
}
],
"materials":[
{
"doubleSided":true,
"name":"Bark_Birch",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_Birch",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.004",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_BirchTree_Normal",
"uri":"Bark_BirchTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_BirchTree",
"uri":"Bark_BirchTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_Birch_C",
"uri":"Leaves_Birch_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":6574,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":6574,
"max":[
3.22851300239563,
12.46019172668457,
1.1877045631408691
],
"min":[
-2.3360869884490967,
-0.428577721118927,
-2.7287137508392334
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":6574,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":6574,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":13599,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":4224,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":4224,
"max":[
3.7881360054016113,
13.101866722106934,
1.8924623727798462
],
"min":[
-2.875913143157959,
4.623663902282715,
-3.3586809635162354
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":4224,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":4224,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":6336,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":105184,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":78888,
"byteOffset":105184,
"target":34962
},
{
"buffer":0,
"byteLength":78888,
"byteOffset":184072,
"target":34962
},
{
"buffer":0,
"byteLength":52592,
"byteOffset":262960,
"target":34962
},
{
"buffer":0,
"byteLength":27198,
"byteOffset":315552,
"target":34963
},
{
"buffer":0,
"byteLength":67584,
"byteOffset":342752,
"target":34962
},
{
"buffer":0,
"byteLength":50688,
"byteOffset":410336,
"target":34962
},
{
"buffer":0,
"byteLength":50688,
"byteOffset":461024,
"target":34962
},
{
"buffer":0,
"byteLength":33792,
"byteOffset":511712,
"target":34962
},
{
"buffer":0,
"byteLength":12672,
"byteOffset":545504,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":558176,
"uri":"Birch_2.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,262 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Birch_3"
}
],
"materials":[
{
"doubleSided":true,
"name":"Bark_Birch",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_Birch",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.005",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_BirchTree_Normal",
"uri":"Bark_BirchTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_BirchTree",
"uri":"Bark_BirchTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_Birch_C",
"uri":"Leaves_Birch_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":6359,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":6359,
"max":[
4.2283711433410645,
12.36229133605957,
1.8531852960586548
],
"min":[
-2.045778512954712,
-0.4285776913166046,
-3.2668685913085938
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":6359,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":6359,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":12879,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":3056,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":3056,
"max":[
4.819523334503174,
12.926748275756836,
2.6471641063690186
],
"min":[
-3.152590274810791,
5.477759838104248,
-4.073222637176514
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":3056,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":3056,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":4584,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":101744,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":76308,
"byteOffset":101744,
"target":34962
},
{
"buffer":0,
"byteLength":76308,
"byteOffset":178052,
"target":34962
},
{
"buffer":0,
"byteLength":50872,
"byteOffset":254360,
"target":34962
},
{
"buffer":0,
"byteLength":25758,
"byteOffset":305232,
"target":34963
},
{
"buffer":0,
"byteLength":48896,
"byteOffset":330992,
"target":34962
},
{
"buffer":0,
"byteLength":36672,
"byteOffset":379888,
"target":34962
},
{
"buffer":0,
"byteLength":36672,
"byteOffset":416560,
"target":34962
},
{
"buffer":0,
"byteLength":24448,
"byteOffset":453232,
"target":34962
},
{
"buffer":0,
"byteLength":9168,
"byteOffset":477680,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":486848,
"uri":"Birch_3.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,262 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Birch_4"
}
],
"materials":[
{
"doubleSided":true,
"name":"Bark_Birch",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_Birch",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.006",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_BirchTree_Normal",
"uri":"Bark_BirchTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_BirchTree",
"uri":"Bark_BirchTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_Birch_C",
"uri":"Leaves_Birch_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":6350,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":6350,
"max":[
2.5928025245666504,
10.423952102661133,
3.0175139904022217
],
"min":[
-2.343264102935791,
-0.4285776913166046,
-2.4500553607940674
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":6350,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":6350,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":12768,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":3056,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":3056,
"max":[
3.188059091567993,
11.192404747009277,
3.5388429164886475
],
"min":[
-3.0476174354553223,
4.711092472076416,
-3.103534460067749
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":3056,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":3056,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":4584,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":101600,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":76200,
"byteOffset":101600,
"target":34962
},
{
"buffer":0,
"byteLength":76200,
"byteOffset":177800,
"target":34962
},
{
"buffer":0,
"byteLength":50800,
"byteOffset":254000,
"target":34962
},
{
"buffer":0,
"byteLength":25536,
"byteOffset":304800,
"target":34963
},
{
"buffer":0,
"byteLength":48896,
"byteOffset":330336,
"target":34962
},
{
"buffer":0,
"byteLength":36672,
"byteOffset":379232,
"target":34962
},
{
"buffer":0,
"byteLength":36672,
"byteOffset":415904,
"target":34962
},
{
"buffer":0,
"byteLength":24448,
"byteOffset":452576,
"target":34962
},
{
"buffer":0,
"byteLength":9168,
"byteOffset":477024,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":486192,
"uri":"Birch_4.bin"
}
]
}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,262 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Birch_5"
}
],
"materials":[
{
"doubleSided":true,
"name":"Bark_Birch",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_Birch",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.007",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_BirchTree_Normal",
"uri":"Bark_BirchTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_BirchTree",
"uri":"Bark_BirchTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_Birch_C",
"uri":"Leaves_Birch_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":5482,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":5482,
"max":[
3.253328323364258,
12.484357833862305,
0.703652560710907
],
"min":[
-2.242967128753662,
-0.428577721118927,
-3.905938148498535
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":5482,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":5482,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":10710,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":3072,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":3072,
"max":[
3.809194803237915,
13.289700508117676,
1.2367165088653564
],
"min":[
-2.8990869522094727,
4.210744857788086,
-5.081326007843018
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":3072,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":3072,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":4608,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":87712,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":65784,
"byteOffset":87712,
"target":34962
},
{
"buffer":0,
"byteLength":65784,
"byteOffset":153496,
"target":34962
},
{
"buffer":0,
"byteLength":43856,
"byteOffset":219280,
"target":34962
},
{
"buffer":0,
"byteLength":21420,
"byteOffset":263136,
"target":34963
},
{
"buffer":0,
"byteLength":49152,
"byteOffset":284556,
"target":34962
},
{
"buffer":0,
"byteLength":36864,
"byteOffset":333708,
"target":34962
},
{
"buffer":0,
"byteLength":36864,
"byteOffset":370572,
"target":34962
},
{
"buffer":0,
"byteLength":24576,
"byteOffset":407436,
"target":34962
},
{
"buffer":0,
"byteLength":9216,
"byteOffset":432012,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":441228,
"uri":"Birch_5.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,151 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Bush_Common"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_TwistedTree",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":0
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.008",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
}
],
"images":[
{
"mimeType":"image/png",
"name":"Leaves_TwistedTree_C",
"uri":"Leaves_TwistedTree_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":1800,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":1800,
"max":[
0.9913685917854309,
1.3470909595489502,
0.9907516837120056
],
"min":[
-0.9234761595726013,
-0.234694704413414,
-0.9743891954421997
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":1800,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":1800,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":2700,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":28800,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":21600,
"byteOffset":28800,
"target":34962
},
{
"buffer":0,
"byteLength":21600,
"byteOffset":50400,
"target":34962
},
{
"buffer":0,
"byteLength":14400,
"byteOffset":72000,
"target":34962
},
{
"buffer":0,
"byteLength":5400,
"byteOffset":86400,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":91800,
"uri":"Bush_Common.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,252 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Bush_Common_Flowers"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_NormalTree",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":0
},
"metallicFactor":0
}
},
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Flowers",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.009",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
}
],
"images":[
{
"mimeType":"image/png",
"name":"Leaves_NormalTree_C",
"uri":"Leaves_NormalTree_C.png"
},
{
"mimeType":"image/png",
"name":"Flowers",
"uri":"Flowers.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":1800,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":1800,
"max":[
0.9913685917854309,
1.3470909595489502,
0.9907516837120056
],
"min":[
-0.9234761595726013,
-0.234694704413414,
-0.9743891954421997
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":1800,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":1800,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":2700,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":715,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":715,
"max":[
0.9718135595321655,
1.328537940979004,
0.98771071434021
],
"min":[
-0.7453983426094055,
0.2586841881275177,
-0.9251851439476013
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":715,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":715,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":1404,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":28800,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":21600,
"byteOffset":28800,
"target":34962
},
{
"buffer":0,
"byteLength":21600,
"byteOffset":50400,
"target":34962
},
{
"buffer":0,
"byteLength":14400,
"byteOffset":72000,
"target":34962
},
{
"buffer":0,
"byteLength":5400,
"byteOffset":86400,
"target":34963
},
{
"buffer":0,
"byteLength":11440,
"byteOffset":91800,
"target":34962
},
{
"buffer":0,
"byteLength":8580,
"byteOffset":103240,
"target":34962
},
{
"buffer":0,
"byteLength":8580,
"byteOffset":111820,
"target":34962
},
{
"buffer":0,
"byteLength":5720,
"byteOffset":120400,
"target":34962
},
{
"buffer":0,
"byteLength":2808,
"byteOffset":126120,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":128928,
"uri":"Bush_Common_Flowers.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,151 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Bush_Large"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_GiantPine",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":0
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.046",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
}
],
"images":[
{
"mimeType":"image/png",
"name":"Leaves_GiantPine_C",
"uri":"Leaves_GiantPine_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":1728,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":1728,
"max":[
1.8775538206100464,
2.833508014678955,
1.8439654111862183
],
"min":[
-1.7178152799606323,
-0.41830262541770935,
-1.8215556144714355
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":1728,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":1728,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":2592,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":27648,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":20736,
"byteOffset":27648,
"target":34962
},
{
"buffer":0,
"byteLength":20736,
"byteOffset":48384,
"target":34962
},
{
"buffer":0,
"byteLength":13824,
"byteOffset":69120,
"target":34962
},
{
"buffer":0,
"byteLength":5184,
"byteOffset":82944,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":88128,
"uri":"Bush_Large.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,252 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Bush_Large_Flowers"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Flowers",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":0
},
"metallicFactor":0
}
},
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_GiantPine",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.010",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
}
],
"images":[
{
"mimeType":"image/png",
"name":"Flowers",
"uri":"Flowers.png"
},
{
"mimeType":"image/png",
"name":"Leaves_GiantPine_C",
"uri":"Leaves_GiantPine_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":549,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":549,
"max":[
2.002925395965576,
2.83725643157959,
1.763440728187561
],
"min":[
-1.7995274066925049,
0.1615467667579651,
-1.404332160949707
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":549,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":549,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":1035,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":1728,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":1728,
"max":[
1.8775538206100464,
2.833508014678955,
1.8439654111862183
],
"min":[
-1.7178152799606323,
-0.41830262541770935,
-1.8215556144714355
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":1728,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":1728,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":2592,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":8784,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":6588,
"byteOffset":8784,
"target":34962
},
{
"buffer":0,
"byteLength":6588,
"byteOffset":15372,
"target":34962
},
{
"buffer":0,
"byteLength":4392,
"byteOffset":21960,
"target":34962
},
{
"buffer":0,
"byteLength":2070,
"byteOffset":26352,
"target":34963
},
{
"buffer":0,
"byteLength":27648,
"byteOffset":28424,
"target":34962
},
{
"buffer":0,
"byteLength":20736,
"byteOffset":56072,
"target":34962
},
{
"buffer":0,
"byteLength":20736,
"byteOffset":76808,
"target":34962
},
{
"buffer":0,
"byteLength":13824,
"byteOffset":97544,
"target":34962
},
{
"buffer":0,
"byteLength":5184,
"byteOffset":111368,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":116552,
"uri":"Bush_Large_Flowers.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,151 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Bush_Long_1"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_NormalTree",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":0
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.011",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
}
],
"images":[
{
"mimeType":"image/png",
"name":"Leaves_NormalTree_C",
"uri":"Leaves_NormalTree_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":1044,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":1044,
"max":[
0.8625106811523438,
1.9658807516098022,
0.7979487180709839
],
"min":[
-0.814096987247467,
-0.402360737323761,
-0.8449163436889648
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":1044,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":1044,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":1566,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":16704,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":12528,
"byteOffset":16704,
"target":34962
},
{
"buffer":0,
"byteLength":12528,
"byteOffset":29232,
"target":34962
},
{
"buffer":0,
"byteLength":8352,
"byteOffset":41760,
"target":34962
},
{
"buffer":0,
"byteLength":3132,
"byteOffset":50112,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":53244,
"uri":"Bush_Long_1.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,151 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Bush_Long_2"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves_NormalTree",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":0
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.012",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
}
],
"images":[
{
"mimeType":"image/png",
"name":"Leaves_NormalTree_C",
"uri":"Leaves_NormalTree_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":7508,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":7508,
"max":[
0.8436034321784973,
2.362247943878174,
0.760888397693634
],
"min":[
-0.76265949010849,
-0.40063750743865967,
-0.8000847697257996
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":7508,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":7508,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":16179,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":120128,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":90096,
"byteOffset":120128,
"target":34962
},
{
"buffer":0,
"byteLength":90096,
"byteOffset":210224,
"target":34962
},
{
"buffer":0,
"byteLength":60064,
"byteOffset":300320,
"target":34962
},
{
"buffer":0,
"byteLength":32358,
"byteOffset":360384,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":392744,
"uri":"Bush_Long_2.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,263 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"CherryBlossom_1"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Bark_NormalTree",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaMode":"BLEND",
"doubleSided":true,
"name":"Leaves_CherryBlossom",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.013",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_NormalTree_Normal",
"uri":"Bark_NormalTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_NormalTree",
"uri":"Bark_NormalTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_CherryBlossom_C",
"uri":"Leaves_CherryBlossom_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":11878,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":11878,
"max":[
3.7631359100341797,
12.229462623596191,
2.7853715419769287
],
"min":[
-4.053962707519531,
-0.210661843419075,
-8.084226608276367
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":11878,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":11878,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":27840,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":7195,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":7195,
"max":[
5.883588790893555,
13.168240547180176,
4.619854927062988
],
"min":[
-6.213872909545898,
1.9577397108078003,
-10.055851936340332
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":7195,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":7195,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":10788,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":190048,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":142536,
"byteOffset":190048,
"target":34962
},
{
"buffer":0,
"byteLength":142536,
"byteOffset":332584,
"target":34962
},
{
"buffer":0,
"byteLength":95024,
"byteOffset":475120,
"target":34962
},
{
"buffer":0,
"byteLength":55680,
"byteOffset":570144,
"target":34963
},
{
"buffer":0,
"byteLength":115120,
"byteOffset":625824,
"target":34962
},
{
"buffer":0,
"byteLength":86340,
"byteOffset":740944,
"target":34962
},
{
"buffer":0,
"byteLength":86340,
"byteOffset":827284,
"target":34962
},
{
"buffer":0,
"byteLength":57560,
"byteOffset":913624,
"target":34962
},
{
"buffer":0,
"byteLength":21576,
"byteOffset":971184,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":992760,
"uri":"CherryBlossom_1.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,263 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"CherryBlossom_2"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Bark_NormalTree",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaMode":"BLEND",
"doubleSided":true,
"name":"Leaves_CherryBlossom",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.014",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_NormalTree_Normal",
"uri":"Bark_NormalTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_NormalTree",
"uri":"Bark_NormalTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_CherryBlossom_C",
"uri":"Leaves_CherryBlossom_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":12523,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":12523,
"max":[
9.119078636169434,
10.751580238342285,
1.4064016342163086
],
"min":[
-1.2529408931732178,
-0.210661843419075,
-8.434141159057617
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":12523,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":12523,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":29184,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":6889,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":6889,
"max":[
9.828458786010742,
11.349228858947754,
2.3914573192596436
],
"min":[
-2.5993385314941406,
0.9124367237091064,
-9.838790893554688
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":6889,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":6889,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":10332,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":200368,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":150276,
"byteOffset":200368,
"target":34962
},
{
"buffer":0,
"byteLength":150276,
"byteOffset":350644,
"target":34962
},
{
"buffer":0,
"byteLength":100184,
"byteOffset":500920,
"target":34962
},
{
"buffer":0,
"byteLength":58368,
"byteOffset":601104,
"target":34963
},
{
"buffer":0,
"byteLength":110224,
"byteOffset":659472,
"target":34962
},
{
"buffer":0,
"byteLength":82668,
"byteOffset":769696,
"target":34962
},
{
"buffer":0,
"byteLength":82668,
"byteOffset":852364,
"target":34962
},
{
"buffer":0,
"byteLength":55112,
"byteOffset":935032,
"target":34962
},
{
"buffer":0,
"byteLength":20664,
"byteOffset":990144,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":1010808,
"uri":"CherryBlossom_2.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,263 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"CherryBlossom_3"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Bark_NormalTree",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaMode":"BLEND",
"doubleSided":true,
"name":"Leaves_CherryBlossom",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.015",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_NormalTree_Normal",
"uri":"Bark_NormalTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_NormalTree",
"uri":"Bark_NormalTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_CherryBlossom_C",
"uri":"Leaves_CherryBlossom_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":12431,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":12431,
"max":[
9.674745559692383,
13.300257682800293,
3.6033935546875
],
"min":[
-3.3593084812164307,
-0.210661843419075,
-5.675198554992676
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":12431,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":12431,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":28983,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":10159,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":10159,
"max":[
11.798202514648438,
14.277937889099121,
4.928161144256592
],
"min":[
-4.789698600769043,
2.868657350540161,
-8.101432800292969
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":10159,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":10159,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":15234,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":198896,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":149172,
"byteOffset":198896,
"target":34962
},
{
"buffer":0,
"byteLength":149172,
"byteOffset":348068,
"target":34962
},
{
"buffer":0,
"byteLength":99448,
"byteOffset":497240,
"target":34962
},
{
"buffer":0,
"byteLength":57966,
"byteOffset":596688,
"target":34963
},
{
"buffer":0,
"byteLength":162544,
"byteOffset":654656,
"target":34962
},
{
"buffer":0,
"byteLength":121908,
"byteOffset":817200,
"target":34962
},
{
"buffer":0,
"byteLength":121908,
"byteOffset":939108,
"target":34962
},
{
"buffer":0,
"byteLength":81272,
"byteOffset":1061016,
"target":34962
},
{
"buffer":0,
"byteLength":30468,
"byteOffset":1142288,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":1172756,
"uri":"CherryBlossom_3.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,263 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"CherryBlossom_4"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Bark_NormalTree",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaMode":"BLEND",
"doubleSided":true,
"name":"Leaves_CherryBlossom",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.016",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_NormalTree_Normal",
"uri":"Bark_NormalTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_NormalTree",
"uri":"Bark_NormalTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_CherryBlossom_C",
"uri":"Leaves_CherryBlossom_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":11564,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":11564,
"max":[
5.290931701660156,
12.393915176391602,
1.3411273956298828
],
"min":[
-3.5921823978424072,
-0.210661843419075,
-7.434797286987305
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":11564,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":11564,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":27735,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":6295,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":6295,
"max":[
7.660218238830566,
12.877479553222656,
3.1258859634399414
],
"min":[
-5.68044376373291,
-0.49091777205467224,
-9.417553901672363
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":6295,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":6295,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":9438,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":185024,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":138768,
"byteOffset":185024,
"target":34962
},
{
"buffer":0,
"byteLength":138768,
"byteOffset":323792,
"target":34962
},
{
"buffer":0,
"byteLength":92512,
"byteOffset":462560,
"target":34962
},
{
"buffer":0,
"byteLength":55470,
"byteOffset":555072,
"target":34963
},
{
"buffer":0,
"byteLength":100720,
"byteOffset":610544,
"target":34962
},
{
"buffer":0,
"byteLength":75540,
"byteOffset":711264,
"target":34962
},
{
"buffer":0,
"byteLength":75540,
"byteOffset":786804,
"target":34962
},
{
"buffer":0,
"byteLength":50360,
"byteOffset":862344,
"target":34962
},
{
"buffer":0,
"byteLength":18876,
"byteOffset":912704,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":931580,
"uri":"CherryBlossom_4.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,263 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"CherryBlossom_5"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Bark_NormalTree",
"normalTexture":{
"index":0
},
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":1
},
"metallicFactor":0
}
},
{
"alphaMode":"BLEND",
"doubleSided":true,
"name":"Leaves_CherryBlossom",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":2
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"tree.017",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
},
{
"attributes":{
"COLOR_0":5,
"POSITION":6,
"NORMAL":7,
"TEXCOORD_0":8
},
"indices":9,
"material":1
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"mimeType":"image/png",
"name":"Bark_NormalTree_Normal",
"uri":"Bark_NormalTree_Normal.png"
},
{
"mimeType":"image/png",
"name":"Bark_NormalTree",
"uri":"Bark_NormalTree.png"
},
{
"mimeType":"image/png",
"name":"Leaves_CherryBlossom_C",
"uri":"Leaves_CherryBlossom_C.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":11697,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":11697,
"max":[
4.682197093963623,
12.478440284729004,
3.106804132461548
],
"min":[
-4.452157020568848,
-0.210661843419075,
-5.747885704040527
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":11697,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":11697,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":28014,
"type":"SCALAR"
},
{
"bufferView":5,
"componentType":5126,
"count":6504,
"type":"VEC4"
},
{
"bufferView":6,
"componentType":5126,
"count":6504,
"max":[
6.370116233825684,
13.169610023498535,
4.772704124450684
],
"min":[
-6.116915702819824,
0.4446876347064972,
-8.240160942077637
],
"type":"VEC3"
},
{
"bufferView":7,
"componentType":5126,
"count":6504,
"type":"VEC3"
},
{
"bufferView":8,
"componentType":5126,
"count":6504,
"type":"VEC2"
},
{
"bufferView":9,
"componentType":5123,
"count":9756,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":187152,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":140364,
"byteOffset":187152,
"target":34962
},
{
"buffer":0,
"byteLength":140364,
"byteOffset":327516,
"target":34962
},
{
"buffer":0,
"byteLength":93576,
"byteOffset":467880,
"target":34962
},
{
"buffer":0,
"byteLength":56028,
"byteOffset":561456,
"target":34963
},
{
"buffer":0,
"byteLength":104064,
"byteOffset":617484,
"target":34962
},
{
"buffer":0,
"byteLength":78048,
"byteOffset":721548,
"target":34962
},
{
"buffer":0,
"byteLength":78048,
"byteOffset":799596,
"target":34962
},
{
"buffer":0,
"byteLength":52032,
"byteOffset":877644,
"target":34962
},
{
"buffer":0,
"byteLength":19512,
"byteOffset":929676,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":949188,
"uri":"CherryBlossom_5.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,152 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Clover_1"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":0
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"Cylinder.018",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
}
],
"images":[
{
"mimeType":"image/png",
"name":"Leaves",
"uri":"Leaves.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5123,
"count":267,
"normalized":true,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":267,
"max":[
0.2939910888671875,
1.131940245628357,
0.36432379484176636
],
"min":[
-0.5022982358932495,
-0.012792191468179226,
-0.39956197142601013
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":267,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":267,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":1137,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":2136,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":3204,
"byteOffset":2136,
"target":34962
},
{
"buffer":0,
"byteLength":3204,
"byteOffset":5340,
"target":34962
},
{
"buffer":0,
"byteLength":2136,
"byteOffset":8544,
"target":34962
},
{
"buffer":0,
"byteLength":2274,
"byteOffset":10680,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":12956,
"uri":"Clover_1.bin"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,152 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.0.44",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Clover_2"
}
],
"materials":[
{
"alphaCutoff":0.20000000298023224,
"alphaMode":"MASK",
"doubleSided":true,
"name":"Leaves",
"pbrMetallicRoughness":{
"baseColorTexture":{
"index":0
},
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"Cylinder.002",
"primitives":[
{
"attributes":{
"COLOR_0":0,
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":4,
"material":0
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
}
],
"images":[
{
"mimeType":"image/png",
"name":"Leaves",
"uri":"Leaves.png"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5123,
"count":433,
"normalized":true,
"type":"VEC4"
},
{
"bufferView":1,
"componentType":5126,
"count":433,
"max":[
0.34883004426956177,
1.261434555053711,
0.36432382464408875
],
"min":[
-0.5022982358932495,
-0.0023507503792643547,
-0.47231054306030273
],
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":433,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5126,
"count":433,
"type":"VEC2"
},
{
"bufferView":4,
"componentType":5123,
"count":1845,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":3464,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":5196,
"byteOffset":3464,
"target":34962
},
{
"buffer":0,
"byteLength":5196,
"byteOffset":8660,
"target":34962
},
{
"buffer":0,
"byteLength":3464,
"byteOffset":13856,
"target":34962
},
{
"buffer":0,
"byteLength":3690,
"byteOffset":17320,
"target":34963
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":21012,
"uri":"Clover_2.bin"
}
]
}

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More