Replace debug_print with to_json

to_json and cJSON_Print are now used when displaying debug information.

The main reason for this change it to support sending objects over DAP.
This commit is contained in:
Nunuhara Cabbage
2023-05-14 20:12:34 -07:00
parent 535a1f1804
commit 7392d74efe
20 changed files with 663 additions and 468 deletions
-2
View File
@@ -140,8 +140,6 @@ float gfx_size_text(struct text_style *ts, const char *text);
float gfx_get_actual_font_size(unsigned face, float size);
float gfx_get_actual_font_size_round_down(unsigned face, float size);
void gfx_print_text_style(struct text_style *style, int indent);
static inline float text_style_width(struct text_style *ts, const char *ch)
{
return (gfx_size_char(ts, ch) + (ts->bold_width * 2) + ts->edge_left + ts->edge_right)
-6
View File
@@ -164,10 +164,4 @@ void gfx_draw_glyph(Texture *dst, float dx, int dy, Texture *glyph, SDL_Color co
void gfx_draw_glyph_to_pmap(Texture *dst, float dx, int dy, Texture *glyph, Rectangle glyph_pos, SDL_Color color, float scale_x);
void gfx_draw_glyph_to_amap(Texture *dst, float dx, int dy, Texture *glyph, Rectangle glyph_pos, float scale_x);
// debug printing
void gfx_print_color(SDL_Color *c);
void gfx_print_rectangle(Rectangle *r);
void gfx_print_point(Point *p);
void gfx_print_texture(struct texture *t, int indent);
#endif /* SYSTEM4_SDL_CORE_H */
+89
View File
@@ -0,0 +1,89 @@
/* Copyright (C) 2023 Nunuhara Cabbage <nunuhara@haniwa.technology>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://gnu.org/licenses/>.
*/
#ifndef XSYSTEM4_JSON_H
#define XSYSTEM4_JSON_H
#include <stdbool.h>
#include "gfx/types.h"
typedef struct cJSON cJSON;
struct texture;
struct text_style;
struct sact_sprite;
struct sprite;
cJSON *num2_to_json(double a, double b);
cJSON *num2_to_json_object(const char *a_name, double a, const char *b_name, double b);
cJSON *num3_to_json(double a, double b, double c);
cJSON *num3_to_json_object(const char *a_name, double a, const char *b_name, double b,
const char *c_name, double c);
cJSON *num4_to_json(double a, double b, double c, double d);
cJSON *num4_to_json_object(const char *a_name, double a, const char *b_name, double b,
const char *c_name, double c, const char *d_name, double d);
cJSON *texture_to_json(struct texture *t, bool verbose);
cJSON *text_style_to_json(struct text_style *ts, bool verbose);
cJSON *scene_sprite_to_json(struct sprite *sp, bool verbose);
cJSON *sprite_to_json(struct sact_sprite *sp, bool verbose);
static inline cJSON *xy_to_json(double x, double y, bool verbose)
{
if (!verbose)
return num2_to_json(x, y);
return num2_to_json_object("x", x, "y", y);
}
static inline cJSON *wh_to_json(double w, double h, bool verbose)
{
if (!verbose)
return num2_to_json(w, h);
return num2_to_json_object("w", w, "h", h);
}
static inline cJSON *point_to_json(Point *p, bool verbose)
{
return xy_to_json(p->x, p->y, verbose);
}
static inline cJSON *rectangle_to_json(Rectangle *r, bool verbose)
{
if (!verbose)
return num4_to_json(r->x, r->y, r->w, r->h);
return num4_to_json_object("x", r->x, "y", r->y, "w", r->w, "h", r->h);
}
static inline cJSON *color_to_json(Color *c, bool verbose)
{
if (!verbose)
return num4_to_json(c->r, c->g, c->b, c->a);
return num4_to_json_object("r", c->r, "g", c->g, "b", c->b, "a", c->a);
}
static inline cJSON *vec3_point_to_json(vec3 v, bool verbose)
{
if (!verbose)
return num3_to_json(v[0], v[1], v[2]);
return num3_to_json_object("x", v[0], "y", v[1], "z", v[2]);
}
static inline cJSON *vec3_color_to_json(vec3 v, bool verbose)
{
if (!verbose)
return num3_to_json(v[0], v[1], v[2]);
return num3_to_json_object("r", v[0], "g", v[1], "b", v[2]);
}
#endif
+4 -1
View File
@@ -17,12 +17,15 @@
#ifndef SYSTEM4_PLUGIN_H
#define SYSTEM4_PLUGIN_H
#include <stdbool.h>
typedef struct cJSON cJSON;
struct sact_sprite;
struct draw_plugin {
const char *name;
void (*update)(struct sact_sprite *);
void (*debug_print)(struct sact_sprite *, int indent);
cJSON *(*to_json)(struct sact_sprite *, bool);
};
#endif /* SYSTEM4_PLUGIN_H */
+2 -1
View File
@@ -25,6 +25,7 @@
#include "gfx/gfx.h"
#include "plugin.h"
typedef struct cJSON cJSON;
struct hash_table;
enum RE_instance_type {
@@ -270,6 +271,6 @@ bool RE_back_cg_set(struct RE_back_cg *bcg, int no);
bool RE_back_cg_set_name(struct RE_back_cg *bcg, struct string *name, struct archive *aar);
void RE_render(struct sact_sprite *sp);
void RE_debug_print(struct sact_sprite *sp, int indent);
cJSON *RE_to_json(struct sact_sprite *sp, bool verbose);
#endif /* SYSTEM4_REIGN_H */
+2 -1
View File
@@ -20,6 +20,7 @@
#include <stdbool.h>
#include "queue.h"
typedef struct cJSON cJSON;
struct texture;
struct sprite {
@@ -40,7 +41,7 @@ struct sprite {
// The rendering function.
void (*render)(struct sprite*);
// Debug printing function
void (*debug_print)(struct sprite*);
cJSON *(*to_json)(struct sprite*, bool);
};
extern bool scene_is_dirty;
-2
View File
@@ -133,6 +133,4 @@ void sprite_get_pixel_value(struct sact_sprite *sp, int x, int y, int *r, int *g
void sprite_bind_plugin(struct sact_sprite *sp, struct draw_plugin *plugin);
void sprite_call_plugins(void);
void sprite_print(struct sact_sprite *sp);
#endif /* SYSTEM4_SPRITE_H */
+108 -72
View File
@@ -17,6 +17,8 @@
#include "system4/string.h"
#include "3d_internal.h"
#include "cJSON.h"
#include "json.h"
#include "reign.h"
#include "sprite.h"
#include "xsystem4.h"
@@ -57,107 +59,141 @@ static const char *fog_type_name(enum RE_fog_type type)
return "UNKNOWN";
}
static void print_motion(const char *name, struct motion *m, int indent)
static cJSON *motion_to_json(struct motion *m)
{
if (m->instance->type == RE_ITYPE_BILLBOARD) {
indent_message(indent, "%s = {state=%s, frame=%f, range=(%d,%d), loop_range=(%d,%d)},\n",
name, motion_state_name(m->state), m->current_frame,
(int)m->frame_begin, (int)m->frame_end, (int)m->loop_frame_begin, (int)m->loop_frame_end);
} else if (m->mot) {
indent_message(indent, "%s = {name=\"%s\", state=%s, frame=%f},\n",
name, m->mot->name, motion_state_name(m->state), m->current_frame);
cJSON *obj = cJSON_CreateObject();
cJSON_AddStringToObject(obj, "state", motion_state_name(m->state));
cJSON_AddNumberToObject(obj, "frame", m->current_frame);
cJSON_AddItemToObjectCS(obj, "range", num2_to_json(m->frame_begin, m->frame_end));
cJSON_AddItemToObjectCS(obj, "loop_range", num2_to_json(m->loop_frame_begin, m->loop_frame_end));
return obj;
}
if (m->mot) {
cJSON *obj = cJSON_CreateObject();
cJSON_AddStringToObject(obj, "name", m->mot->name);
cJSON_AddStringToObject(obj, "state", motion_state_name(m->state));
cJSON_AddNumberToObject(obj, "frame", m->current_frame);
return obj;
}
return cJSON_CreateNull();
}
static void print_instance(struct RE_instance *inst, int index, int indent)
static cJSON *instance_to_json(struct RE_instance *inst, int index, bool verbose)
{
if (!inst)
return;
indent_message(indent, "instance[%d] = {\n", index);
indent++;
indent_message(indent, "type = %s,\n", instance_type_name(inst->type));
cJSON *obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, "index", index);
cJSON_AddStringToObject(obj, "type", instance_type_name(inst->type));
if (inst->type == RE_ITYPE_DIRECTIONAL_LIGHT || inst->type == RE_ITYPE_SPECULAR_LIGHT) {
indent_message(indent, "vec = {x=%f, y=%f, z=%f},\n", SPREAD_VEC3(inst->vec));
indent_message(indent, "diffuse = {r=%f, g=%f, b=%f},\n", SPREAD_VEC3(inst->diffuse));
indent_message(indent, "globe_diffuse = {r=%f, g=%f, b=%f},\n", SPREAD_VEC3(inst->globe_diffuse));
cJSON_AddItemToObjectCS(obj, "vec", vec3_point_to_json(inst->vec, verbose));
cJSON_AddItemToObjectCS(obj, "diffuse", vec3_color_to_json(inst->diffuse, verbose));
cJSON_AddItemToObjectCS(obj, "globe_diffuse", vec3_color_to_json(inst->globe_diffuse, verbose));
} else {
indent_message(indent, "draw = %d,\n", inst->draw);
indent_message(indent, "pos = {x=%f, y=%f, z=%f},\n", SPREAD_VEC3(inst->pos));
indent_message(indent, "scale = {x=%f, y=%f, z=%f},\n", SPREAD_VEC3(inst->scale));
indent_message(indent, "ambient = {r=%f, g=%f, b=%f},\n", SPREAD_VEC3(inst->ambient));
cJSON_AddNumberToObject(obj, "draw", inst->draw);
cJSON_AddItemToObjectCS(obj, "pos", vec3_point_to_json(inst->pos, verbose));
cJSON_AddItemToObjectCS(obj, "scale", vec3_point_to_json(inst->scale, verbose));
cJSON_AddItemToObjectCS(obj, "ambient", vec3_color_to_json(inst->ambient, verbose));
}
if (inst->model) {
indent_message(indent, "path = \"%s\",\n", inst->model->path);
indent_message(indent, "aabb = {min = {x=%f, y=%f, z=%f}, max = {x=%f, y=%f, z=%f}},\n",
SPREAD_VEC3(inst->model->aabb[0]), SPREAD_VEC3(inst->model->aabb[1]));
cJSON *tmp;
cJSON_AddStringToObject(obj, "path", inst->model->path);
cJSON_AddItemToObjectCS(obj, "aabb", tmp = cJSON_CreateObject());
cJSON_AddItemToObjectCS(tmp, "min", vec3_point_to_json(inst->model->aabb[0], verbose));
cJSON_AddItemToObjectCS(tmp, "max", vec3_point_to_json(inst->model->aabb[1], verbose));
}
if (inst->motion) {
indent_message(indent, "fps = %f,\n", inst->fps);
print_motion("motion", inst->motion, indent);
cJSON_AddNumberToObject(obj, "fps", inst->fps);
cJSON_AddItemToObjectCS(obj, "motion", motion_to_json(inst->motion));
}
if (inst->next_motion) {
cJSON_AddItemToObjectCS(obj, "next_motion", motion_to_json(inst->next_motion));
}
if (inst->motion_blend) {
cJSON_AddNumberToObject(obj, "motion_blend_rate", inst->motion_blend_rate);
}
if (inst->effect) {
cJSON_AddStringToObject(obj, "path", inst->effect->pae->path);
}
if (inst->next_motion)
print_motion("next_motion", inst->next_motion, indent);
if (inst->motion_blend)
indent_message(indent, "motion_blend_rate = %f,\n", inst->motion_blend_rate);
if (inst->effect)
indent_message(indent, "path = \"%s\",\n", inst->effect->pae->path);
indent--;
indent_message(indent, "},\n");
return obj;
}
static void print_back_cg(struct RE_back_cg *bcg, int index, int indent)
static cJSON *back_cg_to_json(struct RE_back_cg *bcg, int index, bool verbose)
{
if (!bcg->name && !bcg->no)
return;
indent_message(indent, "backCG[%d] = {\n", index);
indent++;
if (bcg->no)
indent_message(indent, "no = %d,\n", bcg->no);
if (bcg->name)
indent_message(indent, "name = \"%s\",\n", bcg->name ? bcg->name->text : "");
indent_message(indent, "pos = {x=%f, y=%f},\n", bcg->x, bcg->y);
indent_message(indent, "blend_rate = %f,\n", bcg->blend_rate);
indent_message(indent, "mag = %f,\n", bcg->mag);
indent_message(indent, "show = %d,\n", bcg->show);
indent--;
indent_message(indent, "},\n");
cJSON *obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, "index", index);
if (bcg->no) {
cJSON_AddNumberToObject(obj, "no", bcg->no);
}
if (bcg->name) {
cJSON_AddStringToObject(obj, "name", bcg->name->text);
}
if (!verbose) {
cJSON_AddItemToObjectCS(obj, "pos", num2_to_json(bcg->x, bcg->y));
} else {
cJSON *pos;
cJSON_AddItemToObjectCS(obj, "pos", pos = cJSON_CreateObject());
cJSON_AddNumberToObject(pos, "x", bcg->x);
cJSON_AddNumberToObject(pos, "y", bcg->y);
}
cJSON_AddNumberToObject(obj, "blend_rate", bcg->blend_rate);
cJSON_AddNumberToObject(obj, "mag", bcg->mag);
cJSON_AddNumberToObject(obj, "show", bcg->show);
return obj;
}
void RE_debug_print(struct sact_sprite *sp, int indent)
cJSON *RE_to_json(struct sact_sprite *sp, bool verbose)
{
struct RE_plugin *p = (struct RE_plugin *)sp->plugin;
struct RE_plugin *p = (struct RE_plugin*)sp->plugin;
cJSON *obj, *cam, *a;
indent_message(indent, "name = \"%s\",\n", p->plugin.name);
indent_message(indent, "camera = {x=%f, y=%f, z=%f, pitch=%f, roll=%f, yaw=%f},\n",
SPREAD_VEC3(p->camera.pos), p->camera.pitch, p->camera.roll, p->camera.yaw);
indent_message(indent, "shadow_map_light_dir = {x=%f, y=%f, z=%f},\n", SPREAD_VEC3(p->shadow_map_light_dir));
indent_message(indent, "shadow_bias = %f,\n", p->shadow_bias);
indent_message(indent, "fog_type = %s,\n", fog_type_name(p->fog_type));
obj = cJSON_CreateObject();
cJSON_AddStringToObject(obj, "name", p->plugin.name);
cJSON_AddItemToObjectCS(obj, "camera", cam = cJSON_CreateObject());
cJSON_AddItemToObjectCS(cam, "pos", vec3_point_to_json(p->camera.pos, verbose));
cJSON_AddNumberToObject(cam, "pitch", p->camera.pitch);
cJSON_AddNumberToObject(cam, "roll", p->camera.roll);
cJSON_AddNumberToObject(cam, "yaw", p->camera.yaw);
cJSON_AddItemToObjectCS(obj, "shadow_map_light_dir",
vec3_point_to_json(p->shadow_map_light_dir, verbose));
cJSON_AddNumberToObject(obj, "shadow_bias", p->shadow_bias);
cJSON_AddStringToObject(obj, "fog_type", fog_type_name(p->fog_type));
switch (p->fog_type) {
case RE_FOG_NONE:
break;
case RE_FOG_LINEAR:
indent_message(indent, "fog_near = %f, fog_far = %f,\n", p->fog_near, p->fog_far);
indent_message(indent, "fog_color = {r=%f, g=%f, b=%f},\n", SPREAD_VEC3(p->fog_color));
cJSON_AddNumberToObject(obj, "fog_near", p->fog_near);
cJSON_AddNumberToObject(obj, "fog_far", p->fog_far);
break;
case RE_FOG_LIGHT_SCATTERING:
indent_message(indent, "ls_beta_r = %f, ls_beta_m = %f,\n", p->ls_beta_r, p->ls_beta_m);
indent_message(indent, "ls_g = %f,\n", p->ls_g);
indent_message(indent, "ls_distance = %f,\n", p->ls_distance);
indent_message(indent, "ls_light_dir = {x=%f, y=%f, z=%f},\n", SPREAD_VEC3(p->ls_light_dir));
indent_message(indent, "ls_light_color = {r=%f, g=%f, b=%f},\n", SPREAD_VEC3(p->ls_light_color));
indent_message(indent, "ls_sun_color = {r=%f, g=%f, b=%f},\n", SPREAD_VEC3(p->ls_sun_color));
cJSON_AddNumberToObject(obj, "ls_beta_r", p->ls_beta_r);
cJSON_AddNumberToObject(obj, "ls_beta_m", p->ls_beta_m);
cJSON_AddNumberToObject(obj, "ls_g", p->ls_g);
cJSON_AddNumberToObject(obj, "ls_distance", p->ls_distance);
cJSON_AddItemToObjectCS(obj, "ls_light_dir",
vec3_point_to_json(p->ls_light_dir, verbose));
cJSON_AddItemToObjectCS(obj, "ls_light_color",
vec3_color_to_json(p->ls_light_color, verbose));
cJSON_AddItemToObjectCS(obj, "ls_sun_color",
vec3_color_to_json(p->ls_sun_color, verbose));
break;
}
for (int i = 0; i < p->nr_instances; i++)
print_instance(p->instances[i], i, indent);
cJSON_AddItemToObjectCS(obj, "instances", a = cJSON_CreateArray());
for (int i = 0; i < p->nr_instances; i++) {
if (!p->instances[i])
continue;
cJSON_AddItemToArray(a, instance_to_json(p->instances[i], i, verbose));
}
for (int i = 0; i < RE_NR_BACK_CGS; i++)
print_back_cg(&p->back_cg[i], i, indent);
cJSON_AddItemToObjectCS(obj, "back_cgs", a = cJSON_CreateArray());
for (int i = 0; i < RE_NR_BACK_CGS; i++) {
struct RE_back_cg *bcg = &p->back_cg[i];
if (!bcg->name && !bcg->no)
continue;
cJSON_AddItemToArray(a, back_cg_to_json(bcg, i, verbose));
}
return obj;
}
+1 -1
View File
@@ -216,7 +216,7 @@ struct RE_plugin *RE_plugin_new(void)
struct RE_plugin *plugin = xcalloc(1, sizeof(struct RE_plugin));
plugin->plugin.name = "ReignEngine";
plugin->plugin.update = RE_render;
plugin->plugin.debug_print = RE_debug_print;
plugin->plugin.to_json = RE_to_json;
plugin->nr_instances = 16;
plugin->instances = xcalloc(plugin->nr_instances, sizeof(struct RE_instance *));
plugin->aar = aar;
+1 -1
View File
@@ -77,7 +77,7 @@ static void send_response(cJSON *response, bool success)
send_json(response);
}
static void emit_event(const char *name, struct cJSON *body)
static void emit_event(const char *name, cJSON *body)
{
cJSON *event = cJSON_CreateObject();
cJSON_AddStringToObject(event, "type", "event");
+13 -7
View File
@@ -35,6 +35,8 @@
#include "dungeon/renderer.h"
#include "dungeon/tes.h"
#include "gfx/gfx.h"
#include "cJSON.h"
#include "json.h"
#include "sact.h"
#include "sprite.h"
#include "vm.h"
@@ -46,14 +48,14 @@
#endif
static void dungeon_render(struct sact_sprite *sp);
static void dungeon_debug_print(struct sact_sprite *sp, int indent);
static cJSON *dungeon_to_json(struct sact_sprite *sp, bool verbose);
struct dungeon_context *dungeon_context_create(enum draw_dungeon_version version, int surface)
{
struct dungeon_context *ctx = xcalloc(1, sizeof(struct dungeon_context));
ctx->plugin.name = "DrawDungeon";
ctx->plugin.update = dungeon_render;
ctx->plugin.debug_print = dungeon_debug_print;
ctx->plugin.to_json = dungeon_to_json;
ctx->version = version;
ctx->surface = surface;
struct sact_sprite *sp = sact_get_sprite(ctx->surface);
@@ -451,12 +453,16 @@ bool dungeon_save_walk_data(int surface, int map, struct page **page)
return true;
}
#define SPREAD_VEC3(v) (v)[0], (v)[1], (v)[2]
void dungeon_debug_print(struct sact_sprite *sp, int indent)
static cJSON *dungeon_to_json(struct sact_sprite *sp, bool verbose)
{
cJSON *obj, *cam;
struct dungeon_context *ctx = (struct dungeon_context *)sp->plugin;
obj = cJSON_CreateObject();
cJSON_AddStringToObject(obj, "name", ctx->plugin.name);
cJSON_AddItemToObjectCS(obj, "camera", cam = cJSON_CreateObject());
cJSON_AddItemToObjectCS(cam, "pos", vec3_point_to_json(ctx->camera.pos, verbose));
cJSON_AddNumberToObject(cam, "angle", ctx->camera.angle);
cJSON_AddNumberToObject(cam, "angle_p", ctx->camera.angle_p);
indent_message(indent, "name = \"%s\",\n", ctx->plugin.name);
indent_message(indent, "camera = {x=%f, y=%f, z=%f, angle=%f, angle_p=%f},\n", SPREAD_VEC3(ctx->camera.pos), ctx->camera.angle, ctx->camera.angle_p);
return obj;
}
+198
View File
@@ -0,0 +1,198 @@
/* Copyright (C) 2023 Nunuhara Cabbage <nunuhara@haniwa.technology>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://gnu.org/licenses/>.
*/
#include <cglm/types.h>
#include "cJSON.h"
#include "json.h"
#include "gfx/gfx.h"
#include "gfx/font.h"
#include "plugin.h"
#include "scene.h"
#include "sprite.h"
cJSON *num2_to_json(double a, double b)
{
cJSON *ar = cJSON_CreateArray();
cJSON_AddItemToArray(ar, cJSON_CreateNumber(a));
cJSON_AddItemToArray(ar, cJSON_CreateNumber(b));
return ar;
}
cJSON *num2_to_json_object(const char *a_name, double a, const char *b_name, double b)
{
cJSON *obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, a_name, a);
cJSON_AddNumberToObject(obj, b_name, b);
return obj;
}
cJSON *num3_to_json(double a, double b, double c)
{
cJSON *ar = cJSON_CreateArray();
cJSON_AddItemToArray(ar, cJSON_CreateNumber(a));
cJSON_AddItemToArray(ar, cJSON_CreateNumber(b));
cJSON_AddItemToArray(ar, cJSON_CreateNumber(c));
return ar;
}
cJSON *num3_to_json_object(const char *a_name, double a, const char *b_name, double b,
const char *c_name, double c)
{
cJSON *obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, a_name, a);
cJSON_AddNumberToObject(obj, b_name, b);
cJSON_AddNumberToObject(obj, c_name, c);
return obj;
}
cJSON *num4_to_json(double a, double b, double c, double d)
{
cJSON *ar = cJSON_CreateArray();
cJSON_AddItemToArray(ar, cJSON_CreateNumber(a));
cJSON_AddItemToArray(ar, cJSON_CreateNumber(b));
cJSON_AddItemToArray(ar, cJSON_CreateNumber(c));
cJSON_AddItemToArray(ar, cJSON_CreateNumber(d));
return ar;
}
cJSON *num4_to_json_object(const char *a_name, double a, const char *b_name, double b,
const char *c_name, double c, const char *d_name, double d)
{
cJSON *obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, a_name, a);
cJSON_AddNumberToObject(obj, b_name, b);
cJSON_AddNumberToObject(obj, c_name, c);
cJSON_AddNumberToObject(obj, d_name, d);
return obj;
}
cJSON *texture_to_json(struct texture *t, bool verbose)
{
if (!t->handle)
return cJSON_CreateNull();
cJSON *obj = cJSON_CreateObject();
if (!verbose) {
cJSON_AddItemToObjectCS(obj, "size", num2_to_json(t->w, t->h));
} else {
cJSON *size;
cJSON_AddItemToObjectCS(obj, "size", size = cJSON_CreateObject());
cJSON_AddNumberToObject(size, "w", t->w);
cJSON_AddNumberToObject(size, "h", t->h);
}
cJSON_AddBoolToObject(obj, "has_alpha", t->has_alpha);
return obj;
}
cJSON *text_style_to_json(struct text_style *ts, bool verbose)
{
cJSON *obj;
obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, "face", ts->face);
cJSON_AddNumberToObject(obj, "size", ts->size);
cJSON_AddNumberToObject(obj, "bold_width", ts->bold_width);
cJSON_AddNumberToObject(obj, "weight", ts->weight);
cJSON_AddNumberToObject(obj, "edge_left", ts->edge_left);
cJSON_AddNumberToObject(obj, "edge_up", ts->edge_up);
cJSON_AddNumberToObject(obj, "edge_right", ts->edge_right);
cJSON_AddNumberToObject(obj, "edge_down", ts->edge_down);
cJSON_AddItemToObjectCS(obj, "color", color_to_json(&ts->color, verbose));
cJSON_AddItemToObjectCS(obj, "edge_color", color_to_json(&ts->edge_color, verbose));
cJSON_AddNumberToObject(obj, "scale_x", ts->scale_x);
cJSON_AddNumberToObject(obj, "space_scale_x", ts->space_scale_x);
cJSON_AddNumberToObject(obj, "font_spacing", ts->font_spacing);
return obj;
}
cJSON *scene_sprite_to_json(struct sprite *sp, bool verbose)
{
cJSON *obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, "z", sp->z);
cJSON_AddNumberToObject(obj, "z2", sp->z2);
cJSON_AddBoolToObject(obj, "has_pixel", sp->has_pixel);
cJSON_AddBoolToObject(obj, "has_alpha", sp->has_alpha);
cJSON_AddBoolToObject(obj, "hidden", sp->hidden);
cJSON_AddBoolToObject(obj, "in_scene", sp->in_scene);
return obj;
}
static cJSON *draw_plugin_to_json(struct sact_sprite *sp, bool verbose)
{
if (!sp->plugin)
return cJSON_CreateNull();
if (sp->plugin->to_json)
return sp->plugin->to_json(sp, verbose);
cJSON *obj = cJSON_CreateObject();
cJSON_AddStringToObject(obj, "name", sp->plugin->name);
return obj;
}
static const char *draw_method_string(int draw_method)
{
switch (draw_method) {
case DRAW_METHOD_NORMAL: return "normal";
case DRAW_METHOD_SCREEN: return "screen";
case DRAW_METHOD_MULTIPLY: return "multiply";
case DRAW_METHOD_ADDITIVE: return "additive";
default: return "unknown";
}
}
cJSON *sprite_to_json(struct sact_sprite *sp, bool verbose)
{
cJSON *obj, *sprite;
obj = cJSON_CreateObject();
cJSON_AddItemToObjectCS (obj, "sprite", sprite = cJSON_CreateObject());
cJSON_AddNumberToObject(sprite, "no", sp->no);
cJSON_AddNumberToObject(sprite, "z", sp->sp.z);
cJSON_AddNumberToObject(sprite, "z2", sp->sp.z2);
cJSON_AddBoolToObject(sprite, "has_pixel", sp->sp.has_pixel);
cJSON_AddBoolToObject(sprite, "has_alpha", sp->sp.has_alpha);
cJSON_AddBoolToObject(sprite, "hidden", sp->sp.hidden);
cJSON_AddBoolToObject(sprite, "in_scene", sp->sp.in_scene);
cJSON_AddItemToObjectCS(obj, "texture", texture_to_json(&sp->texture, verbose));
cJSON_AddItemToObjectCS(obj, "color", color_to_json(&sp->color, verbose));
if (verbose || sp->multiply_color.r != 255 || sp->multiply_color.g != 255
|| sp->multiply_color.b != 255)
cJSON_AddItemToObjectCS(obj, "mul_color", color_to_json(&sp->multiply_color, verbose));
if (verbose || sp->add_color.r || sp->add_color.g || sp->add_color.b)
cJSON_AddItemToObjectCS(obj, "add_color", color_to_json(&sp->add_color, verbose));
if (verbose || sp->blend_rate != 255)
cJSON_AddNumberToObject(obj, "blend_rate", sp->blend_rate);
if (verbose || sp->draw_method != DRAW_METHOD_NORMAL)
cJSON_AddStringToObject(obj, "draw_method", draw_method_string(sp->draw_method));
cJSON_AddItemToObjectCS(obj, "rect", rectangle_to_json(&sp->rect, verbose));
if (verbose || sp->cg_no)
cJSON_AddNumberToObject(obj, "cg_no", sp->cg_no);
if (verbose || sp->text.texture.handle) {
cJSON *text;
cJSON_AddItemToObjectCS(obj, "text", text = cJSON_CreateObject());
cJSON_AddItemToObjectCS(text, "texture", texture_to_json(&sp->text.texture, verbose));
if (verbose || sp->text.home.x || sp->text.home.y)
cJSON_AddItemToObjectCS(text, "home", point_to_json(&sp->text.home, verbose));
cJSON_AddItemToObjectCS(text, "pos", point_to_json(&sp->text.pos, verbose));
if (verbose || sp->text.char_space)
cJSON_AddNumberToObject(text, "char_space", sp->text.char_space);
if (verbose || sp->text.line_space)
cJSON_AddNumberToObject(text, "line_space", sp->text.line_space);
}
if (verbose || sp->plugin)
cJSON_AddItemToObjectCS(obj, "plugin", draw_plugin_to_json(sp, verbose));
return obj;
}
+1
View File
@@ -20,6 +20,7 @@ xsystem4 = [version_h,
'heap.c',
'id_pool.c',
'input.c',
'json.c',
'msgqueue.c',
'page.c',
'resume.c',
+224 -242
View File
@@ -17,202 +17,247 @@
#include "system4.h"
#include "system4/cg.h"
#include "system4/string.h"
#include "system4/utfsjis.h"
#include "xsystem4.h"
#include "cJSON.h"
#include "json.h"
#include "parts_internal.h"
static void parts_cg_print(struct parts_cg *cg, int indent)
static void cJSON_AddSjisToObject(cJSON *obj, const char *name, const char *sjis)
{
indent_message(indent, "cg.no = %d,\n", cg->no);
// TODO: can avoid copy by implementing this as part of cJSON proper
char *utf = sjis2utf(sjis, 0);
cJSON_AddStringToObject(obj, name, utf);
free(utf);
}
static void parts_text_print(struct parts_text *text, int indent)
static void parts_cg_to_json(struct parts_cg *cg, cJSON *out, bool verbose)
{
indent_message(indent, "text.lines = {\n");
cJSON_AddNumberToObject(out, "no", cg->no);
}
static void parts_text_to_json(struct parts_text *text, cJSON *out, bool verbose)
{
cJSON *lines;
cJSON_AddItemToObjectCS(out, "lines", lines = cJSON_CreateArray());
for (unsigned i = 0; i < text->nr_lines; i++) {
cJSON *line;
struct string *s = parts_text_line_get(&text->lines[i]);
indent_message(indent+1, "contents = \"%s\",\n", display_sjis0(s->text));
indent_message(indent+1, "width = %u,\n", text->lines[i].width);
indent_message(indent+1, "height = %u,\n", text->lines[i].height);
cJSON_AddItemToArray(lines, line = cJSON_CreateObject());
cJSON_AddSjisToObject(line, "contents", s->text);
cJSON_AddNumberToObject(line, "width", text->lines[i].width);
cJSON_AddNumberToObject(line, "height", text->lines[i].height);
free_string(s);
}
indent_message(indent, "},\n");
indent_message(indent, "text.line_space = %u,\n", text->line_space);
indent_message(indent, "text.cursor = ");
gfx_print_point(&text->cursor);
sys_message(",\n");
indent_message(indent, "text.ts = ");
gfx_print_text_style(&text->ts, indent);
sys_message("\n");
cJSON_AddNumberToObject(out, "line_space", text->line_space);
cJSON_AddItemToObjectCS(out, "cursor", point_to_json(&text->cursor, verbose));
cJSON_AddItemToObjectCS(out, "text_style", text_style_to_json(&text->ts, verbose));
}
static void parts_animation_print(struct parts_animation *anim, int indent)
static void parts_animation_to_json(struct parts_animation *anim, cJSON *out, bool verbose)
{
indent_message(indent, "anim.start_no = %u,\n", anim->start_no);
indent_message(indent, "anim.frame_time = %u,\n", anim->frame_time);
indent_message(indent, "anim.elapsed = %u,\n", anim->elapsed);
indent_message(indent, "anim.current_frame = %u,\n", anim->current_frame);
indent_message(indent, "anim.frames = {\n");
cJSON *frames;
cJSON_AddNumberToObject(out, "start_no", anim->start_no);
cJSON_AddNumberToObject(out, "frame_time", anim->frame_time);
cJSON_AddNumberToObject(out, "elapsed", anim->elapsed);
cJSON_AddNumberToObject(out, "current_frame", anim->current_frame);
cJSON_AddItemToObjectCS(out, "frames", frames = cJSON_CreateArray());
for (unsigned i = 0; i < anim->nr_frames; i++) {
indent_message(indent+1, "[%u] = ", i);
gfx_print_texture(&anim->frames[i], indent+1);
indent_message(indent+1, ",\n");
cJSON_AddItemToArray(frames, texture_to_json(&anim->frames[i], verbose));
}
indent_message(indent, "}\n");
}
static void parts_numeral_print(struct parts_numeral *num, int indent)
static void parts_numeral_to_json(struct parts_numeral *num, cJSON *out, bool verbose)
{
indent_message(indent, "num.have_num = %s,\n", num->have_num ? "true" : "false");
indent_message(indent, "num.num = %d,\n", num->num);
indent_message(indent, "num.space = %d,\n", num->space);
indent_message(indent, "num.show_comma = %d,\n", num->show_comma);
indent_message(indent, "num.length = %d,\n", num->length);
indent_message(indent, "num.cg_no = %d,\n", num->cg_no);
indent_message(indent, "num.cg = {\n");
cJSON *cg;
cJSON_AddBoolToObject(out, "have_num", num->have_num);
cJSON_AddNumberToObject(out, "num", num->num);
cJSON_AddNumberToObject(out, "space", num->space);
cJSON_AddBoolToObject(out, "show_comma", num->show_comma);
cJSON_AddNumberToObject(out, "length", num->length);
cJSON_AddNumberToObject(out, "cg_no", num->cg_no);
cJSON_AddItemToObjectCS(out, "cg", cg = cJSON_CreateArray());
for (int i = 0; i < 12; i++) {
indent_message(indent+1, "[%d] = ", i);
gfx_print_texture(&num->cg[i], indent+1);
indent_message(indent+1, ",\n");
cJSON_AddItemToArray(cg, texture_to_json(&num->cg[i], verbose));
}
indent_message(indent, "}\n");
}
static void parts_gauge_print(struct parts_gauge *gauge, int indent)
static void parts_gauge_to_json(struct parts_gauge *gauge, cJSON *out, bool verbose)
{
indent_message(indent, "gauge.cg = ");
gfx_print_texture(&gauge->cg, indent);
cJSON_AddItemToObject(out, "cg", texture_to_json(&gauge->cg, verbose));
}
static void parts_construction_process_print(struct parts_construction_process *cproc, int indent)
static void parts_construction_process_to_json(struct parts_construction_process *cproc,
cJSON *out, bool verbose)
{
static const char *type_names[PARTS_NR_CP_TYPES] = {
[PARTS_CP_CREATE] = "PARTS_CP_CREATE",
[PARTS_CP_CREATE_PIXEL_ONLY] = "PARTS_CP_CREATE_PIXEL_ONLY",
[PARTS_CP_CG] = "PARTS_CP_CG",
[PARTS_CP_FILL] = "PARTS_CP_FILL",
[PARTS_CP_FILL_ALPHA_COLOR] = "PARTS_CP_FILL_ALPHA_COLOR",
[PARTS_CP_FILL_AMAP] = "PARTS_CP_FILL_AMAP",
[PARTS_CP_DRAW_CUT_CG] = "PARTS_CP_DRAW_CUT_CG",
[PARTS_CP_COPY_CUT_CG] = "PARTS_CP_COPY_CUT_CG",
[PARTS_CP_DRAW_TEXT] = "PARTS_CP_DRAW_TEXT",
[PARTS_CP_COPY_TEXT] = "PARTS_CP_COPY_TEXT",
[PARTS_CP_CREATE] = "create",
[PARTS_CP_CREATE_PIXEL_ONLY] = "create_pixel_only",
[PARTS_CP_CG] = "cg",
[PARTS_CP_FILL] = "fill",
[PARTS_CP_FILL_ALPHA_COLOR] = "fill_alpha_color",
[PARTS_CP_FILL_AMAP] = "fill_amap",
[PARTS_CP_DRAW_CUT_CG] = "draw_cut_cg",
[PARTS_CP_COPY_CUT_CG] = "copy_cut_cg",
[PARTS_CP_DRAW_TEXT] = "draw_text",
[PARTS_CP_COPY_TEXT] = "copy_text",
};
indent_message(indent, "cproc.ops = {\n");
indent++;
cJSON *ops, *tmp;
cJSON_AddItemToObjectCS(out, "operations", ops = cJSON_CreateArray());
int i = 0;
struct parts_cp_op *op;
TAILQ_FOREACH(op, &cproc->ops, entry) {
indent_message(indent, "[%d] = {\n", i++);
indent++;
const char *type = "INVALID_CONSTRUCTION_PROCERSS_TYPE";
const char *type = "invalid";
if (op->type >= 0 && op->type < PARTS_NR_CP_TYPES)
type = type_names[op->type];
indent_message(indent, "type = %s,\n", type);
cJSON *obj;
cJSON_AddItemToArray(ops, obj = cJSON_CreateObject());
cJSON_AddStringToObject(obj, "type", type);
switch (op->type) {
case PARTS_CP_CREATE:
case PARTS_CP_CREATE_PIXEL_ONLY:
indent_message(indent, "create = {w=%d,h=%d}\n", op->create.w, op->create.h);
cJSON_AddItemToObjectCS(obj, "size", tmp = cJSON_CreateObject());
cJSON_AddNumberToObject(tmp, "w", op->create.w);
cJSON_AddNumberToObject(tmp, "h", op->create.h);
break;
case PARTS_CP_CG:
indent_message(indent, "cg.no = %d\n", op->cg.no);
cJSON_AddNumberToObject(obj, "no", op->cg.no);
break;
case PARTS_CP_FILL:
case PARTS_CP_FILL_ALPHA_COLOR:
case PARTS_CP_FILL_AMAP:
indent_message(indent, "fill.rect = {x=%d,y=%d,w=%d,h=%d},\n",
op->fill.x, op->fill.y, op->fill.w, op->fill.h);
indent_message(indent, "fill.color = (%d,%d,%d,%d)\n",
op->fill.r, op->fill.g, op->fill.b, op->fill.a);
cJSON_AddItemToObjectCS(obj, "rect", tmp = cJSON_CreateObject());
cJSON_AddNumberToObject(tmp, "x", op->fill.x);
cJSON_AddNumberToObject(tmp, "y", op->fill.y);
cJSON_AddNumberToObject(tmp, "w", op->fill.w);
cJSON_AddNumberToObject(tmp, "h", op->fill.h);
cJSON_AddItemToObjectCS(obj, "color", tmp = cJSON_CreateObject());
cJSON_AddNumberToObject(tmp, "r", op->fill.r);
cJSON_AddNumberToObject(tmp, "g", op->fill.g);
cJSON_AddNumberToObject(tmp, "b", op->fill.b);
cJSON_AddNumberToObject(tmp, "a", op->fill.a);
break;
case PARTS_CP_DRAW_CUT_CG:
case PARTS_CP_COPY_CUT_CG:
indent_message(indent, "cut_cg.cg_no = %d,\n", op->cut_cg.cg_no);
indent_message(indent, "cut_cg.dst = {x=%d,y=%d,w=%d,h=%d},\n",
op->cut_cg.dx, op->cut_cg.dy, op->cut_cg.dw, op->cut_cg.dh);
indent_message(indent, "cut_cg.src = {x=%d,y=%d,w=%d,h=%d},\n",
op->cut_cg.sx, op->cut_cg.sy, op->cut_cg.sw, op->cut_cg.sh);
indent_message(indent, "cut_cg.interp_type = %d\n", op->cut_cg.interp_type);
cJSON_AddNumberToObject(obj, "no", op->cut_cg.cg_no);
cJSON_AddItemToObjectCS(obj, "dst", tmp = cJSON_CreateObject());
cJSON_AddNumberToObject(tmp, "x", op->cut_cg.dx);
cJSON_AddNumberToObject(tmp, "y", op->cut_cg.dy);
cJSON_AddNumberToObject(tmp, "w", op->cut_cg.dw);
cJSON_AddNumberToObject(tmp, "h", op->cut_cg.dh);
cJSON_AddItemToObjectCS(obj, "src", tmp = cJSON_CreateObject());
cJSON_AddNumberToObject(tmp, "x", op->cut_cg.sx);
cJSON_AddNumberToObject(tmp, "y", op->cut_cg.sy);
cJSON_AddNumberToObject(tmp, "w", op->cut_cg.sw);
cJSON_AddNumberToObject(tmp, "h", op->cut_cg.sh);
cJSON_AddNumberToObject(obj, "interp_type", op->cut_cg.interp_type);
break;
case PARTS_CP_DRAW_TEXT:
case PARTS_CP_COPY_TEXT:
indent_message(indent, "text.text = \"%s\",\n", display_sjis0(op->text.text->text));
indent_message(indent, "text.pos = {x=%d,y=%d},\n", op->text.x, op->text.y);
indent_message(indent, "text.line_space = %d,\n", op->text.line_space);
indent_message(indent, "text.style = ");
gfx_print_text_style(&op->text.style, indent);
sys_message("\n");
cJSON_AddSjisToObject(obj, "text", op->text.text->text);
cJSON_AddItemToObjectCS(obj, "pos", tmp = cJSON_CreateObject());
cJSON_AddNumberToObject(tmp, "x", op->text.x);
cJSON_AddNumberToObject(tmp, "y", op->text.y);
cJSON_AddNumberToObject(obj, "line_space", op->text.line_space);
cJSON_AddItemToObjectCS(obj, "style", text_style_to_json(&op->text.style, verbose));
break;
}
indent--;
indent_message(indent, "},\n");
}
indent--;
indent_message(indent, "}\n");
}
static void parts_print_state(struct parts_state *state, int indent)
static cJSON *parts_state_to_json(struct parts_state *state, bool verbose)
{
if (state->type == PARTS_UNINITIALIZED) {
sys_message("UNINITIALIZED");
return;
}
sys_message("{\n");
indent++;
static const char *state_types[PARTS_NR_TYPES] = {
[PARTS_UNINITIALIZED] = "uninitialized",
[PARTS_CG] = "cg",
[PARTS_TEXT] = "text",
[PARTS_ANIMATION] = "animation",
[PARTS_NUMERAL] = "numeral",
[PARTS_HGAUGE] = "hgauge",
[PARTS_VGAUGE] = "vgauge",
[PARTS_CONSTRUCTION_PROCESS] = "construction_process"
};
const char *type = "invalid";
if (state->type >= 0 && state->type < PARTS_NR_TYPES)
type = state_types[state->type];
struct parts_common *com = &state->common;
cJSON *obj = cJSON_CreateObject();
cJSON_AddStringToObject(obj, "type", type);
indent_message(indent, "dims = {w=%d,h=%d},\n", state->common.w, state->common.h);
indent_message(indent, "origin_offset = "); gfx_print_point(&com->origin_offset); sys_message(",\n");
indent_message(indent, "hitbox = "); gfx_print_rectangle(&com->hitbox); sys_message(",\n");
indent_message(indent, "surface_area = "); gfx_print_rectangle(&com->surface_area); sys_message(",\n");
switch (state->type) {
case PARTS_UNINITIALIZED:
break;
case PARTS_CG:
parts_cg_print(&state->cg, indent);
parts_cg_to_json(&state->cg, obj, verbose);
break;
case PARTS_TEXT:
parts_text_print(&state->text, indent);
parts_text_to_json(&state->text, obj, verbose);
break;
case PARTS_ANIMATION:
parts_animation_print(&state->anim, indent);
parts_animation_to_json(&state->anim, obj, verbose);
break;
case PARTS_NUMERAL:
parts_numeral_print(&state->num, indent);
parts_numeral_to_json(&state->num, obj, verbose);
break;
case PARTS_HGAUGE:
case PARTS_VGAUGE:
parts_gauge_print(&state->gauge, indent);
parts_gauge_to_json(&state->gauge, obj, verbose);
break;
case PARTS_CONSTRUCTION_PROCESS:
parts_construction_process_print(&state->cproc, indent);
parts_construction_process_to_json(&state->cproc, obj, verbose);
break;
default:
break;
}
indent--;
indent_message(indent, "}");
return obj;
}
static void parts_print_motion_param(union parts_motion_param param, enum parts_motion_type type)
static cJSON *parts_params_to_json(struct parts_params *params, bool verbose)
{
cJSON *obj, *tmp;
obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, "z", params->z);
cJSON_AddItemToObjectCS(obj, "pos", point_to_json(&params->pos, verbose));
cJSON_AddBoolToObject(obj, "show", params->show);
cJSON_AddNumberToObject(obj, "alpha", params->alpha);
cJSON_AddItemToObjectCS(obj, "scale", tmp = cJSON_CreateObject());
cJSON_AddNumberToObject(tmp, "x", params->scale.x);
cJSON_AddNumberToObject(tmp, "y", params->scale.y);
cJSON_AddItemToObjectCS(obj, "rotation", tmp = cJSON_CreateObject());
cJSON_AddNumberToObject(tmp, "x", params->rotation.x);
cJSON_AddNumberToObject(tmp, "y", params->rotation.y);
cJSON_AddNumberToObject(tmp, "z", params->rotation.z);
cJSON_AddItemToObjectCS(obj, "add_color", color_to_json(&params->add_color, verbose));
cJSON_AddItemToObjectCS(obj, "mul_color", color_to_json(&params->multiply_color, verbose));
return obj;
}
static cJSON *parts_motion_param_to_json(union parts_motion_param param, enum parts_motion_type type)
{
cJSON *obj;
switch (type) {
case PARTS_MOTION_POS:
sys_message("{x=%d,y=%d}", param.x, param.y);
break;
obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, "x", param.x);
cJSON_AddNumberToObject(obj, "y", param.y);
return obj;
case PARTS_MOTION_VIBRATION_SIZE:
sys_message("{w=%d,h=%d}", param.x, param.y);
break;
obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, "w", param.x);
cJSON_AddNumberToObject(obj, "h", param.y);
return obj;
case PARTS_MOTION_ALPHA:
case PARTS_MOTION_CG:
case PARTS_MOTION_NUMERAL_NUMBER:
sys_message("%d", param.i);
break;
return cJSON_CreateNumber(param.i);
case PARTS_MOTION_HGAUGE_RATE:
case PARTS_MOTION_VGAUGE_RATE:
case PARTS_MOTION_MAG_X:
@@ -220,174 +265,105 @@ static void parts_print_motion_param(union parts_motion_param param, enum parts_
case PARTS_MOTION_ROTATE_X:
case PARTS_MOTION_ROTATE_Y:
case PARTS_MOTION_ROTATE_Z:
sys_message("%f", param.f);
break;
return cJSON_CreateNumber(param.f);
}
return cJSON_CreateNull();
}
static void parts_print_motion(struct parts_motion *motion, int indent)
static cJSON *parts_motion_to_json(struct parts_motion *motion)
{
static const char *type_names[PARTS_NR_MOTION_TYPES] = {
[PARTS_MOTION_POS] = "PARTS_MOTION_POS",
[PARTS_MOTION_ALPHA] = "PARTS_MOTION_ALPHA",
[PARTS_MOTION_CG] = "PARTS_MOTION_CG",
[PARTS_MOTION_HGAUGE_RATE] = "PARTS_MOTION_HGAUGE_RATE",
[PARTS_MOTION_VGAUGE_RATE] = "PARTS_MOTION_VGAUGE_RATE",
[PARTS_MOTION_NUMERAL_NUMBER] = "PARTS_MOTION_NUMERAL_NUMBER",
[PARTS_MOTION_MAG_X] = "PARTS_MOTION_MAG_X",
[PARTS_MOTION_MAG_Y] = "PARTS_MOTION_MAG_Y",
[PARTS_MOTION_ROTATE_X] = "PARTS_MOTION_ROTATE_X",
[PARTS_MOTION_ROTATE_Y] = "PARTS_MOTION_ROTATE_Y",
[PARTS_MOTION_ROTATE_Z] = "PARTS_MOTION_ROTATE_Z",
[PARTS_MOTION_VIBRATION_SIZE] = "PARTS_MOTION_VIBRATION_SIZE"
[PARTS_MOTION_POS] = "pos",
[PARTS_MOTION_ALPHA] = "alpha",
[PARTS_MOTION_CG] = "cg",
[PARTS_MOTION_HGAUGE_RATE] = "hgauge_rate",
[PARTS_MOTION_VGAUGE_RATE] = "vgauge_rate",
[PARTS_MOTION_NUMERAL_NUMBER] = "numeral_number",
[PARTS_MOTION_MAG_X] = "mag_x",
[PARTS_MOTION_MAG_Y] = "mag_y",
[PARTS_MOTION_ROTATE_X] = "rotate_x",
[PARTS_MOTION_ROTATE_Y] = "rotate_y",
[PARTS_MOTION_ROTATE_Z] = "rotate_z",
[PARTS_MOTION_VIBRATION_SIZE] = "vibration_size"
};
const char *type = "INVALID_MOTION_TYPE";
const char *type = "invalid";
if (motion->type >= 0 && motion->type < PARTS_NR_MOTION_TYPES)
type = type_names[motion->type];
sys_message("{\n");
indent++;
cJSON *obj;
indent_message(indent, "type = %s,\n", type);
indent_message(indent, "begin = ");
parts_print_motion_param(motion->begin, motion->type);
sys_message(",\n");
indent_message(indent, "end = ");
parts_print_motion_param(motion->end, motion->type);
sys_message(",\n");
indent_message(indent, "begin_time = %d,\n", motion->begin_time);
indent_message(indent, "end_time = %d,\n", motion->end_time);
indent--;
indent_message(indent, "}");
obj = cJSON_CreateObject();
cJSON_AddStringToObject(obj, "type", type);
cJSON_AddItemToObjectCS(obj, "begin", parts_motion_param_to_json(motion->begin, motion->type));
cJSON_AddItemToObjectCS(obj, "end", parts_motion_param_to_json(motion->end, motion->type));
cJSON_AddNumberToObject(obj, "begin_time", motion->begin_time);
cJSON_AddNumberToObject(obj, "end_time", motion->end_time);
return obj;
}
static void parts_print_params(struct parts_params *global, struct parts_params *local, int indent)
{
sys_message("{\n");
indent++;
indent_message(indent, "z = %d (%d),\n", global->z, local->z);
indent_message(indent, "pos = ");
gfx_print_point(&global->pos);
sys_message(" (");
gfx_print_point(&local->pos);
sys_message("),\n");
indent_message(indent, "show = %s (%s),\n", global->show ? "true" : "false",
local->show ? "true" : "false");
indent_message(indent, "alpha = %u (%u),\n", (unsigned)global->alpha, (unsigned)local->alpha);
indent_message(indent, "scale = {x=%f,y=%f} ({x=%f,y=%f}),\n", global->scale.x, global->scale.y,
local->scale.x, local->scale.y);
indent_message(indent, "rotation = {x=%f,y=%f,z=%f} ({x=%f,y=%f,z=%f}),\n",
global->rotation.x, global->rotation.y, global->rotation.z,
local->rotation.x, local->rotation.y, local->rotation.z);
indent_message(indent, "add_color = ");
gfx_print_color(&global->add_color);
sys_message(" (");
gfx_print_color(&local->add_color);
sys_message("),\n");
indent_message(indent, "multiply_color = ");
gfx_print_color(&global->multiply_color);
sys_message(" (");
gfx_print_color(&local->multiply_color);
sys_message("),\n");
indent--;
indent_message(indent, "}");
}
static void _parts_print(struct parts *parts, int indent)
cJSON *parts_to_json(struct parts *parts, bool verbose)
{
static const char *state_names[PARTS_NR_STATES] = {
[PARTS_STATE_DEFAULT] = "PARTS_STATE_DEFAULT",
[PARTS_STATE_HOVERED] = "PARTS_STATE_HOVERED",
[PARTS_STATE_CLICKED] = "PARTS_STATE_CLICKED"
[PARTS_STATE_DEFAULT] = "default",
[PARTS_STATE_HOVERED] = "hovered",
[PARTS_STATE_CLICKED] = "clicked"
};
const char *state = "INVALID_PARTS_STATE";
const char *state = "invalid";
if (parts->state >= 0 && parts->state < PARTS_NR_STATES)
state = state_names[parts->state];
indent_message(indent, "parts %d = {\n", parts->no);
indent++;
cJSON *obj, *motions, *children;
// print states
indent_message(indent, "state = %s,\n", state);
for (int i = 0; i < PARTS_NR_STATES; i++) {
if (parts->states[i].type == PARTS_UNINITIALIZED && i != parts->state)
continue;
indent_message(indent, "state[%s] = ", state_names[i]);
parts_print_state(&parts->states[i], indent);
sys_message(",\n");
}
// print params
indent_message(indent, "local = ");
parts_print_params(&parts->global, &parts->local, indent);
sys_message(",\n");
// print misc. data
obj = cJSON_CreateObject();
cJSON_AddNumberToObject(obj, "no", parts->no);
cJSON_AddStringToObject(obj, "state", state);
cJSON_AddItemToObjectCS(obj, "default", parts_state_to_json(&parts->states[PARTS_STATE_DEFAULT], verbose));
cJSON_AddItemToObjectCS(obj, "hovered", parts_state_to_json(&parts->states[PARTS_STATE_HOVERED], verbose));
cJSON_AddItemToObjectCS(obj, "clicked", parts_state_to_json(&parts->states[PARTS_STATE_CLICKED], verbose));
cJSON_AddItemToObjectCS(obj, "local", parts_params_to_json(&parts->local, verbose));
cJSON_AddItemToObjectCS(obj, "global", parts_params_to_json(&parts->global, verbose));
if (parts->delegate_index >= 0)
indent_message(indent, "delegate_index = %d,\n", parts->delegate_index);
indent_message(indent, "sprite_deform = %d,\n", parts->sprite_deform);
indent_message(indent, "clickable = %s,\n", parts->clickable ? "true" : "false");
cJSON_AddNumberToObject(obj, "delegate_index", parts->delegate_index);
cJSON_AddNumberToObject(obj, "sprite_deform", parts->sprite_deform);
cJSON_AddBoolToObject(obj, "clickable", parts->clickable);
if (parts->on_cursor_sound >= 0)
indent_message(indent, "on_cursor_sound = %d,\n", parts->on_cursor_sound);
cJSON_AddNumberToObject(obj, "on_cursor_sound", parts->on_cursor_sound);
if (parts->on_click_sound >= 0)
indent_message(indent, "on_click_sound = %d,\n", parts->on_click_sound);
indent_message(indent, "origin_mode = %d,\n", parts->origin_mode);
indent_message(indent, "parent = %d,\n", parts->parent ? parts->parent->no : -1);
cJSON_AddNumberToObject(obj, "on_click_sound", parts->on_click_sound);
cJSON_AddNumberToObject(obj, "origin_mode", parts->origin_mode);
cJSON_AddNumberToObject(obj, "parent", parts->parent ? parts->parent->no : -1);
if (parts->linked_to >= 0)
indent_message(indent, "linked_to = %d,\n", parts->linked_to);
cJSON_AddNumberToObject(obj, "linked_to", parts->linked_to);
if (parts->linked_from >= 0)
indent_message(indent, "linked_from = %d,\n", parts->linked_from);
indent_message(indent, "draw_filter = %d,\n", parts->draw_filter);
cJSON_AddNumberToObject(obj, "linked_from", parts->linked_from);
cJSON_AddNumberToObject(obj, "draw_filter", parts->draw_filter);
// print motion data
if (TAILQ_EMPTY(&parts->motion)) {
indent_message(indent, "motion = {},\n");
} else {
indent_message(indent, "motion = {\n");
int i = 0;
struct parts_motion *motion;
TAILQ_FOREACH(motion, &parts->motion, entry) {
indent_message(indent+1, "[%d] = ", i++);
parts_print_motion(motion, indent+1);
sys_message(",\n");
}
indent_message(indent, "},\n");
cJSON_AddItemToObjectCS(obj, "motions", motions = cJSON_CreateArray());
struct parts_motion *motion;
TAILQ_FOREACH(motion, &parts->motion, entry) {
cJSON_AddItemToArray(motions, parts_motion_to_json(motion));
}
// print children
if (TAILQ_EMPTY(&parts->children)) {
} else {
indent_message(indent, "children = {\n");
struct parts *child;
PARTS_FOREACH_CHILD(child, parts) {
_parts_print(child, indent+1);
sys_message(",\n");
}
indent_message(indent, "},\n");
cJSON_AddItemToObjectCS(obj, "children", children = cJSON_CreateArray());
struct parts *child;
PARTS_FOREACH_CHILD(child, parts) {
cJSON_AddItemToArray(children, parts_to_json(child, verbose));
}
indent--;
indent_message(indent, "}");
return obj;
}
void parts_print(struct parts *parts)
cJSON *parts_engine_to_json(bool verbose)
{
_parts_print(parts, 0);
putchar('\n');
}
cJSON *a = cJSON_CreateArray();
void parts_engine_print(void)
{
struct parts *parts;
PARTS_LIST_FOREACH(parts) {
if (!parts->parent)
parts_print(parts);
cJSON_AddItemToArray(a, parts_to_json(parts, verbose));
}
return a;
}
#ifdef DEBUGGER_ENABLED
@@ -408,7 +384,13 @@ static void parts_cmd_parts(unsigned nr_args, char **args)
if (!parts)
return;
parts_print(parts);
cJSON *json = parts_to_json(parts, true);
char *text = cJSON_Print(json);
sys_message("%s\n", text);
free(text);
cJSON_Delete(json);
}
static void parts_list_print(struct parts *parts, int indent)
+3 -2
View File
@@ -21,6 +21,7 @@
#include "gfx/font.h"
#include "queue.h"
typedef struct cJSON cJSON;
struct string;
// NOTE: actual value is +1
@@ -95,6 +96,7 @@ enum parts_type {
PARTS_HGAUGE,
PARTS_VGAUGE,
PARTS_CONSTRUCTION_PROCESS,
#define PARTS_NR_TYPES (PARTS_CONSTRUCTION_PROCESS+1)
};
struct parts_common {
@@ -328,8 +330,7 @@ bool parts_build_construction_process(struct parts *parts,
// debug.c
void parts_debug_init(void);
void parts_print(struct parts *parts);
void parts_engine_print(void);
cJSON *parts_engine_to_json(bool verbose);
static inline bool parts_state_valid(int state)
{
+3 -3
View File
@@ -146,9 +146,9 @@ void parts_dirty(possibly_unused struct parts *parts)
parts_engine_dirty();
}
static void _parts_engine_print(possibly_unused struct sprite *_)
static cJSON *_parts_engine_to_json(struct sprite *_, bool verbose)
{
parts_engine_print();
return parts_engine_to_json(verbose);
}
void parts_render_init(void)
@@ -158,7 +158,7 @@ void parts_render_init(void)
goat_sprite.has_pixel = true;
goat_sprite.has_alpha = true;
goat_sprite.render = parts_engine_render;
goat_sprite.debug_print = _parts_engine_print;
goat_sprite.to_json = _parts_engine_to_json;
scene_register_sprite(&goat_sprite);
gfx_load_shader(&parts_shader.shader, "shaders/render.v.glsl", "shaders/parts.f.glsl");
+7 -21
View File
@@ -22,7 +22,9 @@
#include "system4/cg.h"
#include "asset_manager.h"
#include "cJSON.h"
#include "gfx/gfx.h"
#include "json.h"
#include "queue.h"
#include "scene.h"
#include "xsystem4.h"
@@ -137,30 +139,14 @@ void scene_set_sprite_z2(struct sprite *sp, int z, int z2)
}
}
void scene_print_sprite(struct sprite *sp, int indent)
{
sys_message("{\n");
indent++;
indent_message(indent, "z = (%d,%d),\n", sp->z, sp->z2);
indent_message(indent, "has_pixel = %s,\n", sp->has_pixel ? "true" : "false");
indent_message(indent, "has_alpha = %s,\n", sp->has_alpha ? "true" : "false");
indent_message(indent, "hidden = %s,\n", sp->hidden ? "true" : "false");
indent_message(indent, "in_scene = %s,\n", sp->in_scene ? "true" : "false");
indent--;
sys_message("}");
}
void scene_print(void)
{
struct sprite *p;
TAILQ_FOREACH(p, &sprite_list, entry) {
if (p->debug_print) {
p->debug_print(p);
} else {
sys_message("unknown_scene_entity ");
scene_print_sprite(p, 0);
putchar('\n');
}
cJSON *json = p->to_json ? p->to_json(p, false) : scene_sprite_to_json(p, false);
char *text = cJSON_Print(json);
sys_message("%s\n", text);
free(text);
cJSON_Delete(json);
}
}
+6 -84
View File
@@ -29,6 +29,7 @@
#include "input.h"
#include "gfx/gfx.h"
#include "gfx/font.h"
#include "json.h"
#include "plugin.h"
#include "sprite.h"
#include "vm.h"
@@ -175,9 +176,9 @@ struct texture *sprite_get_texture(struct sact_sprite *sp)
return &sp->texture;
}
static void _sprite_print(struct sprite *sp)
static cJSON *_sprite_to_json(struct sprite *sp, bool verbose)
{
sprite_print((struct sact_sprite*)sp);
return sprite_to_json((struct sact_sprite*)sp, verbose);
}
void sprite_set_cg(struct sact_sprite *sp, struct cg *cg)
@@ -189,7 +190,7 @@ void sprite_set_cg(struct sact_sprite *sp, struct cg *cg)
sp->sp.has_pixel = true;
sp->sp.has_alpha = cg->metrics.has_alpha;
sp->sp.render = sprite_render;
sp->sp.debug_print = _sprite_print;
sp->sp.to_json = _sprite_to_json;
sprite_dirty(sp);
}
@@ -218,7 +219,7 @@ void sprite_set_cg_2x(struct sact_sprite *sp, struct cg *cg)
sp->sp.has_pixel = true;
sp->sp.has_alpha = cg->metrics.has_alpha;
sp->sp.render = sprite_render;
sp->sp.debug_print = _sprite_print;
sp->sp.to_json = _sprite_to_json;
sprite_dirty(sp);
gfx_delete_texture(&tmp);
}
@@ -283,7 +284,7 @@ void sprite_init_color(struct sact_sprite *sp, int w, int h, int r, int g, int b
sp->sp.has_pixel = true;
sp->sp.has_alpha = a >= 0;
sp->sp.render = sprite_render;
sp->sp.debug_print = _sprite_print;
sp->sp.to_json = _sprite_to_json;
sprite_dirty(sp);
}
@@ -465,82 +466,3 @@ void sprite_call_plugins(void)
sp->plugin->update(sp);
}
}
void gfx_print_color(SDL_Color *c)
{
sys_message("(%d,%d,%d,%d)", c->r, c->g, c->b, c->a);
}
void gfx_print_rectangle(Rectangle *r)
{
sys_message("{x=%d,y=%d,w=%d,h=%d}", r->x, r->y, r->w, r->h);
}
void gfx_print_point(Point *p)
{
sys_message("{x=%d,y=%d}", p->x, p->y);
}
void gfx_print_texture(struct texture *t, int indent)
{
sys_message("{\n");
indent_message(indent+1, "initialized = %s,\n", t->handle ? "true" : "false");
indent_message(indent+1, "size = (%d,%d),\n", t->w, t->h);
indent_message(indent+1, "has_alpha = %s,\n", t->has_alpha ? "true" : "false");
indent_message(indent, "}");
}
void sprite_print(struct sact_sprite *sp)
{
int indent = 0;
indent_message(indent, "sprite %d = {\n", sp->no);
indent++;
indent_message(indent, "sp = {\n");
indent++;
indent_message(indent, "z = (%d,%d),\n", sp->sp.z, sp->sp.z2);
indent_message(indent, "has_pixel = %s,\n", sp->sp.has_pixel ? "true" : "false");
indent_message(indent, "has_alpha = %s,\n", sp->sp.has_alpha ? "true" : "false");
indent_message(indent, "hidden = %s,\n", sp->sp.hidden ? "true" : "false");
indent_message(indent, "in_scene = %s,\n", sp->sp.in_scene ? "true" : "false");
indent--;
indent_message(indent, "},\n");
indent_message(indent, "texture = "); gfx_print_texture(&sp->texture, 1); sys_message(",\n");
indent_message(indent, "color = "); gfx_print_color(&sp->color); sys_message(",\n");
indent_message(indent, "blend_rate = %d,\n", sp->blend_rate);
indent_message(indent, "multiply_color = "); gfx_print_color(&sp->multiply_color); sys_message(",\n");
indent_message(indent, "add_color = "); gfx_print_color(&sp->add_color); sys_message(",\n");
switch (sp->draw_method) {
case DRAW_METHOD_NORMAL: indent_message(indent, "draw_method = normal,\n"); break;
case DRAW_METHOD_SCREEN: indent_message(indent, "draw_method = screen,\n"); break;
case DRAW_METHOD_MULTIPLY: indent_message(indent, "draw_method = multiply,\n"); break;
case DRAW_METHOD_ADDITIVE: indent_message(indent, "draw_method = additive,\n"); break;
default: indent_message(indent, "draw_method = unknown,\n"); break;
}
indent_message(indent, "rect = "); gfx_print_rectangle(&sp->rect); sys_message(",\n");
indent_message(indent, "text = {\n");
indent++;
indent_message(indent, "texture = "); gfx_print_texture(&sp->text.texture, 2); sys_message(",\n");
indent_message(indent, "home = "); gfx_print_point(&sp->text.home); sys_message(",\n");
indent_message(indent, "pos = "); gfx_print_point(&sp->text.pos); sys_message(",\n");
indent_message(indent, "char_space = %d,\n", sp->text.char_space);
indent_message(indent, "line_space = %d,\n", sp->text.line_space);
if (sp->plugin) {
if (sp->plugin->debug_print) {
indent_message(indent, "plugin = {\n");
sp->plugin->debug_print(sp, indent + 1);
indent_message(indent, "},\n");
} else {
indent_message(indent, "plugin = %s,\n", sp->plugin->name);
}
}
indent--;
indent_message(indent, "},\n");
indent_message(indent, "cg_no = %d\n", sp->cg_no);
indent--;
indent_message(indent, "}\n");
}
-21
View File
@@ -452,24 +452,3 @@ void gfx_set_font_name(const char *name)
WARNING("Unhandled font name: \"%s\"", display_sjis0(name));
}
}
void gfx_print_text_style(struct text_style *style, int indent)
{
sys_message("{\n");
indent++;
indent_message(indent, "face = %u,\n", style->face);
indent_message(indent, "size = %f,\n", style->size);
indent_message(indent, "bold_width = %f,\n", style->bold_width);
indent_message(indent, "weight = %u,\n", style->weight);
indent_message(indent, "edge_weight = {l=%f,u=%f,r=%f,d=%f},\n",
style->edge_left, style->edge_up, style->edge_right, style->edge_down);
indent_message(indent, "color = "); gfx_print_color(&style->color); sys_message(",\n");
indent_message(indent, "edge_color = "); gfx_print_color(&style->edge_color); sys_message(",\n");
indent_message(indent, "scale_x = %f,\n", style->scale_x);
indent_message(indent, "space_scale_x = %f,\n", style->space_scale_x);
indent_message(indent, "font_spacing = %f,\n", style->font_spacing);
indent--;
indent_message(indent, "}");
}