animated 32bit logo

This commit is contained in:
Zack Buhman 2025-06-26 20:37:48 -05:00
parent 3474099acc
commit 2b96cea9fc
7 changed files with 168 additions and 19 deletions

View File

@ -4182,12 +4182,3 @@ const object objects[] = {
.location = {0.000000, 0.000000, 0.000000},
},
};
const material materials[] = {
{
.start = (void *)&_binary_model_cars_32BitColors_data_start,
.size = (int)&_binary_model_cars_32BitColors_data_size,
.offset = 0,
},
};

View File

@ -37,7 +37,7 @@ static const scene::scene scenes[] = {
scene::logo::scene,
};
static const scene::scene * current_scene = &scenes[0];
static const scene::scene * current_scene = &scenes[1];
void graphics_interrupt(uint32_t istnrm)
{
@ -117,7 +117,7 @@ void graphics_event(ta_parameter_writer& writer)
{
writer.offset = 0;
scene::tracker::transfer(writer);
current_scene->transfer(writer);
while (ta_in_use);
while (core_in_use);

View File

@ -51,7 +51,7 @@ void vbr600()
aica::tactl_tima::TACTL(0) // increment once every sample
| aica::tactl_tima::TIMA(0xffff) // interrupt after 1 counts
;
interpreter::interrupt();
//interpreter::interrupt();
} else if (sh7091.CCN.EXPEVT == 0 && sh7091.CCN.INTEVT == 0x400) { // TMU0
sh7091.TMU.TCR0
= tmu::tcr0::UNIE

View File

@ -1,7 +1,49 @@
#include "math/float_types.hpp"
#include "math/transform.hpp"
#include "ta_parameter.hpp"
#include "scene/logo/scene.hpp"
#include "texture.hpp"
#include "framebuffer.hpp"
#include "model/blender_export.h"
#include "model/32bitlogo/model.h"
static vec3 screen_transform(const vec3& v)
{
return {v.x, v.y, 1.0f / v.z};
}
static void render_mesh(ta_parameter_writer& writer, const mesh& mesh, const mat4x4& trans)
{
const int base_color = 0xffffff;
vec3 position_cache[mesh.position_length];
for (int i = 0; i < mesh.position_length; i++) {
position_cache[i] = screen_transform(trans * mesh.position[i]);
}
for (int i = 0; i < mesh.polygons_length; i++) {
const polygon& p = mesh.polygons[i];
vec3 ap = position_cache[p.a];
vec3 bp = position_cache[p.b];
vec3 cp = position_cache[p.c];
vec2 at = mesh.uv_layers[0][p.uv_index + 0];
vec2 bt = mesh.uv_layers[0][p.uv_index + 1];
vec2 ct = mesh.uv_layers[0][p.uv_index + 2];
tri_type_3(writer,
ap, at,
bp, bt,
cp, ct,
base_color);
}
}
namespace scene::logo {
const struct scene::scene scene = {
@ -20,9 +62,83 @@ namespace scene::logo {
.transfer = transfer,
};
static int tick = 0;
static int last_tick = 0;
struct keyframe {
float rx;
float ry;
float duration;
};
const struct keyframe keyframes[] = {
{
.rx = 0,
.ry = 0,
.duration = 1.0 / (5 * 60),
},
{
.rx = pi / 4,
.ry = pi + pi / 4,
.duration = 1.0 / (10 * 60),
},
};
static inline float clamp(float f)
{
if (f > 1.0)
return 1.0;
else if (f < 0.0)
return 0.0;
else
return f;
}
static inline keyframe interpolate(const keyframe& a, const keyframe& b, const float dt)
{
float ratio = clamp(dt * a.duration);
float drx = b.rx - a.rx;
float dry = b.ry - a.ry;
return {
.rx = a.rx + drx * ratio,
.ry = a.ry + dry * ratio,
.duration = a.duration,
};
}
void transfer(ta_parameter_writer& writer)
{
uint32_t texture_size = tsp_instruction_word::texture_u_size::from_int(8)
| tsp_instruction_word::texture_v_size::from_int(8);
global_polygon_textured(writer,
para_control::list_type::opaque,
texture::offset::logo,
texture_size,
texture_control_word::pixel_format::_565);
vec3 t = {framebuffer.px_width / 2.f, framebuffer.px_height / 2.f, 0};
float s = framebuffer.px_height / 3.f;
keyframe k = interpolate(keyframes[0], keyframes[1], tick - last_tick);
mat4x4 trans
= translate(t)
* scale((vec3){s, s, 1})
* translate((vec3){0, 0, 10})
//* rotate_x(pi / 8)
//* rotate_y(pi + pi/8)
* rotate_x(k.rx)
* rotate_y(k.ry)
* scale((vec3){-1, -1, 1});
render_mesh(writer, mesh_logo, trans);
writer.append<ta_global_parameter::end_of_list>() =
ta_global_parameter::end_of_list(para_control::para_type::end_of_list);
tick += 1;
}
}

View File

@ -4,6 +4,7 @@
#include "../../framebuffer.hpp"
#include "channel_status.hpp"
#include "texture.hpp"
static inline int round_up_div(int n, int m)
{
@ -70,8 +71,14 @@ void transfer(ta_parameter_writer& writer, int x, int y)
base_color);
if (ch < state.xm.number_of_channels) {
uint32_t texture_size = tsp_instruction_word::texture_u_size::from_int(128)
| tsp_instruction_word::texture_v_size::from_int(256);
global_polygon_textured(writer,
para_control::list_type::opaque);
para_control::list_type::opaque,
texture::offset::tandy1k,
texture_size,
texture_control_word::pixel_format::_4bpp_palette);
int hori_center = inner_width / 2 - (glyph::hori_advance * (ch >= 10)) / 2;
transfer_integer(writer, ch, xi + hori_center, y + vert_center,

View File

@ -6,6 +6,7 @@
#include "notes.hpp"
#include "channel_status.hpp"
#include "texture.hpp"
namespace scene::tracker {
@ -31,8 +32,14 @@ namespace scene::tracker {
const int y = 100;
{ // punch-through
uint32_t texture_size = tsp_instruction_word::texture_u_size::from_int(128)
| tsp_instruction_word::texture_v_size::from_int(256);
global_polygon_textured(writer,
para_control::list_type::punch_through);
para_control::list_type::punch_through,
texture::offset::tandy1k,
texture_size,
texture_control_word::pixel_format::_4bpp_palette);
tracker::notes::transfer_lines(writer, x, y);

View File

@ -8,7 +8,11 @@
#include "holly/texture_memory_alloc9.hpp"
#include "math/float_types.hpp"
static inline void global_polygon_textured(ta_parameter_writer& writer, uint32_t list_type)
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
@ -23,11 +27,10 @@ static inline void global_polygon_textured(ta_parameter_writer& writer, uint32_t
| tsp_instruction_word::src_alpha_instr::one
| tsp_instruction_word::dst_alpha_instr::zero
| tsp_instruction_word::fog_control::no_fog
| tsp_instruction_word::texture_u_size::from_int(128)
| tsp_instruction_word::texture_v_size::from_int(256);
| texture_size;
const uint32_t texture_address = texture_memory_alloc.texture.start;
const uint32_t texture_control_word = texture_control_word::pixel_format::_4bpp_palette
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);
@ -106,6 +109,31 @@ static inline void quad_type_3(ta_parameter_writer& writer,
base_color, 0);
}
static inline void tri_type_3(ta_parameter_writer& writer,
const vec3& ap, const vec2& at,
const vec3& bp, const vec2& bt,
const vec3& cp, const vec2& ct,
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(true),
cp.x, cp.y, cp.z,
ct.x, ct.y,
base_color, 0);
}
static inline void quad_type_0(ta_parameter_writer& writer,
const vec3& ap,
const vec3& bp,