aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-12-20 18:29:16 +0800
committerchai <chaifix@163.com>2018-12-20 18:29:16 +0800
commit7ae40127f15f8f2cb963a7efeb018f7887ebc1ea (patch)
tree507bac722297d7dc4a2c97791f824a9a4f29379c /src
parent4355806c576dbf9371a3d9d5481a81524f58f9e5 (diff)
*修改文件结构
Diffstat (limited to 'src')
-rw-r--r--src/3rdparty/cembed/cembed.c230
-rw-r--r--src/libjin/common/je_object.h1
-rw-r--r--src/lua/embed/scripts/ai.lua26
-rw-r--r--src/lua/embed/scripts/boot.lua139
-rw-r--r--src/lua/embed/scripts/graphics.lua139
-rw-r--r--src/lua/embed/scripts/graphics.lua.h104
-rw-r--r--src/lua/embed/scripts/keyboard.lua17
-rw-r--r--src/lua/embed/scripts/mouse.lua16
-rw-r--r--src/lua/embed/scripts/net.lua7
-rw-r--r--src/lua/embed/scripts/path.lua16
10 files changed, 673 insertions, 22 deletions
diff --git a/src/3rdparty/cembed/cembed.c b/src/3rdparty/cembed/cembed.c
new file mode 100644
index 0000000..0488b67
--- /dev/null
+++ b/src/3rdparty/cembed/cembed.c
@@ -0,0 +1,230 @@
+/*
+** Copyright (c) 2018 rxi
+**
+** Permission is hereby granted, free of charge, to any person obtaining a copy
+** of this software and associated documentation files (the "Software"), to
+** deal in the Software without restriction, including without limitation the
+** rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+** sell copies of the Software, and to permit persons to whom the Software is
+** furnished to do so, subject to the following conditions:
+**
+** The above copyright notice and this permission notice shall be included in
+** all copies or substantial portions of the Software.
+**
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+** FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+** IN THE SOFTWARE.
+**/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#define VERSION "v0.2"
+
+
+typedef struct {
+ FILE *fp;
+ unsigned char buf[4096];
+ int idx;
+ int eof_idx;
+} BufferedFile;
+
+
+static BufferedFile bf_writer(FILE *fp) {
+ BufferedFile bf = { .fp = fp };
+ return bf;
+}
+
+
+static BufferedFile bf_reader(FILE *fp) {
+ BufferedFile bf = { .fp = fp,.idx = sizeof(bf.buf),.eof_idx = -1 };
+ return bf;
+}
+
+
+static void bf_flush(BufferedFile *bf) {
+ fwrite(bf->buf, 1, bf->idx, bf->fp);
+ bf->idx = 0;
+}
+
+
+static void bf_write_byte(BufferedFile *bf, char b) {
+ bf->buf[bf->idx++] = b;
+ if (bf->idx == sizeof(bf->buf)) { bf_flush(bf); }
+}
+
+
+static int bf_read_byte(BufferedFile *bf) {
+ if (bf->idx == sizeof(bf->buf)) {
+ int n = fread(bf->buf, 1, sizeof(bf->buf), bf->fp);
+ if (n != sizeof(bf->buf)) { bf->eof_idx = n; }
+ bf->idx = 0;
+ }
+ if (bf->idx == bf->eof_idx) { return EOF; }
+ return bf->buf[bf->idx++];
+}
+
+
+static void error(const char *fmt, ...) {
+ va_list vp;
+ fprintf(stderr, "Error: ");
+ va_start(vp, fmt);
+ vfprintf(stderr, fmt, vp);
+ va_end(vp);
+ fprintf(stderr, "\n");
+ exit(EXIT_FAILURE);
+}
+
+
+static void safename(char *dst, const char *filename) {
+ const char *p = filename;
+ char *q = dst;
+ while (*p) {
+ if (isalpha(*p) || isdigit(*p)) {
+ *q = *p;
+ }
+ else {
+ *q = '_';
+ }
+ q++; p++;
+ }
+ *q = '\0';
+}
+
+
+static void write_byte_string(BufferedFile *bf, unsigned char n) {
+ if (n >= 100) { bf_write_byte(bf, '0' + (n / 100) % 10); }
+ if (n >= 10) { bf_write_byte(bf, '0' + (n / 10) % 10); }
+ bf_write_byte(bf, '0' + n % 10);
+}
+
+
+static void write_embedded(FILE *fp, const char *filename,
+ const char *varprefix, int nostatic, int zerobyte)
+{
+ FILE *infp = fopen(filename, "rb");
+ if (!infp) {
+ error("failed to open file '%s'", filename);
+ }
+
+ char varname[256];
+ if (strlen(filename) >= sizeof(varname)) {
+ error("filename too long");
+ }
+ safename(varname, filename);
+
+ if (!nostatic) { fprintf(fp, "static "); }
+ fprintf(fp, "unsigned char %s%s[] = {", varprefix, varname);
+ BufferedFile inbf = bf_reader(infp);
+ BufferedFile bf = bf_writer(fp);
+ int n = 0;
+
+ for (;;) {
+ int chr = bf_read_byte(&inbf);
+ if (chr == EOF) { break; }
+ if (n > 0) { bf_write_byte(&bf, ','); }
+ if (n % 20 == 0) { bf_write_byte(&bf, '\n'); }
+ write_byte_string(&bf, chr);
+ n++;
+ }
+
+ bf_flush(&bf);
+ if (zerobyte) { fprintf(fp, ",0"); }
+ fprintf(fp, "\n};\n\n");
+
+ fclose(infp);
+}
+
+
+static void print_help(void) {
+ printf(
+ "Usage: cembed [OPTION]... [FILE]...\n"
+ "Create C header with file data embedded in char arrays\n"
+ "\n"
+ " -o <filename> output file\n"
+ " -p <prefix> prefix to place before variable names\n"
+ " -s omits `static` keyword\n"
+ " -z adds zero byte to end of array\n"
+ " -h display this help message\n"
+ " -v display version number\n");
+}
+
+
+int main(int argc, char **argv) {
+ char **arg = argv + 1;
+ char **arg_end = argv + argc;
+
+ /* defaults */
+ const char *outfile = NULL;
+ const char *prefix = "";
+ int zerobyte = 0;
+ int nostatic = 0;
+
+ /* handle options */
+ while (arg != arg_end && (*arg)[0] == '-') {
+ switch ((*arg)[1]) {
+ case 'h':
+ print_help();
+ exit(EXIT_SUCCESS);
+ break;
+
+ case 'v':
+ printf("cembed " VERSION "\n");
+ exit(EXIT_SUCCESS);
+ break;
+
+ case 's':
+ nostatic = 1;
+ break;
+
+ case 'z':
+ zerobyte = 1;
+ break;
+
+ case 'o':
+ arg++;
+ if (arg == arg_end) { error("expected filename after option '-o'"); }
+ outfile = *arg;
+ break;
+
+ case 'p':
+ arg++;
+ if (arg == arg_end) { error("expected prefix after option '-p'"); }
+ prefix = *arg;
+ break;
+
+ default:
+ error("invalid option '%s'", *arg);
+ break;
+ }
+
+ arg++;
+ }
+
+ /* no file arguments: print help */
+ if (arg == arg_end) {
+ print_help();
+ exit(EXIT_SUCCESS);
+ }
+
+ /* open output */
+ FILE *fp = outfile ? fopen(outfile, "wb") : stdout;
+ if (!fp) { error("failed to open output file '%s'", outfile); }
+
+ /* write files */
+ while (arg != arg_end) {
+ write_embedded(fp, *arg, prefix, nostatic, zerobyte);
+ arg++;
+ }
+
+ /* clean up */
+ if (fp != stdout) { fclose(fp); }
+ return EXIT_SUCCESS;
+}
diff --git a/src/libjin/common/je_object.h b/src/libjin/common/je_object.h
index 677b474..581500f 100644
--- a/src/libjin/common/je_object.h
+++ b/src/libjin/common/je_object.h
@@ -11,6 +11,7 @@ namespace JinEngine
{
public:
virtual ~Object() {};
+
};
} // namespace JinEngine
diff --git a/src/lua/embed/scripts/ai.lua b/src/lua/embed/scripts/ai.lua
new file mode 100644
index 0000000..a69da84
--- /dev/null
+++ b/src/lua/embed/scripts/ai.lua
@@ -0,0 +1,26 @@
+/* graphics.lua */
+static const char* ai_lua = R"(
+jin.ai = jin.ai or {}
+
+local ja = jin.ai
+
+ja.StateMachineType = {
+ STEPWISE = 1,
+ ITERATIVE = 2,
+}
+
+
+
+)";
+
+
+//local sp = jin.graphics.newSprite()
+//local sm = jin.ai.newStateMachine(jin.StateMachineMode.STEPWISE, sp)
+//sm:addState("run")
+//sm:addEnterCallback("run", function(spr)
+// spr:setRun()
+//end)
+//
+//function jin.core.onUpdate(dt)
+// sm:update()
+//end
diff --git a/src/lua/embed/scripts/boot.lua b/src/lua/embed/scripts/boot.lua
new file mode 100644
index 0000000..4b97b69
--- /dev/null
+++ b/src/lua/embed/scripts/boot.lua
@@ -0,0 +1,139 @@
+/* boot.lua */
+static const char* boot_lua = R"(
+local cwd = jin.args['cwd'] or '.'
+jin.filesystem.init()
+jin.filesystem.mount(cwd)
+
+-------------------------------------------------------------------------
+-- Config game
+-------------------------------------------------------------------------
+
+jin.config = {}
+if jin.filesystem.exist("config.lua") then
+ xpcall(function()jin.config = require "config" end, function()end)
+end
+jin.config.width = jin.config.width or 580
+jin.config.height = jin.config.height or 450
+jin.config.vsync = jin.config.vsync or true
+jin.config.title = jin.config.title or ("jin v" .. jin.version)
+jin.config.resizable = jin.config.resizable or false
+jin.config.fullscreen = jin.config.fullscreen or false
+jin.config.fps = jin.config.fps or 60
+jin.config.icon = jin.config.icon or ""
+
+-------------------------------------------------------------------------
+-- Default game loop
+-------------------------------------------------------------------------
+
+local function call(func, ...)
+ if func then
+ return func(...)
+ end
+end
+
+local step = jin.time.step
+jin.time.step = nil
+
+function jin.core.run()
+ jin.graphics.reset()
+ call(jin.core.onLoad)
+ local dt = 0
+ while jin.core.running() do
+ for _, e in pairs(jin.event.poll()) do
+ if e.type == "KeyDown" then
+ jin.keyboard.set(e.key, true)
+ elseif e.type == "KeyUp" then
+ jin.keyboard.set(e.key, false)
+ end
+ call(jin.core.onEvent, e)
+ end
+ step()
+ dt = jin.time.getDelta()
+ call(jin.core.onUpdate, dt)
+ jin.graphics.clear()
+ call(jin.core.onDraw)
+ jin.graphics.present()
+ jin.time.sleep(0.001)
+ end
+end
+
+-------------------------------------------------------------------------
+-- Boot game
+-------------------------------------------------------------------------
+
+-- Display error message.
+local function onError(msg)
+ jin.audio.destroy()
+ jin.graphics.showWindow()
+ local err = "Error:\n" .. msg .. "\n" .. debug.traceback()
+ jin.graphics.reset()
+ jin.graphics.setClearColor(100, 100, 100, 255)
+ jin.graphics.clear()
+ jin.graphics.print(err, 5, 5)
+ jin.graphics.present()
+ while jin.core.running() do
+ for _, e in pairs(jin.event.poll()) do
+ if e.type == "Quit" then
+ jin.core.stop()
+ end
+ end
+ jin.time.sleep(0.001)
+ end
+end
+
+-- No game screen.
+local function noGame()
+ jin.graphics.showWindow()
+ jin.graphics.reset()
+ jin.graphics.setClearColor(100, 100, 100, 255)
+ jin.graphics.clear()
+ jin.graphics.print("No Game", 5, 5)
+ jin.graphics.present()
+ while jin.core.running() do
+ for _, e in pairs(jin.event.poll()) do
+ if e.type == "Quit" then
+ jin.core.stop()
+ end
+ end
+ jin.time.sleep(0.001)
+ end
+end
+
+local function boot()
+ if jin.filesystem.exist("main.lua") then
+ call(function()
+ require"main"
+ jin.core.run()
+ end)
+ else
+ noGame()
+ end
+end
+
+-------------------------------------------------------------------------
+-- Initialize sub systems
+-------------------------------------------------------------------------
+
+jin.audio.init()
+jin.graphics.init(jin.config)
+
+-------------------------------------------------------------------------
+-- Boot game
+-------------------------------------------------------------------------
+
+xpcall(boot, onError)
+
+-------------------------------------------------------------------------
+-- Destroy sub-systems
+-------------------------------------------------------------------------
+
+jin.graphics.destroy()
+jin.audio.destroy()
+
+-------------------------------------------------------------------------
+-- Quit game
+-------------------------------------------------------------------------
+
+jin.core.quit()
+
+)"; \ No newline at end of file
diff --git a/src/lua/embed/scripts/graphics.lua b/src/lua/embed/scripts/graphics.lua
new file mode 100644
index 0000000..0a66127
--- /dev/null
+++ b/src/lua/embed/scripts/graphics.lua
@@ -0,0 +1,139 @@
+/* graphics.lua */
+static const char* graphics_lua = R"(
+jin.graphics = jin.graphics or {}
+
+local jg = jin.graphics
+
+jg.RenderMode = {
+ FILL = 1,
+ LINE = 2,
+}
+
+jg.SpriteOrigin = {
+ TOPLEFT = 0,
+ TOPCENTER = 1,
+ TOPRIGHT = 2,
+ MIDDLELEFT = 3,
+ MIDDLECENTER = 4,
+ MIDDLERIGHT = 5,
+ BOTTOMLEFT = 6,
+ BOTTOMCENTER = 7,
+ BOTTOMRIGHT = 8
+}
+
+jg.SpriteMode = {
+ SINGLE = 1,
+ RANDOM = 2,
+ ANIMATED = 3
+}
+
+-- built in shaders
+jg.Shaders = {
+ Font = nil,
+ Texture = nil,
+ Sprite = nil,
+ SpriteSheet = nil,
+ Default = nil
+}
+
+local function compileBuiltInShaders()
+ jg.Shaders.Font = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return Color(col.rgb, texel(tex, v.uv).a);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+ jg.Shaders.Texture = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return col * texel(tex, v.uv);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+ jg.Shaders.Sprite = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return col * texel(tex, v.uv);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+ jg.Shaders.SpriteSheet = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return col * texel(tex, v.uv);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+ jg.Shaders.Default = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return col * texel(tex, v.uv);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+end
+
+local _init = jg.init
+local initialized = false
+jg.init = function(setting)
+ if initialized then
+ return initialized
+ end
+ initialized = _init(setting)
+ if initialized then
+ compileBuiltInShaders()
+ jg.useShader(jg.Shaders.Default)
+ end
+ return initialized
+end
+
+jg.unuseShader = function()
+ jg.useShader(jg.Shaders.Default)
+end
+
+-- Reset all attributes to default value.
+jg.reset = function()
+ jg.setColor(255, 255, 255, 255)
+ jg.setClearColor(0, 0, 0, 255)
+ jg.clear()
+ jg.unsetFont()
+ jg.unuseShader()
+end
+
+)"; \ No newline at end of file
diff --git a/src/lua/embed/scripts/graphics.lua.h b/src/lua/embed/scripts/graphics.lua.h
index 1dddbf5..0a66127 100644
--- a/src/lua/embed/scripts/graphics.lua.h
+++ b/src/lua/embed/scripts/graphics.lua.h
@@ -27,44 +27,104 @@ jg.SpriteMode = {
ANIMATED = 3
}
-local default_shader = nil
-local default_shader_source = [[
-#VERTEX_SHADER
-
-Vertex vert(Vertex v)
-{
- return v;
+-- built in shaders
+jg.Shaders = {
+ Font = nil,
+ Texture = nil,
+ Sprite = nil,
+ SpriteSheet = nil,
+ Default = nil
}
-#END_VERTEX_SHADER
-
-#FRAGMENT_SHADER
-
-Color frag(Color col, Texture tex, Vertex v)
-{
- return col * texel(tex, v.uv);
-}
-
-#END_FRAGMENT_SHADER
-]]
+local function compileBuiltInShaders()
+ jg.Shaders.Font = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return Color(col.rgb, texel(tex, v.uv).a);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+ jg.Shaders.Texture = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return col * texel(tex, v.uv);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+ jg.Shaders.Sprite = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return col * texel(tex, v.uv);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+ jg.Shaders.SpriteSheet = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return col * texel(tex, v.uv);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+ jg.Shaders.Default = jg.newShader([[
+ #VERTEX_SHADER
+ Vertex vert(Vertex v)
+ {
+ return v;
+ }
+ #END_VERTEX_SHADER
+ #FRAGMENT_SHADER
+ Color frag(Color col, Texture tex, Vertex v)
+ {
+ return col * texel(tex, v.uv);
+ }
+ #END_FRAGMENT_SHADER
+ ]])
+end
local _init = jg.init
local initialized = false
-
jg.init = function(setting)
if initialized then
return initialized
end
initialized = _init(setting)
if initialized then
- default_shader = jg.newShader(default_shader_source)
- jg.useShader(default_shader)
+ compileBuiltInShaders()
+ jg.useShader(jg.Shaders.Default)
end
return initialized
end
jg.unuseShader = function()
- jg.useShader(default_shader)
+ jg.useShader(jg.Shaders.Default)
end
-- Reset all attributes to default value.
diff --git a/src/lua/embed/scripts/keyboard.lua b/src/lua/embed/scripts/keyboard.lua
new file mode 100644
index 0000000..e989928
--- /dev/null
+++ b/src/lua/embed/scripts/keyboard.lua
@@ -0,0 +1,17 @@
+
+static const char* keyboard_lua = R"(
+jin.keyboard = jin.keyboard or {}
+
+local jk = jin.keyboard
+
+local keys = {}
+
+function jin.keyboard.isPressed(k)
+ return keys[k]
+end
+
+function jin.keyboard.set(k, status)
+ keys[k] = status
+end
+
+)";
diff --git a/src/lua/embed/scripts/mouse.lua b/src/lua/embed/scripts/mouse.lua
new file mode 100644
index 0000000..ca070a3
--- /dev/null
+++ b/src/lua/embed/scripts/mouse.lua
@@ -0,0 +1,16 @@
+static const char* mouse_lua = R"(
+jin.mouse = jin.mouse or {}
+
+local jm = jin.mouse
+
+local button = {}
+
+function jin.mouse.isDown(btn)
+ return button[btn]
+end
+
+function jin.mouse.set(btn, status)
+ button[btn] = status
+end
+
+)"; \ No newline at end of file
diff --git a/src/lua/embed/scripts/net.lua b/src/lua/embed/scripts/net.lua
new file mode 100644
index 0000000..a986ce6
--- /dev/null
+++ b/src/lua/embed/scripts/net.lua
@@ -0,0 +1,7 @@
+/* net.lua */
+static const char* net_lua = R"(
+jin.net = jin.net or {}
+
+local jn = jin.net
+
+)"; \ No newline at end of file
diff --git a/src/lua/embed/scripts/path.lua b/src/lua/embed/scripts/path.lua
new file mode 100644
index 0000000..f7e1ec3
--- /dev/null
+++ b/src/lua/embed/scripts/path.lua
@@ -0,0 +1,16 @@
+/* path.lua */
+static const char* path_lua = R"(
+jin.path = jin.path or {}
+
+local jp = jin.path
+
+-- game root directory
+jin._root = nil
+
+-- return full path of a given path
+function jin.path.full(path)
+ local root = jin._dir .. '/' .. jin._argv[2]
+ return root .. '/' .. path
+end
+
+)"; \ No newline at end of file