rotating triangle

This commit is contained in:
Zack Buhman 2024-12-28 06:09:32 -06:00
parent de56ce5ac4
commit bb2e911546
13 changed files with 143 additions and 36 deletions

View File

@ -50,8 +50,5 @@ LIBGCC_OBJ = \
include classpath.mk
CLASS_FILES = \
example/DreamcastVideo2.class.o
main.elf: LDSCRIPT = $(LIB)/main.lds
main.elf: $(START_OBJ) $(OBJ) $(MAIN_OBJ) $(MAIN_DREAMCAST_OBJ) $(LIBGCC_OBJ) $(CLASS_FILES) $(CLASS_PATH)
main.elf: $(START_OBJ) $(OBJ) $(MAIN_OBJ) $(MAIN_DREAMCAST_OBJ) $(LIBGCC_OBJ) $(CLASS_PATH)

View File

@ -1,6 +1,7 @@
#pragma once
#include "printf.h"
#include "class_file.h"
#define assert(b) \
do { \
@ -9,3 +10,32 @@
while (1); \
} \
} while (0);
static inline void assert_print_string(struct constant * constant)
{
for (int i = 0; i < constant->utf8.length; i++) {
printc(constant->utf8.bytes[i]);
}
printc('\n');
}
#define assertvm(vm, b) \
do { \
if (!(b)) { \
printf("%s:%d %s: vm assertion `%s` failed\n", __FILE__, __LINE__, __func__, #b); \
\
struct class_entry * class_entry = vm->current_frame->class_entry; \
struct constant * class_constant = &class_entry->class_file->constant_pool[class_entry->class_file->this_class - 1]; \
assert(class_constant->tag == CONSTANT_Class); \
struct constant * class_name_constant = &class_entry->class_file->constant_pool[class_constant->class.name_index - 1]; \
assert(class_name_constant->tag == CONSTANT_Utf8); \
assert_print_string(class_name_constant); \
\
struct method_info * method_info = vm->current_frame->method; \
struct constant * method_name_constant = &class_entry->class_file->constant_pool[method_info->name_index - 1]; \
assert(method_name_constant->tag == CONSTANT_Utf8); \
assert_print_string(method_name_constant); \
\
while (1); \
} \
} while (0);

View File

@ -1,3 +1,6 @@
#include "example/DreamcastVideo2.class.h"
#include "example/DreamcastVideo.class.h"
#include "example/Vec2.class.h"
#include "java/io/PrintStream.class.h"
#include "java/lang/Integer.class.h"
#include "java/lang/Math.class.h"

View File

@ -1,3 +1,6 @@
(const uint8_t *)&_binary_example_DreamcastVideo2_class_start,
(const uint8_t *)&_binary_example_DreamcastVideo_class_start,
(const uint8_t *)&_binary_example_Vec2_class_start,
(const uint8_t *)&_binary_java_io_PrintStream_class_start,
(const uint8_t *)&_binary_java_lang_Integer_class_start,
(const uint8_t *)&_binary_java_lang_Math_class_start,

View File

@ -8,7 +8,6 @@
#include "sh7091_scif.h"
#include "classpath.h"
#include "example/DreamcastVideo2.class.h"
void main()
{
@ -16,7 +15,6 @@ void main()
const uint8_t * class_file_buffers[] = {
#include "classpath.inc.c"
(const uint8_t *)&_binary_example_DreamcastVideo2_class_start,
};
int class_file_buffers_length = (sizeof (class_file_buffers)) / (sizeof (class_file_buffers[0]));

View File

@ -25,6 +25,8 @@ void print_cstring(const char * s);
void _printf(const char * format, ...);
#define printf(...) _printf(__VA_ARGS__)
#define printc(c) print_char(c)
#define prints(s) print_cstring(s)
#if defined(DEBUG_PRINT)
#define debugf(...) _printf(__VA_ARGS__)

View File

@ -1,4 +1,7 @@
CLASS_PATH = \
example/DreamcastVideo2.class.o \
example/DreamcastVideo.class.o \
example/Vec2.class.o \
java/io/PrintStream.class.o \
java/lang/Integer.class.o \
java/lang/Math.class.o \

View File

@ -3,7 +3,7 @@
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
extern C {
#endif
extern uint32_t _binary_example_DreamcastVideo_class_start __asm("_binary_example_DreamcastVideo_class_start");

View File

@ -3,7 +3,7 @@
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
extern C {
#endif
extern uint32_t _binary_example_DreamcastVideo2_class_start __asm("_binary_example_DreamcastVideo2_class_start");

View File

@ -17,10 +17,22 @@ import sega.dreamcast.systembus.SystembusBits;
import sega.dreamcast.MemoryMap;
import java.misc.Memory;
class Vec2 {
float x;
float y;
}
class DreamcastVideo2 {
public static TAGlobalParameter.polygon_type_0 gt0;
public static TAVertexParameter.polygon_type_0 vt0;
public static TAGlobalParameter.end_of_list eol;
static final int framebuffer_width = 640;
static final int framebuffer_height = 480;
static TAGlobalParameter.polygon_type_0 gt0;
static TAVertexParameter.polygon_type_0 vt0;
static TAGlobalParameter.end_of_list eol;
static Vec2[] vtx;
static float theta;
static {
int parameter_control_word = TAParameter.para_control__para_type__polygon_or_modifier_volume
@ -52,6 +64,31 @@ class DreamcastVideo2 {
0xff00ff00); // color (green)
eol = new TAGlobalParameter.end_of_list(TAParameter.para_control__para_type__end_of_list);
vtx = new Vec2[3];
for (int i = 0; i < 3; i++)
vtx[i] = new Vec2();
vtx[0].x = 0.0f;
vtx[0].y = 1.0f;
vtx[1].x = 0.866025f;
vtx[1].y = -0.5f;
vtx[2].x = -0.866025f;
vtx[2].y = -0.5f;
}
public static void transform_vertex(Vec2 v, boolean end_of_strip) {
DreamcastVideo2.vt0.parameter_control_word = TAParameter.para_control__para_type__vertex_parameter;
if (end_of_strip)
DreamcastVideo2.vt0.parameter_control_word |= TAParameter.para_control__end_of_strip;
float x0 = v.x * Math.cos(theta) - v.y * Math.sin(theta);
float y0 = v.x * Math.sin(theta) + v.y * Math.cos(theta);
float x = x0 * 240 + 320;
float y = -y0 * 240 + 240;
DreamcastVideo2.vt0.x = x;
DreamcastVideo2.vt0.y = y;
Memory.putSQ1(DreamcastVideo2.vt0, MemoryMap.ta_fifo_polygon_converter);
}
public static void transfer_scene() {
@ -59,21 +96,9 @@ class DreamcastVideo2 {
Memory.putSQ1(DreamcastVideo2.gt0, MemoryMap.ta_fifo_polygon_converter);
// vertex parameters
DreamcastVideo2.vt0.parameter_control_word = TAParameter.para_control__para_type__vertex_parameter;
DreamcastVideo2.vt0.x = 10.0f;
DreamcastVideo2.vt0.y = 10.0f;
Memory.putSQ1(DreamcastVideo2.vt0, MemoryMap.ta_fifo_polygon_converter);
DreamcastVideo2.vt0.parameter_control_word = TAParameter.para_control__para_type__vertex_parameter;
DreamcastVideo2.vt0.x = 100.0f;
DreamcastVideo2.vt0.y = 10.0f;
Memory.putSQ1(DreamcastVideo2.vt0, MemoryMap.ta_fifo_polygon_converter);
DreamcastVideo2.vt0.parameter_control_word = TAParameter.para_control__para_type__vertex_parameter
| TAParameter.para_control__end_of_strip;
DreamcastVideo2.vt0.x = 100.0f;
DreamcastVideo2.vt0.y = 100.0f;
Memory.putSQ1(DreamcastVideo2.vt0, MemoryMap.ta_fifo_polygon_converter);
for (int i = 0; i < 3; i++) {
transform_vertex(vtx[i], (i == 2));
}
// end of list
Memory.putSQ1(DreamcastVideo2.eol, MemoryMap.ta_fifo_polygon_converter);
@ -100,9 +125,6 @@ class DreamcastVideo2 {
};
int opb_size_total = opb_size[0].total();
int framebuffer_width = 640;
int framebuffer_height = 480;
int num_render_passes = opb_size.length;
Core.fb_init(framebuffer_width, framebuffer_height);
@ -126,11 +148,10 @@ class DreamcastVideo2 {
Background.background(TextureMemoryAllocation.background_start[1],
background_color);
//int ta = -1;
//int core = -2;
int core = 0;
int ta = 0;
while (true) {
// unpipelined render loop
TAFIFOPolygonConverter.init(TextureMemoryAllocation.isp_tsp_parameters_start[ta],
TextureMemoryAllocation.isp_tsp_parameters_end[ta],
TextureMemoryAllocation.object_list_start[ta],
@ -141,6 +162,7 @@ class DreamcastVideo2 {
framebuffer_height / 32);
transfer_scene();
TAFIFOPolygonConverter.wait_opaque_list();
Core.start_render(TextureMemoryAllocation.region_array_start[ta],
TextureMemoryAllocation.isp_tsp_parameters_start[ta],
TextureMemoryAllocation.background_start[ta],
@ -149,6 +171,8 @@ class DreamcastVideo2 {
Core.wait_end_of_render_tsp();
Memory.putU4(Holly.FB_R_SOF1, TextureMemoryAllocation.framebuffer_start[core]);
core = (core + 1) % 1;
theta += Math.DEGREES_TO_RADIANS;
}
}
}

15
example/Vec2.class.h Normal file
View File

@ -0,0 +1,15 @@
#pragma once
#include <stdint.h>
#ifdef __cplusplus
extern C {
#endif
extern uint32_t _binary_example_Vec2_class_start __asm("_binary_example_Vec2_class_start");
extern uint32_t _binary_example_Vec2_class_end __asm("_binary_example_Vec2_class_end");
extern uint32_t _binary_example_Vec2_class_size __asm("_binary_example_Vec2_class_size");
#ifdef __cplusplus
}
#endif

View File

@ -66,10 +66,12 @@ function classpath_h () {
done
}
set -e
find sega/ java/ -name '*.class' -exec rm -f {} \;
find example/ sega/ java/ -name '*.java' | sort | make_class
find sega/ java/ -name '*.class' | sort | rename_class_files
find sega/ java/ -name '*.class' | sort | classpath_mk
find sega/ java/ -name '*.class' | sort | classpath_inc_c
find sega/ java/ -name '*.class' | sort | make_header
find sega/ java/ -name '*.class' | sort | classpath_h
find example/ sega/ java/ -name '*.class' | sort | rename_class_files
find example/ sega/ java/ -name '*.class' | sort | classpath_mk
find example/ sega/ java/ -name '*.class' | sort | classpath_inc_c
find example/ sega/ java/ -name '*.class' | sort | make_header
find example/ sega/ java/ -name '*.class' | sort | classpath_h

30
p/VecTest.java Normal file
View File

@ -0,0 +1,30 @@
package p;
class Vec2 {
float x;
float y;
}
class VecTest {
static Vec2[] vtx;
static {
vtx = new Vec2[3];
for (int i = 0; i < 3; i++)
vtx[i] = new Vec2();
vtx[0].x = 0.0f;
vtx[0].y = 1.0f;
vtx[1].x = 0.866025f;
vtx[1].y = -0.5f;
vtx[2].x = -0.866025f;
vtx[2].y = -0.5f;
}
public static float test() {
return vtx[0].y;
}
public static void main(String[] args) {
System.out.println(test());
}
}