diff --git a/paint/sources/globals.h b/paint/sources/globals.h index ecaa36ff..1036f7de 100644 --- a/paint/sources/globals.h +++ b/paint/sources/globals.h @@ -35,7 +35,6 @@ f32 layers_default_base = 0.5; f32 layers_default_rough = 0.4; ui_align_t config_button_align = UI_ALIGN_LEFT; char *config_button_spacing = " "; -any_imap_t *physics_body_object_map; ui_handle_t *box_export_htab; string_array_t *box_export_files = NULL; ui_handle_t *box_export_mesh_handle; @@ -172,7 +171,6 @@ ui_handle_t *ui_menubar_menu_handle; ui_handle_t *ui_menubar_tab; i32 ui_menubar_w; any_map_t *translator_translations; -physics_world_t *physics_world_active; bool ui_menu_show = false; bool ui_menu_nested = false; i32 ui_menu_x = 0; diff --git a/paint/sources/main.c b/paint/sources/main.c index 1d9c2e10..57239758 100644 --- a/paint/sources/main.c +++ b/paint/sources/main.c @@ -213,14 +213,12 @@ #include "operator.c" #include "parser_logic.c" #include "parser_material.c" -#include "physics_body.c" -#include "physics_sim.c" -#include "physics_world.c" #include "pipes.c" #include "player.c" #include "plugin.c" #include "project.c" #include "resource.c" +#include "sim.c" #include "slot_brush.c" #include "slot_font.c" #include "slot_layer.c" @@ -248,9 +246,6 @@ void _kickstart() { g_operators = any_map_create(); gc_root(g_operators); - physics_body_object_map = any_imap_create(); - gc_root(physics_body_object_map); - box_export_htab = ui_handle_create(); gc_root(box_export_htab); diff --git a/paint/sources/physics_body.c b/paint/sources/physics_body.c deleted file mode 100644 index c92605b3..00000000 --- a/paint/sources/physics_body.c +++ /dev/null @@ -1,83 +0,0 @@ - -#ifdef WITH_PHYSICS - -#include "../libs/asim.h" -#include "global.h" - -physics_body_t *physics_body_create() { - physics_body_t *body = GC_ALLOC_INIT(physics_body_t, {0}); - return body; -} - -void physics_body_init(physics_body_t *body, object_t *obj) { - any_imap_set(physics_body_object_map, obj->uid, body); - - body->obj = obj; - transform_compute_dim(obj->transform); - body->dimx = obj->transform->dim.x; - body->dimy = obj->transform->dim.y; - body->dimz = obj->transform->dim.z; - - f32 scale_pos = 1.0; - i16_array_t *posa = NULL; - u32_array_t *inda = NULL; - - if (body->shape == PHYSICS_SHAPE_MESH || body->shape == PHYSICS_SHAPE_HULL || body->shape == PHYSICS_SHAPE_TERRAIN) { - mesh_object_t *mo = obj->ext; - mesh_data_t *data = mo->data; - vec4_t scale = obj->transform->scale; - - if (obj->parent != NULL) { - scale.x *= obj->parent->transform->scale.x; - scale.y *= obj->parent->transform->scale.y; - scale.z *= obj->parent->transform->scale.z; - } - - i16_array_t *positions = mesh_data_get_vertex_array(data, "pos")->values; - u32_array_t *indices0 = data->index_array; - - scale_pos = scale.x * data->scale_pos; - posa = positions; - inda = indices0; - } - - vec4_t loc = obj->transform->loc; - body->_body = asim_body_create(body->shape, body->mass, body->dimx, body->dimy, body->dimz, loc.x, loc.y, loc.z, posa, inda, scale_pos); -} - -void physics_body_remove(physics_body_t *body) { - if (body == NULL) { - return; - } - imap_delete(physics_body_object_map, body->obj->uid); - asim_body_remove(body->_body); -} - -void physics_body_set_mass(physics_body_t *body, f32 mass) { - body->mass = mass; - if (body->shape == PHYSICS_SHAPE_SPHERE) { - asim_body_set_mass(body->_body, mass); - } -} - -void physics_body_apply_impulse(physics_body_t *body, vec4_t dir) { - asim_body_apply_impulse(body->_body, dir.x, dir.y, dir.z); -} - -void physics_body_sync_transform(physics_body_t *body) { - transform_t *transform = body->obj->transform; - asim_body_sync_transform(body->_body, transform->loc, transform->rot); -} - -void physics_body_update(physics_body_t *body) { - if (body->shape == PHYSICS_SHAPE_MESH) { - return; //// - } - - transform_t *transform = body->obj->transform; - asim_body_get_pos(body->_body, &transform->loc); - asim_body_get_rot(body->_body, &transform->rot); - transform_build_matrix(transform); -} - -#endif diff --git a/paint/sources/physics_world.c b/paint/sources/physics_world.c deleted file mode 100644 index 27a06bfd..00000000 --- a/paint/sources/physics_world.c +++ /dev/null @@ -1,39 +0,0 @@ - -#ifdef WITH_PHYSICS - -#include "../libs/asim.h" -#include "global.h" - -physics_world_t *physics_world_create() { - asim_world_create(); - physics_world_t *world = GC_ALLOC_INIT(physics_world_t, {0}); - gc_unroot(physics_world_active); - physics_world_active = world; - gc_root(physics_world_active); - return world; -} - -void physics_world_update(physics_world_t *world) { - asim_world_update(sys_delta()); - - i32_array_t *keys = imap_keys(physics_body_object_map); - for (i32 i = 0; i < keys->length; ++i) { - physics_body_t *body = any_imap_get(physics_body_object_map, keys->buffer[i]); - physics_body_update(body); - } -} - -physics_pair_t_array_t *physics_world_get_contact_pairs(physics_world_t *world, physics_body_t *body) { - physics_pair_t_array_t *pairs = any_array_create_from_raw((void *[]){}, 0); - physics_pair_t *p = asim_world_get_contact(body->_body); - if (p->pos_a_x != 0 || p->pos_a_y != 0 || p->pos_a_z != 0) { - any_array_push(pairs, p); - } - return pairs; -} - -float physics_world_get_speed(physics_world_t *world, physics_body_t *body) { - return asim_body_get_speed(body->_body); -} - -#endif diff --git a/paint/sources/render/render_gizmo.c b/paint/sources/render/render_gizmo.c index 7037be61..c6de54b3 100644 --- a/paint/sources/render/render_gizmo.c +++ b/paint/sources/render/render_gizmo.c @@ -89,9 +89,9 @@ void render_gizmo_update() { transform_build_matrix(paint_object->transform); - physics_body_t *pb = any_imap_get(physics_body_object_map, paint_object->uid); + asim_body_t *pb = paint_object->_->body; if (pb != NULL) { - physics_body_sync_transform(pb); + asim_body_sync_transform(pb); } } } diff --git a/paint/sources/physics_sim.c b/paint/sources/sim.c similarity index 58% rename from paint/sources/physics_sim.c rename to paint/sources/sim.c index 1844846b..e6e50b62 100644 --- a/paint/sources/physics_sim.c +++ b/paint/sources/sim.c @@ -8,24 +8,16 @@ void sim_init() { if (sim_initialized) { return; } - physics_world_create(); + asim_world_create(); sim_initialized = true; } void sim_update() { - render_path_raytrace_ready = false; if (sim_running) { - // if (render_path_raytrace_frame != 1) { - // return; - // } - - physics_world_t *world = physics_world_active; - physics_world_update(world); - + asim_world_update(); iron_delay_idle_sleep(); - if (sim_record) { render_target_t *rt = any_map_get(render_path_render_targets, "last"); buffer_t *pixels = gpu_get_texture_pixels(rt->_image); @@ -74,43 +66,16 @@ void sim_stop() { mesh_object_t_array_t *pos = g_project->_->paint_objects; for (i32 i = 0; i < pos->length; ++i) { transform_set_matrix(pos->buffer[i]->base->transform, *(mat4_t *)sim_transforms->buffer[i]); - physics_body_t *pb = any_imap_get(physics_body_object_map, pos->buffer[i]->base->uid); + asim_body_t *pb = pos->buffer[i]->base->_->body; if (pb != NULL) { - physics_body_sync_transform(pb); + asim_body_sync_transform(pb); } } } -void sim_add_body(object_t *o, physics_shape_t shape, f32 mass) { +void sim_add_body(object_t *o, asim_shape_t shape, f32 mass) { sim_init(); - physics_body_t *body = physics_body_create(); - body->shape = shape; - body->mass = mass; - physics_body_init(body, o); -} - -void sim_remove_body(physics_body_t *pb) { - physics_body_remove(pb); -} - -mesh_data_t *mesh_data_duplicate(mesh_data_t *source) { - mesh_data_t *raw = gc_alloc(sizeof(mesh_data_t)); - raw->name = string_copy(source->name); - raw->scale_pos = source->scale_pos; - raw->scale_tex = source->scale_tex; - - raw->vertex_arrays = (vertex_array_t_array_t *)any_array_create_from_raw((void *[]){}, 0); - for (i32 i = 0; i < source->vertex_arrays->length; ++i) { - vertex_array_t *src = source->vertex_arrays->buffer[i]; - vertex_array_t *va = - GC_ALLOC_INIT(vertex_array_t, - {.attrib = string_copy(src->attrib), .data = string_copy(src->data), .values = i16_array_create_from_array(src->values)}); - any_array_push(raw->vertex_arrays, va); - } - - raw->index_array = u32_array_create_from_array(source->index_array); - - return mesh_data_create(raw); + asim_body_create(o, shape, mass); } void sim_duplicate() { @@ -120,7 +85,7 @@ void sim_duplicate() { return; } - mesh_data_t *data = mesh_data_duplicate(so->data); + mesh_data_t *data = util_mesh_data_duplicate(so->data); mesh_object_t *dup = scene_add_mesh_object(data, so->material, so->base->parent); transform_set_matrix(dup->base->transform, so->base->transform->local); any_array_push(g_project->_->paint_objects, dup); @@ -136,12 +101,9 @@ void sim_duplicate() { dup->data->name = dup->base->name; // Physics - physics_body_t *pb = any_imap_get(physics_body_object_map, so->base->uid); + asim_body_t *pb = so->base->_->body; if (pb != NULL) { - physics_body_t *pbdup = physics_body_create(); - pbdup->shape = pb->shape; - pbdup->mass = pb->mass; - physics_body_init(pbdup, dup->base); + asim_body_create(dup->base, pb->shape, pb->mass); } } @@ -149,6 +111,5 @@ void sim_delete() { mesh_object_t *so = g_context->paint_object; array_remove(g_project->_->paint_objects, so); mesh_object_remove(so); - physics_body_t *pb = any_imap_get(physics_body_object_map, so->base->uid); - sim_remove_body(pb); + asim_body_remove(so->base->_->body); } diff --git a/paint/sources/ui/tab_meshes.c b/paint/sources/ui/tab_meshes.c index 2b3be5f4..1f5d8ccd 100644 --- a/paint/sources/ui/tab_meshes.c +++ b/paint/sources/ui/tab_meshes.c @@ -380,23 +380,23 @@ void tab_meshes_draw_context_menu() { // Physics if (g_config->experimental) { - physics_body_t *pb = any_imap_get(physics_body_object_map, o->base->uid); + asim_body_t *pb = o->base->_->body; string_array_t *phys_combo = string_array_create(0); string_array_push(phys_combo, ""); // Empty = no physics string_array_push(phys_combo, tr("Sphere")); string_array_push(phys_combo, tr("Mesh")); ui_handle_t *hphys = ui_handle(__ID__); - hphys->i = pb == NULL ? 0 : (pb->shape == PHYSICS_SHAPE_SPHERE ? 1 : 2); + hphys->i = pb == NULL ? 0 : (pb->shape == ASIM_SHAPE_SPHERE ? 1 : 2); ui_combo(hphys, phys_combo, tr("Physics"), true, UI_ALIGN_LEFT, false); if (hphys->changed) { if (pb != NULL) { - sim_remove_body(pb); + asim_body_remove(pb); pb = NULL; } if (hphys->i > 0) { - sim_add_body(o->base, hphys->i == 1 ? PHYSICS_SHAPE_SPHERE : PHYSICS_SHAPE_MESH, hphys->i == 1 ? 1.0 : 0.0); - pb = any_imap_get(physics_body_object_map, o->base->uid); + sim_add_body(o->base, hphys->i == 1 ? ASIM_SHAPE_SPHERE : ASIM_SHAPE_MESH, hphys->i == 1 ? 1.0 : 0.0); + pb = o->base->_->body; } } @@ -405,7 +405,7 @@ void tab_meshes_draw_context_menu() { hmass->f = pb->mass; ui_slider(hmass, tr("Mass"), 0.0, 10.0, true, 100, true, UI_ALIGN_LEFT, true); if (hmass->changed) { - physics_body_set_mass(pb, hmass->f); // Zero mass = static + asim_body_set_mass(pb, hmass->f); // Zero mass = static ui_menu_keep_open = true; } } diff --git a/paint/sources/uniforms.c b/paint/sources/uniforms.c index 86688ca8..2d5cc413 100644 --- a/paint/sources/uniforms.c +++ b/paint/sources/uniforms.c @@ -119,9 +119,7 @@ f32 uniforms_ext_f32_link(object_t *object, material_data_t *mat, char *link) { } else if (string_equals(link, "_particle_radius")) { i32 idx = g_context->particle_index; - f32 speed = (physics_world_active != NULL && g_context->particles[idx].body != NULL) - ? physics_world_get_speed(physics_world_active, g_context->particles[idx].body) - : 0.0f; + f32 speed = g_context->particles[idx].body != NULL ? asim_body_get_speed(g_context->particles[idx].body) : 0.0f; f32 vel_scale = fminf(speed / 0.12f, 1.0f); f32 contact_scale = 1.0f - fminf(g_context->particles[idx].contact_time, 1.0f); return fmaxf(g_context->brush_radius * vel_scale * contact_scale, 0.1f); diff --git a/paint/sources/util/util_mesh.c b/paint/sources/util/util_mesh.c index f31c5a17..a47833de 100644 --- a/paint/sources/util/util_mesh.c +++ b/paint/sources/util/util_mesh.c @@ -45,6 +45,26 @@ mesh_object_t_array_t *util_mesh_get_visible() { return ar; } +mesh_data_t *util_mesh_data_duplicate(mesh_data_t *source) { + mesh_data_t *raw = gc_alloc(sizeof(mesh_data_t)); + raw->name = string_copy(source->name); + raw->scale_pos = source->scale_pos; + raw->scale_tex = source->scale_tex; + + raw->vertex_arrays = (vertex_array_t_array_t *)any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < source->vertex_arrays->length; ++i) { + vertex_array_t *src = source->vertex_arrays->buffer[i]; + vertex_array_t *va = + GC_ALLOC_INIT(vertex_array_t, + {.attrib = string_copy(src->attrib), .data = string_copy(src->data), .values = i16_array_create_from_array(src->values)}); + any_array_push(raw->vertex_arrays, va); + } + + raw->index_array = u32_array_create_from_array(source->index_array); + + return mesh_data_create(raw); +} + static mesh_data_t *util_mesh_build_merged_data(mesh_object_t_array_t *paint_objects, char *name) { i32 vlen = 0; i32 ilen = 0; diff --git a/paint/sources/util/util_particle.c b/paint/sources/util/util_particle.c index 0da9c2a7..5cc6c706 100644 --- a/paint/sources/util/util_particle.c +++ b/paint/sources/util/util_particle.c @@ -9,15 +9,11 @@ void util_particle_init_mesh() { util_mesh_merge(NULL); } - g_context->paint_body = physics_body_create(); - g_context->paint_body->shape = PHYSICS_SHAPE_MESH; - physics_body_init(g_context->paint_body, g_context->merged_object->base); + g_context->paint_body = asim_body_create(g_context->merged_object->base, ASIM_SHAPE_MESH, 0.0); } void util_particle_init_physics() { - if (physics_world_active == NULL) { - physics_world_create(); - } + sim_init(); util_particle_init_mesh(); } @@ -28,12 +24,11 @@ void util_particle_update() { util_particle_init_physics(); make_particle_get_bullet_material(); - physics_world_t *world = physics_world_active; - physics_world_update(world); + asim_world_update(); for (i32 i = 0; i < 32; ++i) { if (g_context->particles[i].timer != NULL && g_context->particles[i].timer->delay <= 0) { - physics_body_remove(g_context->particles[i].body); + asim_body_remove(g_context->particles[i].body); mesh_object_remove((mesh_object_t *)g_context->particles[i].bullet->ext); memset(&g_context->particles[i], 0, sizeof(g_context->particles[i])); } @@ -87,10 +82,7 @@ void util_particle_update() { mo->base->transform->scale = (vec4_t){g_context->brush_radius * 0.2, g_context->brush_radius * 0.2, g_context->brush_radius * 0.2, 1.0}; transform_build_matrix(mo->base->transform); - physics_body_t *body = physics_body_create(); - body->shape = PHYSICS_SHAPE_SPHERE; - body->mass = g_context->particle_mass; - physics_body_init(body, mo->base); + asim_body_t *body = asim_body_create(mo->base, ASIM_SHAPE_SPHERE, g_context->particle_mass); // Random direction f32 rx = math_random() * 2.0f - 1.0f; @@ -112,7 +104,7 @@ void util_particle_update() { f32 dy = ny + (ry - ny) * r; f32 dz = nz + (rz - nz) * r; f32 impulse = g_context->particle_spawn_distance * 30.0f; - physics_body_apply_impulse(body, (vec4_t){dx * impulse, dy * impulse, dz * impulse, 0.0}); + asim_body_apply_impulse(body->_body, (vec4_t){dx * impulse, dy * impulse, dz * impulse, 0.0}); g_context->particles[slot].body = body; g_context->particles[slot].bullet = mo->base; @@ -131,9 +123,9 @@ void util_particle_update() { if (g_context->particles[i].timer == NULL) { continue; } - physics_pair_t_array_t *pairs = physics_world_get_contact_pairs(world, g_context->particles[i].body); + asim_pair_t_array_t *pairs = asim_get_contact_pairs(g_context->particles[i].body); if (pairs != NULL && pairs->length > 0) { - physics_pair_t *p = pairs->buffer[0]; + asim_pair_t *p = pairs->buffer[0]; g_context->particles[i].hit_last_x = g_context->particles[i].hit_x != 0 ? g_context->particles[i].hit_x : p->pos_a_x; g_context->particles[i].hit_last_y = g_context->particles[i].hit_y != 0 ? g_context->particles[i].hit_y : p->pos_a_y; g_context->particles[i].hit_last_z = g_context->particles[i].hit_z != 0 ? g_context->particles[i].hit_z : p->pos_a_z;