Rendering improvements and partial cleanup
parent
3183bef67c
commit
4a76692826
|
@ -92,10 +92,11 @@ partition_reduce(Partition *data, i32_4tech size){
|
|||
}
|
||||
}
|
||||
|
||||
inline void
|
||||
inline void*
|
||||
partition_align(Partition *data, u32_4tech boundary){
|
||||
--boundary;
|
||||
data->pos = (data->pos + boundary) & (~boundary);
|
||||
return(data->base + data->pos);
|
||||
}
|
||||
|
||||
inline void*
|
||||
|
@ -121,6 +122,7 @@ partition_sub_part(Partition *data, i32_4tech size){
|
|||
#define push_struct(part, T) (T*)partition_allocate(part, sizeof(T))
|
||||
#define push_array(part, T, size) (T*)partition_allocate(part, sizeof(T)*(size))
|
||||
#define push_block(part, size) partition_allocate(part, size)
|
||||
#define push_align(part, b) partition_align(part, b)
|
||||
|
||||
inline Temp_Memory
|
||||
begin_temp_memory(Partition *data){
|
||||
|
|
14
4ed.cpp
14
4ed.cpp
|
@ -2312,14 +2312,6 @@ App_Step_Sig(app_step){
|
|||
{
|
||||
begin_render_section(target, system);
|
||||
|
||||
target->clip_top = -1;
|
||||
i32_Rect target_rect = {0};
|
||||
target_rect.x0 = 0;
|
||||
target_rect.y0 = 0;
|
||||
target_rect.x1 = target->width;
|
||||
target_rect.y1 = target->height;
|
||||
draw_push_clip(target, target_rect);
|
||||
|
||||
Command_Data *command = cmd;
|
||||
USE_PANEL(active_panel);
|
||||
USE_VIEW(active_view);
|
||||
|
@ -2338,8 +2330,6 @@ App_Step_Sig(app_step){
|
|||
u32 back_color = style->main.back_color;
|
||||
draw_rectangle(target, full, back_color);
|
||||
|
||||
draw_push_clip(target, panel->inner);
|
||||
|
||||
b32 file_scroll = false;
|
||||
GUI_Scroll_Vars scroll_zero = {0};
|
||||
GUI_Scroll_Vars *scroll_vars = &view->gui_scroll;
|
||||
|
@ -2353,9 +2343,7 @@ App_Step_Sig(app_step){
|
|||
}
|
||||
}
|
||||
|
||||
do_render_file_view(system, view, models, scroll_vars, active_view, panel->inner, active, target, &dead_input);
|
||||
|
||||
draw_pop_clip(target);
|
||||
do_render_file_view(system, view, models, scroll_vars, active_view, panel->inner, active, target, &dead_input);
|
||||
|
||||
u32 margin_color;
|
||||
if (active){
|
||||
|
|
|
@ -12,7 +12,8 @@
|
|||
#if !defined(FRED_CURSOR_CODES_H)
|
||||
#define FRED_CURSOR_CODES_H
|
||||
|
||||
typedef enum Application_Mouse_Cursor{
|
||||
typedef i32 Application_Mouse_Cursor;
|
||||
enum{
|
||||
APP_MOUSE_CURSOR_DEFAULT,
|
||||
APP_MOUSE_CURSOR_ARROW,
|
||||
APP_MOUSE_CURSOR_IBEAM,
|
||||
|
@ -20,7 +21,7 @@ typedef enum Application_Mouse_Cursor{
|
|||
APP_MOUSE_CURSOR_UPDOWN,
|
||||
// never below this
|
||||
APP_MOUSE_CURSOR_COUNT
|
||||
} Application_Mouse_Cursor;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -22,13 +22,12 @@ draw_pop_clip(Render_Target *target){
|
|||
|
||||
inline void
|
||||
draw_change_clip(Render_Target *target, i32_Rect clip_box){
|
||||
render_pop_clip(target);
|
||||
render_push_clip(target, clip_box);
|
||||
render_change_clip(target, clip_box);
|
||||
}
|
||||
|
||||
internal void
|
||||
begin_render_section(Render_Target *target, System_Functions *system){
|
||||
target->size = 0;
|
||||
target->buffer.pos = 0;
|
||||
target->clip_top = -1;
|
||||
|
||||
i32_Rect clip;
|
||||
|
@ -44,31 +43,31 @@ end_render_section(Render_Target *target, System_Functions *system){
|
|||
Assert(target->clip_top == 0);
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_rectangle(Render_Target *target, i32_Rect rect, u32 color){
|
||||
Render_Piece_Combined piece;
|
||||
piece.header.type = piece_type_rectangle;
|
||||
piece.rectangle.rect = f32R(rect);
|
||||
piece.rectangle.color = color;
|
||||
render_push_piece(target, piece);
|
||||
}
|
||||
#define CmdHeader(t) cmd.header.size = sizeof(cmd), cmd.header.type = t
|
||||
|
||||
internal void
|
||||
draw_rectangle(Render_Target *target, f32_Rect rect, u32 color){
|
||||
Render_Piece_Combined piece;
|
||||
piece.header.type = piece_type_rectangle;
|
||||
piece.rectangle.rect = rect;
|
||||
piece.rectangle.color = color;
|
||||
render_push_piece(target, piece);
|
||||
Render_Command_Rectangle cmd = {0};
|
||||
CmdHeader(RenCom_Rectangle);
|
||||
cmd.rect = rect;
|
||||
cmd.color = color;
|
||||
void *h = render_begin_push(target, &cmd, cmd.header.size);
|
||||
render_end_push(target, h);
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_rectangle(Render_Target *target, i32_Rect rect, u32 color){
|
||||
draw_rectangle(target, f32R(rect), color);
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_rectangle_outline(Render_Target *target, f32_Rect rect, u32 color){
|
||||
Render_Piece_Combined piece;
|
||||
piece.header.type = piece_type_outline;
|
||||
piece.rectangle.rect = rect;
|
||||
piece.rectangle.color = color;
|
||||
render_push_piece(target, piece);
|
||||
Render_Command_Rectangle cmd = {0};
|
||||
CmdHeader(RenCom_Outline);
|
||||
cmd.rect = rect;
|
||||
cmd.color = color;
|
||||
void *h = render_begin_push(target, &cmd, cmd.header.size);
|
||||
render_end_push(target, h);
|
||||
}
|
||||
|
||||
inline void
|
||||
|
@ -90,25 +89,21 @@ draw_margin(Render_Target *target, i32_Rect outer, i32 width, u32 color){
|
|||
draw_margin(target, outer, inner, color);
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_font_glyph(Render_Target *target, Font_ID font_id, i32 type, u32 codepoint, f32 x, f32 y, u32 color){
|
||||
Render_Piece_Combined piece;
|
||||
piece.header.type = type;
|
||||
piece.glyph.pos.x = x;
|
||||
piece.glyph.pos.y = y;
|
||||
piece.glyph.color = color;
|
||||
piece.glyph.font_id = font_id;
|
||||
piece.glyph.codepoint = codepoint;
|
||||
render_push_piece(target, piece);
|
||||
}
|
||||
|
||||
internal void
|
||||
draw_font_glyph(Render_Target *target, Font_ID font_id, u32 codepoint, f32 x, f32 y, u32 color){
|
||||
draw_font_glyph(target, font_id, piece_type_glyph, codepoint, x, y, color);
|
||||
Render_Command_Glyph cmd;
|
||||
CmdHeader(RenCom_Glyph);
|
||||
cmd.pos.x = x;
|
||||
cmd.pos.y = y;
|
||||
cmd.color = color;
|
||||
cmd.font_id = font_id;
|
||||
cmd.codepoint = codepoint;
|
||||
void *h = render_begin_push(target, &cmd, cmd.header.size);
|
||||
render_end_push(target, h);
|
||||
}
|
||||
|
||||
internal f32
|
||||
draw_string_base(System_Functions *system, Render_Target *target, Font_ID font_id, i32 type, String str_, i32 x_, i32 y_, u32 color){
|
||||
draw_string_base(System_Functions *system, Render_Target *target, Font_ID font_id, String str_, i32 x_, i32 y_, u32 color){
|
||||
f32 x = 0;
|
||||
|
||||
Render_Font *font = system->font.get_render_data_by_id(font_id);
|
||||
|
@ -134,7 +129,7 @@ draw_string_base(System_Functions *system, Render_Target *target, Font_ID font_i
|
|||
if (behavior.do_codepoint_advance){
|
||||
u32 codepoint = step.value;
|
||||
if (color != 0){
|
||||
draw_font_glyph(target, font_id, type, codepoint, x, y, color);
|
||||
draw_font_glyph(target, font_id, codepoint, x, y, color);
|
||||
}
|
||||
x += font_get_glyph_advance(system, font, codepoint);
|
||||
}
|
||||
|
@ -147,7 +142,7 @@ draw_string_base(System_Functions *system, Render_Target *target, Font_ID font_i
|
|||
|
||||
f32 xx = x;
|
||||
for (u32 j = 0; j < 3; ++j){
|
||||
draw_font_glyph(target, font_id, type, cs[j], xx, y, color);
|
||||
draw_font_glyph(target, font_id, cs[j], xx, y, color);
|
||||
xx += sub_advances[j];
|
||||
}
|
||||
}
|
||||
|
@ -162,27 +157,27 @@ draw_string_base(System_Functions *system, Render_Target *target, Font_ID font_i
|
|||
|
||||
internal f32
|
||||
draw_string(System_Functions *system, Render_Target *target, Font_ID font_id, String str, i32 x, i32 y, u32 color){
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_glyph, str, x, y, color);
|
||||
f32 w = draw_string_base(system, target, font_id, str, x, y, color);
|
||||
return(w);
|
||||
}
|
||||
|
||||
internal f32
|
||||
draw_string(System_Functions *system, Render_Target *target, Font_ID font_id, char *str, i32 x, i32 y, u32 color){
|
||||
String string = make_string_slowly(str);
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_glyph, string, x, y, color);
|
||||
f32 w = draw_string_base(system, target, font_id, string, x, y, color);
|
||||
return(w);
|
||||
}
|
||||
|
||||
internal f32
|
||||
font_string_width(System_Functions *system, Render_Target *target, Font_ID font_id, String str){
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_glyph, str, 0, 0, 0);
|
||||
f32 w = draw_string_base(system, target, font_id, str, 0, 0, 0);
|
||||
return(w);
|
||||
}
|
||||
|
||||
internal f32
|
||||
font_string_width(System_Functions *system, Render_Target *target, Font_ID font_id, char *str){
|
||||
String string = make_string_slowly(str);
|
||||
f32 w = draw_string_base(system, target, font_id, piece_type_glyph, string, 0, 0, 0);
|
||||
f32 w = draw_string_base(system, target, font_id, string, 0, 0, 0);
|
||||
return(w);
|
||||
}
|
||||
|
||||
|
|
|
@ -9,56 +9,43 @@
|
|||
|
||||
// TOP
|
||||
|
||||
enum Render_Piece_Type{
|
||||
piece_type_rectangle,
|
||||
piece_type_outline,
|
||||
piece_type_glyph,
|
||||
piece_type_change_clip
|
||||
enum Render_Command_Type{
|
||||
RenCom_Rectangle,
|
||||
RenCom_Outline,
|
||||
RenCom_Glyph,
|
||||
RenCom_ChangeClip
|
||||
};
|
||||
|
||||
struct Render_Piece_Header{
|
||||
struct Render_Command_Header{
|
||||
i32 size;
|
||||
i32 type;
|
||||
};
|
||||
|
||||
struct Render_Piece_Rectangle{
|
||||
struct Render_Command_Rectangle{
|
||||
Render_Command_Header header;
|
||||
f32_Rect rect;
|
||||
u32 color;
|
||||
};
|
||||
|
||||
struct Render_Piece_Gradient{
|
||||
struct Render_Command_Gradient{
|
||||
Render_Command_Header header;
|
||||
f32_Rect rect;
|
||||
u32 left_color;
|
||||
u32 right_color;
|
||||
};
|
||||
|
||||
struct Render_Piece_Glyph{
|
||||
struct Render_Command_Glyph{
|
||||
Render_Command_Header header;
|
||||
Vec2 pos;
|
||||
u32 color;
|
||||
Font_ID font_id;
|
||||
u32 codepoint;
|
||||
};
|
||||
|
||||
struct Render_Piece_Glyph_Advance{
|
||||
Vec2 pos;
|
||||
u32 color;
|
||||
f32 advance;
|
||||
Font_ID font_id;
|
||||
u32 codepoint;
|
||||
};
|
||||
|
||||
struct Render_Piece_Change_Clip{
|
||||
struct Render_Command_Change_Clip{
|
||||
Render_Command_Header header;
|
||||
i32_Rect box;
|
||||
};
|
||||
|
||||
struct Render_Piece_Combined{
|
||||
Render_Piece_Header header;
|
||||
union{
|
||||
Render_Piece_Rectangle rectangle;
|
||||
Render_Piece_Gradient gradient;
|
||||
Render_Piece_Glyph glyph;
|
||||
Render_Piece_Glyph_Advance glyph_advance;
|
||||
};
|
||||
};
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
|
|
@ -9,64 +9,86 @@
|
|||
|
||||
// TOP
|
||||
|
||||
#define Render_Push_Clip_Sig(n, t, c) void (n)(Render_Target *t, i32_Rect c)
|
||||
#define Render_Pop_Clip_Sig(n, t) i32_Rect (n)(Render_Target *t)
|
||||
#define Render_Push_Piece_Sig(n, t, p) void (n)(Render_Target *t, Render_Piece_Combined p)
|
||||
#define Render_Begin_Push_Sig(n,t,p,s) void* (n)(Render_Target *t, void *p, i32 s)
|
||||
#define Render_End_Push_Sig(n,t,h) void (n)(Render_Target *t, void *h)
|
||||
#define Render_Change_Clip_Sig(n,t,c) void (n)(Render_Target *t, i32_Rect c)
|
||||
#define Render_Push_Clip_Sig(n,t,c) void (n)(Render_Target *t, i32_Rect c)
|
||||
#define Render_Pop_Clip_Sig(n,t) i32_Rect (n)(Render_Target *t)
|
||||
|
||||
inline void
|
||||
draw_safe_push(Render_Target *t, i32 size, void *x){
|
||||
if (size + t->size <= t->max){
|
||||
memcpy(t->push_buffer + t->size, x, size);
|
||||
t->size += size;
|
||||
////////////////////////////////
|
||||
|
||||
internal
|
||||
Render_Begin_Push_Sig(render_internal_begin_push, t, ptr, size){
|
||||
void *out = push_array(&t->buffer, u8, size);
|
||||
if (out != 0){
|
||||
memcpy(out, ptr, size);
|
||||
}
|
||||
|
||||
// TODO(allen): Application side logging.
|
||||
#if 0
|
||||
else{
|
||||
LOG("Render command buffer out of memory!\n");
|
||||
}
|
||||
#endif
|
||||
return(out);
|
||||
}
|
||||
|
||||
#define PutStruct(s,x) draw_safe_push(t, sizeof(s), &x)
|
||||
|
||||
internal
|
||||
Render_Push_Piece_Sig(render_push_piece, t, piece){
|
||||
if (!t->clip_all){
|
||||
PutStruct(Render_Piece_Header, piece.header);
|
||||
|
||||
switch (piece.header.type){
|
||||
case piece_type_rectangle: case piece_type_outline:
|
||||
{
|
||||
PutStruct(Render_Piece_Rectangle, piece.rectangle);
|
||||
}break;
|
||||
|
||||
case piece_type_glyph:
|
||||
{
|
||||
PutStruct(Render_Piece_Glyph, piece.glyph);
|
||||
}break;
|
||||
}
|
||||
|
||||
Assert(t->size <= t->max);
|
||||
internal
|
||||
Render_End_Push_Sig(render_internal_end_push, t, h){
|
||||
if (h != 0){
|
||||
u8 *end_ptr = (u8*)push_align(&t->buffer, 8);
|
||||
Render_Command_Header *header = (Render_Command_Header*)h;
|
||||
header->size = (i32)(end_ptr - (u8*)h);
|
||||
}
|
||||
// TODO(allen): else { LOG }
|
||||
}
|
||||
|
||||
internal void
|
||||
render_push_piece_clip(Render_Target *t, i32_Rect clip_box){
|
||||
if (!t->clip_all){
|
||||
// TODO(allen): optimize out if there are two clip box changes in a row
|
||||
Render_Piece_Change_Clip clip = {0};
|
||||
Render_Piece_Header header = {0};
|
||||
|
||||
header.type = piece_type_change_clip;
|
||||
clip.box = clip_box;
|
||||
|
||||
PutStruct(Render_Piece_Header, header);
|
||||
PutStruct(Render_Piece_Change_Clip, clip);
|
||||
render_internal_push_clip(Render_Target *t, i32_Rect clip_box){
|
||||
t->clip_all = (clip_box.x0 >= clip_box.x1 || clip_box.y0 >= clip_box.y1);
|
||||
if (t->clip_all){
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO(allen): If the previous command was also a push clip should
|
||||
// undo that one and just do this one. (OPTIMIZATION).
|
||||
Render_Command_Change_Clip cmd = {0};
|
||||
cmd.header.size = sizeof(cmd);
|
||||
cmd.header.type = RenCom_ChangeClip;
|
||||
cmd.box = clip_box;
|
||||
void *h = render_internal_begin_push(t, &cmd, cmd.header.size);
|
||||
render_internal_end_push(t, h);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
internal
|
||||
Render_Begin_Push_Sig(render_begin_push, t, ptr, size){
|
||||
void *out = 0;
|
||||
if (!t->clip_all){
|
||||
out = render_internal_begin_push(t, ptr, size);
|
||||
}
|
||||
return(out);
|
||||
}
|
||||
|
||||
internal
|
||||
Render_End_Push_Sig(render_end_push, t, h){
|
||||
render_internal_end_push(t, h);
|
||||
}
|
||||
|
||||
internal
|
||||
Render_Change_Clip_Sig(render_change_clip, t, clip_box){
|
||||
Assert(t->clip_top > -1);
|
||||
t->clip_boxes[t->clip_top] = clip_box;
|
||||
render_internal_push_clip(t, clip_box);
|
||||
}
|
||||
|
||||
internal
|
||||
Render_Push_Clip_Sig(render_push_clip, t, clip_box){
|
||||
Assert(t->clip_top == -1 || fits_inside(clip_box, t->clip_boxes[t->clip_top]));
|
||||
Assert(t->clip_top+1 < ArrayCount(t->clip_boxes));
|
||||
Assert(t->clip_top + 1 < ArrayCount(t->clip_boxes));
|
||||
t->clip_boxes[++t->clip_top] = clip_box;
|
||||
|
||||
t->clip_all = (clip_box.x0 >= clip_box.x1 || clip_box.y0 >= clip_box.y1);
|
||||
render_push_piece_clip(t, clip_box);
|
||||
render_internal_push_clip(t, clip_box);
|
||||
}
|
||||
|
||||
internal
|
||||
|
@ -75,10 +97,7 @@ Render_Pop_Clip_Sig(render_pop_clip, t){
|
|||
i32_Rect result = t->clip_boxes[t->clip_top];
|
||||
--t->clip_top;
|
||||
i32_Rect clip_box = t->clip_boxes[t->clip_top];
|
||||
|
||||
t->clip_all = (clip_box.x0 >= clip_box.x1 || clip_box.y0 >= clip_box.y1);
|
||||
render_push_piece_clip(t, clip_box);
|
||||
|
||||
render_internal_push_clip(t, clip_box);
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,9 +22,7 @@ struct Render_Target{
|
|||
i32 bound_texture;
|
||||
u32 color;
|
||||
|
||||
// TODO(allen): change this to a Partition
|
||||
char *push_buffer;
|
||||
i32 size, max;
|
||||
Partition buffer;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Mr. 4th Dimention - Allen Webster
|
||||
*
|
||||
* 10.11.2017
|
||||
*
|
||||
* OpenGL defines for 4coder
|
||||
*
|
||||
*/
|
||||
|
||||
// TOP
|
||||
|
||||
#if !defined(FRED_OPENGL_DEFINES_H)
|
||||
#define FRED_OPENGL_DEFINES_H
|
||||
|
||||
#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
|
||||
#define GL_DEBUG_OUTPUT 0x92E0
|
||||
|
||||
#endif
|
||||
|
||||
// BOTTOM
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Mr. 4th Dimention - Allen Webster
|
||||
*
|
||||
* 10.11.2017
|
||||
*
|
||||
* OpenGL functions for 4coder
|
||||
*
|
||||
*/
|
||||
|
||||
// TOP
|
||||
/* Usage:
|
||||
#define GL_FUNC(N,R,P) ~~~~
|
||||
#include "4ed_opengl_funcs.h"
|
||||
*/
|
||||
|
||||
#undef GL_FUNC
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
||||
|
|
@ -9,12 +9,13 @@
|
|||
|
||||
// TOP
|
||||
|
||||
#define ExtractStruct(s) ((s*)cursor); cursor += sizeof(s)
|
||||
// TODO(allen): If we don't actually need this then burn down 4ed_opengl_funcs.h
|
||||
// Declare function types and function pointers
|
||||
//#define GL_FUNC(N,R,P) typedef R (N##_Function) P; N##_Function *P = 0;
|
||||
//#include "4ed_opengl_funcs.h"
|
||||
#include "4ed_opengl_defines.h"
|
||||
|
||||
inline void
|
||||
private_draw_set_clip(Render_Target *t, i32_Rect clip_box){
|
||||
glScissor(clip_box.x0, t->height - clip_box.y1, clip_box.x1 - clip_box.x0, clip_box.y1 - clip_box.y0);
|
||||
}
|
||||
// OpenGL 2.1 implementation
|
||||
|
||||
inline void
|
||||
private_draw_bind_texture(Render_Target *t, i32 texid){
|
||||
|
@ -33,106 +34,27 @@ private_draw_set_color(Render_Target *t, u32 color){
|
|||
}
|
||||
}
|
||||
|
||||
inline void
|
||||
private_draw_rectangle(Render_Target *t, f32_Rect rect, u32 color){
|
||||
private_draw_set_color(t, color);
|
||||
private_draw_bind_texture(t, 0);
|
||||
glBegin(GL_QUADS);
|
||||
{
|
||||
glVertex2f(rect.x0, rect.y0);
|
||||
glVertex2f(rect.x0, rect.y1);
|
||||
glVertex2f(rect.x1, rect.y1);
|
||||
glVertex2f(rect.x1, rect.y0);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
inline void
|
||||
private_draw_rectangle_outline(Render_Target *t, f32_Rect rect, u32 color){
|
||||
f32_Rect r = get_inner_rect(rect, .5f);
|
||||
private_draw_set_color(t, color);
|
||||
private_draw_bind_texture(t, 0);
|
||||
glBegin(GL_LINE_STRIP);
|
||||
{
|
||||
glVertex2f(r.x0, r.y0);
|
||||
glVertex2f(r.x1, r.y0);
|
||||
glVertex2f(r.x1, r.y1);
|
||||
glVertex2f(r.x0, r.y1);
|
||||
glVertex2f(r.x0, r.y0);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
struct Render_Quad{
|
||||
f32 x0, y0, x1, y1;
|
||||
f32 s0, t0, s1, t1;
|
||||
};
|
||||
|
||||
inline Render_Quad
|
||||
get_render_quad(Glyph_Bounds *b, i32 pw, i32 ph, float xpos, float ypos){
|
||||
Render_Quad q;
|
||||
|
||||
float ipw = 1.0f / pw, iph = 1.0f / ph;
|
||||
|
||||
q.x0 = xpos + b->xoff;
|
||||
q.y0 = ypos + b->yoff;
|
||||
q.x1 = xpos + b->xoff2;
|
||||
q.y1 = ypos + b->yoff2;
|
||||
|
||||
q.s0 = b->x0 * ipw;
|
||||
q.t0 = b->y0 * iph;
|
||||
q.s1 = b->x1 * ipw;
|
||||
q.t1 = b->y1 * iph;
|
||||
|
||||
return(q);
|
||||
}
|
||||
|
||||
inline void
|
||||
private_draw_glyph(System_Functions *system, Render_Target *t, Render_Font *font, u32 codepoint, f32 x, f32 y, u32 color){
|
||||
Glyph_Data glyph = font_get_glyph(system, font, codepoint);
|
||||
if (glyph.tex != 0){
|
||||
Render_Quad q = get_render_quad(&glyph.bounds, glyph.tex_width, glyph.tex_height, x, y);
|
||||
|
||||
private_draw_set_color(t, color);
|
||||
private_draw_bind_texture(t, glyph.tex);
|
||||
glBegin(GL_QUADS);
|
||||
{
|
||||
glTexCoord2f(q.s0, q.t1); glVertex2f(q.x0, q.y1);
|
||||
glTexCoord2f(q.s1, q.t1); glVertex2f(q.x1, q.y1);
|
||||
glTexCoord2f(q.s1, q.t0); glVertex2f(q.x1, q.y0);
|
||||
glTexCoord2f(q.s0, q.t0); glVertex2f(q.x0, q.y0);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
}
|
||||
|
||||
internal void CALL_CONVENTION
|
||||
opengl_debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char *message, const void *userParam){
|
||||
// TODO(allen): Fill this in with my preferred thingy.
|
||||
}
|
||||
|
||||
internal void
|
||||
interpret_render_buffer(System_Functions *system, Render_Target *t){
|
||||
local_persist b32 first_opengl_call = true;
|
||||
if (first_opengl_call){
|
||||
first_opengl_call = false;
|
||||
|
||||
// TODO(allen): Get logging working everywhere
|
||||
#if 0
|
||||
//TODO(inso): glGetStringi is required in core profile if the GL version is >= 3.0
|
||||
char *Vendor = (char *)glGetString(GL_VENDOR);
|
||||
char *Renderer = (char *)glGetString(GL_RENDERER);
|
||||
char *Version = (char *)glGetString(GL_VERSION);
|
||||
char *vendor = (char *)glGetString(GL_VENDOR);
|
||||
char *renderer = (char *)glGetString(GL_RENDERER);
|
||||
char *version = (char *)glGetString(GL_VERSION);
|
||||
|
||||
LOGF("GL_VENDOR: %s\n", Vendor);
|
||||
LOGF("GL_RENDERER: %s\n", Renderer);
|
||||
LOGF("GL_VERSION: %s\n", Version);
|
||||
#endif
|
||||
LOGF("GL_VENDOR: %s\n", vendor);
|
||||
LOGF("GL_RENDERER: %s\n", renderer);
|
||||
LOGF("GL_VERSION: %s\n", version);
|
||||
|
||||
// TODO(allen): Get this up and running for dev mode again.
|
||||
#if (defined(BUILD_X64) && 0) || (defined(BUILD_X86) && 0)
|
||||
// NOTE(casey): This slows down GL but puts error messages to
|
||||
// the debug console immediately whenever you do something wrong
|
||||
|
||||
void CALL_CONVENTION gl_dbg(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char *message, const void *userParam);
|
||||
|
||||
glDebugMessageCallback_type *glDebugMessageCallback =
|
||||
(glDebugMessageCallback_type *)win32_load_gl_always("glDebugMessageCallback", module);
|
||||
glDebugMessageControl_type *glDebugMessageControl =
|
||||
|
@ -152,39 +74,113 @@ interpret_render_buffer(System_Functions *system, Render_Target *t){
|
|||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
}
|
||||
|
||||
char *cursor = t->push_buffer;
|
||||
char *cursor_end = cursor + t->size;
|
||||
i32 width = t->width;
|
||||
i32 height = t->height;
|
||||
|
||||
for (; cursor < cursor_end;){
|
||||
Render_Piece_Header *header = ExtractStruct(Render_Piece_Header);
|
||||
glViewport(0, 0, width, height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, width, height, 0, -1, 1);
|
||||
glScissor(0, 0, width, height);
|
||||
glClearColor(1.f, 0.f, 1.f, 1.f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
t->bound_texture = 0;
|
||||
|
||||
glColor4f(0.f, 0.f, 0.f, 0.f);
|
||||
t->color = 0;
|
||||
|
||||
u8 *start = (u8*)t->buffer.base;
|
||||
u8 *end = (u8*)t->buffer.base + t->buffer.pos;
|
||||
Render_Command_Header *header = 0;
|
||||
for (u8 *p = start; p < end; p += header->size){
|
||||
header = (Render_Command_Header*)p;
|
||||
|
||||
i32 type = header->type;
|
||||
switch (type){
|
||||
case piece_type_rectangle:
|
||||
case RenCom_Rectangle:
|
||||
{
|
||||
Render_Piece_Rectangle *rectangle = ExtractStruct(Render_Piece_Rectangle);
|
||||
private_draw_rectangle(t, rectangle->rect, rectangle->color);
|
||||
Render_Command_Rectangle *rectangle = (Render_Command_Rectangle*)header;
|
||||
f32_Rect r = rectangle->rect;
|
||||
private_draw_set_color(t, rectangle->color);
|
||||
private_draw_bind_texture(t, 0);
|
||||
glBegin(GL_QUADS);
|
||||
{
|
||||
glVertex2f(r.x0, r.y0);
|
||||
glVertex2f(r.x0, r.y1);
|
||||
glVertex2f(r.x1, r.y1);
|
||||
glVertex2f(r.x1, r.y0);
|
||||
}
|
||||
glEnd();
|
||||
}break;
|
||||
|
||||
case piece_type_outline:
|
||||
case RenCom_Outline:
|
||||
{
|
||||
Render_Piece_Rectangle *rectangle = ExtractStruct(Render_Piece_Rectangle);
|
||||
private_draw_rectangle_outline(t, rectangle->rect, rectangle->color);
|
||||
Render_Command_Rectangle *rectangle = (Render_Command_Rectangle*)header;
|
||||
f32_Rect r = get_inner_rect(rectangle->rect, .5f);
|
||||
private_draw_set_color(t, rectangle->color);
|
||||
private_draw_bind_texture(t, 0);
|
||||
glBegin(GL_LINE_STRIP);
|
||||
{
|
||||
glVertex2f(r.x0, r.y0);
|
||||
glVertex2f(r.x1, r.y0);
|
||||
glVertex2f(r.x1, r.y1);
|
||||
glVertex2f(r.x0, r.y1);
|
||||
glVertex2f(r.x0, r.y0);
|
||||
}
|
||||
glEnd();
|
||||
}break;
|
||||
|
||||
case piece_type_glyph:
|
||||
case RenCom_Glyph:
|
||||
{
|
||||
Render_Piece_Glyph *glyph = ExtractStruct(Render_Piece_Glyph);
|
||||
|
||||
Render_Command_Glyph *glyph = (Render_Command_Glyph*)header;
|
||||
Render_Font *font = system->font.get_render_data_by_id(glyph->font_id);
|
||||
Assert(font != 0);
|
||||
private_draw_glyph(system, t, font, glyph->codepoint, glyph->pos.x, glyph->pos.y, glyph->color);
|
||||
if (font == 0){
|
||||
break;
|
||||
}
|
||||
|
||||
Glyph_Data g = font_get_glyph(system, font, glyph->codepoint);
|
||||
if (g.tex == 0){
|
||||
break;
|
||||
}
|
||||
|
||||
f32 x = glyph->pos.x;
|
||||
f32 y = glyph->pos.y;
|
||||
|
||||
f32_Rect xy = {0};
|
||||
xy.x0 = x + g.bounds.xoff;
|
||||
xy.y0 = y + g.bounds.yoff;
|
||||
xy.x1 = x + g.bounds.xoff2;
|
||||
xy.y1 = y + g.bounds.yoff2;
|
||||
|
||||
// TODO(allen): Why aren't these baked in???
|
||||
f32 unit_u = 1.f/g.tex_width;
|
||||
f32 unit_v = 1.f/g.tex_height;
|
||||
|
||||
f32_Rect uv = {0};
|
||||
uv.x0 = g.bounds.x0*unit_u;
|
||||
uv.y0 = g.bounds.y0*unit_v;
|
||||
uv.x1 = g.bounds.x1*unit_u;
|
||||
uv.y1 = g.bounds.y1*unit_v;
|
||||
|
||||
private_draw_set_color(t, glyph->color);
|
||||
private_draw_bind_texture(t, g.tex);
|
||||
glBegin(GL_QUADS);
|
||||
{
|
||||
glTexCoord2f(uv.x0, uv.y1); glVertex2f(xy.x0, xy.y1);
|
||||
glTexCoord2f(uv.x1, uv.y1); glVertex2f(xy.x1, xy.y1);
|
||||
glTexCoord2f(uv.x1, uv.y0); glVertex2f(xy.x1, xy.y0);
|
||||
glTexCoord2f(uv.x0, uv.y0); glVertex2f(xy.x0, xy.y0);
|
||||
}
|
||||
glEnd();
|
||||
}break;
|
||||
|
||||
case piece_type_change_clip:
|
||||
case RenCom_ChangeClip:
|
||||
{
|
||||
Render_Piece_Change_Clip *clip = ExtractStruct(Render_Piece_Change_Clip);
|
||||
private_draw_set_clip(t, clip->box);
|
||||
Render_Command_Change_Clip *clip = (Render_Command_Change_Clip*)header;
|
||||
i32_Rect box = clip->box;
|
||||
glScissor(box.x0, height - box.y1, box.x1 - box.x0, box.y1 - box.y0);
|
||||
}break;
|
||||
}
|
||||
}
|
|
@ -29,11 +29,12 @@ memory_init(){
|
|||
memory_vars.user_memory = system_memory_allocate_extended(0, memory_vars.user_memory_size);
|
||||
memory_vars.debug_memory_size = MB(512);
|
||||
memory_vars.debug_memory = system_memory_allocate_extended(0, memory_vars.debug_memory_size);
|
||||
target.max = MB(1);
|
||||
target.push_buffer = (char*)system_memory_allocate(target.max);
|
||||
|
||||
i32 render_memsize = MB(1);
|
||||
target.buffer = make_part(system_memory_allocate(render_memsize), render_memsize);
|
||||
|
||||
b32 alloc_success = true;
|
||||
if (memory_vars.vars_memory == 0 || memory_vars.target_memory == 0 || memory_vars.user_memory == 0 || target.push_buffer == 0){
|
||||
if (memory_vars.vars_memory == 0 || memory_vars.target_memory == 0 || memory_vars.user_memory == 0 || target.buffer.base == 0){
|
||||
alloc_success = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -447,7 +447,7 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
|||
|
||||
#include "4ed_font_data.h"
|
||||
#include "4ed_system_shared.cpp"
|
||||
#include "4ed_render_opengl.cpp"
|
||||
#include "opengl/4ed_opengl_render.cpp"
|
||||
|
||||
//
|
||||
// End of system funcs
|
||||
|
@ -460,12 +460,6 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
|||
internal void
|
||||
LinuxResizeTarget(i32 width, i32 height){
|
||||
if (width > 0 && height > 0){
|
||||
glViewport(0, 0, width, height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, width, height, 0, -1, 1);
|
||||
glScissor(0, 0, width, height);
|
||||
|
||||
target.width = width;
|
||||
target.height = height;
|
||||
}
|
||||
|
@ -1652,8 +1646,8 @@ main(int argc, char **argv){
|
|||
|
||||
system_schedule_step();
|
||||
|
||||
linuxvars.keep_running = 1;
|
||||
linuxvars.input.first_step = 1;
|
||||
linuxvars.keep_running = true;
|
||||
linuxvars.input.first_step = true;
|
||||
linuxvars.input.dt = (frame_useconds / 1000000.f);
|
||||
|
||||
for (;;){
|
||||
|
@ -1675,13 +1669,13 @@ main(int argc, char **argv){
|
|||
continue;
|
||||
}
|
||||
|
||||
b32 do_step = 0;
|
||||
b32 do_step = false;
|
||||
|
||||
for(int i = 0; i < num_events; ++i){
|
||||
for (int i = 0; i < num_events; ++i){
|
||||
int fd = events[i].data.u64 & UINT32_MAX;
|
||||
u64 type = events[i].data.u64 & ~fd;
|
||||
|
||||
switch(type){
|
||||
switch (type){
|
||||
case LINUX_4ED_EVENT_X11: {
|
||||
LinuxHandleX11Events();
|
||||
} break;
|
||||
|
@ -1696,7 +1690,7 @@ main(int argc, char **argv){
|
|||
do {
|
||||
ret = read(linuxvars.step_event_fd, &ev, 8);
|
||||
} while (ret != -1 || errno != EAGAIN);
|
||||
do_step = 1;
|
||||
do_step = true;
|
||||
} break;
|
||||
|
||||
case LINUX_4ED_EVENT_STEP_TIMER: {
|
||||
|
@ -1705,7 +1699,7 @@ main(int argc, char **argv){
|
|||
do {
|
||||
ret = read(linuxvars.step_timer_fd, &count, 8);
|
||||
} while (ret != -1 || errno != EAGAIN);
|
||||
do_step = 1;
|
||||
do_step = true;
|
||||
} break;
|
||||
|
||||
case LINUX_4ED_EVENT_CLI: {
|
||||
|
@ -1717,14 +1711,11 @@ main(int argc, char **argv){
|
|||
if (do_step){
|
||||
linuxvars.last_step = system_now_time();
|
||||
|
||||
// NOTE(allen): Frame Clipboard Input
|
||||
if (linuxvars.input.first_step || !linuxvars.has_xfixes){
|
||||
XConvertSelection(linuxvars.XDisplay, linuxvars.atom_CLIPBOARD, linuxvars.atom_UTF8_STRING, linuxvars.atom_CLIPBOARD, linuxvars.XWindow, CurrentTime);
|
||||
}
|
||||
|
||||
Application_Step_Result result = {};
|
||||
result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT;
|
||||
result.trying_to_kill = !linuxvars.keep_running;
|
||||
|
||||
if (linuxvars.new_clipboard){
|
||||
linuxvars.input.clipboard = linuxvars.clipboard_contents;
|
||||
linuxvars.new_clipboard = 0;
|
||||
|
@ -1732,29 +1723,26 @@ main(int argc, char **argv){
|
|||
linuxvars.input.clipboard = null_string;
|
||||
}
|
||||
|
||||
// NOTE(allen): Initialize result So the Core Doesn't Have to Fill Things it Doesn't Care About
|
||||
Application_Step_Result result = {0};
|
||||
result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT;
|
||||
result.trying_to_kill = !linuxvars.keep_running;
|
||||
|
||||
// HACK(allen): THIS SHIT IS FUCKED (happens on mac too)
|
||||
b32 keep_running = linuxvars.keep_running;
|
||||
|
||||
// NOTE(allen): Application Core Update
|
||||
app.step(&sysfunc, &target, &memory_vars, &linuxvars.input, &result);
|
||||
|
||||
// NOTE(allen): Finish the Loop
|
||||
if (result.perform_kill){
|
||||
break;
|
||||
} else if (!keep_running && !linuxvars.keep_running){
|
||||
}
|
||||
else if (!keep_running && !linuxvars.keep_running){
|
||||
linuxvars.keep_running = true;
|
||||
}
|
||||
|
||||
if (linuxvars.do_toggle){
|
||||
linux_toggle_fullscreen();
|
||||
linuxvars.do_toggle = false;
|
||||
}
|
||||
|
||||
if (result.animating){
|
||||
system_schedule_step();
|
||||
}
|
||||
|
||||
interpret_render_buffer(&sysfunc, &target);
|
||||
glXSwapBuffers(linuxvars.XDisplay, linuxvars.XWindow);
|
||||
|
||||
// NOTE(allen): Switch to New Cursor
|
||||
if (result.mouse_cursor_type != linuxvars.cursor && !linuxvars.input.mouse.l){
|
||||
Cursor c = xcursors[result.mouse_cursor_type];
|
||||
if (!linuxvars.hide_cursor){
|
||||
|
@ -1763,15 +1751,32 @@ main(int argc, char **argv){
|
|||
linuxvars.cursor = result.mouse_cursor_type;
|
||||
}
|
||||
|
||||
// NOTE(allen): Render
|
||||
interpret_render_buffer(&sysfunc, &target);
|
||||
glXSwapBuffers(linuxvars.XDisplay, linuxvars.XWindow);
|
||||
|
||||
// NOTE(allen): Toggle Full Screen
|
||||
if (linuxvars.do_toggle){
|
||||
linux_toggle_fullscreen();
|
||||
linuxvars.do_toggle = false;
|
||||
}
|
||||
|
||||
// NOTE(allen): Schedule Another Step if Needed
|
||||
if (result.animating){
|
||||
system_schedule_step();
|
||||
}
|
||||
|
||||
flush_thread_group(BACKGROUND_THREADS);
|
||||
|
||||
linuxvars.input.first_step = 0;
|
||||
// TODO(allen): CROSS REFERENCE WITH WIN32 "TIC898989"
|
||||
linuxvars.input.keys = null_key_input_data;
|
||||
linuxvars.input.mouse.press_l = 0;
|
||||
linuxvars.input.mouse.release_l = 0;
|
||||
linuxvars.input.mouse.press_r = 0;
|
||||
linuxvars.input.mouse.release_r = 0;
|
||||
linuxvars.input.mouse.wheel = 0;
|
||||
|
||||
linuxvars.input.first_step = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -312,7 +312,7 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
|||
|
||||
#include "4ed_font_data.h"
|
||||
#include "4ed_system_shared.cpp"
|
||||
#include "4ed_render_opengl.cpp"
|
||||
#include "opengl/4ed_opengl_render.cpp"
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
|
@ -336,12 +336,6 @@ osx_resize(int width, int height){
|
|||
osx_objc.width = width;
|
||||
osx_objc.height = height;
|
||||
|
||||
glViewport(0, 0, width, height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, width, height, 0, -1, 1);
|
||||
glScissor(0, 0, width, height);
|
||||
|
||||
target.width = width;
|
||||
target.height = height;
|
||||
|
||||
|
@ -490,15 +484,7 @@ osx_step(void){
|
|||
result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT;
|
||||
result.trying_to_kill = !osxvars.keep_running;
|
||||
|
||||
if (osx_objc.has_clipboard_item){
|
||||
//void *clipboard_data;
|
||||
//umem clipboard_size, clipboard_max;
|
||||
osxvars.input.clipboard = make_string(osx_objc.clipboard_data, (i32)osx_objc.clipboard_size);
|
||||
}
|
||||
else{
|
||||
osxvars.input.clipboard = null_string;
|
||||
}
|
||||
|
||||
// NOTE(allen): Prepare the Frame Input
|
||||
osxvars.input.dt = 1.f/60.f;
|
||||
if (osxvars.has_prev_time){
|
||||
u64 time_u = system_now_time();
|
||||
|
@ -511,6 +497,7 @@ osx_step(void){
|
|||
osxvars.prev_time_u = system_now_time();
|
||||
}
|
||||
|
||||
// TODO(allen): CROSS REFERENCE WITH WINDOWS SPECIAL CODE "TIC898989"
|
||||
Application_Step_Input frame_input = osxvars.input;
|
||||
osxvars.input.first_step = false;
|
||||
osxvars.input.keys = null_key_input_data;
|
||||
|
@ -520,14 +507,25 @@ osx_step(void){
|
|||
osxvars.input.mouse.release_r = false;
|
||||
osxvars.input.mouse.wheel = 0;
|
||||
|
||||
// NOTE(allen): Frame Clipboard Input
|
||||
if (osx_objc.has_clipboard_item){
|
||||
osxvars.input.clipboard = make_string(osx_objc.clipboard_data, (i32)osx_objc.clipboard_size);
|
||||
}
|
||||
else{
|
||||
osxvars.input.clipboard = null_string;
|
||||
}
|
||||
|
||||
// HACK(allen): Got this all messed up with respect to how everyone else (other OS layers) work
|
||||
osx_objc.do_toggle = false;
|
||||
osx_objc.full_screen = osx_is_fullscreen();
|
||||
|
||||
// HACK(allen): THIS SHIT IS FUCKED (happens on linux too)
|
||||
b32 keep_running = osxvars.keep_running;
|
||||
|
||||
// NOTE(allen): Application Core Update
|
||||
app.step(&sysfunc, &target, &memory_vars, &frame_input, &result);
|
||||
|
||||
// NOTE(allen): Finish the Loop
|
||||
if (result.perform_kill){
|
||||
osx_close_app();
|
||||
}
|
||||
|
@ -535,14 +533,20 @@ osx_step(void){
|
|||
osxvars.keep_running = true;
|
||||
}
|
||||
|
||||
// NOTE(allen): Switch to New Cursor
|
||||
osx_show_cursor(0, result.mouse_cursor_type);
|
||||
|
||||
// NOTE(allen): Render
|
||||
osx_begin_render();
|
||||
interpret_render_buffer(&sysfunc, &target);
|
||||
osx_end_render();
|
||||
|
||||
// NOTE(allen): Toggle Full Screen
|
||||
if (osx_objc.do_toggle){
|
||||
osx_toggle_fullscreen();
|
||||
}
|
||||
|
||||
osx_show_cursor(0, result.mouse_cursor_type);
|
||||
|
||||
interpret_render_buffer(&sysfunc, &target);
|
||||
|
||||
// NOTE(allen): Schedule Another Step if Needed
|
||||
if (result.animating || cli_count > 0){
|
||||
osx_schedule_step();
|
||||
}
|
||||
|
|
|
@ -186,11 +186,7 @@ static i32 did_update_for_clipboard = true;
|
|||
osx_objc.prev_clipboard_change_count = board.changeCount;
|
||||
}
|
||||
|
||||
CGLLockContext([[self openGLContext] CGLContextObj]);
|
||||
[[self openGLContext] makeCurrentContext];
|
||||
osx_step();
|
||||
[[self openGLContext] flushBuffer];
|
||||
CGLUnlockContext([[self openGLContext] CGLContextObj]);
|
||||
}
|
||||
}
|
||||
return kCVReturnSuccess;
|
||||
|
@ -289,15 +285,6 @@ static i32 did_update_for_clipboard = true;
|
|||
}
|
||||
@end
|
||||
|
||||
#if 0
|
||||
static
|
||||
DISPLINK_SIG(osx_display_link){
|
||||
My4coderView* view = (__bridge My4coderView*)context;
|
||||
CVReturn result = [view getFrame];
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
@implementation AppDelegate
|
||||
- (void)applicationDidFinishLaunching:(id)sender
|
||||
{
|
||||
|
@ -643,6 +630,18 @@ osx_show_cursor(i32 show, i32 cursor_type){
|
|||
My4coderView* view = 0;
|
||||
NSWindow* window = 0;
|
||||
|
||||
void
|
||||
osx_begin_render(){
|
||||
CGLLockContext([[view openGLContext] CGLContextObj]);
|
||||
[[view openGLContext] makeCurrentContext];
|
||||
}
|
||||
|
||||
void
|
||||
osx_end_render(){
|
||||
[[view openGLContext] flushBuffer];
|
||||
CGLUnlockContext([[view openGLContext] CGLContextObj]);
|
||||
}
|
||||
|
||||
void
|
||||
osx_schedule_step(void){
|
||||
[NSTimer scheduledTimerWithTimeInterval: 0.0
|
||||
|
|
|
@ -105,6 +105,12 @@ osx_get_file_change_event(char *buffer, i32 max, i32 *size);
|
|||
external void
|
||||
osx_show_cursor(i32 show_inc, i32 cursor_type);
|
||||
|
||||
void
|
||||
osx_begin_render();
|
||||
|
||||
void
|
||||
osx_end_render();
|
||||
|
||||
external void
|
||||
osx_schedule_step(void);
|
||||
|
||||
|
|
|
@ -488,7 +488,7 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
|||
|
||||
#include "4ed_font_data.h"
|
||||
#include "4ed_system_shared.cpp"
|
||||
#include "4ed_render_opengl.cpp"
|
||||
#include "opengl/4ed_opengl_render.cpp"
|
||||
|
||||
//
|
||||
// Helpers
|
||||
|
@ -533,12 +533,6 @@ Win32KeycodeInit(){
|
|||
internal void
|
||||
Win32Resize(i32 width, i32 height){
|
||||
if (width > 0 && height > 0){
|
||||
glViewport(0, 0, width, height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, width, height, 0, -1, 1);
|
||||
glScissor(0, 0, width, height);
|
||||
|
||||
target.width = width;
|
||||
target.height = height;
|
||||
}
|
||||
|
@ -1186,9 +1180,9 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
MSG msg;
|
||||
for (;keep_running;){
|
||||
// TODO(allen): Find a good way to wait on a pipe
|
||||
// without interfering with the reading process
|
||||
// Looks like we can ReadFile with a size of zero
|
||||
// in an IOCP for this effect.
|
||||
// without interfering with the reading process.
|
||||
// NOTE(allen): Looks like we can ReadFile with a
|
||||
// size of zero in an IOCP for this effect.
|
||||
if (!win32vars.first){
|
||||
system_release_lock(FRAME_LOCK);
|
||||
|
||||
|
@ -1274,6 +1268,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
system_acquire_lock(FRAME_LOCK);
|
||||
}
|
||||
|
||||
// NOTE(allen): Mouse Out of Window Detection
|
||||
POINT mouse_point;
|
||||
if (GetCursorPos(&mouse_point) &&
|
||||
ScreenToClient(win32vars.window_handle, &mouse_point)){
|
||||
|
@ -1293,40 +1288,28 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
}
|
||||
|
||||
if (!is_hit){
|
||||
win32vars.input_chunk.trans.out_of_window = 1;
|
||||
win32vars.input_chunk.trans.out_of_window = true;
|
||||
}
|
||||
|
||||
win32vars.input_chunk.pers.mouse_x = mouse_point.x;
|
||||
win32vars.input_chunk.pers.mouse_y = mouse_point.y;
|
||||
}
|
||||
else{
|
||||
win32vars.input_chunk.trans.out_of_window = 1;
|
||||
win32vars.input_chunk.trans.out_of_window = true;
|
||||
}
|
||||
|
||||
// NOTE(allen): Prepare the Frame Input
|
||||
|
||||
// TODO(allen): CROSS REFERENCE WITH LINUX SPECIAL CODE "TIC898989"
|
||||
Win32_Input_Chunk input_chunk = win32vars.input_chunk;
|
||||
win32vars.input_chunk.trans = null_input_chunk_transient;
|
||||
|
||||
input_chunk.pers.control_keys[MDFR_CAPS_INDEX] = GetKeyState(VK_CAPITAL) & 0x1;
|
||||
|
||||
win32vars.clipboard_contents = null_string;
|
||||
if (win32vars.clipboard_sequence != 0){
|
||||
DWORD new_number = GetClipboardSequenceNumber();
|
||||
if (new_number != win32vars.clipboard_sequence){
|
||||
win32vars.clipboard_sequence = new_number;
|
||||
if (win32vars.next_clipboard_is_self){
|
||||
win32vars.next_clipboard_is_self = 0;
|
||||
}
|
||||
else{
|
||||
win32_read_clipboard_contents();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Application_Step_Input input = {0};
|
||||
|
||||
input.first_step = win32vars.first;
|
||||
|
||||
// NOTE(allen): The expected dt given the frame limit in seconds.
|
||||
input.dt = frame_useconds / 1000000.f;
|
||||
|
||||
input.keys = input_chunk.trans.key_data;
|
||||
|
@ -1343,33 +1326,47 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
|
||||
input.mouse.wheel = input_chunk.trans.mouse_wheel;
|
||||
input.mouse.x = input_chunk.pers.mouse_x;
|
||||
|
||||
input.mouse.y = input_chunk.pers.mouse_y;
|
||||
|
||||
// NOTE(allen): Frame Clipboard Input
|
||||
win32vars.clipboard_contents = null_string;
|
||||
if (win32vars.clipboard_sequence != 0){
|
||||
DWORD new_number = GetClipboardSequenceNumber();
|
||||
if (new_number != win32vars.clipboard_sequence){
|
||||
win32vars.clipboard_sequence = new_number;
|
||||
if (win32vars.next_clipboard_is_self){
|
||||
win32vars.next_clipboard_is_self = 0;
|
||||
}
|
||||
else{
|
||||
win32_read_clipboard_contents();
|
||||
}
|
||||
}
|
||||
}
|
||||
input.clipboard = win32vars.clipboard_contents;
|
||||
|
||||
|
||||
Application_Step_Result result = {(Application_Mouse_Cursor)0};
|
||||
// NOTE(allen): Initialize result So the Core Doesn't Have to Fill Things it Doesn't Care About
|
||||
Application_Step_Result result = {0};
|
||||
result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT;
|
||||
result.lctrl_lalt_is_altgr = win32vars.lctrl_lalt_is_altgr;
|
||||
result.trying_to_kill = input_chunk.trans.trying_to_kill;
|
||||
result.perform_kill = 0;
|
||||
|
||||
// TODO(allen): Not really appropriate to round trip this all the way to the OS layer, redo this system.
|
||||
// NOTE(allen): Ask the Core About Exiting if We Have an Exit Signal
|
||||
if (win32vars.send_exit_signal){
|
||||
result.trying_to_kill = true;
|
||||
win32vars.send_exit_signal = false;
|
||||
}
|
||||
|
||||
// NOTE(allen): Application Core Update
|
||||
app.step(&sysfunc, &target, &memory_vars, &input, &result);
|
||||
|
||||
// NOTE(allen): Finish the Loop
|
||||
if (result.perform_kill){
|
||||
keep_running = false;
|
||||
}
|
||||
|
||||
if (win32vars.do_toggle){
|
||||
win32_toggle_fullscreen();
|
||||
win32vars.do_toggle = false;
|
||||
}
|
||||
|
||||
// NOTE(allen): Switch to New Cursor
|
||||
Win32SetCursorFromUpdate(result.mouse_cursor_type);
|
||||
if (win32vars.cursor_show != win32vars.prev_cursor_show){
|
||||
win32vars.prev_cursor_show = win32vars.cursor_show;
|
||||
|
@ -1393,19 +1390,28 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
// TODO(allen): MouseCursorShow_HideWhenStill
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE(allen): Update lctrl_lalt_is_altgr Status
|
||||
win32vars.lctrl_lalt_is_altgr = result.lctrl_lalt_is_altgr;
|
||||
|
||||
// NOTE(allen): Render
|
||||
HDC hdc = GetDC(win32vars.window_handle);
|
||||
interpret_render_buffer(&sysfunc, &target);
|
||||
SwapBuffers(hdc);
|
||||
ReleaseDC(win32vars.window_handle, hdc);
|
||||
|
||||
win32vars.first = 0;
|
||||
// NOTE(allen): Toggle Full Screen
|
||||
if (win32vars.do_toggle){
|
||||
win32_toggle_fullscreen();
|
||||
win32vars.do_toggle = false;
|
||||
}
|
||||
|
||||
// NOTE(allen): Schedule Another Step if Needed
|
||||
if (result.animating){
|
||||
system_schedule_step();
|
||||
}
|
||||
|
||||
// NOTE(allen): Sleep a Bit to Cool Off :)
|
||||
flush_thread_group(BACKGROUND_THREADS);
|
||||
|
||||
u64 timer_end = Win32HighResolutionTime();
|
||||
|
@ -1419,6 +1425,9 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
|||
}
|
||||
system_acquire_lock(FRAME_LOCK);
|
||||
timer_start = Win32HighResolutionTime();
|
||||
|
||||
// TODO(allen): Only rely on version right inside input?
|
||||
win32vars.first = 0;
|
||||
}
|
||||
|
||||
return(0);
|
||||
|
|
|
@ -70,9 +70,5 @@
|
|||
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
|
||||
#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
|
||||
|
||||
// TODO(allen): these don't belong here, but the organizational stuff is not fully in place yet.
|
||||
#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
|
||||
#define GL_DEBUG_OUTPUT 0x92E0
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
|
Loading…
Reference in New Issue