curr_quad_idx += 1;
}
-render_context_flush :: proc (use rc: ^RenderContext) {
+render_context_ui :: proc (use rc: ^RenderContext) {
+ quad_renderer_update_world(quad_renderer, 1.0f, 1.0f, 0.0f, 0.0f);
+ quad_rebuffer_data(quad_renderer);
+ quad_renderer_draw(quad_renderer, curr_quad_idx);
+
+ curr_quad_idx = 0;
+}
+
+render_context_transformation :: proc (use rc: ^RenderContext) {
quad_renderer_update_world(quad_renderer, scale, scale, trans_x, trans_y);
quad_rebuffer_data(quad_renderer);
quad_renderer_draw(quad_renderer, curr_quad_idx);
if input_state.mouse.wheel_ups > ~~0 do renderer.scale *= 1.125f;
if input_state.mouse.wheel_downs > ~~0 do renderer.scale /= 1.125f;
- curr_tile := tilemap_screen_coord_to_tile(^tilemap, V2f.{ ~~input_state.mouse.x, ~~input_state.mouse.y });
- if curr_tile != null {
- v := cast(i32) curr_tile.r;
- if v < 200 do v += 20;
-
- curr_tile.r = ~~v;
- curr_tile.g = ~~v;
- curr_tile.b = ~~v;
+ if input_state.mouse.buttons_down[0] {
+ renderer.trans_x += ~~input_state.mouse.dx / renderer.scale;
+ renderer.trans_y += ~~input_state.mouse.dy / renderer.scale;
}
if simulating {
}
for ^tile: tilemap.tiles {
- if tile.r >= ~~1 do tile.r -= ~~1; else do tile.r = ~~0;
- if tile.g >= ~~1 do tile.g -= ~~1; else do tile.g = ~~0;
- if tile.b >= ~~1 do tile.b -= ~~1; else do tile.b = ~~0;
+ if tile.r < ~~255 do tile.r += ~~1; else do tile.r = ~~255;
+ if tile.g < ~~255 do tile.g += ~~1; else do tile.g = ~~255;
+ if tile.b < ~~255 do tile.b += ~~1; else do tile.b = ~~255;
}
}
+
draw :: proc () {
gl.clearColor(0.1f, 0.1f, 0.1f, 1.0f);
gl.clear(gl.COLOR_BUFFER_BIT);
+ // World Rendering
texture_use(^textures.tilemap);
tilemap_draw(^tilemap, ^renderer);
dude_sprite.x, dude_sprite.y,
dude_sprite.w, dude_sprite.h);
}
+ render_context_transformation(^renderer);
+ // UI Rendering
renderer.color = Color4f32.{ 0.0f, 0.0f, 0.0f, 1.0f };
draw_rect(^renderer, ~~input_state.mouse.x, ~~input_state.mouse.y, 10f, 10f);
- render_context_flush(^renderer);
+ render_context_ui(^renderer);
}
atlas = atlas_create(^textures.tilemap);
atlas_map(^atlas, 0, AtlasSprite.{ x = 16.0f, y = 0.0f, w = 16.0f, h = 16.0f });
+ atlas_map(^atlas, 1, AtlasSprite.{ x = 32.0f, y = 0.0f, w = 16.0f, h = 16.0f });
event.init();
input.init(^input_state);
Dude_Color_Table[2] = Color4f32.{ 0.2f, 0.2f, 1.0f, 1.0f };
array_init(^dudes);
- for i: 0 .. 2000 {
+ for i: 0 .. 500 {
array_push(^dudes, dude_create_random());
}
- tilemap_init(^tilemap, 202, 140);
+ tilemap_init(^tilemap, 250, 140);
game_launch :: proc () #foreign "game" "launch" ---;
game_launch();
target_g := cast(u8) cast(u32) (color.g * 255.0f);
target_b := cast(u8) cast(u32) (color.b * 255.0f);
- diff_r := cast(i32) (target_r - tile.r) >>> ~~2;
- diff_g := cast(i32) (target_g - tile.g) >>> ~~2;
- diff_b := cast(i32) (target_b - tile.b) >>> ~~2;
+ diff_r := cast(i32) (target_r - tile.r) >>> 2;
+ diff_g := cast(i32) (target_g - tile.g) >>> 2;
+ diff_b := cast(i32) (target_b - tile.b) >>> 2;
tile.r += ~~diff_r;
tile.g += ~~diff_g;
}
Tile :: struct {
- r : u8 = ~~0;
- g : u8 = ~~0;
- b : u8 = ~~0;
+ r : u8 = ~~255;
+ g : u8 = ~~255;
+ b : u8 = ~~255;
}
tilemap_init :: proc (use tm: ^Tilemap, w := 10, h := 10) {
height = h;
alloc_slice(^tiles, width * height);
+ printf("The tilemap takes up %i kibibytes.\n", (width * height * sizeof Tile) >> 10);
+
for ^t: tiles do *t = Tile.{};
}
}
tilemap_draw :: proc (use tm: ^Tilemap, renderer: ^RenderContext) {
- for y: 0 .. height do for x: 0 .. width {
- renderer.color = tile_to_color4f32(tiles[y * width + x]);
- draw_rect(renderer, ~~x * TILE_SIZE + origin.x, ~~y * TILE_SIZE + origin.y, TILE_SIZE, TILE_SIZE);
+ x_pos := origin.x;
+ y_pos := origin.y;
+
+ for y: 0 .. height {
+ for x: 0 .. width {
+ renderer.color = tile_to_color4f32(tiles[y * width + x]);
+
+ // SPEEDUP: Write an optimized version of draw_rect that can take a batch of changes all at once.
+ // This requires a lot of copying overhead.
+ draw_rect(renderer, x_pos, y_pos, TILE_SIZE, TILE_SIZE);
+
+ x_pos += ~~TILE_SIZE;
+ }
+
+ x_pos = origin.x;
+ y_pos += TILE_SIZE;
}
}
tilemap_screen_coord_to_tile :: proc (use tm: ^Tilemap, pos: V2f) -> ^Tile {
n := v2_sub(pos, origin);
- tx := cast(i32) (n.x / TILE_SIZE);
- ty := cast(i32) (n.y / TILE_SIZE);
+ tx := cast(i32) (n.x / ~~TILE_SIZE);
+ ty := cast(i32) (n.y / ~~TILE_SIZE);
if tx < 0 || ty < 0 || tx >= width || ty >= height do return null;
return ^tiles[tx + ty * width];
range /usr/share/onyx/core/builtin.onyx /^range :: struct {$/
readBuffer /usr/share/onyx/core/js/webgl.onyx /^readBuffer :: proc (src: GLenum) #foreign "gl" "readBuffer" ---$/
readPixels /usr/share/onyx/core/js/webgl.onyx /^readPixels :: proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: string) #foreign "gl" "readPixels" ---$/
-render_context_flush src/main.onyx /^render_context_flush :: proc (use rc: ^RenderContext) {$/
render_context_init src/main.onyx /^render_context_init :: proc (use rc: ^RenderContext, qr: ^QuadRenderer = null) {$/
+render_context_transformation src/main.onyx /^render_context_transformation :: proc (use rc: ^RenderContext) {$/
+render_context_ui src/main.onyx /^render_context_ui :: proc (use rc: ^RenderContext) {$/
renderbufferStorageMultisample /usr/share/onyx/core/js/webgl.onyx /^renderbufferStorageMultisample :: proc (target: GLenum, samples: GLsizei, internalforamt: GLenum, width: GLsizei, height: GLsizei) #foreign "gl" "renderbufferStorageMultisample" ---$/
renderer src/globals.onyx /^renderer : RenderContext$/
resize /usr/share/onyx/core/builtin.onyx /^resize :: proc (use a: Allocator, ptr: rawptr, size: u32) -> rawptr {$/