201 lines
4.3 KiB
C
201 lines
4.3 KiB
C
/*
|
|
* Mr. 4th Dimention - Allen Webster
|
|
*
|
|
* 17.12.2014
|
|
*
|
|
* Rendering layer for project codename "4ed"
|
|
*
|
|
*/
|
|
|
|
// TOP
|
|
|
|
#ifndef FRED_RENDERING_H
|
|
#define FRED_RENDERING_H
|
|
|
|
internal void*
|
|
part_alloc(int size, void *context){
|
|
Partition *part = (Partition*)context;
|
|
void *result = push_block(part, size);
|
|
return(result);
|
|
}
|
|
|
|
internal void
|
|
part_free(void *ptr, void *context){
|
|
}
|
|
|
|
#define STBTT_malloc part_alloc
|
|
#define STBTT_free part_free
|
|
|
|
#define STB_TRUETYPE_IMPLEMENTATION
|
|
#include "stb_truetype.h"
|
|
|
|
struct Glyph_Data{
|
|
b32 exists;
|
|
};
|
|
|
|
struct Render_Font{
|
|
char name_[24];
|
|
String name;
|
|
b32 loaded;
|
|
|
|
Glyph_Data glyphs[256];
|
|
stbtt_packedchar chardata[256];
|
|
float advance_data[256];
|
|
i32 height, ascent, descent, line_skip;
|
|
i32 advance;
|
|
u32 tex;
|
|
i32 tex_width, tex_height;
|
|
};
|
|
|
|
struct Render_Target;
|
|
|
|
#define Draw_Push_Clip_Sig(name) void name(Render_Target *target, i32_Rect clip_box)
|
|
typedef Draw_Push_Clip_Sig(Draw_Push_Clip);
|
|
|
|
#define Draw_Pop_Clip_Sig(name) void name(Render_Target *target)
|
|
typedef Draw_Pop_Clip_Sig(Draw_Pop_Clip);
|
|
|
|
enum Render_Piece_Type{
|
|
piece_type_rectangle,
|
|
piece_type_outline,
|
|
piece_type_gradient,
|
|
piece_type_glyph,
|
|
piece_type_mono_glyph,
|
|
piece_type_mono_glyph_advance
|
|
};
|
|
|
|
struct Render_Piece_Header{
|
|
i32 type;
|
|
};
|
|
|
|
struct Render_Piece_Rectangle{
|
|
f32_Rect rect;
|
|
u32 color;
|
|
};
|
|
|
|
struct Render_Piece_Gradient{
|
|
f32_Rect rect;
|
|
u32 left_color, right_color;
|
|
};
|
|
|
|
struct Render_Piece_Glyph{
|
|
Vec2 pos;
|
|
u32 color;
|
|
i16 font_id;
|
|
u8 character;
|
|
};
|
|
|
|
struct Render_Piece_Glyph_Advance{
|
|
Vec2 pos;
|
|
u32 color;
|
|
f32 advance;
|
|
i16 font_id;
|
|
u8 character;
|
|
};
|
|
|
|
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;
|
|
};
|
|
};
|
|
|
|
#define Draw_Push_Piece_Sig(name) void name(Render_Target *target, Render_Piece_Combined piece)
|
|
typedef Draw_Push_Piece_Sig(Draw_Push_Piece);
|
|
|
|
#define Font_Load_Sig(name) i32 name( \
|
|
Partition *partition, \
|
|
Render_Font *font_out, \
|
|
char *filename, \
|
|
i32 pt_size, \
|
|
i32 tab_width)
|
|
typedef Font_Load_Sig(Font_Load);
|
|
|
|
#define Font_Info_Load_Sig(name) i32 name( \
|
|
Partition *partition, \
|
|
char *filename, \
|
|
i32 pt_size, \
|
|
i32 *height, \
|
|
i32 *advance)
|
|
typedef Font_Info_Load_Sig(Font_Info_Load);
|
|
|
|
#define Release_Font_Sig(name) void name(Render_Font *font)
|
|
typedef Release_Font_Sig(Release_Font);
|
|
|
|
struct Font_Table_Entry{
|
|
u32 hash;
|
|
String name;
|
|
i16 font_id;
|
|
};
|
|
|
|
struct Font_Info{
|
|
Render_Font *font;
|
|
String filename;
|
|
String name;
|
|
i32 height, advance;
|
|
i32 pt_size;
|
|
};
|
|
|
|
struct Font_Slot{
|
|
Font_Slot *next, *prev;
|
|
i16 font_id;
|
|
u8 padding[14];
|
|
};
|
|
|
|
struct Font_Set{
|
|
Font_Info *info;
|
|
Font_Table_Entry *entries;
|
|
u32 count, max;
|
|
|
|
void *font_block;
|
|
Font_Slot free_slots;
|
|
Font_Slot used_slots;
|
|
|
|
Font_Info_Load *font_info_load;
|
|
Font_Load *font_load;
|
|
Release_Font *release_font;
|
|
|
|
b8 *font_used_flags;
|
|
i16 used_this_frame;
|
|
i16 live_max;
|
|
};
|
|
|
|
struct Render_Target{
|
|
void *handle;
|
|
void *context;
|
|
i32_Rect clip_boxes[5];
|
|
i32 clip_top;
|
|
i32 width, height;
|
|
i32 bound_texture;
|
|
u32 color;
|
|
|
|
byte *push_buffer;
|
|
i32 size, max;
|
|
|
|
Font_Set font_set;
|
|
Partition *partition;
|
|
|
|
Draw_Push_Clip *push_clip;
|
|
Draw_Pop_Clip *pop_clip;
|
|
Draw_Push_Piece *push_piece;
|
|
};
|
|
|
|
inline i32_Rect
|
|
rect_from_target(Render_Target *target){
|
|
return i32R(0, 0, target->width, target->height);
|
|
}
|
|
|
|
inline Font_Info*
|
|
get_font_info(Font_Set *set, i16 font_id){
|
|
Font_Info *result = set->info + font_id - 1;
|
|
return(result);
|
|
}
|
|
|
|
#endif
|
|
|
|
// BOTTOM
|
|
|