f
[carveJwlIkooP6JGAAIwe30JlM.git] / physics_test.h
1 #ifndef PHYSICS_TEST_H
2 #define PHYSICS_TEST_H
3
4 #include "rigidbody.h"
5 #include "player.h"
6
7 rigidbody ground = { .type = k_rb_shape_box,
8 .bbx = {{-100.0f,-1.0f,-100.0f},{100.0f,0.0f,100.0f}},
9 .co = {0.0f, 0.0f, 0.0f},
10 .q = {0.0f,0.0f,0.0f,1.0f},
11 .is_world = 1 };
12
13 rigidbody blocky =
14 {
15 .type = k_rb_shape_box,
16 .bbx = {{-2.0f,-1.0f,-3.0f},{2.0f,1.0f,2.0f}},
17 .co = {30.0f,2.0f,30.0f},
18 .q = {0.0f,0.0f,0.0f,1.0f},
19 .is_world = 1
20 };
21
22 rigidbody funnel[4] = {
23 {
24 .type = k_rb_shape_box,
25 .bbx = {{-20.0f,-1.0f,-20.0f},{20.0f,1.0f,20.0f}},
26 .co = {-10.0f,5.0f,0.0f},
27 .is_world = 1
28 },
29 {
30 .type = k_rb_shape_box,
31 .bbx = {{-20.0f,-1.0f,-20.0f},{20.0f,1.0f,20.0f}},
32 .co = { 10.0f,5.0f,0.0f},
33 .is_world = 1
34 },
35 {
36 .type = k_rb_shape_box,
37 .bbx = {{-20.0f,-1.0f,-20.0f},{20.0f,1.0f,20.0f}},
38 .co = { 0.0f,5.0f,10.0f},
39 .is_world = 1
40 },
41 {
42 .type = k_rb_shape_box,
43 .bbx = {{-20.0f,-1.0f,-20.0f},{20.0f,1.0f,20.0f}},
44 .co = {0.0f,5.0f,-10.0f},
45 .is_world = 1
46 }
47 };
48
49 rigidbody jeff1 = { .type = k_rb_shape_capsule,
50 .inf.capsule = { .radius = 0.75f, .height = 3.0f },
51 .co = {30.0f, 4.0f, 30.0f },
52 .q = {0.0f,0.0f,0.0f,1.0f}
53 };
54
55 rigidbody ball = { .type = k_rb_shape_sphere,
56 .inf.sphere = { .radius = 2.0f },
57 .co = {0.0f,6.0f,0.0f},
58 .q = {0.0f,0.0f,0.0f,1.0f}},
59
60 ball1= { .type = k_rb_shape_sphere,
61 .inf.sphere = { .radius = 1.0f },
62 .co = {0.1f,9.0f,0.2f},
63 .q = {0.0f,0.0f,0.0f,1.0f}};
64
65 static void physics_test_start(void)
66 {
67 q_axis_angle( funnel[0].q, (v3f){1.0f,0.0f,0.0f}, 0.3f );
68 q_axis_angle( funnel[1].q, (v3f){1.0f,0.0f,0.0f}, -0.3f );
69 q_axis_angle( funnel[2].q, (v3f){0.0f,0.0f,1.0f}, 0.3f );
70 q_axis_angle( funnel[3].q, (v3f){0.0f,0.0f,1.0f}, -0.3f );
71
72 for( int i=0; i<4; i++ )
73 rb_init( &funnel[i] );
74
75 rb_init( &ground );
76 rb_init( &ball );
77 rb_init( &ball1 );
78 rb_init( &jeff1 );
79 rb_init( &blocky );
80 }
81
82 static void physics_test_update(void)
83 {
84 player_freecam();
85 player_camera_update();
86
87 {
88
89 rb_iter( &ball );
90 rb_iter( &ball1 );
91 rb_iter( &jeff1 );
92
93 rb_solver_reset();
94
95 for( int i=0; i<4; i++ )
96 {
97 rb_contact_count += rb_sphere_vs_box( &ball, &funnel[i], rb_global_ct());
98 rb_contact_count += rb_sphere_vs_box( &ball1, &funnel[i], rb_global_ct());
99 }
100
101 rb_contact_count += rb_sphere_vs_box( &ball, &ground, rb_global_ct() );
102 rb_contact_count += rb_sphere_vs_box( &ball1, &ground, rb_global_ct() );
103 rb_contact_count += rb_sphere_vs_sphere( &ball, &ball1, rb_global_ct() );
104
105 rb_contact_count += rb_capsule_vs_box( &jeff1, &ground, rb_global_ct() );
106 rb_contact_count += rb_capsule_vs_box( &jeff1, &blocky, rb_global_ct() );
107
108 rb_presolve_contacts( rb_contact_buffer, rb_contact_count );
109
110 for( int i=0; i<5; i++ )
111 rb_solve_contacts( rb_contact_buffer, rb_contact_count );
112
113 rb_update_transform( &ball );
114 rb_update_transform( &ball1 );
115 rb_update_transform( &jeff1 );
116
117 }
118
119 if(glfwGetKey( vg_window, GLFW_KEY_L ))
120 {
121 v3_copy( player.camera_pos, jeff1.co );
122 v3_zero( jeff1.v );
123 v3_zero( jeff1.w );
124 }
125
126 for( int i=0; i<4; i++ )
127 rb_debug( &funnel[i], 0xff0060e0 );
128 rb_debug( &ground, 0xff00ff00 );
129 rb_debug( &ball, 0xffe00040 );
130 rb_debug( &ball1, 0xff00e050 );
131
132 rb_debug( &blocky, 0xffcccccc );
133 rb_debug( &jeff1, 0xff00ffff );
134 }
135
136 static void physics_test_render(void)
137 {
138 m4x4f world_4x4;
139 m4x3_expand( player.camera_inverse, world_4x4 );
140
141 gpipeline.fov = 60.0f;
142 m4x4_projection( vg_pv, gpipeline.fov,
143 (float)vg_window_x / (float)vg_window_y,
144 0.1f, 2100.0f );
145
146 m4x4_mul( vg_pv, world_4x4, vg_pv );
147 glEnable( GL_DEPTH_TEST );
148
149 glDisable( GL_DEPTH_TEST );
150 vg_lines_drawall( (float *)vg_pv );
151 }
152
153 #endif /* PHYSICS_TEST_H */