example: modifier_volume_with_two_volumes

This commit is contained in:
Zack Buhman 2023-12-30 21:50:54 +08:00
parent de76c0bed2
commit 549254615e
4 changed files with 101 additions and 65 deletions

View File

@ -140,6 +140,17 @@ MODIFIER_VOLUME_OBJ = \
example/modifier_volume.elf: LDSCRIPT = $(LIB)/alt.lds example/modifier_volume.elf: LDSCRIPT = $(LIB)/alt.lds
example/modifier_volume.elf: $(START_OBJ) $(MODIFIER_VOLUME_OBJ) example/modifier_volume.elf: $(START_OBJ) $(MODIFIER_VOLUME_OBJ)
MODIFIER_VOLUME_WITH_TWO_VOLUMES_OBJ = \
example/modifier_volume_with_two_volumes.o \
vga.o \
holly/core.o \
holly/region_array.o \
holly/background.o \
holly/ta_fifo_polygon_converter.o
example/modifier_volume_with_two_volumes.elf: LDSCRIPT = $(LIB)/alt.lds
example/modifier_volume_with_two_volumes.elf: $(START_OBJ) $(MODIFIER_VOLUME_WITH_TWO_VOLUMES_OBJ)
MACAW_CUBE_OBJ = \ MACAW_CUBE_OBJ = \
example/macaw_cube.o \ example/macaw_cube.o \
vga.o \ vga.o \

View File

@ -9,9 +9,12 @@
#include "holly/core_bits.hpp" #include "holly/core_bits.hpp"
#include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_fifo_polygon_converter.hpp"
#include "holly/ta_parameter.hpp" #include "holly/ta_parameter.hpp"
#include "holly/ta_global_parameter.hpp"
#include "holly/ta_vertex_parameter.hpp"
#include "holly/ta_bits.hpp" #include "holly/ta_bits.hpp"
#include "holly/region_array.hpp" #include "holly/region_array.hpp"
#include "holly/background.hpp" #include "holly/background.hpp"
#include "holly/isp_tsp.hpp"
#include "memorymap.hpp" #include "memorymap.hpp"
#include "geometry/plane.hpp" #include "geometry/plane.hpp"
@ -60,17 +63,27 @@ vec3 _transform(const vec3& point,
return {x, y, z}; return {x, y, z};
} }
uint32_t argb8888(const vec4& color)
{
return ((static_cast<int>(255.f * color.a) & 0xff) << 24)
| ((static_cast<int>(255.f * color.r) & 0xff) << 16)
| ((static_cast<int>(255.f * color.g) & 0xff) << 8)
| ((static_cast<int>(255.f * color.b) & 0xff) << 0)
;
}
void transform_polygon(ta_parameter_writer& parameter, void transform_polygon(ta_parameter_writer& parameter,
const vec3 * vertices, const vec3 * vertices,
const face& face, const face& face,
const float scale, const float scale,
const vec4& color, const vec4& color0,
const vec4& color1,
const float theta) const float theta)
{ {
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
| para_control::list_type::opaque | para_control::list_type::opaque
| obj_control::col_type::floating_color | obj_control::shadow
| obj_control::shadow; | obj_control::volume::polygon::with_two_volumes;
const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater
| isp_tsp_instruction_word::culling_mode::no_culling; | isp_tsp_instruction_word::culling_mode::no_culling;
@ -79,10 +92,16 @@ void transform_polygon(ta_parameter_writer& parameter,
| tsp_instruction_word::dst_alpha_instr::zero | tsp_instruction_word::dst_alpha_instr::zero
| tsp_instruction_word::fog_control::no_fog; | tsp_instruction_word::fog_control::no_fog;
parameter.append<global_polygon_type_0>() = global_polygon_type_0(parameter_control_word, parameter.append<ta_global_parameter::polygon_type_3>() =
isp_tsp_instruction_word, ta_global_parameter::polygon_type_3(parameter_control_word,
tsp_instruction_word, isp_tsp_instruction_word,
0); tsp_instruction_word, // tsp_instruction_word_0
0, // texture_control_word_0
tsp_instruction_word, // tsp_instruction_word_1
0, // texture_control_word_1
0, // data_size_for_sort_dma
0 // next_address_for_sort_dma
);
constexpr uint32_t strip_length = 3; constexpr uint32_t strip_length = 3;
for (uint32_t i = 0; i < strip_length; i++) { for (uint32_t i = 0; i < strip_length; i++) {
@ -92,16 +111,14 @@ void transform_polygon(ta_parameter_writer& parameter,
auto point = _transform(vertex, scale, theta); auto point = _transform(vertex, scale, theta);
bool end_of_strip = i == strip_length - 1; bool end_of_strip = i == strip_length - 1;
parameter.append<vertex_polygon_type_1>() = parameter.append<ta_vertex_parameter::polygon_type_9>() =
vertex_polygon_type_1(polygon_vertex_parameter_control_word(end_of_strip), ta_vertex_parameter::polygon_type_9(polygon_vertex_parameter_control_word(end_of_strip),
point.x, point.x,
point.y, point.y,
point.z, point.z,
color.a, // alpha argb8888(color0),
color.r, // red argb8888(color1)
color.g, // green );
color.b // blue
);
} }
} }
@ -120,9 +137,10 @@ void transform_modifier_volume(ta_parameter_writer& parameter,
const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::volume_instruction::normal_polygon const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::volume_instruction::normal_polygon
| isp_tsp_instruction_word::culling_mode::no_culling; | isp_tsp_instruction_word::culling_mode::no_culling;
parameter.append<global_modifier_volume>() = parameter.append<ta_global_parameter::modifier_volume>() =
global_modifier_volume(parameter_control_word, ta_global_parameter::modifier_volume(parameter_control_word,
isp_tsp_instruction_word); isp_tsp_instruction_word
);
for (uint32_t i = 0; i < num_faces; i++) { for (uint32_t i = 0; i < num_faces; i++) {
// world transform // world transform
@ -144,17 +162,17 @@ void transform_modifier_volume(ta_parameter_writer& parameter,
const uint32_t last_isp_tsp_instruction_word = isp_tsp_instruction_word::volume_instruction::inside_last_polygon const uint32_t last_isp_tsp_instruction_word = isp_tsp_instruction_word::volume_instruction::inside_last_polygon
| isp_tsp_instruction_word::culling_mode::no_culling; | isp_tsp_instruction_word::culling_mode::no_culling;
parameter.append<global_modifier_volume>() = parameter.append<ta_global_parameter::modifier_volume>() =
global_modifier_volume(last_parameter_control_word, ta_global_parameter::modifier_volume(last_parameter_control_word,
last_isp_tsp_instruction_word); last_isp_tsp_instruction_word);
} }
parameter.append<vertex_modifier_volume>() = parameter.append<ta_vertex_parameter::modifier_volume>() =
vertex_modifier_volume(modifier_volume_vertex_parameter_control_word(), ta_vertex_parameter::modifier_volume(modifier_volume_vertex_parameter_control_word(),
a.x, a.y, a.z, a.x, a.y, a.z,
b.x, b.y, b.z, b.x, b.y, b.z,
c.x, c.y, c.z); c.x, c.y, c.z);
} }
} }
@ -200,6 +218,7 @@ void main()
holly.SOFTRESET = 0; holly.SOFTRESET = 0;
core_init(); core_init();
holly.FPU_SHAD_SCALE = fpu_shad_scale::simple_shadow_enable::parameter_selection_volume_mode;
init_texture_memory(opb_size); init_texture_memory(opb_size);
uint32_t frame_ix = 0; uint32_t frame_ix = 0;
@ -214,14 +233,16 @@ void main()
480 / 32); 480 / 32);
auto parameter = ta_parameter_writer(ta_parameter_buf); auto parameter = ta_parameter_writer(ta_parameter_buf);
{ // plane { // plane
vec4 color = {1.0, 0.9, 0.4, 0.2}; vec4 color0 = {1.0, 0.9, 0.4, 0.2};
vec4 color1 = {1.0, 0.2, 0.9, 0.9};
float scale = 2.f; float scale = 2.f;
for (uint32_t i = 0; i < plane::num_faces; i++) { for (uint32_t i = 0; i < plane::num_faces; i++) {
transform_polygon(parameter, transform_polygon(parameter,
plane::vertices, plane::vertices,
plane::faces[i], plane::faces[i],
scale, scale,
color, color0,
color1,
theta); theta);
} }
@ -236,7 +257,7 @@ void main()
*/ */
} }
// end of opaque list // end of opaque list
parameter.append<global_end_of_list>() = global_end_of_list(); parameter.append<ta_global_parameter::end_of_list>() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list);
{ // cube { // cube
float scale = 1.f; float scale = 1.f;
@ -247,7 +268,7 @@ void main()
scale); scale);
} }
// end of opaque modifier list // end of opaque modifier list
parameter.append<global_end_of_list>() = global_end_of_list(); parameter.append<ta_global_parameter::end_of_list>() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list);
ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset);
ta_wait_opaque_modifier_volume_list(); ta_wait_opaque_modifier_volume_list();

View File

@ -410,8 +410,8 @@ namespace ta_vertex_parameter {
float x; float x;
float y; float y;
float z; float z;
float base_color_0; uint32_t base_color_0;
float base_color_1; uint32_t base_color_1;
uint32_t _res0; uint32_t _res0;
uint32_t _res1; uint32_t _res1;
@ -419,8 +419,8 @@ namespace ta_vertex_parameter {
const float x, const float x,
const float y, const float y,
const float z, const float z,
const float base_color_0, const uint32_t base_color_0,
const float base_color_1 const uint32_t base_color_1
) )
: parameter_control_word(parameter_control_word) : parameter_control_word(parameter_control_word)
, x(x) , x(x)
@ -447,8 +447,8 @@ namespace ta_vertex_parameter {
float x; float x;
float y; float y;
float z; float z;
float base_intensity_0; uint32_t base_intensity_0;
float base_intensity_1; uint32_t base_intensity_1;
uint32_t _res0; uint32_t _res0;
uint32_t _res1; uint32_t _res1;
@ -456,8 +456,8 @@ namespace ta_vertex_parameter {
const float x, const float x,
const float y, const float y,
const float z, const float z,
const float base_intensity_0, const uint32_t base_intensity_0,
const float base_intensity_1 const uint32_t base_intensity_1
) )
: parameter_control_word(parameter_control_word) : parameter_control_word(parameter_control_word)
, x(x) , x(x)
@ -486,12 +486,12 @@ namespace ta_vertex_parameter {
float z; float z;
float u_0; float u_0;
float v_0; float v_0;
float base_color_0; uint32_t base_color_0;
float offset_color_0; uint32_t offset_color_0;
float u_1; float u_1;
float v_1; float v_1;
float base_color_1; uint32_t base_color_1;
float offset_color_1; uint32_t offset_color_1;
uint32_t _res0; uint32_t _res0;
uint32_t _res1; uint32_t _res1;
uint32_t _res2; uint32_t _res2;
@ -503,12 +503,12 @@ namespace ta_vertex_parameter {
const float z, const float z,
const float u_0, const float u_0,
const float v_0, const float v_0,
const float base_color_0, const uint32_t base_color_0,
const float offset_color_0, const uint32_t offset_color_0,
const float u_1, const float u_1,
const float v_1, const float v_1,
const float base_color_1, const uint32_t base_color_1,
const float offset_color_1 const uint32_t offset_color_1
) )
: parameter_control_word(parameter_control_word) : parameter_control_word(parameter_control_word)
, x(x) , x(x)
@ -553,12 +553,12 @@ namespace ta_vertex_parameter {
float z; float z;
uint32_t u_v_0; uint32_t u_v_0;
uint32_t _res0; uint32_t _res0;
float base_color_0; uint32_t base_color_0;
float offset_color_0; uint32_t offset_color_0;
uint32_t u_v_1; uint32_t u_v_1;
uint32_t _res1; uint32_t _res1;
float base_color_1; uint32_t base_color_1;
float offset_color_1; uint32_t offset_color_1;
uint32_t _res2; uint32_t _res2;
uint32_t _res3; uint32_t _res3;
uint32_t _res4; uint32_t _res4;
@ -569,11 +569,11 @@ namespace ta_vertex_parameter {
const float y, const float y,
const float z, const float z,
const uint32_t u_v_0, const uint32_t u_v_0,
const float base_color_0, const uint32_t base_color_0,
const float offset_color_0, const uint32_t offset_color_0,
const uint32_t u_v_1, const uint32_t u_v_1,
const float base_color_1, const uint32_t base_color_1,
const float offset_color_1 const uint32_t offset_color_1
) )
: parameter_control_word(parameter_control_word) : parameter_control_word(parameter_control_word)
, x(x) , x(x)
@ -618,11 +618,11 @@ namespace ta_vertex_parameter {
float z; float z;
float u_0; float u_0;
float v_0; float v_0;
float base_intensity_0; uint32_t base_intensity_0;
float offset_intensity_0; float offset_intensity_0;
float u_1; float u_1;
float v_1; float v_1;
float base_intensity_1; uint32_t base_intensity_1;
float offset_intensity_1; float offset_intensity_1;
uint32_t _res0; uint32_t _res0;
uint32_t _res1; uint32_t _res1;
@ -635,11 +635,11 @@ namespace ta_vertex_parameter {
const float z, const float z,
const float u_0, const float u_0,
const float v_0, const float v_0,
const float base_intensity_0, const uint32_t base_intensity_0,
const float offset_intensity_0, const float offset_intensity_0,
const float u_1, const float u_1,
const float v_1, const float v_1,
const float base_intensity_1, const uint32_t base_intensity_1,
const float offset_intensity_1 const float offset_intensity_1
) )
: parameter_control_word(parameter_control_word) : parameter_control_word(parameter_control_word)
@ -685,11 +685,11 @@ namespace ta_vertex_parameter {
float z; float z;
uint32_t u_v_0; uint32_t u_v_0;
uint32_t _res0; uint32_t _res0;
float base_intensity_0; uint32_t base_intensity_0;
float offset_intensity_0; float offset_intensity_0;
uint32_t u_v_1; uint32_t u_v_1;
uint32_t _res1; uint32_t _res1;
float base_intensity_1; uint32_t base_intensity_1;
float offset_intensity_1; float offset_intensity_1;
uint32_t _res2; uint32_t _res2;
uint32_t _res3; uint32_t _res3;
@ -701,10 +701,10 @@ namespace ta_vertex_parameter {
const float y, const float y,
const float z, const float z,
const uint32_t u_v_0, const uint32_t u_v_0,
const float base_intensity_0, const uint32_t base_intensity_0,
const float offset_intensity_0, const float offset_intensity_0,
const uint32_t u_v_1, const uint32_t u_v_1,
const float base_intensity_1, const uint32_t base_intensity_1,
const float offset_intensity_1 const float offset_intensity_1
) )
: parameter_control_word(parameter_control_word) : parameter_control_word(parameter_control_word)

View File

@ -21,7 +21,11 @@ _field_types = {
"y": "float", "y": "float",
"z": "float", "z": "float",
"base_color_": "float", "base_color_": "float",
"base_intensity_": "float", "base_color_0": "uint32_t",
"base_color_1": "uint32_t",
"offset_color_0": "uint32_t",
"offset_color_1": "uint32_t",
"base_intensity_": "uint32_t",
"u": "float", "u": "float",
"v": "float", "v": "float",
"u_v": "uint32_t", "u_v": "uint32_t",