Add the seal from TF2

This commit is contained in:
kp 2024-08-10 04:03:37 -05:00
parent f9e4187a10
commit 9010b5e821
19 changed files with 1887 additions and 66 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View file

@ -7,6 +7,8 @@ layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 texcoord; layout (location = 2) in vec2 texcoord;
layout (location = 3) in vec3 tangent; layout (location = 3) in vec3 tangent;
layout (location = 4) in vec3 bitangent; layout (location = 4) in vec3 bitangent;
layout (location = 5) in uvec4 bone_ids; // Skinning (experimental)
layout (location = 6) in vec4 weights;
out vec3 v_position; out vec3 v_position;
out vec3 v_normal; out vec3 v_normal;
@ -17,6 +19,10 @@ out vec3 v_bitangent;
out float v_id; out float v_id;
const int MAX_BONES = 48;
uniform mat4 u_bones[MAX_BONES];
uniform int u_has_bones;
void main() void main()
{ {
v_position = position; v_position = position;
@ -28,5 +34,14 @@ void main()
v_id = gl_VertexID; v_id = gl_VertexID;
if (u_has_bones == 1) {
mat4 bone_transform = u_bones[bone_ids[0]] * weights[0];
bone_transform += u_bones[bone_ids[1]] * weights[1];
bone_transform += u_bones[bone_ids[2]] * weights[2];
bone_transform += u_bones[bone_ids[3]] * weights[3];
gl_Position = u_mvp * (bone_transform * vec4(v_position, 1.0));
return;
}
gl_Position = u_mvp * vec4(v_position, 1.0); gl_Position = u_mvp * vec4(v_position, 1.0);
} }

View file

@ -1,56 +1,742 @@
[02:08:00 AM] Info: Starting... [04:00:32 AM] Info: Starting...
KP3D version 2 KP3D version 2
=============================== ===============================
Copyright (C) kpworld.xyz 2018-2024 Copyright (C) kpworld.xyz 2018-2024
Contact me! @kp_cftsz Contact me! @kp_cftsz
[02:08:00 AM] Info: Initializing SDL [04:00:32 AM] Info: Initializing SDL
[02:08:00 AM] Info: Initializing OpenGL [04:00:32 AM] Info: Initializing OpenGL
[02:08:00 AM] Info: OpenGL version: 4.6.0 NVIDIA 536.23 [04:00:32 AM] Info: OpenGL version: 4.6.0 NVIDIA 536.23
[02:08:00 AM] Info: Initializing GLEW [04:00:32 AM] Info: Initializing GLEW
[02:08:00 AM] Info: Initializing SDL_mixer [04:00:32 AM] Info: Initializing SDL_mixer
[02:08:00 AM] Info: Reticulating splines... [04:00:32 AM] Info: Reticulating splines...
[02:08:00 AM] Info: Ready! [04:00:32 AM] Info: Ready!
[02:08:00 AM] Info: Loading script: build-cylinder.scm [04:00:32 AM] Info: Loading script: build-cylinder.scm
[02:08:00 AM] Info: Loading script: build-stairs.scm [04:00:32 AM] Info: Loading script: build-stairs.scm
[02:08:00 AM] Info: Loading material resource: block.png [04:00:32 AM] Info: Loading material resource: block.png
[02:08:00 AM] Info: Found normal map texture: materials/block_n.png [04:00:32 AM] Info: Found normal map texture: materials/block_n.png
[02:08:00 AM] Info: Loading material resource: brick2.jpg [04:00:32 AM] Info: Loading material resource: brick2.jpg
[02:08:00 AM] Info: Found normal map texture: materials/brick2_n.jpg [04:00:32 AM] Info: Found normal map texture: materials/brick2_n.jpg
[02:08:00 AM] Info: Loading material resource: bricks.jpg [04:00:32 AM] Info: Loading material resource: bricks.jpg
[02:08:00 AM] Info: Found normal map texture: materials/bricks_n.jpg [04:00:32 AM] Info: Found normal map texture: materials/bricks_n.jpg
[02:08:00 AM] Info: Loading material resource: FLAT5_7.png [04:00:32 AM] Info: Loading material resource: FLAT5_7.png
[02:08:00 AM] Info: Found normal map texture: materials/FLAT5_7_n.png [04:00:32 AM] Info: Found normal map texture: materials/FLAT5_7_n.png
[02:08:00 AM] Info: Loading material resource: floor0.png [04:00:32 AM] Info: Loading material resource: floor0.png
[02:08:00 AM] Info: Found normal map texture: materials/floor0_n.png [04:00:32 AM] Info: Found normal map texture: materials/floor0_n.png
[02:08:00 AM] Info: Loading material resource: floor1.png [04:00:32 AM] Info: Loading material resource: floor1.png
[02:08:00 AM] Info: Found normal map texture: materials/floor1_n.png [04:00:32 AM] Info: Found normal map texture: materials/floor1_n.png
[02:08:00 AM] Info: Loading material resource: GRASS2.png [04:00:32 AM] Info: Loading material resource: GRASS2.png
[02:08:00 AM] Info: Found normal map texture: materials/GRASS2_n.png [04:00:32 AM] Info: Found normal map texture: materials/GRASS2_n.png
[02:08:00 AM] Info: Loading material resource: hardwood.jpg [04:00:32 AM] Info: Loading material resource: hardwood.jpg
[02:08:00 AM] Info: Found normal map texture: materials/hardwood_n.jpg [04:00:32 AM] Info: Found normal map texture: materials/hardwood_n.jpg
[02:08:00 AM] Info: Loading texture resource: .kp3d/banner.png [04:00:32 AM] Info: Loading texture resource: .kp3d/banner.png
[02:08:00 AM] Info: Loading texture resource: .kp3d/crosshair.png [04:00:32 AM] Info: Loading texture resource: .kp3d/crosshair.png
[02:08:00 AM] Info: Loading texture resource: .kp3d/empty.png [04:00:32 AM] Info: Loading texture resource: .kp3d/empty.png
[02:08:00 AM] Info: Loading texture resource: .kp3d/logo.png [04:00:32 AM] Info: Loading texture resource: .kp3d/logo.png
[02:08:00 AM] Info: Loading texture resource: .kp3d/map_grid.png [04:00:32 AM] Info: Loading texture resource: .kp3d/map_grid.png
[02:08:00 AM] Info: Loading texture resource: .kp3d/not_found.png [04:00:32 AM] Info: Loading texture resource: .kp3d/not_found.png
[02:08:00 AM] Info: Loading texture resource: .kp3d/skybox.png [04:00:32 AM] Info: Loading texture resource: .kp3d/skybox.png
[02:08:00 AM] Info: Loading texture resource: .kp3d/uv_test.png [04:00:32 AM] Info: Loading texture resource: .kp3d/uv_test.png
[02:08:00 AM] Info: Loading texture resource: .kp3d/water.png [04:00:32 AM] Info: Loading texture resource: .kp3d/water.png
[02:08:00 AM] Info: Loading texture resource: dot.png [04:00:32 AM] Info: Loading texture resource: dot.png
[02:08:00 AM] Info: Loading texture resource: editor/stem.png [04:00:32 AM] Info: Loading texture resource: editor/stem.png
[02:08:00 AM] Info: Loading texture resource: logo.png [04:00:32 AM] Info: Loading texture resource: logo.png
[02:08:00 AM] Info: Loading texture resource: skyboxes/sky50e2dd1d496fc.jpg [04:00:32 AM] Info: Loading texture resource: skyboxes/sky50e2dd1d496fc.jpg
[02:08:00 AM] Info: Loading texture resource: skyboxes/sky8.jpg [04:00:32 AM] Info: Loading texture resource: skyboxes/sky8.jpg
[02:08:00 AM] Info: Loading texture resource: skyboxes/sky9.jpg [04:00:32 AM] Info: Loading texture resource: skyboxes/sky9.jpg
[02:08:00 AM] Info: Loading texture resource: skyboxes/skybox.jpg [04:00:32 AM] Info: Loading texture resource: skyboxes/skybox.jpg
[02:08:00 AM] Info: Loading texture resource: skyboxes/skybox_11.jpg [04:00:32 AM] Info: Loading texture resource: skyboxes/skybox_11.jpg
[02:08:00 AM] Info: Loading texture resource: skyboxes/skybox_14.jpg [04:00:32 AM] Info: Loading texture resource: skyboxes/skybox_14.jpg
[02:08:00 AM] Info: Loading texture resource: skyboxes/skybox_15.jpg [04:00:32 AM] Info: Loading texture resource: skyboxes/skybox_15.jpg
[02:08:00 AM] Info: Loading texture resource: skyboxes/skybox_3.jpg [04:00:33 AM] Info: Loading texture resource: skyboxes/skybox_3.jpg
[02:08:00 AM] Info: Loading texture resource: skybox_16.jpg [04:00:33 AM] Info: Loading texture resource: skybox_16.jpg
[02:08:00 AM] Info: Map init [04:00:33 AM] Info: FOUND ANIMATION: seal.qc_skeleton_seal.qc_skeleton, 0
[02:08:00 AM] Info: Finalized mesh with 49 batches [04:00:33 AM] Info: Num weights for seal_qc_skeleton_body2: 1208
[02:08:03 AM] Info: Placed thing at {6.38296, -1.5, -7.31712} [04:00:33 AM] Info: Num weights for seal_qc_skeleton_body1: 2068
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_head: 2188
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyeupper_l: 648
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyelower_l: 359
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyeupper_r: 636
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyelower_r: 359
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_jowl_l: 666
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_jowl_r: 818
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_flipper1_l: 272
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_flipper2_l: 304
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_flipper1_r: 272
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_flipper2_r: 304
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_body3: 1320
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_body4: 1436
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_body5: 1436
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_backflipper_r: 1358
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_backflipper_l: 1358
[04:00:33 AM] Info: FOUND TEXTURE: seal.png
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_head: 24
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyeupper_l: 30
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyelower_l: 36
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyeupper_r: 30
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyelower_r: 36
[04:00:33 AM] Info: FOUND TEXTURE: seal.png
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_jowl_l: 12
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_jowl_r: 12
[04:00:33 AM] Info: FOUND TEXTURE: seal_whiskers.png
[04:00:33 AM] Info: Map init
[04:00:33 AM] Info: Finalized mesh with 49 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:44 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:45 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:46 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:47 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:57 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:58 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:00:59 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:05 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:06 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:07 AM] Info: Finalized mesh with 48 batches
[04:01:09 AM] Info: Finalized mesh with 48 batches
[04:01:09 AM] Info: Finalized mesh with 48 batches
[04:01:09 AM] Info: Finalized mesh with 48 batches
[04:01:09 AM] Info: Finalized mesh with 48 batches
[04:01:09 AM] Info: Finalized mesh with 48 batches
[04:01:09 AM] Info: Finalized mesh with 48 batches
[04:01:09 AM] Info: Finalized mesh with 48 batches
[04:01:09 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:10 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:14 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:17 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:18 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:19 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:20 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:23 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:29 AM] Info: Finalized mesh with 48 batches
[04:01:31 AM] Info: Finalized mesh with 48 batches
[04:01:31 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:32 AM] Info: Finalized mesh with 48 batches
[04:01:37 AM] Info: Starting animation
[04:01:46 AM] Info: Finalized mesh with 54 batches
[04:01:51 AM] Info: Finalized mesh with 53 batches
[04:01:54 AM] Info: Finalized mesh with 53 batches
[04:02:07 AM] Info: Finalized mesh with 53 batches
[04:02:15 AM] Info: Finalized mesh with 53 batches
[04:02:17 AM] Info: Finalized mesh with 53 batches
[04:02:19 AM] Info: Finalized mesh with 53 batches
[04:02:38 AM] Info: Finalized mesh with 53 batches

View file

@ -427,8 +427,8 @@ ErrCode Model::LoadModel(const std::string& path, const std::string& main_textur
m_faces = 0; m_faces = 0;
// Run the texture loading routine (this can vary based on how we've decided to load the model) // Run the texture loading routine (this can vary based on how we've decided to load the model)
if (load_textures) //if (load_textures)
load_textures(); // load_textures();
// TODO: Retarded busy-waiting, fix whenever I restructure this // TODO: Retarded busy-waiting, fix whenever I restructure this
// //
@ -436,8 +436,10 @@ ErrCode Model::LoadModel(const std::string& path, const std::string& main_textur
// fallback and just load whatever textures are in the store by default, because the way the editor/games work is that ALL // fallback and just load whatever textures are in the store by default, because the way the editor/games work is that ALL
// textures in textures/, including textures/tex3d/ (where model textures go) are loaded in one go // textures in textures/, including textures/tex3d/ (where model textures go) are loaded in one go
// //
while (!m_textures.size()) //while (!m_textures.size())
std::this_thread::sleep_for(std::chrono::milliseconds(50)); // std::this_thread::sleep_for(std::chrono::milliseconds(50));
std::string parent_dir = kp3d_path.substr(0, kp3d_path.find_last_of("/\\"));
m_scene = m_importer.ReadFile( m_scene = m_importer.ReadFile(
kp3d_path, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FlipUVs | aiProcess_OptimizeMeshes kp3d_path, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FlipUVs | aiProcess_OptimizeMeshes
@ -450,7 +452,7 @@ ErrCode Model::LoadModel(const std::string& path, const std::string& main_textur
m_global_inverse_transform = m_scene->mRootNode->mTransformation; m_global_inverse_transform = m_scene->mRootNode->mTransformation;
m_global_inverse_transform = m_scene->mRootNode->mTransformation.Inverse(); m_global_inverse_transform = m_scene->mRootNode->mTransformation.Inverse();
std::string parent_dir = kp3d_path.substr(0, kp3d_path.find_last_of("/\\")); // exit(1);
// TODO: Go through the scene's material information and try to grab diffuse, AO, normal map, etc. textures... // TODO: Go through the scene's material information and try to grab diffuse, AO, normal map, etc. textures...
@ -460,6 +462,7 @@ ErrCode Model::LoadModel(const std::string& path, const std::string& main_textur
{ {
std::string name(m_scene->mAnimations[i]->mName.C_Str()); std::string name(m_scene->mAnimations[i]->mName.C_Str());
m_animation_map.emplace(name, i); m_animation_map.emplace(name, i);
KP3D_LOG_INFO("FOUND ANIMATION: {}, {}", name, i);
} }
} }
@ -478,11 +481,11 @@ ErrCode Model::LoadModel(const std::string& path, const std::string& main_textur
if (noflip) if (noflip)
{ {
def.vertices.push_back(Vertex3D(Vec3{pos.x, pos.y, pos.z}, Vec3{nor.x, nor.y, nor.z}, Vec2{tex.x, tex.y})); def.vertices.push_back(Vertex3D(Vec3{pos.x, pos.y, pos.z}, Vec3{nor.x, nor.y, nor.z}, Vec2{tex.x, -tex.y}));
continue; continue;
} }
def.vertices.push_back(Vertex3D(Vec3{pos.x, pos.y, -pos.z}, Vec3{nor.x, nor.y, -nor.z}, Vec2{tex.x, tex.y})); def.vertices.push_back(Vertex3D(Vec3{pos.x, pos.y, -pos.z}, Vec3{nor.x, nor.y, -nor.z}, Vec2{tex.x, -tex.y}));
} }
for (size_t i = 0; i < model->mNumFaces; i++) for (size_t i = 0; i < model->mNumFaces; i++)
@ -507,10 +510,31 @@ ErrCode Model::LoadModel(const std::string& path, const std::string& main_textur
def.base_vertex = m_vertices; def.base_vertex = m_vertices;
def.base_index = m_faces * 3; def.base_index = m_faces * 3;
Texture* tex = nullptr,* normal_tex = nullptr;
if (m_scene->HasMaterials())
{
aiString path;
if (!m_scene->mMaterials[model->mMaterialIndex]->GetTexture(aiTextureType_DIFFUSE, 0, &path))
{
tex = new Texture();
tex->Load("$" + parent_dir + "/" + path.C_Str(), false, Texture::FILTER_LINEAR);
m_textures.push_back(tex);
KP3D_LOG_INFO("FOUND TEXTURE: {}", path.C_Str());
}
aiString normal_path;
if (!m_scene->mMaterials[model->mMaterialIndex]->GetTexture(aiTextureType_NORMALS, 0, &path))
{
normal_tex = new Texture();
normal_tex->Load("$" + parent_dir + "/" + path.C_Str(), false, Texture::FILTER_LINEAR);
m_normal_textures.push_back(normal_tex);
KP3D_LOG_INFO("FOUND NORMAL TEXTURE: {}", path.C_Str());
}
}
if (model->HasBones()) if (model->HasBones())
m->AddSkinnedBatch(m_textures.back(), def.vertices, def.indices, def.bones, false); m->AddSkinnedBatch(tex, def.vertices, def.indices, def.bones, false, normal_tex);
else else
m->AddIndexedBatch(m_textures.back(), def.vertices, def.indices); m->AddIndexedBatch(tex, def.vertices, def.indices, normal_tex);
m->Finalize(); m->Finalize();
m_meshes.push_back(m); m_meshes.push_back(m);

View file

@ -84,6 +84,7 @@ private:
std::vector<StaticMesh*> m_meshes; std::vector<StaticMesh*> m_meshes;
std::vector<Texture*> m_textures; std::vector<Texture*> m_textures;
std::vector<Texture*> m_normal_textures;
std::vector<BoneInfo> m_bone_info; std::vector<BoneInfo> m_bone_info;
std::unordered_map<std::string, uint> m_bone_name_to_index_map; std::unordered_map<std::string, uint> m_bone_name_to_index_map;
std::unordered_map<std::string, uint> m_animation_map; std::unordered_map<std::string, uint> m_animation_map;

View file

@ -71,7 +71,7 @@ Mat4 Quaternion::ToMat4() const
Vec3 up(2.0f * (x * y + w * z), 1.0f - 2.0f * (x * x + z * z), 2.0f * (y * z - w * x)); Vec3 up(2.0f * (x * y + w * z), 1.0f - 2.0f * (x * x + z * z), 2.0f * (y * z - w * x));
Vec3 right(1.0f - 2.0f * (y * y + z * z), 2.0f * (x * y - w * z), 2.0f * (x * z + w * y)); Vec3 right(1.0f - 2.0f * (y * y + z * z), 2.0f * (x * y - w * z), 2.0f * (x * z + w * y));
return Mat4().InitRotation(forward, up, right); return Mat4().InitRotation(forward, up, -right);
} }
Quaternion& Quaternion::operator*=(const Quaternion& rhs) Quaternion& Quaternion::operator*=(const Quaternion& rhs)

View file

@ -222,17 +222,15 @@ void Renderer3D::DrawMesh(StaticMesh& mesh, const Mat4& m, bool bind_shader, uin
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1); glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2); glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4); glEnableVertexAttribArray(4);
glEnableVertexAttribArray(5);
if (skinned) if (skinned)
{ {
glEnableVertexAttribArray(5); glEnableVertexAttribArray(5);
glEnableVertexAttribArray(6); glEnableVertexAttribArray(6);
} }
glVertexAttribPointer( glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), reinterpret_cast<GLvoid*>(offsetof(Vertex3D, position)));
0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), reinterpret_cast<GLvoid*>(offsetof(Vertex3D, position))
);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), reinterpret_cast<GLvoid*>(offsetof(Vertex3D, normal))); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), reinterpret_cast<GLvoid*>(offsetof(Vertex3D, normal)));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), reinterpret_cast<GLvoid*>(offsetof(Vertex3D, uv))); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), reinterpret_cast<GLvoid*>(offsetof(Vertex3D, uv)));
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), reinterpret_cast<GLvoid*>(offsetof(Vertex3D, atangent))); glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), reinterpret_cast<GLvoid*>(offsetof(Vertex3D, atangent)));
@ -378,10 +376,13 @@ void Renderer3D::DrawModel(Model& model, const Mat4& m)
if (!mesh) if (!mesh)
continue; continue;
r3d_state->shader->Bind();
for (int i = 0; i < transforms.size(); i++) for (int i = 0; i < transforms.size(); i++)
{ {
if (i >= MAX_BONES) if (i >= MAX_BONES)
continue; continue;
std::string u = "u_bones[" + std::to_string(i) + "]"; std::string u = "u_bones[" + std::to_string(i) + "]";
glUniformMatrix4fv( glUniformMatrix4fv(
glGetUniformLocation(r3d_state->shader->GetGLID(), u.c_str()), 1, GL_FALSE, transforms[i].mat.data() glGetUniformLocation(r3d_state->shader->GetGLID(), u.c_str()), 1, GL_FALSE, transforms[i].mat.data()
@ -389,7 +390,7 @@ void Renderer3D::DrawModel(Model& model, const Mat4& m)
} }
if (mesh->skinnable) if (mesh->skinnable)
r3d_state->shader->SetUniform("u_has_bones", 1); r3d_state->shader->SetUniform("u_has_bones", 1);
DrawMesh(*mesh, m); DrawMesh(*mesh, m, false);
if (mesh->skinnable) if (mesh->skinnable)
r3d_state->shader->SetUniform("u_has_bones", 0); r3d_state->shader->SetUniform("u_has_bones", 0);
} }

View file

@ -11,6 +11,7 @@ namespace kp3d::res {
std::unordered_map<std::string, std::shared_ptr<Material>> material_cache; std::unordered_map<std::string, std::shared_ptr<Material>> material_cache;
std::unordered_map<std::string, std::shared_ptr<Texture>> texture_cache; std::unordered_map<std::string, std::shared_ptr<Texture>> texture_cache;
std::unordered_map<std::string, std::shared_ptr<Model>> model_cache;
void LoadMaterials() void LoadMaterials()
{ {
@ -93,4 +94,28 @@ void LoadTextures()
} }
} }
void LoadModels()
{
// Load every available texture
for (const auto& entry: std::filesystem::recursive_directory_iterator(sys::GetModelDir()))
{
if (entry.is_directory())
continue;
std::filesystem::path entry_path = entry.path();
std::string path_str = entry_path.string();
if (!str::EndsWith(path_str, ".fbx") && !str::EndsWith(path_str, ".obj"))
continue;
std::string filename = std::filesystem::proximate(path_str, sys::GetModelDir()).string();
std::replace(filename.begin(), filename.end(), '\\', '/');
KP3D_LOG_INFO("Loading model resource: {}", filename);
model_cache.emplace(filename, std::make_shared<Model>());
model_cache[filename]->Load(filename);
}
}
} // namespace kp3d::res } // namespace kp3d::res

View file

@ -7,13 +7,16 @@
#include "KP3D_Common.h" #include "KP3D_Common.h"
#include "KP3D_Texture.h" #include "KP3D_Texture.h"
#include "KP3D_Material.h" #include "KP3D_Material.h"
#include "KP3D_Model.h"
namespace kp3d::res { namespace kp3d::res {
extern std::unordered_map<std::string, std::shared_ptr<Material>> material_cache; extern std::unordered_map<std::string, std::shared_ptr<Material>> material_cache;
extern std::unordered_map<std::string, std::shared_ptr<Texture>> texture_cache; extern std::unordered_map<std::string, std::shared_ptr<Texture>> texture_cache;
extern std::unordered_map<std::string, std::shared_ptr<Model>> model_cache;
void LoadMaterials(); void LoadMaterials();
void LoadTextures(); void LoadTextures();
void LoadModels();
} // namespace kp3d::res } // namespace kp3d::res

View file

@ -16,7 +16,7 @@ RawTexture::RawTexture():
RawTexture::RawTexture(const std::string& path) RawTexture::RawTexture(const std::string& path)
{ {
std::string tex_path = sys::GetTextureDir() + path; std::string tex_path = path[0] == '$' ? path.substr(1) : sys::GetTextureDir() + path;
data = stbi_load(tex_path.c_str(), &width, &height, NULL, STBI_rgb_alpha); data = stbi_load(tex_path.c_str(), &width, &height, NULL, STBI_rgb_alpha);

View file

@ -19,6 +19,9 @@ Sandbox::Sandbox(const std::string& path):
kp3d::res::LoadMaterials(); kp3d::res::LoadMaterials();
kp3d::res::LoadTextures(); kp3d::res::LoadTextures();
seal.noflip = true;
seal.Load("seal/seal.dae");
tex.Load("logo.png"); tex.Load("logo.png");
crosshair.Load(".kp3d/crosshair.png"); crosshair.Load(".kp3d/crosshair.png");
projection.InitPerspective(70.0f, (float) GetWidth() / (float) GetHeight()); projection.InitPerspective(70.0f, (float) GetWidth() / (float) GetHeight());
@ -97,6 +100,14 @@ void Sandbox::Update()
//if (IsKeyDown(kp3d::KEY_F)) camera.Rotate(kp3d::Camera::AXIS_Y, -qerf_speed); //if (IsKeyDown(kp3d::KEY_F)) camera.Rotate(kp3d::Camera::AXIS_Y, -qerf_speed);
ResetMouseCursor([&](float x, float y) { camera.UpdateMouseLook({x, y}); }); ResetMouseCursor([&](float x, float y) { camera.UpdateMouseLook({x, y}); });
camera.UpdateMatrix(); camera.UpdateMatrix();
seal.SetAnimation(0);
if (IsKeyDown(kp3d::KEY_L))
{
seal.StartAnimation();
KeyReset(kp3d::KEY_L);
}
seal.UpdateAnimation();
} }
void Sandbox::Render() void Sandbox::Render()
@ -112,6 +123,10 @@ void Sandbox::Render()
if (m_mode == MODE_EDIT) if (m_mode == MODE_EDIT)
editor.RenderMap(); editor.RenderMap();
kp3d::Renderer3D::DrawBillboard(tex, {}, { 1, 1 }); kp3d::Renderer3D::DrawBillboard(tex, {}, { 1, 1 });
kp3d::Transform trans{ {-2.0f, 0.0f, -2.0f}, {kp3d::ToRadians(-90), 0, 0}, kp3d::Vec3(0.1f)};
kp3d::Renderer3D::PushShader(kp3d::Renderer3D::GetMapShader());
kp3d::Renderer3D::DrawModel(seal, trans);
kp3d::Renderer3D::PopShader();
kp3d::Renderer3D::End(); kp3d::Renderer3D::End();
// 2D scene // 2D scene

View file

@ -6,6 +6,7 @@
#include <KP3D_Math.h> #include <KP3D_Math.h>
#include <KP3D_Camera.h> #include <KP3D_Camera.h>
#include <KP3D_Map.h> #include <KP3D_Map.h>
#include <KP3D_Model.h>
#include "Editor.h" #include "Editor.h"
@ -35,6 +36,8 @@ public:
kp3d::Texture crosshair; kp3d::Texture crosshair;
kp3d::Mat4 projection; kp3d::Mat4 projection;
kp3d::Model seal;
private: private:
// KP3D essentials // KP3D essentials
int m_mode; int m_mode;