Konata animation test

This commit is contained in:
kp 2024-08-10 16:14:28 -05:00
parent 9010b5e821
commit 89a7084a1f
14 changed files with 1373 additions and 870 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View file

@ -19,7 +19,7 @@ out vec3 v_bitangent;
out float v_id; out float v_id;
const int MAX_BONES = 48; const int MAX_BONES = 96;
uniform mat4 u_bones[MAX_BONES]; uniform mat4 u_bones[MAX_BONES];
uniform int u_has_bones; uniform int u_has_bones;

View file

@ -1,742 +1,111 @@
[04:00:32 AM] Info: Starting... [04:12:58 PM] 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
[04:00:32 AM] Info: Initializing SDL [04:12:58 PM] Info: Initializing SDL
[04:00:32 AM] Info: Initializing OpenGL [04:12:58 PM] Info: Initializing OpenGL
[04:00:32 AM] Info: OpenGL version: 4.6.0 NVIDIA 536.23 [04:12:58 PM] Info: OpenGL version: 4.6.0 NVIDIA 536.23
[04:00:32 AM] Info: Initializing GLEW [04:12:58 PM] Info: Initializing GLEW
[04:00:32 AM] Info: Initializing SDL_mixer [04:12:58 PM] Info: Initializing SDL_mixer
[04:00:32 AM] Info: Reticulating splines... [04:12:58 PM] Info: Reticulating splines...
[04:00:32 AM] Info: Ready! [04:12:59 PM] Info: Ready!
[04:00:32 AM] Info: Loading script: build-cylinder.scm [04:12:59 PM] Info: Loading script: build-cylinder.scm
[04:00:32 AM] Info: Loading script: build-stairs.scm [04:12:59 PM] Info: Loading script: build-stairs.scm
[04:00:32 AM] Info: Loading material resource: block.png [04:12:59 PM] Info: Loading material resource: block.png
[04:00:32 AM] Info: Found normal map texture: materials/block_n.png [04:12:59 PM] Info: Found normal map texture: materials/block_n.png
[04:00:32 AM] Info: Loading material resource: brick2.jpg [04:12:59 PM] Info: Loading material resource: brick2.jpg
[04:00:32 AM] Info: Found normal map texture: materials/brick2_n.jpg [04:12:59 PM] Info: Found normal map texture: materials/brick2_n.jpg
[04:00:32 AM] Info: Loading material resource: bricks.jpg [04:12:59 PM] Info: Loading material resource: bricks.jpg
[04:00:32 AM] Info: Found normal map texture: materials/bricks_n.jpg [04:12:59 PM] Info: Found normal map texture: materials/bricks_n.jpg
[04:00:32 AM] Info: Loading material resource: FLAT5_7.png [04:12:59 PM] Info: Loading material resource: FLAT5_7.png
[04:00:32 AM] Info: Found normal map texture: materials/FLAT5_7_n.png [04:12:59 PM] Info: Found normal map texture: materials/FLAT5_7_n.png
[04:00:32 AM] Info: Loading material resource: floor0.png [04:12:59 PM] Info: Loading material resource: floor0.png
[04:00:32 AM] Info: Found normal map texture: materials/floor0_n.png [04:12:59 PM] Info: Found normal map texture: materials/floor0_n.png
[04:00:32 AM] Info: Loading material resource: floor1.png [04:12:59 PM] Info: Loading material resource: floor1.png
[04:00:32 AM] Info: Found normal map texture: materials/floor1_n.png [04:12:59 PM] Info: Found normal map texture: materials/floor1_n.png
[04:00:32 AM] Info: Loading material resource: GRASS2.png [04:12:59 PM] Info: Loading material resource: GRASS2.png
[04:00:32 AM] Info: Found normal map texture: materials/GRASS2_n.png [04:12:59 PM] Info: Found normal map texture: materials/GRASS2_n.png
[04:00:32 AM] Info: Loading material resource: hardwood.jpg [04:12:59 PM] Info: Loading material resource: hardwood.jpg
[04:00:32 AM] Info: Found normal map texture: materials/hardwood_n.jpg [04:12:59 PM] Info: Found normal map texture: materials/hardwood_n.jpg
[04:00:32 AM] Info: Loading texture resource: .kp3d/banner.png [04:12:59 PM] Info: Loading texture resource: .kp3d/banner.png
[04:00:32 AM] Info: Loading texture resource: .kp3d/crosshair.png [04:12:59 PM] Info: Loading texture resource: .kp3d/crosshair.png
[04:00:32 AM] Info: Loading texture resource: .kp3d/empty.png [04:12:59 PM] Info: Loading texture resource: .kp3d/empty.png
[04:00:32 AM] Info: Loading texture resource: .kp3d/logo.png [04:12:59 PM] Info: Loading texture resource: .kp3d/logo.png
[04:00:32 AM] Info: Loading texture resource: .kp3d/map_grid.png [04:12:59 PM] Info: Loading texture resource: .kp3d/map_grid.png
[04:00:32 AM] Info: Loading texture resource: .kp3d/not_found.png [04:12:59 PM] Info: Loading texture resource: .kp3d/not_found.png
[04:00:32 AM] Info: Loading texture resource: .kp3d/skybox.png [04:12:59 PM] Info: Loading texture resource: .kp3d/skybox.png
[04:00:32 AM] Info: Loading texture resource: .kp3d/uv_test.png [04:12:59 PM] Info: Loading texture resource: .kp3d/uv_test.png
[04:00:32 AM] Info: Loading texture resource: .kp3d/water.png [04:12:59 PM] Info: Loading texture resource: .kp3d/water.png
[04:00:32 AM] Info: Loading texture resource: dot.png [04:12:59 PM] Info: Loading texture resource: dot.png
[04:00:32 AM] Info: Loading texture resource: editor/stem.png [04:12:59 PM] Info: Loading texture resource: editor/stem.png
[04:00:32 AM] Info: Loading texture resource: logo.png [04:12:59 PM] Info: Loading texture resource: logo.png
[04:00:32 AM] Info: Loading texture resource: skyboxes/sky50e2dd1d496fc.jpg [04:12:59 PM] Info: Loading texture resource: skyboxes/sky50e2dd1d496fc.jpg
[04:00:32 AM] Info: Loading texture resource: skyboxes/sky8.jpg [04:12:59 PM] Info: Loading texture resource: skyboxes/sky8.jpg
[04:00:32 AM] Info: Loading texture resource: skyboxes/sky9.jpg [04:12:59 PM] Info: Loading texture resource: skyboxes/sky9.jpg
[04:00:32 AM] Info: Loading texture resource: skyboxes/skybox.jpg [04:12:59 PM] Info: Loading texture resource: skyboxes/skybox.jpg
[04:00:32 AM] Info: Loading texture resource: skyboxes/skybox_11.jpg [04:12:59 PM] Info: Loading texture resource: skyboxes/skybox_11.jpg
[04:00:32 AM] Info: Loading texture resource: skyboxes/skybox_14.jpg [04:12:59 PM] Info: Loading texture resource: skyboxes/skybox_14.jpg
[04:00:32 AM] Info: Loading texture resource: skyboxes/skybox_15.jpg [04:12:59 PM] Info: Loading texture resource: skyboxes/skybox_15.jpg
[04:00:33 AM] Info: Loading texture resource: skyboxes/skybox_3.jpg [04:12:59 PM] Info: Loading texture resource: skyboxes/skybox_3.jpg
[04:00:33 AM] Info: Loading texture resource: skybox_16.jpg [04:12:59 PM] Info: Loading texture resource: skybox_16.jpg
[04:00:33 AM] Info: FOUND ANIMATION: seal.qc_skeleton_seal.qc_skeleton, 0 [04:12:59 PM] Info: # of bones for model konata/Konata_PistolAnimations.dae: 23
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_body2: 1208 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Pelvis: 432
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_body1: 2068 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine: 279
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_head: 2188 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine1: 350
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyeupper_l: 648 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine2: 515
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyelower_l: 359 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine4: 132
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyeupper_r: 636 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Neck1: 25
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyelower_r: 359 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Head1: 6
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_jowl_l: 666 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Clavicle: 219
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_jowl_r: 818 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_UpperArm: 226
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_flipper1_l: 272 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Forearm: 342
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_flipper2_l: 304 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Hand: 254
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_flipper1_r: 272 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_Clavicle: 172
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_flipper2_r: 304 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_UpperArm: 208
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_body3: 1320 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_Forearm: 333
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_body4: 1436 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_Hand: 248
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_body5: 1436 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Thigh: 475
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_backflipper_r: 1358 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Calf: 382
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_backflipper_l: 1358 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Foot: 319
[04:00:33 AM] Info: FOUND TEXTURE: seal.png [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Toe0: 159
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_head: 24 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_Thigh: 490
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyeupper_l: 30 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_Calf: 359
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyelower_l: 36 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_Foot: 304
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyeupper_r: 30 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_Toe0: 154
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_eyelower_r: 36 [04:12:59 PM] Info: # of bones for model konata/Konata_PistolAnimations.dae: 7
[04:00:33 AM] Info: FOUND TEXTURE: seal.png [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine: 312
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_jowl_l: 12 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine1: 168
[04:00:33 AM] Info: Num weights for seal_qc_skeleton_jowl_r: 12 [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine2: 164
[04:00:33 AM] Info: FOUND TEXTURE: seal_whiskers.png [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine4: 154
[04:00:33 AM] Info: Map init [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Neck1: 408
[04:00:33 AM] Info: Finalized mesh with 49 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Head1: 3912
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Clavicle: 14
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: # of bones for model konata/Konata_PistolAnimations.dae: 8
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine2: 30
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Spine4: 26
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Neck1: 123
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_Head1: 1027
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_Clavicle: 87
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_R_UpperArm: 5
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_Clavicle: 64
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Num weights for Konatap_ARM_ValveBiped_Bip01_L_UpperArm: 3
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Map init
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:12:59 PM] Info: Finalized mesh with 49 batches
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:13:05 PM] Info: Starting animation
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:13:14 PM] Info: Starting animation
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:13:19 PM] Info: Starting animation
[04:00:42 AM] Info: Finalized mesh with 48 batches [04:13:26 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:27 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:30 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:30 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:31 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:31 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:31 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:32 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:32 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:32 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:33 PM] Info: Starting animation
[04:00:44 AM] Info: Finalized mesh with 48 batches [04:13:34 PM] Info: Starting animation
[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

@ -1,28 +1,30 @@
#include "KP3D_Model.h" #include "KP3D_Model.h"
#include <filesystem>
#include <assimp/postprocess.h> #include <assimp/postprocess.h>
#include "KP3D_EventBus.h" #include "KP3D_EventBus.h"
#include "KP3D_SystemUtils.h" #include "KP3D_SystemUtils.h"
#include "KP3D_Log.h" #include "KP3D_Log.h"
#include "KP3D_Time.h" #include "KP3D_Time.h"
#include "KP3D_Renderer2D.h"
namespace { namespace {
#define TRANSPOSE_AI 0 #define TRANSPOSE_AI 0
using namespace kp3d; kp3d::Mat4 ConvertAssimpMatrix(const aiMatrix4x4& in)
Mat4 aimattokp3dmat(const aiMatrix4x4& in)
{ {
Mat4 val; kp3d::Mat4 mat;
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) for (int j = 0; j < 4; j++)
#if TRANSPOSE_AI #if TRANSPOSE_AI
val.mat[i + j * 4] = in[j][i]; val.mat[i + j * 4] = in[j][i];
#else #else
val.mat[i + j * 4] = in[i][j]; mat.mat[i + j * 4] = in[i][j];
#endif #endif
return val; return mat;
} }
} // namespace } // namespace
@ -54,47 +56,7 @@ Model::~Model()
ErrCode Model::Load(const std::string& path, const std::string& main_texture_path) ErrCode Model::Load(const std::string& path, const std::string& main_texture_path)
{ {
return LoadModel( return LoadModel(path);
path,
main_texture_path,
[&]()
{
if (!main_texture_path.empty())
{
m_textures.push_back(new Texture());
m_textures.back()->Load(main_texture_path);
}
}
);
}
ErrCode Model::LoadCached(
const std::string& path,
const std::string& main_texture_path,
std::vector<RawTexture*>& raw_texture_data,
TextureCache& texture_cache
)
{
Model* self = this;
return LoadModel(
path,
main_texture_path,
[&]()
{
KP3D_LOG_ERROR("Model::LoadCached() disabled");
// TODO: Re-enable me!
// raw_texture_data.push_back(new RawTexture(main_texture_path));
// TextureLoadEvent* event = new TextureLoadEvent(main_texture_path, raw_texture_data.size() - 1);
// event->dependent_model = self;
// EventBus::GetInstance().PublishDeferred(event);
}
);
}
void Model::AddTexture(Texture* texture)
{
m_textures.push_back(texture);
} }
std::string Model::GetPath() const std::string Model::GetPath() const
@ -189,7 +151,7 @@ void Model::ParseSingleBone(MeshDef& def, const aiBone* bone)
if (bone_id == m_bone_info.size()) if (bone_id == m_bone_info.size())
{ {
Mat4 offset = aimattokp3dmat(bone->mOffsetMatrix); Mat4 offset = ConvertAssimpMatrix(bone->mOffsetMatrix);
BoneInfo bi(offset); BoneInfo bi(offset);
m_bone_info.push_back(bi); m_bone_info.push_back(bi);
} }
@ -229,11 +191,14 @@ void Model::GetBoneTransforms(float seconds, std::vector<Mat4>& transforms)
if (!m_has_bones) if (!m_has_bones)
return; return;
float animation_time_ticks = 0.0f;
if (m_scene->HasAnimations())
{
const aiAnimation* animation = m_scene->mAnimations[m_animation_index]; const aiAnimation* animation = m_scene->mAnimations[m_animation_index];
float ticks_per_second = (float)(animation->mTicksPerSecond != 0 ? animation->mTicksPerSecond : 25.0f);
float ticks_per_second = (float) (animation->mTicksPerSecond != 0 ? animation->mTicksPerSecond : 25.0f);
float time_in_ticks = seconds * ticks_per_second; float time_in_ticks = seconds * ticks_per_second;
float animation_time_ticks = fmod(time_in_ticks, (float) animation->mDuration); animation_time_ticks = fmod(time_in_ticks, (float)animation->mDuration);
}
Mat4 identity; Mat4 identity;
identity.InitIdentity(); identity.InitIdentity();
@ -251,8 +216,10 @@ void Model::ReadNodeHierarchy(float ticks, const aiNode* node, const Mat4& paren
return; return;
std::string node_name(node->mName.data); std::string node_name(node->mName.data);
Mat4 node_transformation = aimattokp3dmat(node->mTransformation); Mat4 node_transformation = ConvertAssimpMatrix(node->mTransformation);
if (m_scene->HasAnimations())
{
const aiAnimation* animation = m_scene->mAnimations[m_animation_index]; const aiAnimation* animation = m_scene->mAnimations[m_animation_index];
const aiNodeAnim* node_anim = FindNodeAnim(animation, node_name); const aiNodeAnim* node_anim = FindNodeAnim(animation, node_name);
if (node_anim) if (node_anim)
@ -261,7 +228,7 @@ void Model::ReadNodeHierarchy(float ticks, const aiNode* node, const Mat4& paren
aiVector3D scaling; aiVector3D scaling;
CalcInterpScaling(scaling, ticks, node_anim); CalcInterpScaling(scaling, ticks, node_anim);
Mat4 scaling_m; Mat4 scaling_m;
scaling_m.InitScale({scaling.x, scaling.y, scaling.z}); scaling_m.InitScale({ scaling.x, scaling.y, scaling.z });
// Same with rotation.... // Same with rotation....
aiQuaternion rotation_q; aiQuaternion rotation_q;
@ -275,17 +242,18 @@ void Model::ReadNodeHierarchy(float ticks, const aiNode* node, const Mat4& paren
aiVector3D translation; aiVector3D translation;
CalcInterpPosition(translation, ticks, node_anim); CalcInterpPosition(translation, ticks, node_anim);
Mat4 translation_m; Mat4 translation_m;
translation_m.InitTranslation({translation.x, translation.y, translation.z}); translation_m.InitTranslation({ translation.x, translation.y, translation.z });
// Combine the above transformations for a complete transformation matrix // Combine the above transformations for a complete transformation matrix
node_transformation = translation_m * rotation_m * scaling_m; node_transformation = translation_m * rotation_m * scaling_m;
} }
}
Mat4 global_transformation = parent_transform * node_transformation; Mat4 global_transformation = parent_transform * node_transformation;
if (m_bone_name_to_index_map.count(node_name)) if (m_bone_name_to_index_map.count(node_name))
{ {
Mat4 git = aimattokp3dmat(m_global_inverse_transform); Mat4 git = ConvertAssimpMatrix(m_global_inverse_transform);
uint bone_idx = m_bone_name_to_index_map[node_name]; uint bone_idx = m_bone_name_to_index_map[node_name];
m_bone_info[bone_idx].final_transformation = git * global_transformation * m_bone_info[bone_idx].offset_matrix; m_bone_info[bone_idx].final_transformation = git * global_transformation * m_bone_info[bone_idx].offset_matrix;
@ -414,31 +382,17 @@ const aiNodeAnim* Model::FindNodeAnim(const aiAnimation* animation, const std::s
return nullptr; return nullptr;
} }
ErrCode Model::LoadModel(const std::string& path, const std::string& main_texture_path, std::function<void(void)> load_textures) ErrCode Model::LoadModel(const std::string& path)
{ {
std::string kp3d_path = sys::GetModelDir() + path; std::string kp3d_path = sys::GetModelDir() + path;
m_path = path; m_path = path;
// Quick reset
m_meshes.clear(); m_meshes.clear();
m_textures.clear(); m_textures.clear();
m_vertices = 0; m_vertices = 0;
m_faces = 0; m_faces = 0;
// Run the texture loading routine (this can vary based on how we've decided to load the model)
//if (load_textures)
// load_textures();
// TODO: Retarded busy-waiting, fix whenever I restructure this
//
// Another consideration: Do we even need to do this if it's using the texture cache? I mean we can do this busy-waiting as a
// 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
//
//while (!m_textures.size())
// std::this_thread::sleep_for(std::chrono::milliseconds(50));
std::string parent_dir = kp3d_path.substr(0, kp3d_path.find_last_of("/\\")); std::string parent_dir = kp3d_path.substr(0, kp3d_path.find_last_of("/\\"));
m_scene = m_importer.ReadFile( m_scene = m_importer.ReadFile(
@ -452,17 +406,12 @@ 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();
// exit(1);
// TODO: Go through the scene's material information and try to grab diffuse, AO, normal map, etc. textures...
if (m_scene->HasAnimations()) if (m_scene->HasAnimations())
{ {
for (size_t i = 0; i < m_scene->mNumAnimations; i++) for (size_t i = 0; i < m_scene->mNumAnimations; i++)
{ {
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);
} }
} }
@ -502,6 +451,7 @@ ErrCode Model::LoadModel(const std::string& path, const std::string& main_textur
if (model->HasBones()) if (model->HasBones())
{ {
KP3D_LOG_INFO("# of bones for model {}: {}", m_path, model->mNumBones);
m_has_bones = true; m_has_bones = true;
def.bones.resize(def.vertices.size()); def.bones.resize(def.vertices.size());
ParseBones(def, model); ParseBones(def, model);
@ -511,30 +461,33 @@ ErrCode Model::LoadModel(const std::string& path, const std::string& main_textur
def.base_index = m_faces * 3; def.base_index = m_faces * 3;
Texture* tex = nullptr,* normal_tex = nullptr; Texture* tex = nullptr,* normal_tex = nullptr;
const Texture* default_tex = &Renderer2D::GetDefaultTexture();
if (m_scene->HasMaterials()) if (m_scene->HasMaterials())
{ {
aiString path; aiString path;
if (!m_scene->mMaterials[model->mMaterialIndex]->GetTexture(aiTextureType_DIFFUSE, 0, &path)) if (!m_scene->mMaterials[model->mMaterialIndex]->GetTexture(aiTextureType_DIFFUSE, 0, &path))
{ {
std::string tex_path(path.C_Str());
tex_path = std::filesystem::path(tex_path).filename().string();
tex = new Texture(); tex = new Texture();
tex->Load("$" + parent_dir + "/" + path.C_Str(), false, Texture::FILTER_LINEAR); tex->Load("$" + parent_dir + "/" + tex_path, false, Texture::FILTER_LINEAR);
m_textures.push_back(tex); m_textures.push_back(tex);
KP3D_LOG_INFO("FOUND TEXTURE: {}", path.C_Str());
} }
aiString normal_path; aiString normal_path;
if (!m_scene->mMaterials[model->mMaterialIndex]->GetTexture(aiTextureType_NORMALS, 0, &path)) if (!m_scene->mMaterials[model->mMaterialIndex]->GetTexture(aiTextureType_NORMALS, 0, &path))
{ {
std::string tex_path(path.C_Str());
tex_path = std::filesystem::path(tex_path).filename().string();
normal_tex = new Texture(); normal_tex = new Texture();
normal_tex->Load("$" + parent_dir + "/" + path.C_Str(), false, Texture::FILTER_LINEAR); normal_tex->Load("$" + parent_dir + "/" + tex_path, false, Texture::FILTER_LINEAR);
m_normal_textures.push_back(normal_tex); m_normal_textures.push_back(normal_tex);
KP3D_LOG_INFO("FOUND NORMAL TEXTURE: {}", path.C_Str());
} }
} }
if (model->HasBones()) if (model->HasBones())
m->AddSkinnedBatch(tex, def.vertices, def.indices, def.bones, false, normal_tex); m->AddSkinnedBatch(tex ? tex : default_tex, def.vertices, def.indices, def.bones, false, normal_tex);
else else
m->AddIndexedBatch(tex, def.vertices, def.indices, normal_tex); m->AddIndexedBatch(tex ? tex : default_tex, def.vertices, def.indices, normal_tex);
m->Finalize(); m->Finalize();
m_meshes.push_back(m); m_meshes.push_back(m);

View file

@ -23,15 +23,6 @@ public:
~Model(); ~Model();
ErrCode Load(const std::string& path, const std::string& main_texture_path = ""); ErrCode Load(const std::string& path, const std::string& main_texture_path = "");
// TODO: Remove this, realized I don't really need it
ErrCode LoadCached(
const std::string& path,
const std::string& main_texture_path,
std::vector<RawTexture*>& raw_texture_data,
TextureCache& texture_cache
);
void AddTexture(Texture* texture);
std::string GetPath() const; std::string GetPath() const;
@ -70,7 +61,7 @@ private:
void CalcInterpRotation(aiQuaternion& out, float ticks, const aiNodeAnim* node_anim); void CalcInterpRotation(aiQuaternion& out, float ticks, const aiNodeAnim* node_anim);
void CalcInterpScaling(aiVector3D& out, float ticks, const aiNodeAnim* node_anim); void CalcInterpScaling(aiVector3D& out, float ticks, const aiNodeAnim* node_anim);
const aiNodeAnim* FindNodeAnim(const aiAnimation* animation, const std::string& node_name); const aiNodeAnim* FindNodeAnim(const aiAnimation* animation, const std::string& node_name);
ErrCode LoadModel(const std::string& path, const std::string& main_texture_path, std::function<void(void)> load_textures); ErrCode LoadModel(const std::string& path);
private: private:
Texture* m_main_texture; Texture* m_main_texture;

View file

@ -10,7 +10,7 @@
#include "KP3D_Texture.h" #include "KP3D_Texture.h"
#define MAX_NUM_BONES_PER_VERTEX 4 #define MAX_NUM_BONES_PER_VERTEX 4
#define MAX_BONES 48 #define MAX_BONES 96
namespace kp3d { namespace kp3d {

View file

@ -238,9 +238,9 @@ void Editor::Update()
#define KEY_SHORTCUT(key, action) if (sandbox->IsKeyDown(kp3d::KEY_##key)) { action; sandbox->KeyReset(kp3d::KEY_##key); } #define KEY_SHORTCUT(key, action) if (sandbox->IsKeyDown(kp3d::KEY_##key)) { action; sandbox->KeyReset(kp3d::KEY_##key); }
KEY_SHORTCUT(SPACE, m_mode = MODE_NORMAL); KEY_SHORTCUT(SPACE, SetMode(MODE_NORMAL));
KEY_SHORTCUT(V, m_mode = MODE_BUILD); KEY_SHORTCUT(V, SetMode(MODE_BUILD));
KEY_SHORTCUT(T, m_mode = MODE_THINGS); KEY_SHORTCUT(T, SetMode(MODE_THINGS));
KEY_SHORTCUT(Z, { KEY_SHORTCUT(Z, {
if (sandbox->IsKeyDown(kp3d::KEY_LCTRL)) if (sandbox->IsKeyDown(kp3d::KEY_LCTRL))
Undo(); Undo();
@ -252,6 +252,7 @@ void Editor::Update()
KEY_SHORTCUT(F1, sandbox->map.render_wireframe ^= 1); KEY_SHORTCUT(F1, sandbox->map.render_wireframe ^= 1);
KEY_SHORTCUT(F2, show_grid ^= 1); KEY_SHORTCUT(F2, show_grid ^= 1);
KEY_SHORTCUT(TAB, show_selection_info ^= 1); KEY_SHORTCUT(TAB, show_selection_info ^= 1);
KEY_SHORTCUT(Q, Deselect());
switch (m_mode) switch (m_mode)
{ {
@ -308,6 +309,20 @@ void Editor::RebuildMap()
m_build_time = kp3d::CurrentTimeInMilliseconds().count() - start; m_build_time = kp3d::CurrentTimeInMilliseconds().count() - start;
} }
void Editor::SetMode(EditMode mode)
{
Deselect();
m_mode = mode;
}
void Editor::Deselect()
{
kp3d::editor_hovered_batch.clear();
m_selected_thing = nullptr;
points.clear();
build_has_start_pos = false;
}
void Editor::UpdateModeBuild() void Editor::UpdateModeBuild()
{ {
if (sandbox->IsMouseButtonDown(kp3d::MOUSE_BUTTON_LEFT) && !build_show_options) if (sandbox->IsMouseButtonDown(kp3d::MOUSE_BUTTON_LEFT) && !build_show_options)
@ -993,8 +1008,6 @@ void Editor::RenderModeThings()
nullptr nullptr
); );
editing_gizmo = ImGuizmo::IsOver(); editing_gizmo = ImGuizmo::IsOver();
// if (v)
{
float translation[3], rotation[3], scale[3]; float translation[3], rotation[3], scale[3];
ImGuizmo::DecomposeMatrixToComponents(tmp, translation, rotation, scale); ImGuizmo::DecomposeMatrixToComponents(tmp, translation, rotation, scale);
m_selected_thing->transform.translation = {translation[0], translation[1], translation[2]}; m_selected_thing->transform.translation = {translation[0], translation[1], translation[2]};
@ -1004,7 +1017,6 @@ void Editor::RenderModeThings()
kp3d::ToRadians(rotation[2]) kp3d::ToRadians(rotation[2])
}; };
m_selected_thing->transform.scale = {scale[0], scale[1], scale[2]}; m_selected_thing->transform.scale = {scale[0], scale[1], scale[2]};
}
} }
void Editor::RenderUI() void Editor::RenderUI()
@ -1030,9 +1042,11 @@ void Editor::RenderUI()
} }
if (ImGui::BeginMenu("Mode")) if (ImGui::BeginMenu("Mode"))
{ {
if (ImGui::MenuItem("Normal Mode", "Space", m_mode == MODE_NORMAL)) m_mode = MODE_NORMAL; if (ImGui::MenuItem("Normal Mode", "Space", m_mode == MODE_NORMAL)) SetMode(MODE_NORMAL);
if (ImGui::MenuItem("Build Mode", "V", m_mode == MODE_BUILD)) m_mode = MODE_BUILD; if (ImGui::MenuItem("Build Mode", "V", m_mode == MODE_BUILD)) SetMode(MODE_BUILD);
if (ImGui::MenuItem("Things Mode", "T", m_mode == MODE_THINGS)) m_mode = MODE_THINGS; if (ImGui::MenuItem("Things Mode", "T", m_mode == MODE_THINGS)) SetMode(MODE_THINGS);
ImGui::Separator();
if (ImGui::MenuItem("Clear Selection", "Q")) Deselect();
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (ImGui::BeginMenu("View")) if (ImGui::BeginMenu("View"))

View file

@ -43,6 +43,9 @@ public:
void RenderStem(kp3d::Vec3 position); void RenderStem(kp3d::Vec3 position);
void RebuildMap(); void RebuildMap();
void SetMode(EditMode mode);
void Deselect();
void UpdateModeBuild(); void UpdateModeBuild();
void RenderModeBuild(); void RenderModeBuild();
void UpdateModeNormal(); void UpdateModeNormal();

View file

@ -20,7 +20,7 @@ Sandbox::Sandbox(const std::string& path):
kp3d::res::LoadTextures(); kp3d::res::LoadTextures();
seal.noflip = true; seal.noflip = true;
seal.Load("seal/seal.dae"); seal.Load("konata/Konata_PistolAnimations.dae");
tex.Load("logo.png"); tex.Load("logo.png");
crosshair.Load(".kp3d/crosshair.png"); crosshair.Load(".kp3d/crosshair.png");
@ -123,7 +123,7 @@ 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::Transform trans{ {0.0f, 0.0f, 0}, {kp3d::ToRadians(-90), 0, 0}, kp3d::Vec3(1.0f)};
kp3d::Renderer3D::PushShader(kp3d::Renderer3D::GetMapShader()); kp3d::Renderer3D::PushShader(kp3d::Renderer3D::GetMapShader());
kp3d::Renderer3D::DrawModel(seal, trans); kp3d::Renderer3D::DrawModel(seal, trans);
kp3d::Renderer3D::PopShader(); kp3d::Renderer3D::PopShader();