Texture the 3d rendering, fix image flip coordinate system 'problem'

main
parent 04d0719418
commit 86f2c544bf

BIN
art/art.blend (Stored with Git LFS)

Binary file not shown.

@ -18,6 +18,10 @@
{ {
filepath: "grunt_3.wav", filepath: "grunt_3.wav",
} }
@image gigatexture:
{
filepath: "exported_3d/gigatexture.png",
}
@image sword: @image sword:
{ {
filepath: "sword_of_nazareth.png", filepath: "sword_of_nazareth.png",

@ -890,7 +890,15 @@ SER_MAKE_FOR_TYPE(NPCPlayerStanding);
typedef struct typedef struct
{ {
Vec3 *vertices; Vec3 pos;
Vec2 uv; // CANNOT have struct padding
} Vertex;
SER_MAKE_FOR_TYPE(Vertex);
typedef struct
{
Vertex *vertices;
MD_u64 num_vertices; MD_u64 num_vertices;
sg_buffer loaded_buffer; sg_buffer loaded_buffer;
@ -913,10 +921,10 @@ Mesh load_mesh(MD_Arena *arena, MD_String8 binary_file, MD_String8 mesh_name)
ser_MD_u64(&ser, &out.num_vertices); ser_MD_u64(&ser, &out.num_vertices);
Log("Mesh %.*s has %llu vertices\n", MD_S8VArg(mesh_name), out.num_vertices); Log("Mesh %.*s has %llu vertices\n", MD_S8VArg(mesh_name), out.num_vertices);
out.vertices = MD_ArenaPush(arena, sizeof(Vec3) * out.num_vertices); out.vertices = MD_ArenaPush(arena, sizeof(*out.vertices) * out.num_vertices);
for(MD_u64 i = 0; i < out.num_vertices; i++) for(MD_u64 i = 0; i < out.num_vertices; i++)
{ {
ser_Vec3(&ser, &out.vertices[i]); ser_Vertex(&ser, &out.vertices[i]);
} }
assert(!ser.cur_error.failed); assert(!ser.cur_error.failed);
@ -925,7 +933,7 @@ Mesh load_mesh(MD_Arena *arena, MD_String8 binary_file, MD_String8 mesh_name)
out.loaded_buffer = sg_make_buffer(&(sg_buffer_desc) out.loaded_buffer = sg_make_buffer(&(sg_buffer_desc)
{ {
.usage = SG_USAGE_IMMUTABLE, .usage = SG_USAGE_IMMUTABLE,
.data = (sg_range){.ptr = out.vertices, .size = out.num_vertices * sizeof(Vec3)}, .data = (sg_range){.ptr = out.vertices, .size = out.num_vertices * sizeof(Vertex)},
.label = (const char*)nullterm(arena, MD_S8Fmt(arena, "%.*s-vertices", MD_S8VArg(mesh_name))).str, .label = (const char*)nullterm(arena, MD_S8Fmt(arena, "%.*s-vertices", MD_S8VArg(mesh_name))).str,
}); });
@ -2430,8 +2438,15 @@ void do_serialization_tests()
Mesh mesh_player = {0}; Mesh mesh_player = {0};
void stbi_flip_into_correct_direction(bool do_it)
{
if(do_it) stbi_set_flip_vertically_on_load(true);
}
void init(void) void init(void)
{ {
stbi_flip_into_correct_direction(true);
#ifdef WEB #ifdef WEB
EM_ASM( { EM_ASM( {
set_server_url(UTF8ToString($0)); set_server_url(UTF8ToString($0));
@ -2502,12 +2517,19 @@ void init(void)
stbtt_BakeFontBitmap(fontBuffer, 0, font_size, font_bitmap, 512, 512, 32, 96, cdata); stbtt_BakeFontBitmap(fontBuffer, 0, font_size, font_bitmap, 512, 512, 32, 96, cdata);
unsigned char *font_bitmap_rgba = malloc(4 * 512 * 512); // stack would be too big if allocated on stack (stack overflow) unsigned char *font_bitmap_rgba = malloc(4 * 512 * 512); // stack would be too big if allocated on stack (stack overflow)
for (int i = 0; i < 512 * 512; i++)
// also flip the image, because I think opengl or something I'm too tired
for(int row = 0; row < 512; row++)
{
for(int col = 0; col < 512; col++)
{ {
int i = row * 512 + col;
int flipped_i = (512 - row) * 512 + col;
font_bitmap_rgba[i*4 + 0] = 255; font_bitmap_rgba[i*4 + 0] = 255;
font_bitmap_rgba[i*4 + 1] = 255; font_bitmap_rgba[i*4 + 1] = 255;
font_bitmap_rgba[i*4 + 2] = 255; font_bitmap_rgba[i*4 + 2] = 255;
font_bitmap_rgba[i*4 + 3] = font_bitmap[i]; font_bitmap_rgba[i*4 + 3] = font_bitmap[flipped_i];
}
} }
image_font = sg_make_image(&(sg_image_desc) { image_font = sg_make_image(&(sg_image_desc) {
@ -2593,7 +2615,8 @@ void init(void)
.layout = { .layout = {
.attrs = .attrs =
{ {
[ATTR_threedee_vs_position].format = SG_VERTEXFORMAT_FLOAT3, [ATTR_threedee_vs_pos_in].format = SG_VERTEXFORMAT_FLOAT3,
[ATTR_threedee_vs_uv_in].format = SG_VERTEXFORMAT_FLOAT2,
} }
}, },
.colors[0].blend = (sg_blend_state) { // allow transparency .colors[0].blend = (sg_blend_state) { // allow transparency
@ -3290,9 +3313,11 @@ AABB draw_text(TextParams t)
AABB font_atlas_region = (AABB) AABB font_atlas_region = (AABB)
{ {
.upper_left = V2(q.s0, q.t0), .upper_left = V2(q.s0, 1.0f - q.t1),
.lower_right = V2(q.s1, q.t1), .lower_right = V2(q.s1, 1.0f - q.t0),
}; };
font_atlas_region.upper_left.y += 1.0f / 512.0f;
font_atlas_region.lower_right.y += 1.0f / 512.0f;
PROFILE_SCOPE("Scaling font atlas region to img font size") PROFILE_SCOPE("Scaling font atlas region to img font size")
{ {
font_atlas_region.upper_left.X *= image_font_size.X; font_atlas_region.upper_left.X *= image_font_size.X;
@ -4195,6 +4220,7 @@ void frame(void)
sg_apply_pipeline(state.threedee_pip); sg_apply_pipeline(state.threedee_pip);
state.threedee_bind.vertex_buffers[0] = mesh_player.loaded_buffer; state.threedee_bind.vertex_buffers[0] = mesh_player.loaded_buffer;
state.threedee_bind.fs_images[SLOT_threedee_tex] = image_gigatexture;
sg_apply_bindings(&state.threedee_bind); sg_apply_bindings(&state.threedee_bind);
Mat4 model = M4D(1.0f); Mat4 model = M4D(1.0f);
@ -6057,12 +6083,32 @@ void frame(void)
Vec2 region_size = SubV2(d.image_region.lower_right, d.image_region.upper_left); Vec2 region_size = SubV2(d.image_region.lower_right, d.image_region.upper_left);
assert(region_size.X > 0.0); assert(region_size.X > 0.0);
assert(region_size.Y > 0.0); assert(region_size.Y > 0.0);
//Vec2 lower_left = AddV2(d.image_region.upper_left, V2(0, region_size.y));
Vec2 tex_coords[4] = Vec2 tex_coords[4] =
{ {
AddV2(d.image_region.upper_left, V2(0.0, 0.0)), // upper left vertex, upper right vertex, lower right vertex, lower left vertex
/*
AddV2(lower_left, V2(0.0, region_size.y)),
AddV2(lower_left, V2(region_size.x, region_size.y)),
AddV2(lower_left, V2(region_size.x, 0.0 )),
AddV2(lower_left, V2(0.0 , 0.0 )),
*/
// This flips the image
AddV2(d.image_region.upper_left, V2(0.0, region_size.Y)),
AddV2(d.image_region.upper_left, V2(region_size.X, region_size.Y)),
AddV2(d.image_region.upper_left, V2(region_size.X, 0.0)), AddV2(d.image_region.upper_left, V2(region_size.X, 0.0)),
AddV2(d.image_region.upper_left, V2(0.0, 0.0)),
/*
AddV2(d.image_region.upper_left, V2(region_size.X, region_size.Y)), AddV2(d.image_region.upper_left, V2(region_size.X, region_size.Y)),
AddV2(d.image_region.upper_left, V2(0.0, region_size.Y)), AddV2(d.image_region.upper_left, V2(0.0, region_size.Y)),
AddV2(d.image_region.upper_left, V2(0.0, 0.0)),
AddV2(d.image_region.upper_left, V2(region_size.X, 0.0)),
*/
}; };
// convert to uv space // convert to uv space

@ -30,6 +30,7 @@ copy "rpgpt_private_assets\knight_run_start.png" "assets\copyrighted\knight_run_
rmdir /S /q "assets\exported_3d" rmdir /S /q "assets\exported_3d"
mkdir "assets\exported_3d" || goto :error mkdir "assets\exported_3d" || goto :error
copy "art\exported\*" "assets\exported_3d\" || goto :error copy "art\exported\*" "assets\exported_3d\" || goto :error
copy "art\gigatexture.png" "assets\exported_3d\gigatexture.png" || goto :error
@echo off @echo off
rmdir /S /q gen rmdir /S /q gen

@ -1,8 +1,10 @@
@module threedee @module threedee
@vs vs @vs vs
in vec3 position; in vec3 pos_in;
in vec2 uv_in;
out vec3 pos; out vec3 pos;
out vec2 uv;
uniform vs_params { uniform vs_params {
mat4 model; mat4 model;
@ -11,17 +13,20 @@ uniform vs_params {
}; };
void main() { void main() {
pos = position; pos = pos_in;
gl_Position = projection * view * model * vec4(position, 1.0); uv = uv_in;
gl_Position = projection * view * model * vec4(pos_in, 1.0);
} }
@end @end
@fs fs @fs fs
uniform sampler2D tex;
in vec3 pos; in vec3 pos;
in vec2 uv;
out vec4 frag_color; out vec4 frag_color;
void main() { void main() {
frag_color = vec4(pos, 1.0); frag_color = vec4(texture(tex, uv).rgb, 1.0);
} }
@end @end

Loading…
Cancel
Save