latest
[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 = {1.0f,0.0f,0.0f,0.0f}
53 };
54
55 rigidbody ball = { .type = k_rb_shape_sphere,
56 .inf.sphere = { .radius = 2.0f },
57 .co = {0.0f,20.0f,2.0f},
58 .q = {0.0f,0.0f,0.0f,1.0f}},
59
60 ball1= { .type = k_rb_shape_sphere,
61 .inf.sphere = { .radius = 2.0f },
62 .co = {0.1f,25.0f,0.2f},
63 .q = {0.0f,0.0f,0.0f,1.0f}};
64
65 rigidbody jeffs[16];
66
67 static void reorg_jeffs(void)
68 {
69 for( int i=0; i<vg_list_size(jeffs); i++ )
70 {
71 v3_copy( (v3f){ (vg_randf()-0.5f) * 10.0f,
72 (vg_randf()-0.5f) * 10.0f + 17.0f,
73 (vg_randf()-0.5f) * 10.0f }, jeffs[i].co );
74 v4_copy( (v4f){ vg_randf(), vg_randf(), vg_randf(), vg_randf() },
75 jeffs[i].q );
76 q_normalize( jeffs[i].q );
77
78 jeffs[i].type = k_rb_shape_capsule;
79 jeffs[i].inf.capsule.radius = 0.75f;
80 jeffs[i].inf.capsule.height = 3.0f;
81
82 rb_init( &jeffs[i] );
83 }
84 }
85
86 static void physics_test_start(void)
87 {
88 q_axis_angle( funnel[0].q, (v3f){1.0f,0.0f,0.0f}, 0.6f );
89 q_axis_angle( funnel[1].q, (v3f){1.0f,0.0f,0.0f}, -0.6f );
90 q_axis_angle( funnel[2].q, (v3f){0.0f,0.0f,1.0f}, 0.6f );
91 q_axis_angle( funnel[3].q, (v3f){0.0f,0.0f,1.0f}, -0.6f );
92
93 for( int i=0; i<4; i++ )
94 rb_init( &funnel[i] );
95
96 reorg_jeffs();
97
98 rb_init( &ground );
99 rb_init( &ball );
100 rb_init( &ball1 );
101 rb_init( &jeff1 );
102 rb_init( &blocky );
103 }
104
105 static void physics_test_update(void)
106 {
107 player_freecam();
108 player_camera_update();
109
110
111 for( int i=0; i<4; i++ )
112 rb_debug( &funnel[i], 0xff0060e0 );
113 rb_debug( &ground, 0xff00ff00 );
114 rb_debug( &ball, 0xffe00040 );
115 rb_debug( &ball1, 0xff00e050 );
116
117 rb_debug( &blocky, 0xffcccccc );
118 rb_debug( &jeff1, 0xff00ffff );
119
120 for( int i=0; i<vg_list_size(jeffs); i++ )
121 {
122 rb_debug( &jeffs[i], (u32[]){ 0xff0000ff, 0xff00ff00, 0xff00ffff,
123 0xffff0000, 0xffff00ff, 0xffffff00,
124 }[i%6] );
125 rb_iter( jeffs+i );
126 }
127
128 {
129
130 rb_iter( &ball );
131 rb_iter( &ball1 );
132 rb_iter( &jeff1 );
133
134 rb_solver_reset();
135
136 for( int i=0; i<4; i++ )
137 {
138 rigidbody *fn = &funnel[i];
139 rb_collide( &ball, fn );
140 rb_collide( &ball1, fn );
141 rb_collide( &jeff1, fn );
142
143 for( int i=0; i<vg_list_size(jeffs); i++ )
144 rb_collide( jeffs+i, fn );
145 }
146
147 for( int i=0; i<vg_list_size(jeffs)-1; i++ )
148 {
149 for( int j=i+1; j<vg_list_size(jeffs); j++ )
150 {
151 rb_collide( jeffs+i, jeffs+j );
152 }
153 }
154
155 for( int i=0; i<vg_list_size(jeffs); i++ )
156 {
157 rb_collide( jeffs+i, &ground );
158 rb_collide( jeffs+i, &ball );
159 rb_collide( jeffs+i, &ball1 );
160 rb_collide( jeffs+i, &jeff1 );
161 }
162
163 rb_collide( &jeff1, &ground );
164 rb_collide( &jeff1, &blocky );
165 rb_collide( &jeff1, &ball );
166 rb_collide( &jeff1, &ball1 );
167
168 rb_collide( &ball, &ground );
169 rb_collide( &ball1, &ground );
170 rb_collide( &ball1, &ball );
171
172 rb_presolve_contacts( rb_contact_buffer, rb_contact_count );
173 for( int i=0; i<8; i++ )
174 rb_solve_contacts( rb_contact_buffer, rb_contact_count );
175
176 for( int i=0; i<vg_list_size(jeffs); i++ )
177 {
178 rb_update_transform(jeffs+i);
179 }
180
181 rb_update_transform( &ball );
182 rb_update_transform( &ball1 );
183 rb_update_transform( &jeff1 );
184
185 }
186
187 if(glfwGetKey( vg_window, GLFW_KEY_L ))
188 {
189 m4x3_mulv( player.camera, (v3f){0.0f,0.0f,-5.0f}, jeff1.co );
190 v3_zero( jeff1.v );
191 v3_zero( jeff1.w );
192 }
193 if(glfwGetKey( vg_window, GLFW_KEY_K ))
194 {
195 m4x3_mulv( player.camera, (v3f){0.0f,0.0f,-5.0f}, ball.co );
196 v3_zero( ball.v );
197 v3_zero( ball.w );
198 }
199 if(glfwGetKey( vg_window, GLFW_KEY_J ))
200 {
201 m4x3_mulv( player.camera, (v3f){0.0f,0.0f,-5.0f}, ball1.co );
202 v3_zero( ball1.v );
203 v3_zero( ball1.w );
204 }
205
206 if(glfwGetKey( vg_window, GLFW_KEY_H ))
207 {
208 reorg_jeffs();
209 }
210 }
211
212 static void physics_test_render(void)
213 {
214 m4x4f world_4x4;
215 m4x3_expand( player.camera_inverse, world_4x4 );
216
217 gpipeline.fov = 60.0f;
218 m4x4_projection( vg_pv, gpipeline.fov,
219 (float)vg_window_x / (float)vg_window_y,
220 0.1f, 2100.0f );
221
222 m4x4_mul( vg_pv, world_4x4, vg_pv );
223 glEnable( GL_DEPTH_TEST );
224
225 glDisable( GL_DEPTH_TEST );
226 vg_lines_drawall( (float *)vg_pv );
227 }
228
229 #endif /* PHYSICS_TEST_H */