glm: matrix multiplication; docs: toc
							parent
							
								
									72dfe11fa5
								
							
						
					
					
						commit
						3ec2608d6b
					
				
							
								
								
									
										50
									
								
								doc/docs.md
								
								
								
								
							
							
						
						
									
										50
									
								
								doc/docs.md
								
								
								
								
							|  | @ -18,10 +18,52 @@ you can do in V. | ||||||
| 
 | 
 | ||||||
| <table> | <table> | ||||||
| 	<tr> | 	<tr> | ||||||
| 		<td><a href='#hello-world'>1. Hello world</a></td> | 		<td><a href='#hello-world'>Hello world</a></td> | ||||||
| 		<td><a href='#comments'>2. Comments</a></td> | 		<td><a href='#comments'>Comments</a></td> | ||||||
| 		<td><a href='#functions'>3. Functions</a></td> | 		<td><a href='#functions'>Functions</a></td> | ||||||
| 		<td><a href='#'>TODO</a></td> | 		<td><a href='#constants--variables'>Constants & variables</a></td> | ||||||
|  | 		<td><a href='#primitive-types'>Primitive types</a></td> | ||||||
|  | 		<td><a href='#strings'>Strings</a></td> | ||||||
|  | 		<td><a href='#imports'>Imports</a></td> | ||||||
|  | 		<td><a href='#arrays'>Arrays</a></td> | ||||||
|  | 		<td><a href='#maps'>Maps</a></td> | ||||||
|  | 		<td><a href='#if'>If</a></td> | ||||||
|  | 		<td><a href='#in-operator'>In Operator</a></td> | ||||||
|  | 		<td><a href='#for-loop'>For loop</a></td> | ||||||
|  | 		<td><a href='#match'>Match</a></td> | ||||||
|  | 		<td><a href='#structs'>Structs</a></td> | ||||||
|  | 		<td><a href='#access-modifiers'>Access modifiers</a></td> | ||||||
|  | 		<td><a href='#methods'>Methods</a></td> | ||||||
|  | 		<td><a href='#pure-functions-by-default'>Pure functions by default</a></td> | ||||||
|  | 		<td><a href='#anonymous--high-order-functions'>Anonymous & high order functions</a></td> | ||||||
|  | 		<td><a href='#references'>References</a></td> | ||||||
|  | 		<td><a href='#constants'>Constants</a></td> | ||||||
|  | 		<td><a href='#println'>println</a></td> | ||||||
|  | 		<td><a href='#modules'>Modules</a></td> | ||||||
|  | 		<td><a href='#interfaces'>Interfaces</a></td> | ||||||
|  | 		<td><a href='#enums'>Enums</a></td> | ||||||
|  | 		<td><a href='#sum-types'>Sum types</a></td> | ||||||
|  | 		<td><a href='#optionresult-types-and-error-handtdng'>Option/Result types and error handtdng</a></td> | ||||||
|  | 		<td><a href='#generics'>Generics</a></td> | ||||||
|  | 		<td><a href='#concurrency'>Concurrency</a></td> | ||||||
|  | 		<td><a href='#decoding-json'>Decoding JSON</a></td> | ||||||
|  | 		<td><a href='#testing'>Testing</a></td> | ||||||
|  | 		<td><a href='#memory-management'>Memory managment</a></td> | ||||||
|  | 		<td><a href='#defer'>Defer</a></td> | ||||||
|  | 		<td><a href='#orm'>ORM</a></td> | ||||||
|  | 		<td><a href='#vfmt'>vfmt</a></td> | ||||||
|  | 		<td><a href='#writing-documentation'>Writing documentation</a></td> | ||||||
|  | 		<td><a href='caltdng-c-functions-from-v'>Caltdng C functions from V</a></td> | ||||||
|  | 		<td><a href='conditional-compilation'>Conditional compilation</a></td> | ||||||
|  | 		<td><a href='reflection-via-codegen'>Reflection via codegen</a></td> | ||||||
|  | 		<td><a href='tdmited-operator-overloading'>tdmited operator overloading</a></td> | ||||||
|  | 		<td><a href='intdne-assembly'>Intdne assembly</a></td> | ||||||
|  | 		<td><a href='translating-cc-to-v'>Translating C/C++ to V</a></td> | ||||||
|  | 		<td><a href='hot-code-reloading'>Hot code reloading</a></td> | ||||||
|  | 		<td><a href='cross-compilation'>Cross compilation</a></td> | ||||||
|  | 		<td><a href='cross-platform-shell-scripts-in-v'>Cross-platform shell scripts in V</a></td> | ||||||
|  | 		<td><a href='appendix-i-keywords'>Appendix I: Keywords</a></td> | ||||||
|  | 		<td><a href='appendix-ii-keywords'>Appendix II: Operators</a></td> | ||||||
| 	</tr> | 	</tr> | ||||||
| </table> | </table> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -179,7 +179,6 @@ pub fn (s Shader) use() { | ||||||
| 	gl.use_program(s.program_id) | 	gl.use_program(s.program_id) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn C.glGetUniformLocation() int |  | ||||||
| fn C.glUniformMatrix4fv() | fn C.glUniformMatrix4fv() | ||||||
| fn C.glUniform1i() | fn C.glUniform1i() | ||||||
| fn C.glUniform3f() | fn C.glUniform3f() | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								vlib/gl/gl.v
								
								
								
								
							
							
						
						
									
										20
									
								
								vlib/gl/gl.v
								
								
								
								
							|  | @ -4,10 +4,13 @@ | ||||||
| 
 | 
 | ||||||
| module gl | module gl | ||||||
| 
 | 
 | ||||||
|  | import glm | ||||||
|  | 
 | ||||||
| #flag  -I @VROOT/thirdparty/glad | #flag  -I @VROOT/thirdparty/glad | ||||||
| #include "glad.h" | #include "glad.h" | ||||||
| #flag @VROOT/thirdparty/glad/glad.o | #flag @VROOT/thirdparty/glad/glad.o | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| // joe-c: fix & remove
 | // joe-c: fix & remove
 | ||||||
| pub enum TmpGlImportHack{ non_empty } | pub enum TmpGlImportHack{ non_empty } | ||||||
| 
 | 
 | ||||||
|  | @ -51,6 +54,8 @@ fn C.glPixelStorei() | ||||||
| fn C.glBlendFunc() | fn C.glBlendFunc() | ||||||
| fn C.glPolygonMode() | fn C.glPolygonMode() | ||||||
| fn C.glDeleteBuffers() | fn C.glDeleteBuffers() | ||||||
|  | fn C.glGetUniformLocation() int | ||||||
|  | fn C.glGetAttribLocation() int | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| pub fn init_glad() { | pub fn init_glad() { | ||||||
|  | @ -181,6 +186,17 @@ pub fn set_ebo(ebo u32, indices []int, draw_typ int) { | ||||||
| // fn gen_vertex_arrays(a int, vao uint) {
 | // fn gen_vertex_arrays(a int, vao uint) {
 | ||||||
| // # glGenVertexArrays(a, &VAO);
 | // # glGenVertexArrays(a, &VAO);
 | ||||||
| // }
 | // }
 | ||||||
|  | 
 | ||||||
|  | // gets the uniform location for key
 | ||||||
|  | pub fn get_uniform_location(program int, key string) int { | ||||||
|  | 	return C.glGetUniformLocation(program, key.str) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //gets the attribute location for key
 | ||||||
|  | pub fn get_attrib_location(program int, key string) int { | ||||||
|  | 	return C.glGetAttribLocation(program, key.str) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub fn draw_arrays(typ, start, len int) { | pub fn draw_arrays(typ, start, len int) { | ||||||
| 	C.glDrawArrays(typ, start, len) | 	C.glDrawArrays(typ, start, len) | ||||||
| } | } | ||||||
|  | @ -239,3 +255,7 @@ pub fn generate_mipmap(typ int) { | ||||||
| 	C.glGenerateMipmap(typ) | 	C.glGenerateMipmap(typ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // set mat4 at uniform location
 | ||||||
|  | pub fn set_mat4fv(loc, count int, transpose bool, val glm.Mat4) { | ||||||
|  | 	C.glUniformMatrix4fv(loc, count, transpose, val.data) | ||||||
|  | } | ||||||
|  | @ -175,6 +175,22 @@ pub fn ortho(left, right, bottom, top f32) Mat4 { | ||||||
| 	return mat4(res) | 	return mat4(res) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // https://github.com/g-truc/glm/blob/0ceb2b755fb155d593854aefe3e45d416ce153a4/glm/ext/matrix_clip_space.inl
 | ||||||
|  | pub fn ortho_zo(left, right, bottom, top, zNear, zFar f32) Mat4 { | ||||||
|  | 	//println('glm ortho($left, $right, $bottom, $top)')
 | ||||||
|  | 	// mat<4, 4, T, defaultp> Result(static_cast<T>(1));
 | ||||||
|  | 	n := 16 | ||||||
|  | 	mut res := f32_calloc(n) | ||||||
|  | 	res[0] = 2.0 / (right - left) | ||||||
|  | 	res[5] = 2.0 / (top - bottom) | ||||||
|  | 	res[10] = 1.0 | ||||||
|  | 	res[12] = - (right + left) / (right - left) | ||||||
|  | 	res[13] = - (top + bottom) / (top - bottom) | ||||||
|  | 	res[14] = - zNear / (zFar - zNear) | ||||||
|  | 	res[15] = 1.0 | ||||||
|  | 	return mat4(res) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // fn scale(a *f32, v Vec3) *f32 {
 | // fn scale(a *f32, v Vec3) *f32 {
 | ||||||
| pub fn scale(m Mat4, v Vec3) Mat4 { | pub fn scale(m Mat4, v Vec3) Mat4 { | ||||||
| 	a := m.data | 	a := m.data | ||||||
|  | @ -201,6 +217,62 @@ pub fn scale(m Mat4, v Vec3) Mat4 { | ||||||
| 	return mat4(out) | 	return mat4(out) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // multiplicates two matrices
 | ||||||
|  | pub fn mult(a, b Mat4) Mat4 { | ||||||
|  | 	da := a.data | ||||||
|  | 	db := b.data | ||||||
|  | 	mut out := f32_calloc(16) | ||||||
|  | 	mut row0 := f32_calloc(4) | ||||||
|  | 	mut row1 := f32_calloc(4) | ||||||
|  | 	mut row2 := f32_calloc(4) | ||||||
|  | 	mut row3 := f32_calloc(4) | ||||||
|  | 
 | ||||||
|  | 	row0[0] = db[0]row0[1] = db[1]row0[2] = db[2]row0[3] = db[3] | ||||||
|  | 	row1[0] = db[4]row1[1] = db[5]row1[2] = db[6]row1[3] = db[7] | ||||||
|  | 	row2[0] = db[8]row2[1] = db[9]row2[2] = db[10]row2[3] = db[11] | ||||||
|  | 	row3[0] = db[12]row3[1] = db[13]row3[2] = db[14]row3[3] = db[15] | ||||||
|  | 
 | ||||||
|  | 	a_ := mult_mat_point(a, mat4(row0)) | ||||||
|  | 	b_ := mult_mat_point(a, mat4(row1)) | ||||||
|  | 	c_ := mult_mat_point(a, mat4(row2)) | ||||||
|  | 	d_ := mult_mat_point(a, mat4(row3)) | ||||||
|  | 
 | ||||||
|  | 	res0 := a_.data res1 := b_.data res2 := c_.data res3 := d_.data | ||||||
|  | 
 | ||||||
|  | 	out[0] = res0[0] out[1] = res0[1] out[2] = res0[2] out[3] = res0[3] | ||||||
|  | 	out[4] = res1[0] out[5] = res1[1] out[6] = res1[2] out[7] = res1[3] | ||||||
|  | 	out[8] = res2[0] out[9] = res2[1] out[10] = res2[2] out[11] = res2[3] | ||||||
|  | 	out[12] = res3[0] out[13] = res3[1] out[14] = res3[2] out[15] = res3[3] | ||||||
|  | 
 | ||||||
|  | 	return mat4(out) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // helper function for mult
 | ||||||
|  | fn mult_mat_point(a Mat4, point Mat4) Mat4 { | ||||||
|  | 	data := a.data | ||||||
|  | 	c0r0 := data[0]c1r0 := data[1]c2r0 := data[2]c3r0 := data[3] | ||||||
|  | 	c0r1 := data[4]c1r1 := data[5]c2r1 := data[6]c3r1 := data[7] | ||||||
|  | 	c0r2 := data[8]c1r2 := data[9]c2r2 := data[10]c3r2 := data[11] | ||||||
|  | 	c0r3 := data[12]c1r3 := data[13]c2r3 := data[14]c3r3 := data[15] | ||||||
|  | 
 | ||||||
|  | 	pdata := point.data | ||||||
|  | 	x := pdata[0] | ||||||
|  | 	y := pdata[1] | ||||||
|  | 	z := pdata[2] | ||||||
|  | 	w := pdata[3] | ||||||
|  | 
 | ||||||
|  | 	mut out := f32_calloc(4) | ||||||
|  | 
 | ||||||
|  | 	rx := (x * c0r0) + (y * c0r1) + (z * c0r2) + (w * c0r3) | ||||||
|  | 	ry := (x * c1r0) + (y * c1r1) + (z * c1r2) + (w * c1r3) | ||||||
|  | 	rz := (x * c2r0) + (y * c2r1) + (z * c2r2) + (w * c2r3) | ||||||
|  | 	rw := (x * c3r0) + (y * c3r1) + (z * c3r2) + (w * c3r3) | ||||||
|  | 
 | ||||||
|  | 	out[0] = rx out[1] = ry	out[2] = rz out[3] = rw | ||||||
|  | 
 | ||||||
|  | 	return mat4(out) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // fn rotate_z(a *f32, rad f32) *f32 {
 | // fn rotate_z(a *f32, rad f32) *f32 {
 | ||||||
| pub fn rotate_z(m Mat4, rad f32) Mat4 { | pub fn rotate_z(m Mat4, rad f32) Mat4 { | ||||||
| 	a := m.data | 	a := m.data | ||||||
|  |  | ||||||
|  | @ -82,3 +82,13 @@ fn test_translate() { | ||||||
| 	// (0.000000, 0.000000, -0.500000, 1.000000))
 | 	// (0.000000, 0.000000, -0.500000, 1.000000))
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | fn test_mult() { | ||||||
|  | 	//TODO improve test
 | ||||||
|  | 	mut a := glm.identity() | ||||||
|  | 	mut b := glm.identity() | ||||||
|  | 	mut c := glm.identity() | ||||||
|  | 	a = glm.mult(a, b) | ||||||
|  | 	for i in 0..15 { | ||||||
|  | 		assert a.data[i] == c.data[i] | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue