Add ResDecl parser
parent
7f86cbf988
commit
4ad3bfa3e2
|
@ -9,7 +9,7 @@ entity Player < Shootable
|
||||||
task G_Player_Think
|
task G_Player_Think
|
||||||
size 3
|
size 3
|
||||||
drawsize 16
|
drawsize 16
|
||||||
sprite "@sprites/particle3.png"
|
sprite "ent/player"
|
||||||
}
|
}
|
||||||
|
|
||||||
// EOF
|
// EOF
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
// Copyright © 2017 Project Golan, all rights reserved.
|
||||||
|
font "base" = "fonts/base.ttf", 24pt
|
||||||
|
|
||||||
|
texture "gui/border" = "textures/Border.png"
|
||||||
|
texture "ent/player" = "sprites/Particle3.png"
|
||||||
|
|
||||||
|
shader "plasma" = "shaders/plasma.fp", "shaders/base.vp"
|
||||||
|
|
||||||
|
// EOF
|
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright © 2017 Project Golan, all rights reserved.
|
||||||
|
#version 120
|
||||||
|
|
||||||
|
varying vec4 color;
|
||||||
|
varying vec4 texcoord;
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
gl_Position = ftransform();
|
||||||
|
|
||||||
|
texcoord = gl_MultiTexCoord0;
|
||||||
|
color = gl_Color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
|
@ -0,0 +1,55 @@
|
||||||
|
// Copyright © 2017 Project Golan, all rights reserved.
|
||||||
|
#version 120
|
||||||
|
|
||||||
|
uniform sampler2D DGE_Texture;
|
||||||
|
uniform int DGE_Ticks;
|
||||||
|
uniform float DGE_Seconds;
|
||||||
|
|
||||||
|
varying vec4 color;
|
||||||
|
varying vec4 texcoord;
|
||||||
|
|
||||||
|
vec4 HSVToRGB(float h, float s, float v, float a)
|
||||||
|
{
|
||||||
|
h *= 360.0;
|
||||||
|
|
||||||
|
if(h < 0) h = 0;
|
||||||
|
else if(h > 359.5) h = 359.5;
|
||||||
|
|
||||||
|
float chroma = v * s;
|
||||||
|
float hp = h / 60.0;
|
||||||
|
float x = chroma * (1 - abs(mod(hp, 2) - 1));
|
||||||
|
float r1 = 0, g1 = 0, b1 = 0;
|
||||||
|
|
||||||
|
if(0 <= hp && hp < 1) r1 = chroma, g1 = x, b1 = 0;
|
||||||
|
else if(1 <= hp && hp < 2) r1 = x, g1 = chroma, b1 = 0;
|
||||||
|
else if(2 <= hp && hp < 3) r1 = 0, g1 = chroma, b1 = x;
|
||||||
|
else if(3 <= hp && hp < 4) r1 = 0, g1 = x, b1 = chroma;
|
||||||
|
else if(4 <= hp && hp < 5) r1 = x, g1 = 0, b1 = chroma;
|
||||||
|
else if(5 <= hp && hp < 6) r1 = chroma, g1 = 0, b1 = x;
|
||||||
|
|
||||||
|
float m = v - chroma;
|
||||||
|
return vec4(r1 + m, g1 + m, b1 + m, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
const float pi = 3.14159265;
|
||||||
|
|
||||||
|
float t = (DGE_Seconds * 1000.0) / 32.0;
|
||||||
|
vec2 uv = texcoord.xy * vec2(256.0, 224.0);
|
||||||
|
float bx = uv.x + 0.5 * sin(t / 8.0);
|
||||||
|
float by = uv.y + 0.5 * cos(t / 8.0);
|
||||||
|
float v;
|
||||||
|
|
||||||
|
v = sin((-bx + t) / 32.0);
|
||||||
|
v += cos((by + t) / 32.0);
|
||||||
|
v += sin((bx + by + t) / 32.0);
|
||||||
|
v += sin((sqrt(pow(bx + sin(t / 3.0), 2.0) + pow(by + cos(t / 2.0), 2.0) + 1.0) + t) / 128.0);
|
||||||
|
|
||||||
|
gl_FragColor =
|
||||||
|
texture2D(DGE_Texture, texcoord.xy) *
|
||||||
|
HSVToRGB(sin(v * pi) * 0.5 + 0.5, 1.0, 0.2, 1.0) *
|
||||||
|
color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
|
@ -11,9 +11,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define G_dodTokBeg (4)
|
|
||||||
#define G_dodTokEnd (10)
|
|
||||||
|
|
||||||
#define G_ofmap_GetKey(o) ( (o)->name)
|
#define G_ofmap_GetKey(o) ( (o)->name)
|
||||||
#define G_ofmap_GetNext(o) (&(o)->next)
|
#define G_ofmap_GetNext(o) (&(o)->next)
|
||||||
#define G_ofmap_GetPrev(o) (&(o)->prev)
|
#define G_ofmap_GetPrev(o) (&(o)->prev)
|
||||||
|
@ -491,8 +488,8 @@ void G_ObjDef_Init(void)
|
||||||
void G_ObjDef_Load(char const *fname)
|
void G_ObjDef_Load(char const *fname)
|
||||||
{
|
{
|
||||||
G_dodst st = {.fname = fname, .lines = 1, .tbPtr = &st.tb,
|
G_dodst st = {.fname = fname, .lines = 1, .tbPtr = &st.tb,
|
||||||
.tb = {.bbeg = G_dodTokBeg, .bend = G_dodTokEnd,
|
.tb = {.bbeg = 4, .bend = 10, .tokProcess = G_ObjDef_tokProcess,
|
||||||
.tokProcess = G_ObjDef_tokProcess, .udata = &st}};
|
.udata = &st}};
|
||||||
|
|
||||||
st.fp = fopen(fname, "r");
|
st.fp = fopen(fname, "r");
|
||||||
st.tb.fp = st.fp;
|
st.tb.fp = st.fp;
|
||||||
|
|
|
@ -4,6 +4,21 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
// Static Functions ----------------------------------------------------------|
|
||||||
|
|
||||||
|
//
|
||||||
|
// M_TokBuf_tokProcess
|
||||||
|
//
|
||||||
|
static enum M_tkprc M_TokBuf_tokProcess(M_token *tok, void *udata)
|
||||||
|
{
|
||||||
|
switch(tok->type) {
|
||||||
|
default: return tokproc_next;
|
||||||
|
case tok_eof: return tokproc_done;
|
||||||
|
case tok_lnend:
|
||||||
|
case tok_cmtlin: return tokproc_skip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Extern Functions ----------------------------------------------------------|
|
// Extern Functions ----------------------------------------------------------|
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -12,6 +27,7 @@
|
||||||
void M_TokBuf_Ctor(M_tkbuf *tb)
|
void M_TokBuf_Ctor(M_tkbuf *tb)
|
||||||
{
|
{
|
||||||
tb->toks = calloc(tb->bend, sizeof(M_token));
|
tb->toks = calloc(tb->bend, sizeof(M_token));
|
||||||
|
if(!tb->tokProcess) tb->tokProcess = M_TokBuf_tokProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -19,10 +35,13 @@ void M_TokBuf_Ctor(M_tkbuf *tb)
|
||||||
//
|
//
|
||||||
void M_TokBuf_Dtor(M_tkbuf *tb)
|
void M_TokBuf_Dtor(M_tkbuf *tb)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < tb->bend; i++)
|
/* TODO
|
||||||
free(tb->toks[i].textV);
|
if(tb->toks)
|
||||||
|
for(int i = 0; i < tb->bend; i++)
|
||||||
|
free(tb->toks[i].textV);
|
||||||
|
|
||||||
free(tb->toks);
|
free(tb->toks);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -34,8 +53,10 @@ M_token *M_TokBuf_Get(M_tkbuf *tb)
|
||||||
if(++tb->tpos < tb->tend)
|
if(++tb->tpos < tb->tend)
|
||||||
return &tb->toks[tb->tpos];
|
return &tb->toks[tb->tpos];
|
||||||
|
|
||||||
|
/* TODO
|
||||||
for(int i = 0; i < tb->tend - tb->bbeg; i++)
|
for(int i = 0; i < tb->tend - tb->bbeg; i++)
|
||||||
free(tb->toks[i].textV);
|
free(tb->toks[i].textV);
|
||||||
|
*/
|
||||||
|
|
||||||
memmove(&tb->toks[0], &tb->toks[tb->tend - tb->bbeg],
|
memmove(&tb->toks[0], &tb->toks[tb->tend - tb->bbeg],
|
||||||
sizeof(M_token) * tb->bbeg);
|
sizeof(M_token) * tb->bbeg);
|
||||||
|
|
|
@ -49,6 +49,9 @@ void main(void)
|
||||||
|
|
||||||
DGE_Renderer_SetVirtualRes(960, 720);
|
DGE_Renderer_SetVirtualRes(960, 720);
|
||||||
|
|
||||||
|
printf("Loading resource declarations...\n");
|
||||||
|
R_ResDec_Load("resdecl.rd");
|
||||||
|
|
||||||
printf("Loading object function table...\n");
|
printf("Loading object function table...\n");
|
||||||
G_ObjDef_Init();
|
G_ObjDef_Init();
|
||||||
G_ObjDef_loadFunc(G_Player_Think);
|
G_ObjDef_loadFunc(G_Player_Think);
|
||||||
|
@ -56,9 +59,6 @@ void main(void)
|
||||||
printf("Loading object definitions...\n");
|
printf("Loading object definitions...\n");
|
||||||
G_ObjDef_Load("objdefs.dod");
|
G_ObjDef_Load("objdefs.dod");
|
||||||
|
|
||||||
printf("Creating fonts...\n");
|
|
||||||
DGE_Font_Create(s"myfont", "fonts/base.ttf", 24);
|
|
||||||
|
|
||||||
printf("Registering callbacks...\n");
|
printf("Registering callbacks...\n");
|
||||||
DGE_Callback_Register(DGE_CB_DrawPost, (DGE_CallbackType)R_DrawPost);
|
DGE_Callback_Register(DGE_CB_DrawPost, (DGE_CallbackType)R_DrawPost);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
// Copyright © 2017 Project Golan, all rights reserved.
|
||||||
|
#include "m_tokbuf.h"
|
||||||
|
#include "m_str.h"
|
||||||
|
|
||||||
|
#include <Doominati.h>
|
||||||
|
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
// Static Functions ----------------------------------------------------------|
|
||||||
|
|
||||||
|
_Noreturn static void R_ResDec_throw (struct R_rdcst *st, char const *emsg);
|
||||||
|
static M_token *R_ResDec_expect(struct R_rdcst *st, M_tokty t, char const *exp);
|
||||||
|
|
||||||
|
// Types ---------------------------------------------------------------------|
|
||||||
|
|
||||||
|
typedef struct R_rdcst
|
||||||
|
{
|
||||||
|
__prop throw {call: R_ResDec_throw (this)}
|
||||||
|
__prop expect {call: R_ResDec_expect(this)}
|
||||||
|
|
||||||
|
M_tkbuf tb;
|
||||||
|
jmp_buf ejmp;
|
||||||
|
} R_rdcst;
|
||||||
|
|
||||||
|
// Static Functions ----------------------------------------------------------|
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_ResDec_throw
|
||||||
|
//
|
||||||
|
_Noreturn static void R_ResDec_throw(R_rdcst *st, char const *emsg)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ResDec: %s\n", emsg);
|
||||||
|
longjmp(st->ejmp, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_ResDec_expect
|
||||||
|
//
|
||||||
|
static M_token *R_ResDec_expect(R_rdcst *st, M_tokty t, char const *exp)
|
||||||
|
{
|
||||||
|
M_token *tok;
|
||||||
|
if((tok = st->tb.get())->type != t)
|
||||||
|
st->throw(M_StrFmt("expected %s", exp));
|
||||||
|
return tok;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_ResDec_getFont
|
||||||
|
//
|
||||||
|
static void R_ResDec_getFont(R_rdcst *st)
|
||||||
|
{
|
||||||
|
char const *fname;
|
||||||
|
__str name;
|
||||||
|
int pt;
|
||||||
|
|
||||||
|
name = M_StrCreate(st->expect(tok_string, "alias name")->textV);
|
||||||
|
st->expect(tok_eq, "'='");
|
||||||
|
|
||||||
|
fname = st->expect(tok_string, "file name")->textV;
|
||||||
|
st->expect(tok_comma, "','");
|
||||||
|
|
||||||
|
pt = strtoi(st->expect(tok_number, "pt size")->textV, NULL, 0);
|
||||||
|
DGE_Font_Create(name, fname, pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_ResDec_getTexture
|
||||||
|
//
|
||||||
|
static void R_ResDec_getTexture(R_rdcst *st)
|
||||||
|
{
|
||||||
|
char const *fname;
|
||||||
|
__str name;
|
||||||
|
|
||||||
|
name = M_StrCreate(st->expect(tok_string, "alias name")->textV);
|
||||||
|
st->expect(tok_eq, "'='");
|
||||||
|
|
||||||
|
fname = st->expect(tok_string, "file name")->textV;
|
||||||
|
DGE_Texture_Create(name, fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_ResDec_getShader
|
||||||
|
//
|
||||||
|
static void R_ResDec_getShader(R_rdcst *st)
|
||||||
|
{
|
||||||
|
char const *fp, *vp;
|
||||||
|
__str name;
|
||||||
|
bool data = false;
|
||||||
|
|
||||||
|
name = M_StrCreate(st->expect(tok_string, "alias name")->textV);
|
||||||
|
st->expect(tok_eq, "'='");
|
||||||
|
|
||||||
|
if(st->tb.drop(tok_identi) && strcmp(st->tb.reget()->textV, "data") == 0)
|
||||||
|
data = true;
|
||||||
|
|
||||||
|
fp = st->expect(tok_string, "fragment shader")->textV;
|
||||||
|
st->expect(tok_comma, "','");
|
||||||
|
|
||||||
|
vp = st->expect(tok_string, "vertex shader")->textV;
|
||||||
|
if(data) DGE_Shader_CreateData(name, fp, vp);
|
||||||
|
else DGE_Shader_CreateFile(name, fp, vp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extern Functions ----------------------------------------------------------|
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_ResDec_Load
|
||||||
|
//
|
||||||
|
void R_ResDec_Load(char const *fname)
|
||||||
|
{
|
||||||
|
R_rdcst st = {{.bbeg = 4, .bend = 10, .fp = fopen(fname, "r")}};
|
||||||
|
|
||||||
|
if(!st.tb.fp) {
|
||||||
|
fprintf(stderr, "ResDec: couldn't open file '%s'\n", fname);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
st.tb.ctor();
|
||||||
|
|
||||||
|
if(setjmp(st.ejmp) == 1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
for(M_token *tok; (tok = st.tb.get())->type != tok_eof;)
|
||||||
|
{
|
||||||
|
if(tok->type != tok_identi)
|
||||||
|
st.throw("expected identifier");
|
||||||
|
else if(strcmp(tok->textV, "font") == 0)
|
||||||
|
R_ResDec_getFont(&st);
|
||||||
|
else if(strcmp(tok->textV, "texture") == 0)
|
||||||
|
R_ResDec_getTexture(&st);
|
||||||
|
else if(strcmp(tok->textV, "shader") == 0)
|
||||||
|
R_ResDec_getShader(&st);
|
||||||
|
else if(strcmp(tok->textV, "include") == 0)
|
||||||
|
R_ResDec_Load(st.expect(tok_string, "file name")->textV);
|
||||||
|
else
|
||||||
|
st.throw(M_StrFmt("invalid resource type '%s'", tok->textV));
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("ResDec: '%s' loaded.\n", fname);
|
||||||
|
|
||||||
|
done:
|
||||||
|
st.tb.dtor();
|
||||||
|
fclose(st.tb.fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// EOF
|
Loading…
Reference in New Issue