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
},
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
},
22 rigidbody funnel
[4] = {
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
},
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
},
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
},
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
},
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
}
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
}},
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
}};
67 static void reorg_jeffs(void)
69 for( int i
=0; i
<vg_list_size(jeffs
); i
++ )
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() },
76 q_normalize( jeffs
[i
].q
);
78 jeffs
[i
].type
= k_rb_shape_capsule
;
79 jeffs
[i
].inf
.capsule
.radius
= 0.75f
;
80 jeffs
[i
].inf
.capsule
.height
= 3.0f
;
86 static void physics_test_start(void)
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
);
93 for( int i
=0; i
<4; i
++ )
94 rb_init( &funnel
[i
] );
105 static void physics_test_update(void)
108 player_camera_update();
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 );
117 rb_debug( &blocky
, 0xffcccccc );
118 rb_debug( &jeff1
, 0xff00ffff );
120 for( int i
=0; i
<vg_list_size(jeffs
); i
++ )
122 rb_debug( &jeffs
[i
], (u32
[]){ 0xff0000ff, 0xff00ff00, 0xff00ffff,
123 0xffff0000, 0xffff00ff, 0xffffff00,
136 for( int i
=0; i
<4; i
++ )
138 rigidbody
*fn
= &funnel
[i
];
139 rb_contact_count
+= rb_sphere_vs_box( &ball
, fn
, rb_global_ct());
140 rb_contact_count
+= rb_sphere_vs_box( &ball1
, fn
, rb_global_ct());
141 rb_contact_count
+= rb_capsule_vs_box( &jeff1
, fn
, rb_global_ct() );
143 for( int i
=0; i
<vg_list_size(jeffs
); i
++ )
144 rb_contact_count
+= rb_capsule_vs_box( jeffs
+i
, fn
, rb_global_ct() );
147 for( int i
=0; i
<vg_list_size(jeffs
)-1; i
++ )
149 for( int j
=i
+1; j
<vg_list_size(jeffs
); j
++ )
151 rb_contact_count
+= rb_capsule_vs_capsule( jeffs
+i
, jeffs
+j
,
156 for( int i
=0; i
<vg_list_size(jeffs
); i
++ )
158 rb_contact_count
+= rb_capsule_vs_box( jeffs
+i
, &ground
, rb_global_ct() );
159 rb_contact_count
+= rb_capsule_vs_sphere( jeffs
+i
, &ball
, rb_global_ct() );
160 rb_contact_count
+= rb_capsule_vs_sphere( jeffs
+i
, &ball1
, rb_global_ct() );
161 rb_contact_count
+= rb_capsule_vs_capsule( jeffs
+i
, &jeff1
, rb_global_ct() );
164 rb_contact_count
+= rb_capsule_vs_box( &jeff1
, &ground
, rb_global_ct() );
165 rb_contact_count
+= rb_capsule_vs_box( &jeff1
, &blocky
, rb_global_ct() );
166 rb_contact_count
+= rb_capsule_vs_sphere( &jeff1
, &ball
, rb_global_ct() );
167 rb_contact_count
+= rb_capsule_vs_sphere( &jeff1
, &ball1
, rb_global_ct() );
169 rb_contact_count
+= rb_sphere_vs_box( &ball
, &ground
, rb_global_ct() );
170 rb_contact_count
+= rb_sphere_vs_box( &ball1
, &ground
, rb_global_ct() );
171 rb_contact_count
+= rb_sphere_vs_sphere( &ball1
, &ball
, rb_global_ct() );
173 rb_presolve_contacts( rb_contact_buffer
, rb_contact_count
);
174 for( int i
=0; i
<8; i
++ )
175 rb_solve_contacts( rb_contact_buffer
, rb_contact_count
);
177 for( int i
=0; i
<vg_list_size(jeffs
); i
++ )
179 rb_update_transform(jeffs
+i
);
182 rb_update_transform( &ball
);
183 rb_update_transform( &ball1
);
184 rb_update_transform( &jeff1
);
188 if(glfwGetKey( vg_window
, GLFW_KEY_L
))
190 m4x3_mulv( player
.camera
, (v3f
){0.0f
,0.0f
,-5.0f
}, jeff1
.co
);
194 if(glfwGetKey( vg_window
, GLFW_KEY_K
))
196 m4x3_mulv( player
.camera
, (v3f
){0.0f
,0.0f
,-5.0f
}, ball
.co
);
200 if(glfwGetKey( vg_window
, GLFW_KEY_J
))
202 m4x3_mulv( player
.camera
, (v3f
){0.0f
,0.0f
,-5.0f
}, ball1
.co
);
207 if(glfwGetKey( vg_window
, GLFW_KEY_H
))
213 static void physics_test_render(void)
216 m4x3_expand( player
.camera_inverse
, world_4x4
);
218 gpipeline
.fov
= 60.0f
;
219 m4x4_projection( vg_pv
, gpipeline
.fov
,
220 (float)vg_window_x
/ (float)vg_window_y
,
223 m4x4_mul( vg_pv
, world_4x4
, vg_pv
);
224 glEnable( GL_DEPTH_TEST
);
226 glDisable( GL_DEPTH_TEST
);
227 vg_lines_drawall( (float *)vg_pv
);
230 #endif /* PHYSICS_TEST_H */