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
 | 
						|
}
 |