Added pawn system for input via scheme
This commit is contained in:
parent
9bdb7ce9cb
commit
5ae72062a2
|
@ -75,7 +75,7 @@ void draw_circle(int x, int y, float radius, int pixels)
|
|||
};
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, circleVBO);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), &verts, GL_DYNAMIC_DRAW);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_DYNAMIC_DRAW);
|
||||
|
||||
shader_setfloat(circleShader, "radius", radius);
|
||||
shader_setint(circleShader, "thickness", pixels);
|
||||
|
|
|
@ -686,8 +686,7 @@ void editor_project_gui() {
|
|||
startobjectgui:
|
||||
|
||||
if (selectedobject) {
|
||||
draw_point(selectedobject->transform.position[0],
|
||||
selectedobject->transform.position[1], 5);
|
||||
draw_point(selectedobject->transform.position[0], selectedobject->transform.position[1], 5);
|
||||
|
||||
NK_FORCE(gameobject)
|
||||
|
||||
|
|
|
@ -25,6 +25,14 @@ struct gameobject *get_gameobject_from_id(int id)
|
|||
return &gameobjects[id];
|
||||
}
|
||||
|
||||
int id_from_gameobject(struct gameobject *go) {
|
||||
for (int i = 0; i < arrlen(gameobjects); i++) {
|
||||
if (&gameobjects[i] == i) return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void gameobject_setpickcolor(struct gameobject *go)
|
||||
{
|
||||
float r = ((go->editor.id & 0x000000FF) >> 0) / 255.f;
|
||||
|
@ -114,7 +122,7 @@ void gameobject_save(struct gameobject *go, FILE * file)
|
|||
}
|
||||
}
|
||||
|
||||
void gameobject_makefromprefab(char *path)
|
||||
int gameobject_makefromprefab(char *path)
|
||||
{
|
||||
FILE *fprefab = fopen(path, "rb");
|
||||
if (fprefab == NULL) {
|
||||
|
@ -129,6 +137,8 @@ void gameobject_makefromprefab(char *path)
|
|||
gameobject_init(new, fprefab);
|
||||
|
||||
fclose(fprefab);
|
||||
|
||||
return arrlen(gameobjects)-1;
|
||||
}
|
||||
|
||||
void gameobject_init(struct gameobject *go, FILE * fprefab)
|
||||
|
@ -228,6 +238,18 @@ void gameobject_rotate(struct gameobject *go, float as)
|
|||
cpBodySetAngle(go->body, a);
|
||||
}
|
||||
|
||||
void gameobject_setangle(struct gameobject *go, float angle) {
|
||||
cpBodySetAngle(go->body, angle);
|
||||
}
|
||||
|
||||
void gameobject_setpos(struct gameobject *go, float x, float y) {
|
||||
if (!go || !go->body) return;
|
||||
cpVect p;
|
||||
p.x = x;
|
||||
p.y = y;
|
||||
cpBodySetPosition(go->body, p);
|
||||
}
|
||||
|
||||
void update_gameobjects() {
|
||||
for (int i = 0; i < arrlen(gameobjects); i++)
|
||||
gameobject_update(&gameobjects[i]);
|
||||
|
|
|
@ -46,14 +46,17 @@ int number_of_gameobjects();
|
|||
void set_n_gameobjects(int n);
|
||||
void setup_model_transform(struct mTransform *t, struct shader *s, float scale);
|
||||
void toggleprefab(struct gameobject *go);
|
||||
|
||||
struct gameobject *get_gameobject_from_id(int id);
|
||||
int id_from_gameobject(struct gameobject *go);
|
||||
|
||||
void gameobject_save(struct gameobject *go, FILE * file);
|
||||
void gameobject_addcomponent(struct gameobject *go, struct component *c);
|
||||
void gameobject_delcomponent(struct gameobject *go, int n);
|
||||
void gameobject_loadcomponent(struct gameobject *go, int id);
|
||||
|
||||
void gameobject_saveprefab(struct gameobject *go);
|
||||
void gameobject_makefromprefab(char *path);
|
||||
int gameobject_makefromprefab(char *path);
|
||||
void gameobject_syncprefabs(char *revertPath);
|
||||
void gameobject_revertprefab(struct gameobject *go);
|
||||
|
||||
|
@ -64,6 +67,8 @@ void update_gameobjects();
|
|||
|
||||
void gameobject_move(struct gameobject *go, float xs, float ys);
|
||||
void gameobject_rotate(struct gameobject *go, float as);
|
||||
void gameobject_setangle(struct gameobject *go, float angle);
|
||||
void gameobject_setpos(struct gameobject *go, float x, float y);
|
||||
|
||||
void object_gui(struct gameobject *go);
|
||||
|
||||
|
|
|
@ -19,6 +19,13 @@ static int *downkeys = NULL;
|
|||
|
||||
static int mquit = 0;
|
||||
|
||||
static s7_pointer *pawns = NULL;
|
||||
|
||||
void set_pawn(s7_pointer menv) {
|
||||
arrput(pawns, menv);
|
||||
YughInfo("Now controling %d pawns.", arrlen(pawns));
|
||||
}
|
||||
|
||||
static void cursor_pos_cb(GLFWwindow *w, double xpos, double ypos)
|
||||
{
|
||||
xchange = (int)xpos - c_xpos;
|
||||
|
@ -174,7 +181,9 @@ void win_key_callback(GLFWwindow *w, int key, int scancode, int action, int mods
|
|||
}
|
||||
|
||||
SCRIPTCALL:
|
||||
script_call(keystr);
|
||||
for (int i = 0; i < arrlen(pawns); i++)
|
||||
script_eval_w_env(keystr, pawns[i]);
|
||||
|
||||
}
|
||||
|
||||
void cursor_hide()
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
#include <stdint.h>
|
||||
#include "window.h"
|
||||
|
||||
#include "script.h"
|
||||
|
||||
extern int32_t mouseWheelX;
|
||||
extern int32_t mouseWheelY;
|
||||
extern int ychange;
|
||||
|
@ -26,7 +28,8 @@ void win_key_callback(GLFWwindow *w, int key, int scancode, int action, int mods
|
|||
struct inputaction
|
||||
{
|
||||
int scancode;
|
||||
|
||||
};
|
||||
|
||||
void set_pawn(s7_pointer env);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "engine.h"
|
||||
#include "log.h"
|
||||
#include "input.h"
|
||||
#include "gameobject.h"
|
||||
|
||||
#include "s7.h"
|
||||
|
||||
|
@ -135,17 +136,19 @@ s7_pointer s7_gen_cmd(s7_scheme *sc, s7_pointer args) {
|
|||
/* 0 : load level */
|
||||
/* 1: load prefab */
|
||||
|
||||
int response = 0;
|
||||
|
||||
switch (cmd) {
|
||||
case 0:
|
||||
load_level(s);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
gameobject_makefromprefab(s);
|
||||
response = gameobject_makefromprefab(s);
|
||||
break;
|
||||
}
|
||||
|
||||
return args;
|
||||
return s7_make_integer(sc, response);
|
||||
}
|
||||
|
||||
s7_pointer s7_sys_cmd(s7_scheme *sc, s7_pointer args) {
|
||||
|
@ -156,6 +159,8 @@ s7_pointer s7_sys_cmd(s7_scheme *sc, s7_pointer args) {
|
|||
quit();
|
||||
break;
|
||||
}
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
s7_pointer s7_sound_cmd(s7_scheme *sc, s7_pointer args) {
|
||||
|
@ -195,24 +200,41 @@ s7_pointer s7_register(s7_scheme *sc, s7_pointer args) {
|
|||
return expr;
|
||||
}
|
||||
|
||||
/*
|
||||
mrb_value mrb_nuke_cb(mrb_state *mrb, mrb_value self) {
|
||||
mrb_float win;
|
||||
mrb_sym cb;
|
||||
mrb_get_args(mrb, "fn", &win, &cb);
|
||||
window_i((int)win)->nuke_cb = cb;
|
||||
return self;
|
||||
s7_pointer s7_set_pawn(s7_scheme *sc, s7_pointer args) {
|
||||
s7_pointer pawn = s7_car(args);
|
||||
set_pawn(pawn);
|
||||
return args;
|
||||
}
|
||||
|
||||
mrb_value mrb_gui_cb(mrb_state *mrb, mrb_value self) {
|
||||
mrb_float win;
|
||||
mrb_sym cb;
|
||||
mrb_get_args(mrb, "fn", &win, &cb);
|
||||
window_i((int)win)->gui_cb = cb;
|
||||
return self;
|
||||
s7_pointer s7_set_body(s7_scheme *sc, s7_pointer args) {
|
||||
int id = s7_integer(s7_car(args));
|
||||
int cmd = s7_integer(s7_cadr(args));
|
||||
double val1;
|
||||
double val2;
|
||||
|
||||
switch (cmd) {
|
||||
case 0:
|
||||
val1 = s7_real(s7_caddr(args));
|
||||
gameobject_setangle(get_gameobject_from_id(id), val1);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
val1 = s7_real(s7_car(s7_caddr(args)));
|
||||
val2 = s7_real(s7_cadr(s7_caddr(args)));
|
||||
gameobject_setpos(get_gameobject_from_id(id), val1, val2);
|
||||
break;
|
||||
}
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
*/
|
||||
s7_pointer s7_set_body_pos(s7_scheme *sc, s7_pointer args) {
|
||||
int id = s7_integer(s7_car(args));
|
||||
double x = s7_real(s7_cadr(args));
|
||||
double y = s7_real(s7_caddr(args));
|
||||
gameobject_setpos(get_gameobject_from_id(id), x, y);
|
||||
return args;
|
||||
}
|
||||
|
||||
#define S7_FUNC(NAME, ARGS) s7_define_function(s7, #NAME, s7_ ##NAME, ARGS, 0, 0, "")
|
||||
|
||||
|
@ -232,5 +254,8 @@ void ffi_load() {
|
|||
S7_FUNC(sound_cmd, 2);
|
||||
S7_FUNC(gui_hook, 1);
|
||||
S7_FUNC(register, 2);
|
||||
S7_FUNC(set_pawn, 1);
|
||||
S7_FUNC(set_body, 3);
|
||||
S7_FUNC(set_body_pos, 3);
|
||||
}
|
||||
|
||||
|
|
|
@ -86,6 +86,12 @@ void script_call(const char *f) {
|
|||
s7_call(s7, s7_name_to_value(s7, f), s7_nil(s7));
|
||||
}
|
||||
|
||||
void script_eval_w_env(const char *s, s7_pointer env) {
|
||||
char buffer[512];
|
||||
snprintf(buffer, 512-1, "(%s)", s);
|
||||
s7_eval_c_string_with_environment(s7, buffer, env);
|
||||
}
|
||||
|
||||
void script_call_sym(s7_pointer sym)
|
||||
{
|
||||
s7_call(s7, sym, s7_nil(s7));
|
||||
|
|
|
@ -13,27 +13,17 @@
|
|||
(define-macro (funcsrc func)
|
||||
`(funcinfo ,func 'source))
|
||||
|
||||
;(define-macro (glog data lvl)
|
||||
; (let ((z (gensym)))
|
||||
; `(begin
|
||||
; (define (,z) ())
|
||||
; (log ,lvl ,data (funcinfo ,z 'file) (funcinfo ,z 'line)))))
|
||||
|
||||
(define-macro (glog data lvl)
|
||||
`(log ,lvl ,data (port-filename (current-input-port)) (port-line-number (current-input-port))))
|
||||
|
||||
(define-macro (flog data lvl)
|
||||
`(log ,lvl ,data (funcinfo (*function*) 'file) (funcinfo (*function*) 'line)))
|
||||
|
||||
;(define-macro (glog data lvl)
|
||||
; `(log ,lvl ,data (pair-line-number (cddr (procedure-source
|
||||
|
||||
(define (loginfo data) (glog data 0))
|
||||
(define (logwarn data) (glog data 1))
|
||||
(define (logerr data) (glog data 2))
|
||||
(define (logcrit data) (glog data 3))
|
||||
|
||||
|
||||
(define (set_fps fps) (settings_cmd 0 (/ 1 fps)))
|
||||
(define (set_update fps) (settings_cmd 1 (/ 1 fps)))
|
||||
(define (set_phys fps) (settings_cmd 2 (/ 1 fps)))
|
||||
|
@ -65,3 +55,17 @@
|
|||
(cond (,condition
|
||||
(begin . ,body)
|
||||
(,loop))))))
|
||||
|
||||
(define (clamp val min max)
|
||||
(cond ((< val min) min)
|
||||
((> val max) max)
|
||||
(else val)))
|
||||
|
||||
(define (lerp s f dt)
|
||||
(+ s (* (clamp dt 0 1) (- f s))))
|
||||
|
||||
(define (deg2rad deg)
|
||||
(* deg 0.01745329252))
|
||||
|
||||
(define (body_angle! body angle) (set_body body 0 angle))
|
||||
(define (body_pos! body x y) (set_body_pos body x y))
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#version 330 core
|
||||
layout (location = 0) in vec4 vertex;
|
||||
layout (location = 0) in vec2 vertex;
|
||||
out vec2 coords;
|
||||
|
||||
layout (std140) uniform Projection
|
||||
|
@ -9,7 +9,5 @@ layout (std140) uniform Projection
|
|||
|
||||
void main()
|
||||
{
|
||||
coords = vertex.zw;
|
||||
|
||||
gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);
|
||||
}
|
Loading…
Reference in a new issue