2 #include "vg_platform.h"
3 #include "vg_rigidbody.h"
8 static struct vg_shader _shader_rigidbody
=
10 .name
= "[vg] rigidbody",
16 "uniform mat4x3 uMdl;"
17 "uniform mat4x3 uMdl1;"
18 "layout (location=0) in vec4 a_co;"
19 "layout (location=1) in vec3 a_norm;"
25 "vec3 world_pos0 = uMdl * vec4( a_co.xyz, 1.0 );"
26 "vec3 world_pos1 = uMdl1 * vec4( a_co.xyz, 1.0 );"
27 "vec3 co = mix( world_pos0, world_pos1, a_co.w );"
28 "vec4 vert_pos = uPv * vec4( co, 1.0 );"
30 "gl_Position = vert_pos;"
31 "vec3 l = vec3(length(uMdl[0]),length(uMdl[1]),length(uMdl[2]));"
32 "aNorm = (mat3(uMdl) * a_norm)/l;"
41 "uniform vec4 uColour;"
46 // Copyright © 2017 Inigo Quilez
47 // Permission is hereby granted, free of charge, to any person obtaining a
48 // copy of this software and associated documentation files (the "Software"),
49 // to deal in the Software without restriction, including without limitation
50 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
51 // and/or sell copies of the Software, and to permit persons to whom the
52 // Software is furnished to do so, subject to the following conditions:
53 // The above copyright notice and this permission notice shall be included in
54 // all copies or substantial portions of the Software. THE SOFTWARE IS
55 // PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
56 // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
57 // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
58 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
59 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
60 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
61 // DEALINGS IN THE SOFTWARE.
63 // Info: https://iquilezles.org/articles/filterableprocedurals
65 // More filtered patterns: https://www.shadertoy.com/playlist/l3KXR1
67 "vec3 tri( in vec3 x ){"
68 "return 1.0-abs(2.0*fract(x/2.0)-1.0);"
71 "float checkersTextureGrad( in vec3 p, in vec3 ddx, in vec3 ddy ){"
72 "vec3 w = max(abs(ddx), abs(ddy)) + 0.0001;" // filter kernel
73 "vec3 i = (tri(p+0.5*w)-tri(p-0.5*w))/w;" // analytical integral
75 "return 0.5 - 0.5*i.x*i.y*i.z;" // xor pattern
81 "vec3 ddx_uvw = dFdx( uvw );"
82 "vec3 ddy_uvw = dFdy( uvw );"
83 "float diffuse = checkersTextureGrad( uvw, ddx_uvw, ddy_uvw )*0.5+0.4;"
84 "float light = dot( vec3(0.8017,0.5345,-0.2672), aNorm )*0.5 + 0.5;"
85 "FragColor = light * diffuse * uColour;"
97 typedef struct rb_view_vert rb_view_vert
;
100 GLuint vao
, vbo
, ebo
;
101 u32 sphere_start
, sphere_count
,
102 box_start
, box_count
;
106 struct vg_rb_mesh_init
{
107 u32 verts_size
, tris_size
;
112 static void async_vg_rb_view_init( void *payload
, u32 payload_size
)
114 struct vg_rb_mesh_init
*inf
= payload
;
116 glGenVertexArrays( 1, &vg_rb_view
.vao
);
117 glGenBuffers( 1, &vg_rb_view
.vbo
);
118 glGenBuffers( 1, &vg_rb_view
.ebo
);
119 glBindVertexArray( vg_rb_view
.vao
);
122 glBindBuffer( GL_ARRAY_BUFFER
, vg_rb_view
.vbo
);
123 glBufferData( GL_ARRAY_BUFFER
, inf
->verts_size
, inf
->verts
, GL_STATIC_DRAW
);
124 glBindBuffer( GL_ELEMENT_ARRAY_BUFFER
, vg_rb_view
.ebo
);
125 glBufferData( GL_ELEMENT_ARRAY_BUFFER
,
126 inf
->tris_size
, inf
->tris
, GL_STATIC_DRAW
);
129 size_t stride
= sizeof(rb_view_vert
);
130 glVertexAttribPointer( 0, 4, GL_FLOAT
, GL_FALSE
, stride
, (void*)0 );
131 glEnableVertexAttribArray( 0 );
134 glVertexAttribPointer( 1, 3, GL_FLOAT
, GL_FALSE
,
135 stride
, (void *)offsetof(rb_view_vert
, n
) );
136 glEnableVertexAttribArray( 1 );
141 void vg_rb_view_init(void)
143 vg_shader_register( &_shader_rigidbody
);
153 vg_rb_view
.box_count
= 2*6;
154 vg_rb_view
.box_start
= 0;
157 verts_count
+= H
*(V
-2) + 2;
158 tris_count
+= H
*2 + (V
-2)*(H
*2);
159 vg_rb_view
.sphere_count
= H
*2 + (V
-2)*(H
*2);
161 u32 hdr_size
= vg_align8( sizeof(struct vg_rb_mesh_init
) ),
162 vert_size
= vg_align8( verts_count
* sizeof(rb_view_vert
) ),
163 tris_size
= vg_align8( tris_count
* 3 * sizeof(u16
) );
165 vg_async_item
*call
= vg_async_alloc( hdr_size
+ vert_size
+ tris_size
);
167 struct vg_rb_mesh_init
*inf
= call
->payload
;
168 rb_view_vert
*verts
= ((void *)inf
) + hdr_size
;
169 u16
*tris
= ((void *)inf
) + hdr_size
+ vert_size
;
173 inf
->verts_size
= vert_size
;
174 inf
->tris_size
= tris_size
;
180 * ----------------------------------------------------------- */
181 for( u32 i
=0; i
<6; i
++ ){
182 v3f n
= {i
%3==0,i
%3==1,i
%3==2};
183 if( i
>= 3 ) v3_negate( n
, n
);
185 v3_tangent_basis( n
, v0
, v1
);
187 rb_view_vert
*vs
= &verts
[vert_index
];
190 for( u32 j
=0; j
<4; j
++ ){
191 v3_copy( n
, vs
[j
].n
);
192 v3_muladds( n
, v0
, j
&0x1?1.0f
:-1.0f
, vs
[j
].co
);
193 v3_muladds( vs
[j
].co
, v1
, j
&0x2?1.0f
:-1.0f
, vs
[j
].co
);
197 tris
[tri_index
*3+0] = i
*4+0;
198 tris
[tri_index
*3+1] = i
*4+1;
199 tris
[tri_index
*3+2] = i
*4+3;
200 tris
[tri_index
*3+3] = i
*4+0;
201 tris
[tri_index
*3+4] = i
*4+3;
202 tris
[tri_index
*3+5] = i
*4+2;
207 * ----------------------------------------------------------- */
208 u32 base
= vert_index
;
209 vg_rb_view
.sphere_start
= tri_index
;
210 v4_copy( (v4f
){0,-1,0,0}, verts
[vert_index
].co
);
211 v3_copy( (v3f
){0,-1,0}, verts
[vert_index
++].n
);
213 for( u32 x
=0; x
<H
; x
++ ){
214 tris
[tri_index
*3+0] = base
+0;
215 tris
[tri_index
*3+1] = base
+1+x
;
216 tris
[tri_index
*3+2] = base
+1+((x
+1)%H
);
220 for( u32 y
=1; y
<V
-1; y
++ ){
221 f32 ty
= ((f32
)y
/(f32
)(V
-1)) * VG_PIf
;
223 for( u32 x
=0; x
<H
; x
++ ){
224 f32 tx
= ((f32
)x
/(f32
)H
) * VG_TAUf
;
226 v4f co
= { cosf(tx
)*sinf(ty
), -cosf(ty
), sinf(tx
)*sinf(ty
), y
>=(V
/2) };
227 v4_copy( co
, verts
[vert_index
].co
);
228 v4_copy( co
, verts
[vert_index
++].n
);
231 tris
[tri_index
*3+0] = base
+1 + ybase
*H
+ x
;
232 tris
[tri_index
*3+1] = base
+1 + (ybase
+1)*H
+ ((x
+1)%H
);
233 tris
[tri_index
*3+2] = base
+1 + ybase
*H
+ ((x
+1)%H
);
234 tris
[tri_index
*3+3] = base
+1 + ybase
*H
+ x
;
235 tris
[tri_index
*3+4] = base
+1 + (ybase
+1)*H
+ x
;
236 tris
[tri_index
*3+5] = base
+1 + (ybase
+1)*H
+ ((x
+1)%H
);
242 v4_copy( (v4f
){0, 1,0,1}, verts
[vert_index
].co
);
243 v3_copy( (v3f
){0, 1,0}, verts
[vert_index
++].n
);
245 for( u32 x
=0; x
<H
; x
++ ){
246 tris
[tri_index
*3+0] = base
+ (H
*(V
-2) + 2)-1;
247 tris
[tri_index
*3+1] = base
+1 + (V
-3)*H
+((x
+1)%H
);
248 tris
[tri_index
*3+2] = base
+1 + (V
-3)*H
+x
;
252 vg_async_dispatch( call
, async_vg_rb_view_init
);
255 void vg_rb_view_bind(void)
257 glEnable( GL_CULL_FACE
);
258 glEnable( GL_DEPTH_TEST
);
260 glUseProgram( _shader_rigidbody
.id
);
261 glUniformMatrix4fv( glGetUniformLocation( _shader_rigidbody
.id
, "uPv" ),
262 1, GL_FALSE
, (float *)vg
.pv
);
264 glBindVertexArray( vg_rb_view
.vao
);
267 void vg_rb_view_box( m4x3f mdl
, boxf bbx
, v4f colour
)
270 v3_sub( bbx
[1], bbx
[0], e
);
271 v3_muls( e
, 0.5f
, e
);
274 m4x3_identity( mmdl
);
275 m3x3_scale( mmdl
, e
);
276 v3_add( bbx
[0], e
, mmdl
[3] );
277 m4x3_mul( mdl
, mmdl
, mmdl
);
279 glUniformMatrix4x3fv( glGetUniformLocation( _shader_rigidbody
.id
, "uMdl" ),
280 1,GL_FALSE
,(float*)mmdl
);
281 glUniformMatrix4x3fv( glGetUniformLocation( _shader_rigidbody
.id
, "uMdl1" ),
282 1,GL_FALSE
,(float*)mmdl
);
283 glUniform4fv( glGetUniformLocation( _shader_rigidbody
.id
, "uColour" ), 1,
285 glDrawElements( GL_TRIANGLES
,
286 vg_rb_view
.box_count
*3, GL_UNSIGNED_SHORT
,
287 (void *)(vg_rb_view
.box_start
*3*sizeof(u16
)) );
290 void vg_rb_view_sphere( m4x3f mdl
, f32 r
, v4f colour
)
293 m4x3_copy( mdl
, mmdl
);
294 m3x3_scalef( mmdl
, r
);
295 glUniformMatrix4x3fv( glGetUniformLocation( _shader_rigidbody
.id
, "uMdl" ),
296 1,GL_FALSE
,(float*)mmdl
);
297 glUniformMatrix4x3fv( glGetUniformLocation( _shader_rigidbody
.id
, "uMdl1" ),
298 1,GL_FALSE
,(float*)mmdl
);
299 glUniform4fv( glGetUniformLocation( _shader_rigidbody
.id
, "uColour" ), 1,
301 glDrawElements( GL_TRIANGLES
,
302 vg_rb_view
.sphere_count
*3, GL_UNSIGNED_SHORT
,
303 (void *)(vg_rb_view
.sphere_start
*3*sizeof(u16
)) );
306 void vg_rb_view_capsule( m4x3f mdl
, f32 r
, f32 h
, v4f colour
)
309 m4x3_identity( mmdl0
);
310 m4x3_identity( mmdl1
);
311 m3x3_scalef( mmdl0
, r
);
312 m3x3_scalef( mmdl1
, r
);
313 mmdl0
[3][1] = -h
*0.5f
+r
;
314 mmdl1
[3][1] = h
*0.5f
-r
;
315 m4x3_mul( mdl
, mmdl0
, mmdl0
);
316 m4x3_mul( mdl
, mmdl1
, mmdl1
);
318 glUniformMatrix4x3fv( glGetUniformLocation( _shader_rigidbody
.id
, "uMdl" ),
319 1,GL_FALSE
,(float*)mmdl0
);
320 glUniformMatrix4x3fv( glGetUniformLocation( _shader_rigidbody
.id
, "uMdl1" ),
321 1,GL_FALSE
,(float*)mmdl1
);
322 glUniform4fv( glGetUniformLocation( _shader_rigidbody
.id
, "uColour" ), 1,
324 glDrawElements( GL_TRIANGLES
,
325 vg_rb_view
.sphere_count
*3, GL_UNSIGNED_SHORT
,
326 (void *)(vg_rb_view
.sphere_start
*3*sizeof(u16
)) );