280 lines
14 KiB
C++
280 lines
14 KiB
C++
#pragma once
|
|
|
|
#include "holly/ta_global_parameter.hpp"
|
|
#include "holly/ta_vertex_parameter.hpp"
|
|
#include "holly/ta_parameter.hpp"
|
|
#include "holly/ta_global_parameter.hpp"
|
|
#include "holly/isp_tsp.hpp"
|
|
#include "holly/texture_memory_alloc9.hpp"
|
|
#include "math/float_types.hpp"
|
|
|
|
#include "math/math.hpp"
|
|
|
|
static inline void global_polygon_textured(ta_parameter_writer& writer,
|
|
uint32_t list_type,
|
|
uint32_t texture_offset,
|
|
uint32_t texture_size,
|
|
uint32_t pixel_format)
|
|
{
|
|
const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume
|
|
| list_type
|
|
| obj_control::col_type::packed_color
|
|
| obj_control::texture
|
|
;
|
|
|
|
const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater_or_equal
|
|
| isp_tsp_instruction_word::culling_mode::no_culling;
|
|
|
|
const uint32_t tsp_instruction_word = tsp_instruction_word::texture_shading_instruction::modulate
|
|
| tsp_instruction_word::src_alpha_instr::one
|
|
| tsp_instruction_word::fog_control::no_fog
|
|
| texture_size;
|
|
|
|
const uint32_t texture_address = texture_memory_alloc.texture.start + texture_offset;
|
|
const uint32_t texture_control_word = pixel_format
|
|
| texture_control_word::scan_order::twiddled
|
|
| texture_control_word::texture_address(texture_address / 8);
|
|
|
|
writer.append<ta_global_parameter::polygon_type_0>() =
|
|
ta_global_parameter::polygon_type_0(parameter_control_word,
|
|
isp_tsp_instruction_word,
|
|
tsp_instruction_word,
|
|
texture_control_word,
|
|
0, // data_size_for_sort_dma
|
|
0 // next_address_for_sort_dma
|
|
);
|
|
}
|
|
|
|
static inline void global_polygon_intensity(ta_parameter_writer& writer,
|
|
uint32_t list_type,
|
|
uint32_t texture_offset,
|
|
uint32_t texture_size,
|
|
uint32_t pixel_format)
|
|
{
|
|
const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume
|
|
| list_type
|
|
| obj_control::col_type::packed_color
|
|
| obj_control::texture
|
|
| obj_control::col_type::intensity_mode_1
|
|
;
|
|
|
|
const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater_or_equal
|
|
| isp_tsp_instruction_word::culling_mode::no_culling;
|
|
|
|
const uint32_t tsp_instruction_word = tsp_instruction_word::texture_shading_instruction::modulate
|
|
| tsp_instruction_word::src_alpha_instr::one
|
|
| tsp_instruction_word::dst_alpha_instr::zero
|
|
| tsp_instruction_word::fog_control::no_fog
|
|
| texture_size;
|
|
|
|
const uint32_t texture_address = texture_memory_alloc.texture.start + texture_offset;
|
|
const uint32_t texture_control_word = pixel_format
|
|
| texture_control_word::scan_order::twiddled
|
|
| texture_control_word::texture_address(texture_address / 8);
|
|
|
|
writer.append<ta_global_parameter::polygon_type_1>() =
|
|
ta_global_parameter::polygon_type_1(parameter_control_word,
|
|
isp_tsp_instruction_word,
|
|
tsp_instruction_word,
|
|
texture_control_word,
|
|
1, 1, 1, 1);
|
|
}
|
|
|
|
static inline void global_polygon_untextured(ta_parameter_writer& writer, uint32_t list_type, uint32_t dst_alpha)
|
|
{
|
|
const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume
|
|
| list_type
|
|
| obj_control::col_type::packed_color
|
|
;
|
|
|
|
const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater_or_equal
|
|
| isp_tsp_instruction_word::culling_mode::no_culling;
|
|
|
|
const uint32_t tsp_instruction_word = tsp_instruction_word::texture_shading_instruction::modulate
|
|
| tsp_instruction_word::src_alpha_instr::one
|
|
| dst_alpha
|
|
| tsp_instruction_word::fog_control::no_fog;
|
|
|
|
const uint32_t texture_control_word = 0;
|
|
|
|
writer.append<ta_global_parameter::polygon_type_0>() =
|
|
ta_global_parameter::polygon_type_0(parameter_control_word,
|
|
isp_tsp_instruction_word,
|
|
tsp_instruction_word,
|
|
texture_control_word,
|
|
0, // data_size_for_sort_dma
|
|
0 // next_address_for_sort_dma
|
|
);
|
|
}
|
|
|
|
static inline void global_polygon_translucent(ta_parameter_writer& writer)
|
|
{
|
|
const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume
|
|
| para_control::list_type::translucent
|
|
| obj_control::col_type::packed_color
|
|
;
|
|
|
|
const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater_or_equal
|
|
| isp_tsp_instruction_word::culling_mode::no_culling;
|
|
|
|
const uint32_t tsp_instruction_word = tsp_instruction_word::texture_shading_instruction::modulate_alpha
|
|
| tsp_instruction_word::src_alpha_instr::src_alpha
|
|
| tsp_instruction_word::dst_alpha_instr::inverse_src_alpha
|
|
| tsp_instruction_word::use_alpha
|
|
| tsp_instruction_word::fog_control::no_fog;
|
|
|
|
const uint32_t texture_control_word = 0;
|
|
|
|
writer.append<ta_global_parameter::polygon_type_0>() =
|
|
ta_global_parameter::polygon_type_0(parameter_control_word,
|
|
isp_tsp_instruction_word,
|
|
tsp_instruction_word,
|
|
texture_control_word,
|
|
0, // data_size_for_sort_dma
|
|
0 // next_address_for_sort_dma
|
|
);
|
|
}
|
|
|
|
static inline void quad_type_3(ta_parameter_writer& writer,
|
|
const vec3& ap, const vec2& at,
|
|
const vec3& bp, const vec2& bt,
|
|
const vec3& cp, const vec2& ct,
|
|
const vec3& dp, const vec2& dt,
|
|
int base_color)
|
|
{
|
|
writer.append<ta_vertex_parameter::polygon_type_3>() =
|
|
ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(false),
|
|
ap.x, ap.y, ap.z,
|
|
at.x, at.y,
|
|
base_color, 0);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_3>() =
|
|
ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(false),
|
|
bp.x, bp.y, bp.z,
|
|
bt.x, bt.y,
|
|
base_color, 0);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_3>() =
|
|
ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(false),
|
|
dp.x, dp.y, dp.z,
|
|
dt.x, dt.y,
|
|
base_color, 0);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_3>() =
|
|
ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(true),
|
|
cp.x, cp.y, cp.z,
|
|
ct.x, ct.y,
|
|
base_color, 0);
|
|
}
|
|
|
|
static inline void tri_type_7(ta_parameter_writer& writer,
|
|
const vec3& ap, const vec2& at,
|
|
const vec3& bp, const vec2& bt,
|
|
const vec3& cp, const vec2& ct,
|
|
float intensity)
|
|
{
|
|
writer.append<ta_vertex_parameter::polygon_type_7>() =
|
|
ta_vertex_parameter::polygon_type_7(polygon_vertex_parameter_control_word(false),
|
|
ap.x, ap.y, ap.z,
|
|
at.x, at.y,
|
|
intensity, 0);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_7>() =
|
|
ta_vertex_parameter::polygon_type_7(polygon_vertex_parameter_control_word(false),
|
|
bp.x, bp.y, bp.z,
|
|
bt.x, bt.y,
|
|
intensity, 0);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_7>() =
|
|
ta_vertex_parameter::polygon_type_7(polygon_vertex_parameter_control_word(true),
|
|
cp.x, cp.y, cp.z,
|
|
ct.x, ct.y,
|
|
intensity, 0);
|
|
}
|
|
|
|
static inline void quad_type_7(ta_parameter_writer& writer,
|
|
const vec3& ap, const vec2& at,
|
|
const vec3& bp, const vec2& bt,
|
|
const vec3& cp, const vec2& ct,
|
|
const vec3& dp, const vec2& dt,
|
|
float intensity)
|
|
{
|
|
writer.append<ta_vertex_parameter::polygon_type_7>() =
|
|
ta_vertex_parameter::polygon_type_7(polygon_vertex_parameter_control_word(false),
|
|
ap.x, ap.y, ap.z,
|
|
at.x, at.y,
|
|
intensity, 0);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_7>() =
|
|
ta_vertex_parameter::polygon_type_7(polygon_vertex_parameter_control_word(false),
|
|
bp.x, bp.y, bp.z,
|
|
bt.x, bt.y,
|
|
intensity, 0);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_7>() =
|
|
ta_vertex_parameter::polygon_type_7(polygon_vertex_parameter_control_word(false),
|
|
dp.x, dp.y, dp.z,
|
|
dt.x, dt.y,
|
|
intensity, 0);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_7>() =
|
|
ta_vertex_parameter::polygon_type_7(polygon_vertex_parameter_control_word(true),
|
|
cp.x, cp.y, cp.z,
|
|
ct.x, ct.y,
|
|
intensity, 0);
|
|
}
|
|
|
|
static inline void quad_type_0(ta_parameter_writer& writer,
|
|
const vec3& ap,
|
|
const vec3& bp,
|
|
const vec3& cp,
|
|
const vec3& dp,
|
|
int base_color)
|
|
{
|
|
writer.append<ta_vertex_parameter::polygon_type_0>() =
|
|
ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false),
|
|
ap.x, ap.y, ap.z,
|
|
base_color);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_0>() =
|
|
ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false),
|
|
bp.x, bp.y, bp.z,
|
|
base_color);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_0>() =
|
|
ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false),
|
|
dp.x, dp.y, dp.z,
|
|
base_color);
|
|
|
|
writer.append<ta_vertex_parameter::polygon_type_0>() =
|
|
ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(true),
|
|
cp.x, cp.y, cp.z,
|
|
base_color);
|
|
}
|
|
|
|
#define _fsrra(n) (1.0f / (sqrt<float>(n)))
|
|
|
|
static inline void line_type_0(ta_parameter_writer& writer,
|
|
const vec3& p1,
|
|
const vec3& p2,
|
|
int base_color)
|
|
{
|
|
float dy = p2.y - p1.y;
|
|
float dx = p2.x - p1.x;
|
|
float d = _fsrra(dx * dx + dy * dy) * 0.7f;
|
|
float dy1 = dy * d;
|
|
float dx1 = dx * d;
|
|
|
|
vec3 ap = { p1.x + dy1, p1.y + -dx1, p1.z };
|
|
vec3 bp = { p1.x + -dy1, p1.y + dx1, p1.z };
|
|
vec3 cp = { p2.x + -dy1, p2.y + dx1, p2.z };
|
|
vec3 dp = { p2.x + dy1, p2.y + -dx1, p2.z };
|
|
|
|
quad_type_0(writer,
|
|
ap,
|
|
bp,
|
|
cp,
|
|
dp,
|
|
base_color);
|
|
}
|