paint: physics cleanup
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user