Compare commits

..

No commits in common. "608273ef44dd52ab2543dfdac71edfc568a7d7de" and "9a2e97fdaea2070e9d030eaf82c78de86912d63c" have entirely different histories.

25 changed files with 9 additions and 51409 deletions

View File

@ -1,685 +0,0 @@
#include <stdint.h>
#include "holly/background.hpp"
#include "holly/core.hpp"
#include "holly/core_bits.hpp"
#include "holly/holly.hpp"
#include "holly/isp_tsp.hpp"
#include "holly/region_array.hpp"
#include "holly/ta_bits.hpp"
#include "holly/ta_fifo_polygon_converter.hpp"
#include "holly/ta_global_parameter.hpp"
#include "holly/ta_parameter.hpp"
#include "holly/ta_vertex_parameter.hpp"
#include "holly/texture_memory_alloc3.hpp"
#include "holly/video_output.hpp"
#include "sh7091/sh7091.hpp"
#include "sh7091/sh7091_bits.hpp"
#include "sh7091/serial.hpp"
#include "sh7091/vbr.hpp"
#include "systembus.hpp"
#include "systembus_bits.hpp"
#include "memorymap.hpp"
#include "math/vec2.hpp"
#include "math/vec3.hpp"
#include "math/vec4.hpp"
#include "math/mat4x4.hpp"
using vec2 = vec<2, float>;
using vec3 = vec<3, float>;
using vec4 = vec<4, float>;
using mat4x4 = mat<4, 4, float>;
#include "model/model.h"
#include "model/bear/material.h"
#include "model/bear/model.h"
#include "model/bear/bear.data.h"
void vbr100()
{
serial::string("vbr100\n");
serial::string("expevt ");
serial::integer<uint16_t>(sh7091.CCN.EXPEVT);
serial::string("intevt ");
serial::integer<uint16_t>(sh7091.CCN.INTEVT);
serial::string("tra ");
serial::integer<uint16_t>(sh7091.CCN.TRA);
uint32_t spc;
uint32_t ssr;
asm volatile ("stc spc,%0" : "=r" (spc));
asm volatile ("stc ssr,%0" : "=r" (ssr));
serial::string("spc ");
serial::integer(spc);
serial::string("ssr ");
serial::integer(ssr);
while (1);
}
void vbr400()
{
serial::string("vbr400\n");
serial::string("expevt ");
serial::integer<uint16_t>(sh7091.CCN.EXPEVT);
serial::string("intevt ");
serial::integer<uint16_t>(sh7091.CCN.INTEVT);
serial::string("tra ");
serial::integer<uint16_t>(sh7091.CCN.TRA);
uint32_t spc;
uint32_t ssr;
asm volatile ("stc spc,%0" : "=r" (spc));
asm volatile ("stc ssr,%0" : "=r" (ssr));
serial::string("spc ");
serial::integer(spc);
serial::string("ssr ");
serial::integer(ssr);
while (1);
}
static int render_done = 0;
void vbr600()
{
if (sh7091.CCN.EXPEVT == 0 && sh7091.CCN.INTEVT == 0x320) {
uint32_t istnrm = system.ISTNRM;
uint32_t isterr = system.ISTERR;
if (isterr) {
serial::string("isterr: ");
serial::integer<uint32_t>(system.ISTERR);
}
if (istnrm & istnrm::end_of_render_tsp) {
system.ISTNRM = istnrm::end_of_render_tsp
| istnrm::end_of_render_isp
| istnrm::end_of_render_video;
render_done = 1;
return;
}
}
serial::string("vbr600\n");
serial::string("expevt ");
serial::integer<uint16_t>(sh7091.CCN.EXPEVT);
serial::string("intevt ");
serial::integer<uint16_t>(sh7091.CCN.INTEVT);
serial::string("tra ");
serial::integer<uint16_t>(sh7091.CCN.TRA);
serial::string("istnrm: ");
serial::integer<uint32_t>(system.ISTNRM);
serial::string("isterr: ");
serial::integer<uint32_t>(system.ISTERR);
uint32_t spc;
uint32_t ssr;
asm volatile ("stc spc,%0" : "=r" (spc));
asm volatile ("stc ssr,%0" : "=r" (ssr));
serial::string("spc ");
serial::integer(spc);
serial::string("ssr ");
serial::integer(ssr);
while (1);
}
void interrupt_init()
{
system.IML2NRM = 0;
system.IML2ERR = 0;
system.IML2EXT = 0;
system.IML4NRM = 0;
system.IML4ERR = 0;
system.IML4EXT = 0;
system.IML6NRM = 0;
system.IML6ERR = 0;
system.IML6EXT = 0;
system.ISTERR = 0xffffffff;
system.ISTNRM = 0xffffffff;
sh7091.CCN.INTEVT = 0;
sh7091.CCN.EXPEVT = 0;
uint32_t vbr = reinterpret_cast<uint32_t>(&__vbr_link_start) - 0x100;
serial::string("vbr ");
serial::integer<uint32_t>(vbr);
serial::string("vbr100 ");
serial::integer<uint32_t>(reinterpret_cast<uint32_t>(&vbr100));
asm volatile ("ldc %0,vbr"
:
: "r" (vbr));
uint32_t sr;
asm volatile ("stc sr,%0"
: "=r" (sr));
serial::string("sr ");
serial::integer<uint32_t>(sr);
sr &= ~sh::sr::bl; // BL
sr &= ~sh::sr::imask(15); // imask
serial::string("sr ");
serial::integer<uint32_t>(sr);
asm volatile ("ldc %0,sr"
:
: "r" (sr));
}
void global_polygon_type_0(ta_parameter_writer& writer,
uint32_t list,
uint32_t cull,
vec3 color)
{
const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume
| list
| obj_control::col_type::packed_color
| obj_control::gouraud
;
const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater
| cull;
const uint32_t tsp_instruction_word = tsp_instruction_word::fog_control::no_fog
| tsp_instruction_word::src_alpha_instr::one
| tsp_instruction_word::dst_alpha_instr::zero
;
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, // offset color
0 // sort dma
);
}
void global_polygon_type_1(ta_parameter_writer& writer,
uint32_t texture_address,
uint32_t list,
uint32_t cull,
vec3 color)
{
const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume
| list
| obj_control::col_type::intensity_mode_1
| obj_control::gouraud
| obj_control::texture
;
const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater
| cull;
const uint32_t tsp_instruction_word = tsp_instruction_word::fog_control::no_fog
| tsp_instruction_word::src_alpha_instr::one
| tsp_instruction_word::dst_alpha_instr::zero
| tsp_instruction_word::texture_shading_instruction::modulate
| tsp_instruction_word::texture_u_size::from_int(512)
| tsp_instruction_word::texture_v_size::from_int(512)
;
const uint32_t texture_control_word = texture_control_word::pixel_format::_565
| texture_control_word::scan_order::twiddled
| texture_control_word::texture_address(texture_address / 8);
const float alpha = 1.0f;
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,
alpha,
color.x,
color.y,
color.z
);
}
static inline vec3 screen_transform(vec3 v)
{
float dim = 480 / 2.0;
return {
v.x / v.z * dim + 640 / 2.0f,
v.y / v.z * dim + 480 / 2.0f,
1 / v.z,
};
}
static inline void render_quad_type_0(ta_parameter_writer& writer,
vec3 ap,
vec3 bp,
vec3 cp,
vec3 dp,
uint32_t 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);
}
static inline void render_quad_type_7(ta_parameter_writer& writer,
vec3 ap,
vec3 bp,
vec3 cp,
vec3 dp,
vec2 at,
vec2 bt,
vec2 ct,
vec2 dt,
float ai,
float bi,
float ci,
float di)
{
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,
ai,
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,
bi,
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,
di,
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,
ci,
0);
}
constexpr inline mat4x4 screen_rotation(float theta)
{
//float zt = -0.7853981633974483 + (0.2);
float zt = -0.7853981633974483 * 0;
float yt = -0.7853981633974483 * theta;
float xt = 0.7853981633974483 * 4;
//float xt = 0.7853981633974483 * 3.7;
mat4x4 rx = {
1, 0, 0, 0,
0, cos(xt), -sin(xt), 0,
0, sin(xt), cos(xt), 0,
0, 0, 0, 1,
};
mat4x4 ry = {
cos(yt), 0, sin(yt), 0,
0, 1, 0, 0,
-sin(yt), 0, cos(yt), 0,
0, 0, 0, 1,
};
mat4x4 rz = {
cos(zt), -sin(zt), 0, 0,
sin(zt), cos(zt), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
};
mat4x4 t = {
1, 0, 0, 0,
0, 1, 0, 6.5,
0, 0, 1, 8.5,
0, 0, 0, 1,
};
return t * ry * rx * rz;
}
#define _fsrra(n) (1.0f / (__builtin_sqrtf(n)))
static inline float inverse_length(vec3 v)
{
float f = dot(v, v);
return _fsrra(f);
}
float light_intensity(vec3 light_vec, mat4x4& trans, vec3 n0)
{
vec4 n1 = trans * (vec4){n0.x, n0.y, n0.z, 0.f}; // no translation component
vec3 n = {n1.x, n1.y, n1.z};
float n_dot_l = dot(n, light_vec);
float intensity = 0.5f;
if (n_dot_l > 0) {
intensity += 0.5f * n_dot_l * (inverse_length(n) * inverse_length(light_vec));
if (intensity > 1.0f)
intensity = 1.0f;
}
return intensity;
}
static int animation_tick = 0;
constexpr int animation_frames = 4;
constexpr int ticks_per_animation_frame = 16;
constexpr float tick_div = 1.0f / (float)ticks_per_animation_frame;
void render_object_intensity(ta_parameter_writer& writer, const mat4x4& model_trans, const mat4x4& screen,
const struct model * model,
const struct object * object0,
const struct object * object1)
{
int frame_ix0 = animation_tick / ticks_per_animation_frame;
float lerp = (float)(animation_tick - (frame_ix0 * ticks_per_animation_frame)) * tick_div;
vec3 light_vec = {20, 1, -20};
mat4x4 trans = screen * model_trans;
for (int i = 0; i < object0->quadrilateral_count; i++) {
const union quadrilateral * quad0 = &object0->quadrilateral[i];
const union quadrilateral * quad1 = &object1->quadrilateral[i];
vec3 a0 = model->position[quad0->v[0].position];
vec3 b0 = model->position[quad0->v[1].position];
vec3 c0 = model->position[quad0->v[2].position];
vec3 d0 = model->position[quad0->v[3].position];
vec3 a1 = model->position[quad1->v[0].position];
vec3 b1 = model->position[quad1->v[1].position];
vec3 c1 = model->position[quad1->v[2].position];
vec3 d1 = model->position[quad1->v[3].position];
vec3 a = trans * (a0 + ((a1 - a0) * lerp));
vec3 b = trans * (b0 + ((b1 - b0) * lerp));
vec3 c = trans * (c0 + ((c1 - c0) * lerp));
vec3 d = trans * (d0 + ((d1 - d0) * lerp));
vec2 at = model->texture[quad0->v[0].texture] * (vec2){1, -1};
vec2 bt = model->texture[quad0->v[1].texture] * (vec2){1, -1};
vec2 ct = model->texture[quad0->v[2].texture] * (vec2){1, -1};
vec2 dt = model->texture[quad0->v[3].texture] * (vec2){1, -1};
vec3 an0 = model->normal[quad0->v[0].normal];
vec3 bn0 = model->normal[quad0->v[1].normal];
vec3 cn0 = model->normal[quad0->v[2].normal];
vec3 dn0 = model->normal[quad0->v[3].normal];
vec3 an1 = model->normal[quad1->v[0].normal];
vec3 bn1 = model->normal[quad1->v[1].normal];
vec3 cn1 = model->normal[quad1->v[2].normal];
vec3 dn1 = model->normal[quad1->v[3].normal];
vec3 an = (an0 + ((an1 - an0) * lerp));
vec3 bn = (bn0 + ((bn1 - bn0) * lerp));
vec3 cn = (cn0 + ((cn1 - cn0) * lerp));
vec3 dn = (dn0 + ((dn1 - dn0) * lerp));
float ai = light_intensity(light_vec, trans, an);
float bi = light_intensity(light_vec, trans, bn);
float ci = light_intensity(light_vec, trans, cn);
float di = light_intensity(light_vec, trans, dn);
render_quad_type_7(writer,
screen_transform(a),
screen_transform(b),
screen_transform(c),
screen_transform(d),
at,
bt,
ct,
dt,
ai,
bi,
ci,
di);
}
}
void render_object_packed(ta_parameter_writer& writer, const mat4x4& model_trans, const mat4x4& screen,
const struct model * model, const struct object * object)
{
mat4x4 trans = screen * model_trans;
uint32_t base_color = 0xffff0000;
for (int i = 0; i < object->quadrilateral_count; i++) {
const union quadrilateral * quad = &object->quadrilateral[i];
vec3 a = trans * model->position[quad->v[0].position];
vec3 b = trans * model->position[quad->v[1].position];
vec3 c = trans * model->position[quad->v[2].position];
vec3 d = trans * model->position[quad->v[3].position];
render_quad_type_0(writer,
screen_transform(a),
screen_transform(b),
screen_transform(c),
screen_transform(d),
base_color);
}
}
void transfer_scene(ta_parameter_writer& writer)
{
const float deg = 0.017453292519943295 / 4;
static float theta = deg;
const mat4x4 screen = screen_rotation(theta);
theta += deg;
int frame_ix0 = animation_tick / ticks_per_animation_frame;
int frame_ix1 = frame_ix0 + 1;
if (frame_ix1 >= animation_frames)
frame_ix1 = 0;
float scale = 2.0f;
float translate = 0.f;
const mat4x4 model_trans = {
scale, 0, 0, 0,
0, scale, 0, 0,
0, 0, -scale, translate,
0, 0, 0, 1,
};
// opaque
{
global_polygon_type_1(writer, texture_memory_alloc.texture.start,
para_control::list_type::opaque,
isp_tsp_instruction_word::culling_mode::cull_if_negative,
{1, 1, 1});
const struct model * model = &bear_model;
const struct object * object0 = bear_object[frame_ix0 * 2];
const struct object * object1 = bear_object[frame_ix1 * 2];
render_object_intensity(writer, model_trans, screen, model, object0, object1);
}
{
global_polygon_type_1(writer, texture_memory_alloc.texture.start,
para_control::list_type::opaque,
isp_tsp_instruction_word::culling_mode::cull_if_negative,
{0, 0, 0});
const struct model * model = &bear_model;
const struct object * object0 = bear_object[(frame_ix0 * 2) + 1];
const struct object * object1 = bear_object[(frame_ix1 * 2) + 1];
render_object_intensity(writer, model_trans, screen, model, object0, object1);
}
// end of opaque list
writer.append<ta_global_parameter::end_of_list>() =
ta_global_parameter::end_of_list(para_control::para_type::end_of_list);
// increment tick
animation_tick += 1;
if (animation_tick >= animation_frames * ticks_per_animation_frame)
animation_tick = 0;
}
void transfer_ta_fifo_texture_memory_32byte(void * dst, void * src, int length)
{
uint32_t out_addr = (uint32_t)dst;
sh7091.CCN.QACR0 = ((reinterpret_cast<uint32_t>(out_addr) >> 24) & 0b11100);
sh7091.CCN.QACR1 = ((reinterpret_cast<uint32_t>(out_addr) >> 24) & 0b11100);
volatile uint32_t * base = &store_queue[(out_addr & 0x03ffffc0) / 4];
uint32_t * src32 = reinterpret_cast<uint32_t *>(src);
length = (length + 31) & ~31; // round up to nearest multiple of 32
while (length > 0) {
base[0] = src32[0];
base[1] = src32[1];
base[2] = src32[2];
base[3] = src32[3];
base[4] = src32[4];
base[5] = src32[5];
base[6] = src32[6];
base[7] = src32[7];
asm volatile ("pref @%0"
: // output
: "r" (&base[0]) // input
: "memory");
length -= 32;
base += 8;
src32 += 8;
}
}
void transfer_textures()
{
system.LMMODE0 = 0; // 64-bit address space
system.LMMODE1 = 0; // 64-bit address space
{
uint32_t offset = texture_memory_alloc.texture.start;
void * dst = reinterpret_cast<void *>(&ta_fifo_texture_memory[offset / 4]);
void * src = reinterpret_cast<void *>(&_binary_model_bear_bear_data_start);
uint32_t size = reinterpret_cast<uint32_t>(&_binary_model_bear_bear_data_size);
transfer_ta_fifo_texture_memory_32byte(dst, src, size);
}
}
uint8_t __attribute__((aligned(32))) ta_parameter_buf[1024 * 1024];
void main()
{
serial::init(0);
serial::integer<uint32_t>((sizeof (bear_position)) / (sizeof (bear_position[0])));
interrupt_init();
constexpr uint32_t ta_alloc = 0
| ta_alloc_ctrl::pt_opb::no_list
| ta_alloc_ctrl::tm_opb::no_list
| ta_alloc_ctrl::t_opb::no_list
| ta_alloc_ctrl::om_opb::no_list
| ta_alloc_ctrl::o_opb::_16x4byte;
constexpr int render_passes = 1;
constexpr struct opb_size opb_size[render_passes] = {
{
.opaque = 16 * 4,
.opaque_modifier = 0,
.translucent = 0,
.translucent_modifier = 0,
.punch_through = 0
}
};
holly.SOFTRESET = softreset::pipeline_soft_reset
| softreset::ta_soft_reset;
holly.SOFTRESET = 0;
core_init();
system.IML6NRM = istnrm::end_of_render_tsp;
const int framebuffer_width = 640;
const int framebuffer_height = 480;
const int tile_width = framebuffer_width / 32;
const int tile_height = framebuffer_height / 32;
for (int i = 0; i < 2; i++) {
region_array_multipass(tile_width,
tile_height,
opb_size,
render_passes,
texture_memory_alloc.region_array[i].start,
texture_memory_alloc.object_list[i].start);
background_parameter2(texture_memory_alloc.background[i].start,
0xff202040);
}
int ta = 0;
int core = 0;
ta_parameter_writer writer = ta_parameter_writer(ta_parameter_buf);
transfer_textures();
video_output::set_mode_vga();
while (1) {
ta_polygon_converter_init2(texture_memory_alloc.isp_tsp_parameters[ta].start,
texture_memory_alloc.isp_tsp_parameters[ta].end,
texture_memory_alloc.object_list[ta].start,
texture_memory_alloc.object_list[ta].end,
opb_size[0].total(),
ta_alloc,
tile_width,
tile_height);
writer.offset = 0;
transfer_scene(writer);
ta_polygon_converter_writeback(writer.buf, writer.offset);
ta_polygon_converter_transfer(writer.buf, writer.offset);
ta_wait_opaque_list();
render_done = 0;
core_start_render2(texture_memory_alloc.region_array[core].start,
texture_memory_alloc.isp_tsp_parameters[core].start,
texture_memory_alloc.background[core].start,
texture_memory_alloc.framebuffer[core].start,
framebuffer_width);
while (render_done == 0) {
asm volatile ("nop");
};
while (!spg_status::vsync(holly.SPG_STATUS));
holly.FB_R_SOF1 = texture_memory_alloc.framebuffer[ta].start;
while (spg_status::vsync(holly.SPG_STATUS));
}
}

View File

@ -936,8 +936,8 @@ MOAI_OBJ = \
example/moai.elf: LDSCRIPT = $(LIB)/main.lds
example/moai.elf: $(START_OBJ) $(MOAI_OBJ)
HAUNTED_MANSION_OBJ = \
example/haunted_mansion.o \
FEMALE_OBJ = \
example/female.o \
holly/core.o \
holly/region_array.o \
holly/background.o \
@ -947,19 +947,5 @@ HAUNTED_MANSION_OBJ = \
maple/maple.o \
$(LIBGCC)
example/haunted_mansion.elf: LDSCRIPT = $(LIB)/main.lds
example/haunted_mansion.elf: $(START_OBJ) $(HAUNTED_MANSION_OBJ)
BEAR_OBJ = \
example/bear.o \
holly/core.o \
holly/region_array.o \
holly/background.o \
holly/ta_fifo_polygon_converter.o \
holly/video_output.o \
sh7091/serial.o \
model/bear/bear.data.o \
$(LIBGCC)
example/bear.elf: LDSCRIPT = $(LIB)/main.lds
example/bear.elf: $(START_OBJ) $(BEAR_OBJ)
example/female.elf: LDSCRIPT = $(LIB)/main.lds
example/female.elf: $(START_OBJ) $(FEMALE_OBJ)

View File

@ -43,11 +43,11 @@ using vec4 = vec<4, float>;
using mat4x4 = mat<4, 4, float>;
#include "model/model.h"
#include "model/haunted_mansion/material.h"
#include "model/haunted_mansion/model_female.h"
#include "model/haunted_mansion/model_mansion.h"
#include "model/haunted_mansion/model_cone.h"
#include "model/haunted_mansion/model_cube.h"
#include "model/female/material.h"
#include "model/female/model.h"
#include "model/female/model_mansion.h"
#include "model/female/model_cone.h"
#include "model/female/model_cube.h"
void vbr100()
{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

View File

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

View File

@ -1,22 +0,0 @@
# Blender 4.3.2 MTL File: 'bear.blend'
# www.blender.org
newmtl matBear
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 1
newmtl matOutline
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.000000 0.000000 0.000000
Ks 0.000000 0.000000 0.000000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +0,0 @@
#pragma once
#include <stdint.h>
#include "model/material.h"
enum material {
bear_matBear,
bear_matOutline,
};
const struct material_descriptor bear_material[] = {
};

File diff suppressed because it is too large Load Diff