105 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			V
		
	
	
| /**********************************************************************
 | |
| *
 | |
| * .obj loader
 | |
| *
 | |
| * Copyright (c) 2021 Dario Deledda. All rights reserved.
 | |
| * Use of this source code is governed by an MIT license
 | |
| * that can be found in the LICENSE file.
 | |
| *
 | |
| * TODO:
 | |
| **********************************************************************/
 | |
| module obj
 | |
| 
 | |
| import gg.m4
 | |
| 
 | |
| // part struct mantain the fae indexes list
 | |
| pub struct Part {
 | |
| pub mut:
 | |
| 	faces    [][][3]int // v n t index order, if -1 not available
 | |
| 	name     string
 | |
| 	material string
 | |
| }
 | |
| 
 | |
| // materias struct, all Ks and Ns are stored as maps of string
 | |
| pub struct Material {
 | |
| pub mut:
 | |
| 	name string
 | |
| 	ks   map[string]m4.Vec4
 | |
| 	ns   map[string]f32
 | |
| 	maps map[string]string
 | |
| }
 | |
| 
 | |
| // render data used for the rendering
 | |
| pub struct Render_data {
 | |
| pub mut:
 | |
| 	pipeline C.sg_pipeline
 | |
| 	bind     C.sg_bindings
 | |
| 	n_vert   u32
 | |
| 	material string
 | |
| }
 | |
| 
 | |
| // base object parts struct
 | |
| pub struct ObjPart {
 | |
| pub mut:
 | |
| 	v  []m4.Vec4 // position
 | |
| 	vn []m4.Vec4 // normals
 | |
| 	vp []m4.Vec4 // vertex params
 | |
| 	vt []m4.Vec4 // textures
 | |
| 
 | |
| 	name          string
 | |
| 	part          []Part                // parts of the ObjPart
 | |
| 	mat           []Material            // list of the materials of the ObjPart
 | |
| 	mat_map       map[string]int        // maping material name to its material index
 | |
| 	texture       map[string]C.sg_image // GPU loaded texture map
 | |
| 	material_file string // .mtl file name for the .obj
 | |
| 
 | |
| 	rend_data []Render_data // render data used for the rendering
 | |
| 
 | |
| 	t_m m4.Mat4 = m4.unit_m4() // transform matrix for this ObjPart
 | |
| 	// child []ObjPart           // childs
 | |
| 	// stats
 | |
| 	min    m4.Vec4 // min 3d position in the ObjPart
 | |
| 	max    m4.Vec4 // max 3d position in the ObjPart
 | |
| 	radius f32     // bounding circle radius of the ObjPart
 | |
| }
 | |
| 
 | |
| // used in to pass the matrices to the shader
 | |
| pub struct Mats {
 | |
| pub mut:
 | |
| 	mv  m4.Mat4
 | |
| 	mvp m4.Mat4
 | |
| 	nm  m4.Mat4
 | |
| }
 | |
| 
 | |
| // data passed to the vertex shader
 | |
| pub struct Tmp_vs_param {
 | |
| pub mut:
 | |
| 	mv  m4.Mat4
 | |
| 	mvp m4.Mat4
 | |
| 	nm  m4.Mat4
 | |
| }
 | |
| 
 | |
| // data passed to the pixel shader
 | |
| pub struct Tmp_fs_param {
 | |
| pub mut:
 | |
| 	ligth m4.Vec4
 | |
| 	ka    m4.Vec4 = m4.Vec4{
 | |
| 		e: [f32(0.1), 0.0, 0.0, 1.0]!
 | |
| 	}
 | |
| 	kd m4.Vec4 = m4.Vec4{
 | |
| 		e: [f32(0.5), 0.5, 0.5, 1.0]!
 | |
| 	}
 | |
| 	ks m4.Vec4 = m4.Vec4{
 | |
| 		e: [f32(1.0), 1.0, 1.0, 1.0]!
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // shader data for the rendering
 | |
| pub struct Shader_data {
 | |
| pub mut:
 | |
| 	vs_data &Tmp_vs_param
 | |
| 	vs_len  int
 | |
| 	fs_data &Tmp_fs_param
 | |
| 	fs_len  int
 | |
| }
 |