example/md5: color joints
This commit is contained in:
parent
f14e958ec2
commit
efe6470afe
@ -50,6 +50,7 @@ using mat4x4 = mat<4, 4, float>;
|
|||||||
#include "md5/md5.h"
|
#include "md5/md5.h"
|
||||||
#include "model/boblamp/boblamp.h"
|
#include "model/boblamp/boblamp.h"
|
||||||
|
|
||||||
|
static int joint_ix_sel = 0;
|
||||||
|
|
||||||
static ft0::data_transfer::data_format data[4];
|
static ft0::data_transfer::data_format data[4];
|
||||||
|
|
||||||
@ -199,7 +200,7 @@ void vbr600()
|
|||||||
interrupt_exception();
|
interrupt_exception();
|
||||||
}
|
}
|
||||||
|
|
||||||
void global_polygon_type_1(ta_parameter_writer& writer,
|
void global_polygon_type_0(ta_parameter_writer& writer,
|
||||||
uint32_t para_control_obj_control,
|
uint32_t para_control_obj_control,
|
||||||
uint32_t tsp_instruction_word,
|
uint32_t tsp_instruction_word,
|
||||||
uint32_t texture_control_word,
|
uint32_t texture_control_word,
|
||||||
@ -210,7 +211,7 @@ void global_polygon_type_1(ta_parameter_writer& writer,
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume
|
const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume
|
||||||
| obj_control::col_type::intensity_mode_1
|
| obj_control::col_type::floating_color
|
||||||
| obj_control::gouraud
|
| obj_control::gouraud
|
||||||
| para_control_obj_control
|
| para_control_obj_control
|
||||||
;
|
;
|
||||||
@ -219,15 +220,13 @@ void global_polygon_type_1(ta_parameter_writer& writer,
|
|||||||
| isp_tsp_instruction_word::culling_mode::no_culling
|
| isp_tsp_instruction_word::culling_mode::no_culling
|
||||||
;
|
;
|
||||||
|
|
||||||
writer.append<ta_global_parameter::polygon_type_1>() =
|
writer.append<ta_global_parameter::polygon_type_0>() =
|
||||||
ta_global_parameter::polygon_type_1(parameter_control_word,
|
ta_global_parameter::polygon_type_0(parameter_control_word,
|
||||||
isp_tsp_instruction_word,
|
isp_tsp_instruction_word,
|
||||||
tsp_instruction_word,
|
tsp_instruction_word,
|
||||||
texture_control_word,
|
texture_control_word,
|
||||||
a,
|
0,
|
||||||
r,
|
0
|
||||||
g,
|
|
||||||
b
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,28 +234,31 @@ void transfer_triangle(ta_parameter_writer& writer,
|
|||||||
vec3 ap,
|
vec3 ap,
|
||||||
vec3 bp,
|
vec3 bp,
|
||||||
vec3 cp,
|
vec3 cp,
|
||||||
float ai,
|
vec3 ac,
|
||||||
float bi,
|
vec3 bc,
|
||||||
float ci
|
vec3 cc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (ap.z < 0 || bp.z < 0 || cp.z < 0)
|
if (ap.z < 0 || bp.z < 0 || cp.z < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
writer.append<ta_vertex_parameter::polygon_type_2>() =
|
writer.append<ta_vertex_parameter::polygon_type_1>() =
|
||||||
ta_vertex_parameter::polygon_type_2(polygon_vertex_parameter_control_word(false),
|
ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(false),
|
||||||
ap.x, ap.y, ap.z,
|
ap.x, ap.y, ap.z,
|
||||||
ai);
|
1.0,
|
||||||
|
ac.x, ac.y, ac.z);
|
||||||
|
|
||||||
writer.append<ta_vertex_parameter::polygon_type_2>() =
|
writer.append<ta_vertex_parameter::polygon_type_1>() =
|
||||||
ta_vertex_parameter::polygon_type_2(polygon_vertex_parameter_control_word(false),
|
ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(false),
|
||||||
bp.x, bp.y, bp.z,
|
bp.x, bp.y, bp.z,
|
||||||
bi);
|
1.0,
|
||||||
|
bc.x, bc.y, bc.z);
|
||||||
|
|
||||||
writer.append<ta_vertex_parameter::polygon_type_2>() =
|
writer.append<ta_vertex_parameter::polygon_type_1>() =
|
||||||
ta_vertex_parameter::polygon_type_2(polygon_vertex_parameter_control_word(true),
|
ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(true),
|
||||||
cp.x, cp.y, cp.z,
|
cp.x, cp.y, cp.z,
|
||||||
ci);
|
1.0,
|
||||||
|
cc.x, cc.y, cc.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 quaternion_normalize(vec4 q)
|
vec4 quaternion_normalize(vec4 q)
|
||||||
@ -321,6 +323,22 @@ vec3 vertex_weights(const md5_mesh_joint * joints,
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec3 vertex_weight_color(const md5_mesh_joint * joints,
|
||||||
|
const md5_mesh_mesh * mesh,
|
||||||
|
const md5_mesh_vert * v)
|
||||||
|
{
|
||||||
|
const md5_mesh_weight * weights = &mesh->weights[v->weight_index];
|
||||||
|
|
||||||
|
for (int i = 0; i < v->weight_elem; i++) {
|
||||||
|
const md5_mesh_weight * weight = &weights[i];
|
||||||
|
if (weight->joint_index == joint_ix_sel) {
|
||||||
|
return {weight->weight_value, 1.0f - weight->weight_value, 0.0};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {0.0, 0.0, 1.0};
|
||||||
|
}
|
||||||
|
|
||||||
static inline vec3 screen_transform(vec3 v)
|
static inline vec3 screen_transform(vec3 v)
|
||||||
{
|
{
|
||||||
float x2 = 640 / 2.0;
|
float x2 = 640 / 2.0;
|
||||||
@ -376,13 +394,18 @@ void transfer_mesh(ta_parameter_writer& writer,
|
|||||||
float b_diffuse = max(dot(n, b_light_dir), 0.0f);
|
float b_diffuse = max(dot(n, b_light_dir), 0.0f);
|
||||||
float c_diffuse = max(dot(n, c_light_dir), 0.0f);
|
float c_diffuse = max(dot(n, c_light_dir), 0.0f);
|
||||||
|
|
||||||
|
vec3 ac = vertex_weight_color(joints, mesh, av);
|
||||||
|
vec3 bc = vertex_weight_color(joints, mesh, bv);
|
||||||
|
vec3 cc = vertex_weight_color(joints, mesh, cv);
|
||||||
|
|
||||||
transfer_triangle(writer,
|
transfer_triangle(writer,
|
||||||
screen_transform(ap),
|
screen_transform(ap),
|
||||||
screen_transform(bp),
|
screen_transform(bp),
|
||||||
screen_transform(cp),
|
screen_transform(cp),
|
||||||
a_diffuse,
|
ac * a_diffuse,
|
||||||
b_diffuse,
|
bc * b_diffuse,
|
||||||
c_diffuse);
|
cc * c_diffuse
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,7 +418,7 @@ void transfer_scene(ta_parameter_writer& writer,
|
|||||||
| tsp_instruction_word::fog_control::no_fog
|
| tsp_instruction_word::fog_control::no_fog
|
||||||
| tsp_instruction_word::texture_shading_instruction::decal;
|
| tsp_instruction_word::texture_shading_instruction::decal;
|
||||||
uint32_t texture_control_word = 0;
|
uint32_t texture_control_word = 0;
|
||||||
global_polygon_type_1(writer,
|
global_polygon_type_0(writer,
|
||||||
control,
|
control,
|
||||||
tsp_instruction_word,
|
tsp_instruction_word,
|
||||||
texture_control_word);
|
texture_control_word);
|
||||||
@ -408,6 +431,31 @@ void transfer_scene(ta_parameter_writer& writer,
|
|||||||
ta_global_parameter::end_of_list(para_control::para_type::end_of_list);
|
ta_global_parameter::end_of_list(para_control::para_type::end_of_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void update_maple(struct md5_mesh * m)
|
||||||
|
{
|
||||||
|
int ra = ft0::data_transfer::digital_button::ra(data[0].digital_button) == 0;
|
||||||
|
int la = ft0::data_transfer::digital_button::la(data[0].digital_button) == 0;
|
||||||
|
|
||||||
|
static int last_ra = 0;
|
||||||
|
static int last_la = 0;
|
||||||
|
|
||||||
|
if (ra && last_ra == 0) {
|
||||||
|
joint_ix_sel += 1;
|
||||||
|
printf("joint_ix_sel: %d\n", joint_ix_sel);
|
||||||
|
if (joint_ix_sel >= m->num_joints)
|
||||||
|
joint_ix_sel = 0;
|
||||||
|
}
|
||||||
|
if (la && last_la == 0) {
|
||||||
|
joint_ix_sel -= 1;
|
||||||
|
printf("joint_ix_sel: %d\n", joint_ix_sel);
|
||||||
|
if (joint_ix_sel < 0)
|
||||||
|
joint_ix_sel = m->num_joints - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_ra = ra;
|
||||||
|
last_la = la;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t __attribute__((aligned(32))) ta_parameter_buf[1024 * 1024];
|
uint8_t __attribute__((aligned(32))) ta_parameter_buf[1024 * 1024];
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
@ -462,6 +510,7 @@ int main()
|
|||||||
while (1) {
|
while (1) {
|
||||||
maple::dma_wait_complete();
|
maple::dma_wait_complete();
|
||||||
do_get_condition();
|
do_get_condition();
|
||||||
|
update_maple(&boblamp_mesh);
|
||||||
|
|
||||||
screen_trans = screen_trans * rotate_z(0.01f);
|
screen_trans = screen_trans * rotate_z(0.01f);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user