fix layout

This commit is contained in:
2024-12-02 12:57:19 -06:00
parent 5e1d37c2b8
commit edc29cc28c
9 changed files with 71 additions and 82 deletions

View File

@@ -24,6 +24,13 @@ endif
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
# adding cblas
if host_machine.system() == 'darwin'
deps += dependency('appleframeworks', modules: 'accelerate')
else
deps += dependency('cblas')
endif
if host_machine.system() == 'linux' if host_machine.system() == 'linux'
deps += cc.find_library('asound', required:true) deps += cc.find_library('asound', required:true)
deps += [dependency('x11'), dependency('xi'), dependency('xcursor'), dependency('egl'), dependency('gl')] deps += [dependency('x11'), dependency('xi'), dependency('xcursor'), dependency('egl'), dependency('gl')]
@@ -59,26 +66,12 @@ if storefront == 'steam'
deps += dependency('qjs-steam',static:false) deps += dependency('qjs-steam',static:false)
endif endif
cmake = import('cmake')
#cmake_ozz = cmake.subproject('ozz')
cmake_sdl3 = cmake.subproject('SDL')
message('CMake targets:\n - ' + '\n - '.join(cmake_sdl3.target_list()))
sdl3_lib = cmake_sdl3.dependency('SDL3-shared')
#deps += dependency('openblas')
deps += dependency('qjs-layout',static:true) deps += dependency('qjs-layout',static:true)
deps += dependency('qjs-nota',static:true) deps += dependency('qjs-nota',static:true)
deps += dependency('qjs-miniz',static:true) deps += dependency('qjs-miniz',static:true)
deps += dependency('qjs-soloud',static:true) deps += dependency('qjs-soloud',static:true)
deps += sdl3_lib deps += dependency('sdl3')
deps += dependency('physfs',static:true) deps += dependency('physfs',static:true)
#deps += cmake_ozz.dependency('ozz_base')
#deps += dependency('sdl2_image')
#deps += dependency('ogg') # for sdl2_mixer
#deps += dependency('sdl2_mixer')
#deps += dependency('sdl2_ttf')
deps += dependency('threads') deps += dependency('threads')

View File

@@ -15,6 +15,7 @@ var clay_base = {
margin:0, margin:0,
offset:[0,0], offset:[0,0],
size:undefined, size:undefined,
background_color: undefined
}; };
var root_item; var root_item;
@@ -38,7 +39,7 @@ clay.normalizeSpacing = function normalizeSpacing(spacing) {
} }
} }
clay.draw = function draw(size, fn) clay.draw = function draw(size, fn, config = {})
{ {
lay_ctx.reset(); lay_ctx.reset();
boxes = []; boxes = [];
@@ -74,6 +75,10 @@ clay.draw = function draw(size, fn)
box.marginbox.y -= margin.t; box.marginbox.y -= margin.t;
box.marginbox.width += margin.l+margin.r; box.marginbox.width += margin.l+margin.r;
box.marginbox.height += margin.t+margin.b; box.marginbox.height += margin.t+margin.b;
box.content.y *= -1;
box.content.y += size.y;
box.boundingbox.y *= -1;
box.boundingbox.y += size.y;
box.content.anchor_y = 1; box.content.anchor_y = 1;
box.boundingbox.anchor_y = 1; box.boundingbox.anchor_y = 1;
} }
@@ -220,13 +225,10 @@ layout.newframe = function() { hovered = undefined; }
layout.draw_commands = function draw_commands(cmds, pos = [0,0], mousepos) layout.draw_commands = function draw_commands(cmds, pos = [0,0], mousepos)
{ {
for (var cmd of cmds) { for (var cmd of cmds) {
var boundingbox = geometry.rect_move(cmd.boundingbox,pos); var config = cmd.config;
// boundingbox.x -= boundingbox.width*pos.anchor_x; var boundingbox = geometry.rect_move(cmd.boundingbox,pos.add(config.offset));
// boundingbox.y += boundingbox.height*pos.anchor_y; var content = geometry.rect_move(cmd.content,pos.add(config.offset));
var content = geometry.rect_move(cmd.content,pos);
// content.x -= content.width*pos.anchor_x;
// content.y += content.height*pos.anchor_y;
var config = cmd.config;
if (config.hovered && geometry.rect_point_inside(boundingbox, mousepos)) { if (config.hovered && geometry.rect_point_inside(boundingbox, mousepos)) {
config.hovered.__proto__ = config; config.hovered.__proto__ = config;
@@ -259,11 +261,7 @@ layout.draw_debug = function draw_debug(cmds, pos = [0,0])
for (var i = 0; i < cmds.length; i++) { for (var i = 0; i < cmds.length; i++) {
var cmd = cmds[i]; var cmd = cmds[i];
var boundingbox = geometry.rect_move(cmd.boundingbox,pos); var boundingbox = geometry.rect_move(cmd.boundingbox,pos);
// boundingbox.x -= boundingbox.width*pos.anchor_x;
// boundingbox.y += boundingbox.height*pos.anchor_y;
var content = geometry.rect_move(cmd.content,pos); var content = geometry.rect_move(cmd.content,pos);
// content.x -= content.width*pos.anchor_x;
// content.y += content.height*pos.anchor_y;
render.rectangle(content, dbg_colors.content); render.rectangle(content, dbg_colors.content);
render.rectangle(boundingbox, dbg_colors.boundingbox); render.rectangle(boundingbox, dbg_colors.boundingbox);
// render.rectangle(geometry.rect_move(cmd.marginbox,pos), dbg_colors.margin); // render.rectangle(geometry.rect_move(cmd.marginbox,pos), dbg_colors.margin);

View File

@@ -114,8 +114,6 @@ prosperon.init = function () {
}; };
if (io.exists("game.js")) global.app = actor.spawn("game.js"); if (io.exists("game.js")) global.app = actor.spawn("game.js");
else global.app = actor.spawn("nogame.js"); else global.app = actor.spawn("nogame.js");
console.log(io.exists("game.js"))
}; };
prosperon.release_mode = function () { prosperon.release_mode = function () {

View File

@@ -865,6 +865,8 @@ render.rectangle = function render_rectangle(rect, color = Color.white, shader =
}; };
render.text = function text(str, rect, font = cur_font, size = 0, color = Color.white, wrap = -1, ) { render.text = function text(str, rect, font = cur_font, size = 0, color = Color.white, wrap = -1, ) {
if (typeof font === 'string')
font = render.get_font(font)
var mesh = os.make_text_buffer(str, rect, 0, color, wrap, font); var mesh = os.make_text_buffer(str, rect, 0, color, wrap, font);
render._main.geometry(font.texture, mesh); render._main.geometry(font.texture, mesh);
return; return;
@@ -1171,7 +1173,6 @@ render.get_font = function get_font(path,size)
} }
path = Resources.find_font(path); path = Resources.find_font(path);
var fontstr = `${path}.${size}`; var fontstr = `${path}.${size}`;
console.log(`getting ${fontstr}`);
if (fontcache[fontstr]) return fontcache[fontstr]; if (fontcache[fontstr]) return fontcache[fontstr];
var data = io.slurpbytes(path); var data = io.slurpbytes(path);

View File

@@ -12,7 +12,6 @@ if (ignore = io.slurp('.prosperonignore')) {
} }
} }
*/ */
//console.info(allpaths)
var appy = {}; var appy = {};
appy.inputs = {}; appy.inputs = {};
@@ -302,8 +301,6 @@ Cmdline.register_order(
if (io.exists("config.js")) global.mixin("config.js"); if (io.exists("config.js")) global.mixin("config.js");
else console.warn("No config.js file found. Starting with default parameters."); else console.warn("No config.js file found. Starting with default parameters.");
var window = game.engine_start(prosperon); var window = game.engine_start(prosperon);
console.log(game.renderers());
console.log(game.cameras());
var renderer = window.make_renderer("gpu"); var renderer = window.make_renderer("gpu");
render._main = renderer; render._main = renderer;

View File

@@ -86,26 +86,24 @@ struct sFont *MakeFont(void *ttf_buffer, size_t len, int height) {
if (!SDL_WriteSurfacePixel(newfont->surface, j, i, 255,255,255,bitmap[i*packsize+j])) if (!SDL_WriteSurfacePixel(newfont->surface, j, i, 255,255,255,bitmap[i*packsize+j]))
printf("SDLERROR: %s\n", SDL_GetError()); printf("SDLERROR: %s\n", SDL_GetError());
printf("FONT SURFACE IS %p\n", newfont->surface);
for (unsigned char c = 32; c < 127; c++) { for (unsigned char c = 32; c < 127; c++) {
stbtt_packedchar glyph = glyphs[c - 32]; stbtt_packedchar glyph = glyphs[c - 32];
struct rect r; rect uv;
r.x = (glyph.x0) / (float)packsize; uv.x = (glyph.x0) / (float)packsize;
r.w = (glyph.x1-glyph.x0) / (float)packsize; uv.w = (glyph.x1-glyph.x0) / (float)packsize;
r.y = (glyph.y1) / (float)packsize; uv.y = (glyph.y1) / (float)packsize;
r.h = (glyph.y0-glyph.y1) / (float)packsize; uv.h = (glyph.y0-glyph.y1) / (float)packsize;
newfont->Characters[c].uv = uv;
newfont->Characters[c].size = (HMM_Vec2){ rect quad;
.x = glyph.x1-glyph.x0, quad.x = glyph.xoff;
.y = glyph.y1-glyph.y0 quad.w = glyph.xoff2-glyph.xoff;
}; quad.y = -glyph.yoff2;
quad.h = glyph.yoff2-glyph.yoff;
newfont->Characters[c].Advance = glyph.xadvance; /* x distance from this char to the next */ newfont->Characters[c].quad = quad;
newfont->Characters[c].leftbearing = glyph.xoff; newfont->Characters[c].advance = glyph.xadvance;
newfont->Characters[c].topbearing = glyph.yoff2;//newfont->ascent - glyph.yoff; -glyph.yoff2; // printf("glyph for %c is x0,y0,x1,y1: %d,%d,%d,%d\n xoff %g, yoff %g, xadvance %g, xoff2 %g, yoff2 %g\n", c, glyph.x0, glyph.y1, glyph.x1, glyph.y1, glyph.xoff, glyph.yoff, glyph.xadvance, glyph.xoff2, glyph.yoff2);
newfont->Characters[c].rect = r;
} }
free(bitmap); free(bitmap);
@@ -136,17 +134,17 @@ int text_flush() {
*/ */
} }
void sdrawCharacter(struct text_vert **buffer, struct Character c, HMM_Vec2 cursor, float scale, struct rgba color) { void sdrawCharacter(struct text_vert **buffer, stbtt_packedchar c, HMM_Vec2 cursor, float scale, struct rgba color) {
struct text_vert vert; struct text_vert vert;
vert.pos.x = cursor.X + c.leftbearing; // vert.pos.x = cursor.X + c.leftbearing;
vert.pos.y = cursor.Y + c.topbearing; // vert.pos.y = cursor.Y + c.topbearing;
// vert.wh = c.size; // vert.wh = c.size;
// if (vert.pos.x > frame.l || vert.pos.y > frame.t || (vert.pos.y + vert.wh.y) < frame.b || (vert.pos.x + vert.wh.x) < frame.l) return; // if (vert.pos.x > frame.l || vert.pos.y > frame.t || (vert.pos.y + vert.wh.y) < frame.b || (vert.pos.x + vert.wh.x) < frame.l) return;
vert.uv.x = c.rect.x; // vert.uv.x = c.rect.x;
vert.uv.y = c.rect.y; // vert.uv.y = c.rect.y;
// vert.st.x = c.rect.w; // vert.st.x = c.rect.w;
// vert.st.y = c.rect.h; // vert.st.y = c.rect.h;
rgba2floats(vert.color.e, color); rgba2floats(vert.color.e, color);
@@ -154,30 +152,32 @@ void sdrawCharacter(struct text_vert **buffer, struct Character c, HMM_Vec2 curs
arrput(*buffer, vert); arrput(*buffer, vert);
} }
void draw_char_verts(struct text_vert **buffer, struct Character c, HMM_Vec2 cursor, float scale, struct rgba color) void draw_char_verts(struct text_vert **buffer, struct character c, HMM_Vec2 cursor, float scale, struct rgba color)
{ {
// packedchar has
// Adds four verts: bottom left, bottom right, top left, top right // Adds four verts: bottom left, bottom right, top left, top right
text_vert bl; text_vert bl;
bl.pos.x = cursor.X + c.leftbearing; bl.pos.x = cursor.X + c.quad.x;
bl.pos.y = cursor.Y - c.topbearing; bl.pos.y = cursor.Y + c.quad.y;
bl.uv.x = c.rect.x; bl.uv.x = c.uv.x;
bl.uv.y = c.rect.y+c.rect.h; bl.uv.y = c.uv.y;
rgba2floats(bl.color.e, color); rgba2floats(bl.color.e, color);
arrput(*buffer, bl); arrput(*buffer, bl);
text_vert br = bl; text_vert br = bl;
br.pos.x += c.size.x; br.pos.x += c.quad.w;
br.uv.x += c.rect.w; br.uv.x += c.uv.w;
arrput(*buffer, br); arrput(*buffer, br);
text_vert ul = bl; text_vert ul = bl;
ul.pos.y -= c.size.y; ul.pos.y += c.quad.h;
ul.uv.y = c.rect.y; ul.uv.y += c.uv.h;
arrput(*buffer, ul); arrput(*buffer, ul);
text_vert ur = ul; text_vert ur = ul;
ur.pos.x += c.size.x; ur.pos.x = br.pos.x;
ur.uv.x += c.rect.w; ur.uv.x = br.uv.x;
arrput(*buffer, ur); arrput(*buffer, ur);
} }
@@ -229,7 +229,7 @@ HMM_Vec2 measure_text(const char *text, font *f, float size, float letterSpacing
height += lineHeight + f->linegap; height += lineHeight + f->linegap;
continue; continue;
} }
lineWidth += f->Characters[*c].Advance + letterSpacing; lineWidth += f->Characters[*c].advance + letterSpacing;
} }
maxWidth = fmaxf(maxWidth, lineWidth); maxWidth = fmaxf(maxWidth, lineWidth);
@@ -255,7 +255,7 @@ struct text_vert *renderText(const char *text, HMM_Vec2 pos, font *f, float scal
} }
draw_char_verts(&buffer, f->Characters[*c], cursor, scale, color); draw_char_verts(&buffer, f->Characters[*c], cursor, scale, color);
cursor.x += f->Characters[*c].Advance; cursor.x += f->Characters[*c].advance;
} }
return buffer; return buffer;
/* /*
@@ -267,7 +267,7 @@ struct text_vert *renderText(const char *text, HMM_Vec2 pos, font *f, float scal
while (*line != '\0') { while (*line != '\0') {
if (isblank(*line)) { if (isblank(*line)) {
sdrawCharacter(f->Characters[*line], cursor, scale, usecolor); sdrawCharacter(f->Characters[*line], cursor, scale, usecolor);
cursor.X += f->Characters[*line].Advance * scale; cursor.X += f->Characters[*line].advance * scale;
line++; line++;
} else if (isspace(*line)) { } else if (isspace(*line)) {
sdrawCharacter(f->Characters[*line], cursor, scale, usecolor); sdrawCharacter(f->Characters[*line], cursor, scale, usecolor);
@@ -283,7 +283,7 @@ struct text_vert *renderText(const char *text, HMM_Vec2 pos, font *f, float scal
while (!isspace(*line) && *line != '\0') { while (!isspace(*line) && *line != '\0') {
wordWidth += f->Characters[*line].Advance * scale; wordWidth += f->Characters[*line].advance * scale;
line++; line++;
} }
@@ -298,7 +298,7 @@ struct text_vert *renderText(const char *text, HMM_Vec2 pos, font *f, float scal
sdrawCharacter(f->Characters[*wordstart], cursor, scale, usecolor); sdrawCharacter(f->Characters[*wordstart], cursor, scale, usecolor);
cursor.X += f->Characters[*wordstart].Advance * scale; cursor.X += f->Characters[*wordstart].advance * scale;
wordstart++; wordstart++;
} }
} }

View File

@@ -6,6 +6,7 @@
#include <quickjs.h> #include <quickjs.h>
#include "texture.h" #include "texture.h"
#include <SDL3/SDL.h> #include <SDL3/SDL.h>
#include "render.h"
typedef enum { typedef enum {
LEFT, LEFT,
@@ -25,13 +26,14 @@ typedef struct text_vert text_vert;
struct shader; struct shader;
struct window; struct window;
/// Holds all state information relevant to a character as loaded using FreeType struct character {
struct Character { float advance;
float Advance; // Horizontal offset to advance to next glyph rect quad;
float leftbearing; // X offset from cursor to render at rect uv;
float topbearing; // Y offset from cursor to render at float xoff;
struct rect rect; // the rect on the font image to render from, uv coordinates float yoff;
HMM_Vec2 size; // The pixel size of this letter float width;
float height;
}; };
// text data // text data
@@ -40,7 +42,7 @@ struct sFont {
float ascent; // pixels float ascent; // pixels
float descent; // pixels float descent; // pixels
float linegap; //pixels float linegap; //pixels
struct Character Characters[256]; struct character Characters[256];
SDL_Surface *surface; SDL_Surface *surface;
}; };

View File

@@ -497,8 +497,6 @@ int js_print_exception(JSContext *js, JSValue v)
return 0; return 0;
} }
typedef SDL_FRect rect;
rect js2rect(JSContext *js,JSValue v) { rect js2rect(JSContext *js,JSValue v) {
rect rect; rect rect;
rect.w = js_getnum(js,v,width_atom); rect.w = js_getnum(js,v,width_atom);
@@ -716,12 +714,13 @@ JSValue make_quad_indices_buffer(JSContext *js, int quads)
JSC_CCALL(os_make_text_buffer, JSC_CCALL(os_make_text_buffer,
const char *s = JS_ToCString(js, argv[0]); const char *s = JS_ToCString(js, argv[0]);
HMM_Vec2 startpos = js2vec2(js,argv[1]); rect rectpos = js2rect(js,argv[1]);
float size = js2number(js,argv[2]); float size = js2number(js,argv[2]);
font *f = js2font(js,argv[5]); font *f = js2font(js,argv[5]);
if (!size) size = f->height; if (!size) size = f->height;
struct rgba c = js2color(js,argv[3]); struct rgba c = js2color(js,argv[3]);
int wrap = js2number(js,argv[4]); int wrap = js2number(js,argv[4]);
HMM_Vec2 startpos = {.x = rectpos.x, .y = rectpos.y };
text_vert *buffer = renderText(s, startpos, f, size, c, wrap); text_vert *buffer = renderText(s, startpos, f, size, c, wrap);
size_t verts = arrlen(buffer); size_t verts = arrlen(buffer);
@@ -2740,7 +2739,6 @@ JSC_CCALL(os_make_font,
if (!f) return JS_ThrowReferenceError(js, "could not create font"); if (!f) return JS_ThrowReferenceError(js, "could not create font");
ret = font2js(js,f); ret = font2js(js,f);
JS_SetPropertyStr(js, ret, "surface", SDL_Surface2js(js,f->surface)); JS_SetPropertyStr(js, ret, "surface", SDL_Surface2js(js,f->surface));
printf("texture is %dx%d at %p\n", f->surface->w, f->surface->h, f->surface);
) )
JSC_CCALL(os_make_transform, return transform2js(js,make_transform())) JSC_CCALL(os_make_transform, return transform2js(js,make_transform()))

View File

@@ -54,6 +54,8 @@ struct rect {
float x,y,w,h; float x,y,w,h;
}; };
typedef SDL_FRect rect;
float *rgba2floats(float *r, struct rgba c); float *rgba2floats(float *r, struct rgba c);
static inline float lerp(float f, float a, float b) static inline float lerp(float f, float a, float b)