Pixel-Composer/scripts/d3d_object/d3d_object.gml

133 lines
3.8 KiB
Plaintext
Raw Normal View History

2023-08-14 19:22:04 +02:00
#region vertex format
vertex_format_begin();
vertex_format_add_position_3d();
vertex_format_add_color();
global.VF_POS_COL = vertex_format_end();
vertex_format_begin();
vertex_format_add_position_3d();
vertex_format_add_normal();
vertex_format_add_texcoord();
vertex_format_add_color();
global.VF_POS_NORM_TEX_COL = vertex_format_end();
#endregion
function __3dObject() constructor {
vertex = [];
normals = [];
uv = [];
VB = noone;
VF = global.VF_POS_COL;
render_type = pr_trianglelist;
custom_shader = noone;
position = new __vec3(0, 0, 0);
2023-08-15 19:35:31 +02:00
rotation = new BBMOD_Quaternion();
2023-08-14 19:22:04 +02:00
scale = new __vec3(1, 1, 1);
2023-08-17 16:56:54 +02:00
texture = -1;
static buildVertex = function(_vertex, _normal, _uv) {
var _buffer = vertex_create_buffer();
2023-08-14 19:22:04 +02:00
vertex_begin(_buffer, VF);
for( var i = 0, n = array_length(_vertex); i < n; i++ ) {
var v = _vertex[i];
switch(VF) {
case global.VF_POS_COL :
var cc = array_length(v) > 3? v[3] : c_gray;
var aa = array_length(v) > 4? v[4] : 1;
vertex_position_3d(_buffer, v[0], v[1], v[2]);
vertex_color(_buffer, cc, aa);
break;
case global.VF_POS_NORM_TEX_COL :
var nor = _normal[i];
2023-08-17 16:56:54 +02:00
var uuv = array_safe_get(_uv, i, [ 0, 0 ]);
var cc = array_length(v) > 3? v[3] : c_white;
var aa = array_length(v) > 4? v[4] : 1;
2023-08-14 19:22:04 +02:00
vertex_position_3d(_buffer, v[0], v[1], v[2]);
vertex_normal(_buffer, nor[0], nor[1], nor[2]);
2023-08-17 16:56:54 +02:00
vertex_texcoord(_buffer, uuv[0], uuv[1]);
2023-08-14 19:22:04 +02:00
vertex_color(_buffer, cc, aa);
break;
}
}
vertex_end(_buffer);
return _buffer;
2023-08-17 16:56:54 +02:00
}
static build = function(_buffer = VB, _vertex = vertex, _normal = normals, _uv = uv) { #region
if(is_array(_buffer)) {
for( var i = 0, n = array_length(_buffer); i < n; i++ )
vertex_delete_buffer(_buffer[i])
} else if(_buffer != noone) vertex_delete_buffer(_buffer);
if(array_empty(_vertex)) return noone;
var _buffer_count = is_array(_vertex[0][0])? array_length(_vertex) : 0;
if(_buffer_count == 0) return buildVertex(_vertex, _normal, _uv);
var _res = array_create(_buffer_count);
for( var i = 0; i < _buffer_count; i++ )
_res[i] = buildVertex(_vertex[i], _normal[i], _uv[i]);
return _res;
2023-08-16 20:16:31 +02:00
} #endregion
2023-08-14 19:22:04 +02:00
2023-08-16 20:16:31 +02:00
static preSubmitVertex = function(params = {}) {}
static postSubmitVertex = function(params = {}) {}
static submitShader = function(params = {}, shader = noone) {}
2023-08-14 19:22:04 +02:00
static submit = function(params = {}, shader = noone) { submitVertex(params, shader); }
static submitUI = function(params = {}, shader = noone) { submitVertex(params, shader); }
static submitSel = function(params = {}) { submitVertex(params, sh_d3d_silhouette); }
2023-08-16 20:16:31 +02:00
static submitVertex = function(params = {}, shader = noone) { #region
2023-08-14 19:22:04 +02:00
if(shader != noone)
shader_set(shader);
else if(custom_shader != noone)
shader_set(custom_shader);
else {
switch(VF) {
case global.VF_POS_NORM_TEX_COL: shader_set(sh_d3d_default); break;
case global.VF_POS_COL: shader_set(sh_d3d_wireframe); break;
}
}
2023-08-16 20:16:31 +02:00
preSubmitVertex(params);
2023-08-14 19:22:04 +02:00
if(VB != noone) {
2023-08-15 19:35:31 +02:00
var pos = matrix_build(position.x, position.y, position.z,
0, 0, 0,
2023-08-14 19:22:04 +02:00
1, 1, 1);
2023-08-15 19:35:31 +02:00
var rot = rotation.ToMatrix();
2023-08-14 19:22:04 +02:00
var sca = matrix_build(0, 0, 0,
0, 0, 0,
scale.x, scale.y, scale.z);
matrix_stack_clear();
matrix_stack_push(pos);
matrix_stack_push(rot);
matrix_stack_push(sca);
matrix_set(matrix_world, matrix_stack_top());
2023-08-17 16:56:54 +02:00
if(is_array(VB)) {
for( var i = 0, n = array_length(VB); i < n; i++ )
vertex_submit(VB[i], render_type, array_safe_get(texture, i, -1));
} else
vertex_submit(VB, render_type, texture);
2023-08-14 19:22:04 +02:00
matrix_stack_clear();
matrix_set(matrix_world, matrix_build_identity());
}
2023-08-16 20:16:31 +02:00
postSubmitVertex(params);
2023-08-14 19:22:04 +02:00
shader_reset();
2023-08-16 20:16:31 +02:00
} #endregion
2023-08-14 19:22:04 +02:00
}