REFACTOR!!
This commit is contained in:
parent
e745acad3e
commit
5b9369a197
71
Makefile
71
Makefile
|
@ -9,14 +9,12 @@ endif
|
||||||
|
|
||||||
UNAME_P != uname -m
|
UNAME_P != uname -m
|
||||||
|
|
||||||
CCACHE = #ccache
|
CCACHE = ccache
|
||||||
|
|
||||||
#CC specifies which compiler we're using
|
#CC specifies which compiler we're using
|
||||||
CC = $(CCACHE) clang -DSDL_DISABLE_IMMINTRIN_H
|
CC = $(CCACHE) clang -DSDL_DISABLE_IMMINTRIN_H
|
||||||
CLINK = clang
|
CLINK = clang
|
||||||
|
|
||||||
MUSL = /usr/local/musl/include
|
|
||||||
|
|
||||||
ifeq ($(DEBUG), 1)
|
ifeq ($(DEBUG), 1)
|
||||||
DEFFALGS += -DDEBUG
|
DEFFALGS += -DDEBUG
|
||||||
INFO = dbg
|
INFO = dbg
|
||||||
|
@ -32,16 +30,8 @@ define make_objs
|
||||||
find $(1) -type f -name '*.c' | sed 's|\.c.*|.o|' | sed 's|\.|$(objprefix)|1'
|
find $(1) -type f -name '*.c' | sed 's|\.c.*|.o|' | sed 's|\.|$(objprefix)|1'
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define make_obj
|
|
||||||
echo $(1) | tr " " "\n" | sed 's|\.c.*|.o|' | sed 's|\.|$(objprefix)|1'
|
|
||||||
endef
|
|
||||||
|
|
||||||
define find_include
|
|
||||||
find $(1) -type f -name '*.h' | sed 's|\/[^\/]*\.h$$||' | sort | uniq
|
|
||||||
endef
|
|
||||||
|
|
||||||
define prefix
|
define prefix
|
||||||
echo $(1) | tr " " "\n" | sed 's|.*|$(2)&$(3)|'
|
echo $(1) | tr " " "\n" | sed 's/.*/$(2)&$(3)/'
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define rm
|
define rm
|
||||||
|
@ -62,31 +52,15 @@ ehead != $(call findindir,./source/engine,*.h)
|
||||||
eobjects != $(call make_objs, ./source/engine)
|
eobjects != $(call make_objs, ./source/engine)
|
||||||
eobjects != $(call rm,$(eobjects),sqlite pl_mpeg_extract_frames pl_mpeg_player yugine)
|
eobjects != $(call rm,$(eobjects),sqlite pl_mpeg_extract_frames pl_mpeg_player yugine)
|
||||||
|
|
||||||
eddirs != find ./source/editor -type d
|
edirs += ./source/engine/thirdparty/Chipmunk2D/include ./source/engine/thirdparty/enet/include ./source/engine/thirdparty/Nuklear
|
||||||
eddirs += ./source/editor
|
includeflag != $(call prefix,$(edirs) $(eddirs),-I)
|
||||||
edhead != $(call findindir,./source/editor,*.h)
|
COMPINCLUDE = $(edirs) $(eddirs)
|
||||||
edobjects != find ./source/editor -maxdepth 1 -type f -name '*.c'
|
|
||||||
edobjects != $(call make_obj,$(edobjects))
|
|
||||||
|
|
||||||
bsdirs != find ./source/brainstorm -type d
|
|
||||||
bsobjects != $(call make_objs, ./source/brainstorm)
|
|
||||||
|
|
||||||
pindirs != find ./source/pinball -type d
|
|
||||||
pinobjects != $(call make_objs, ./source/pinball);
|
|
||||||
|
|
||||||
edirs += ./source/engine/thirdparty/Chipmunk2D/include ./source/engine/thirdparty/enet/include
|
|
||||||
includeflag != $(call prefix,$(edirs) $(eddirs) $(pindirs) $(bsdirs),-I)
|
|
||||||
COMPINCLUDE = $(edirs) $(eddirs) $(pindirs) $(bsdirs)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WARNING_FLAGS = -Wno #-Wall -Wwrite-strings -Wunsupported -Wall -Wextra -Wwrite-strings -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Wno-incompatible-function-pointer-types -Wno-gnu-statement-expression -Wno-complex-component-init -pedantic
|
|
||||||
|
|
||||||
|
|
||||||
|
WARNING_FLAGS = -Wno-everything #-Wall -Wwrite-strings -Wunsupported -Wall -Wextra -Wwrite-strings -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Wno-incompatible-function-pointer-types -Wno-gnu-statement-expression -Wno-complex-component-init -pedantic
|
||||||
|
|
||||||
COMPILER_FLAGS = $(includeflag) -I/usr/local/include -g -O0 -MD $(WARNING_FLAGS) -c $< -o $@
|
COMPILER_FLAGS = $(includeflag) -I/usr/local/include -g -O0 -MD $(WARNING_FLAGS) -c $< -o $@
|
||||||
|
|
||||||
LIBPATH = -L./bin -L/usr/local/lib -L/usr/local/lib/tcc -L/usr/lib64/pipewire-0.3/jack
|
LIBPATH = -L./bin -L/usr/local/lib -L/usr/lib64/pipewire-0.3/jack
|
||||||
|
|
||||||
ALLFILES != find source/ -name '*.[ch]' -type f
|
ALLFILES != find source/ -name '*.[ch]' -type f
|
||||||
|
|
||||||
|
@ -98,7 +72,7 @@ ifeq ($(UNAME), Windows_NT)
|
||||||
EXT = .exe
|
EXT = .exe
|
||||||
else
|
else
|
||||||
LINKER_FLAGS = -g /usr/lib64/pipewire-0.3/jack/libjack.so.0
|
LINKER_FLAGS = -g /usr/lib64/pipewire-0.3/jack/libjack.so.0
|
||||||
ELIBS = m c engine editor glfw3 portaudio rt asound pthread SDL2 yughc mruby
|
ELIBS = m c engine glfw3 portaudio rt asound pthread SDL2 yughc mruby
|
||||||
CLIBS =
|
CLIBS =
|
||||||
EXT =
|
EXT =
|
||||||
endif
|
endif
|
||||||
|
@ -107,28 +81,20 @@ ELIBS != $(call prefix, $(ELIBS), -l)
|
||||||
|
|
||||||
LELIBS = $(ELIBS) $(CLIBS)
|
LELIBS = $(ELIBS) $(CLIBS)
|
||||||
|
|
||||||
objects = $(bsobjects) $(eobjects) $(pinobjects)
|
objects = $(eobjects)
|
||||||
DEPENDS = $(objects:.o=.d)
|
DEPENDS = $(objects:.o=.d)
|
||||||
-include $(DEPENDS)
|
-include $(DEPENDS)
|
||||||
|
|
||||||
yuginec = ./source/engine/yugine.c
|
yuginec = ./source/engine/yugine.c
|
||||||
|
|
||||||
ENGINE = $(BIN)libengine.a
|
ENGINE = $(BIN)libengine.a
|
||||||
EDITOR = $(BIN)libeditor.a
|
|
||||||
INCLUDE = $(BIN)include
|
INCLUDE = $(BIN)include
|
||||||
|
|
||||||
linkinclude = $(BIN)include
|
|
||||||
|
|
||||||
LINK = $(LIBPATH) $(LINKER_FLAGS) $(LELIBS) -o $@
|
LINK = $(LIBPATH) $(LINKER_FLAGS) $(LELIBS) -o $@
|
||||||
|
|
||||||
engine: tags $(yuginec:.%.c=$(objprefix)%.o) $(ENGINE)
|
engine: $(yuginec:.%.c=$(objprefix)%.o) $(ENGINE)
|
||||||
@echo Linking engine
|
@echo Linking engine
|
||||||
@$(CLINK) $@ $(LINK)
|
$(CLINK) $< $(LINK)
|
||||||
@echo Finished build
|
|
||||||
|
|
||||||
editor: tags $(yuginec:.%.c=$(objprefix)%.o) $(EDITOR) $(ENGINE)
|
|
||||||
@echo Linking editor
|
|
||||||
@$(CLINK) $^ $(LINK)
|
|
||||||
@echo Finished build
|
@echo Finished build
|
||||||
|
|
||||||
$(ENGINE): $(eobjects) bin/libglfw3.a
|
$(ENGINE): $(eobjects) bin/libglfw3.a
|
||||||
|
@ -136,21 +102,6 @@ $(ENGINE): $(eobjects) bin/libglfw3.a
|
||||||
@ar r $(ENGINE) $(eobjects)
|
@ar r $(ENGINE) $(eobjects)
|
||||||
@cp -u -r $(ehead) $(INCLUDE)
|
@cp -u -r $(ehead) $(INCLUDE)
|
||||||
|
|
||||||
$(EDITOR): $(edobjects)
|
|
||||||
@echo Making editor library
|
|
||||||
@ar r $(EDITOR) $^
|
|
||||||
@cp -u -r $(edhead) $(INCLUDE)
|
|
||||||
|
|
||||||
xbrainstorm: $(bsobjects) $(ENGINE) $(EDITOR)
|
|
||||||
@echo Making brainstorm
|
|
||||||
$(CLINK) $^ $(LINK)
|
|
||||||
@mv xbrainstorm brainstorm/brainstorm$(EXT)
|
|
||||||
|
|
||||||
pinball: tags $(ENGINE) $(pinobjects)
|
|
||||||
@echo Making pinball
|
|
||||||
@$(CLINK) $(pinobjects) $(LINK) -o $@
|
|
||||||
@mv pinball paladin/pinball
|
|
||||||
|
|
||||||
bin/libglfw3.a:
|
bin/libglfw3.a:
|
||||||
@echo Making GLFW
|
@echo Making GLFW
|
||||||
@make glfw/build
|
@make glfw/build
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
# Install
|
|
||||||
BIN = demo
|
|
||||||
|
|
||||||
# Flags
|
|
||||||
CFLAGS += -std=c99 -Wall -Wextra -pedantic -O2
|
|
||||||
|
|
||||||
SRC = main.c
|
|
||||||
OBJ = $(SRC:.c=.o)
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
BIN := $(BIN).exe
|
|
||||||
LIBS = -lglfw3 -lopengl32 -lm -lGLU32
|
|
||||||
else
|
|
||||||
UNAME_S := $(shell uname -s)
|
|
||||||
ifeq ($(UNAME_S),Darwin)
|
|
||||||
LIBS := -lglfw3 -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo -lm -lGLEW -L/usr/local/lib
|
|
||||||
else
|
|
||||||
LIBS = -lglfw -lGL -lm -lGLU
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(BIN):
|
|
||||||
@mkdir -p bin
|
|
||||||
rm -f bin/$(BIN) $(OBJS)
|
|
||||||
$(CC) $(SRC) $(CFLAGS) -o bin/$(BIN) $(LIBS)
|
|
|
@ -1,240 +0,0 @@
|
||||||
/* nuklear - v1.32.0 - public domain */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
#define NK_INCLUDE_FIXED_TYPES
|
|
||||||
#define NK_INCLUDE_STANDARD_IO
|
|
||||||
#define NK_INCLUDE_STANDARD_VARARGS
|
|
||||||
#define NK_INCLUDE_DEFAULT_ALLOCATOR
|
|
||||||
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
|
|
||||||
#define NK_INCLUDE_FONT_BAKING
|
|
||||||
#define NK_INCLUDE_DEFAULT_FONT
|
|
||||||
#define NK_IMPLEMENTATION
|
|
||||||
#define NK_GLFW_GL2_IMPLEMENTATION
|
|
||||||
#define NK_KEYSTATE_BASED_INPUT
|
|
||||||
#include "../../nuklear.h"
|
|
||||||
#include "nuklear_glfw_gl2.h"
|
|
||||||
|
|
||||||
#define STB_IMAGE_IMPLEMENTATION
|
|
||||||
#include "../../demo/common/filebrowser/stb_image.h"
|
|
||||||
|
|
||||||
#define WINDOW_WIDTH 1200
|
|
||||||
#define WINDOW_HEIGHT 800
|
|
||||||
|
|
||||||
/* ===============================================================
|
|
||||||
*
|
|
||||||
* EXAMPLE
|
|
||||||
*
|
|
||||||
* ===============================================================*/
|
|
||||||
/* This are some code examples to provide a small overview of what can be
|
|
||||||
* done with this library. To try out an example uncomment the defines */
|
|
||||||
/* #define INCLUDE_ALL */
|
|
||||||
/* #define INCLUDE_STYLE */
|
|
||||||
/* #define INCLUDE_CALCULATOR */
|
|
||||||
#define INCLUDE_CANVAS
|
|
||||||
/* #define INCLUDE_FILE_BROWSER */
|
|
||||||
/* #define INCLUDE_OVERVIEW */
|
|
||||||
/* #define INCLUDE_NODE_EDITOR */
|
|
||||||
|
|
||||||
#ifdef INCLUDE_ALL
|
|
||||||
#define INCLUDE_STYLE
|
|
||||||
#define INCLUDE_CALCULATOR
|
|
||||||
#define INCLUDE_CANVAS
|
|
||||||
#define INCLUDE_OVERVIEW
|
|
||||||
#define INCLUDE_NODE_EDITOR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef INCLUDE_STYLE
|
|
||||||
#include "../../demo/common/style.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CALCULATOR
|
|
||||||
#include "../../demo/common/calculator.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CANVAS
|
|
||||||
#include "../../demo/common/canvas.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_FILE_BROWSER
|
|
||||||
#include "../../demo/common/file_browser.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_OVERVIEW
|
|
||||||
#include "../../demo/common/overview.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_NODE_EDITOR
|
|
||||||
#include "../../demo/common/node_editor.c"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ===============================================================
|
|
||||||
*
|
|
||||||
* DEMO
|
|
||||||
*
|
|
||||||
* ===============================================================*/
|
|
||||||
static void error_callback(int e, const char *d)
|
|
||||||
{printf("Error %d: %s\n", e, d);}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
/* Platform */
|
|
||||||
static GLFWwindow *win;
|
|
||||||
int width = 0, height = 0;
|
|
||||||
|
|
||||||
/* GUI */
|
|
||||||
struct nk_context *ctx;
|
|
||||||
struct nk_colorf bg;
|
|
||||||
#ifdef INCLUDE_FILE_BROWSER
|
|
||||||
struct file_browser browser;
|
|
||||||
struct media media;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* GLFW */
|
|
||||||
glfwSetErrorCallback(error_callback);
|
|
||||||
if (!glfwInit()) {
|
|
||||||
fprintf(stdout, "[GFLW] failed to init!\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
win = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Demo", NULL, NULL);
|
|
||||||
glfwMakeContextCurrent(win);
|
|
||||||
glfwGetWindowSize(win, &width, &height);
|
|
||||||
|
|
||||||
/* GUI */
|
|
||||||
ctx = nk_glfw3_init(win, NK_GLFW3_INSTALL_CALLBACKS);
|
|
||||||
/* Load Fonts: if none of these are loaded a default font will be used */
|
|
||||||
/* Load Cursor: if you uncomment cursor loading please hide the cursor */
|
|
||||||
{struct nk_font_atlas *atlas;
|
|
||||||
nk_glfw3_font_stash_begin(&atlas);
|
|
||||||
/*struct nk_font *droid = nk_font_atlas_add_from_file(atlas, "../../../extra_font/DroidSans.ttf", 14, 0);*/
|
|
||||||
/*struct nk_font *roboto = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Roboto-Regular.ttf", 14, 0);*/
|
|
||||||
/*struct nk_font *future = nk_font_atlas_add_from_file(atlas, "../../../extra_font/kenvector_future_thin.ttf", 13, 0);*/
|
|
||||||
/*struct nk_font *clean = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyClean.ttf", 12, 0);*/
|
|
||||||
/*struct nk_font *tiny = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyTiny.ttf", 10, 0);*/
|
|
||||||
/*struct nk_font *cousine = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Cousine-Regular.ttf", 13, 0);*/
|
|
||||||
nk_glfw3_font_stash_end();
|
|
||||||
/*nk_style_load_all_cursors(ctx, atlas->cursors);*/
|
|
||||||
/*nk_style_set_font(ctx, &droid->handle);*/}
|
|
||||||
|
|
||||||
#ifdef INCLUDE_STYLE
|
|
||||||
/*set_style(ctx, THEME_WHITE);*/
|
|
||||||
/*set_style(ctx, THEME_RED);*/
|
|
||||||
/*set_style(ctx, THEME_BLUE);*/
|
|
||||||
/*set_style(ctx, THEME_DARK);*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bg.r = 0.10f, bg.g = 0.18f, bg.b = 0.24f, bg.a = 1.0f;
|
|
||||||
|
|
||||||
#ifdef INCLUDE_FILE_BROWSER
|
|
||||||
/* icons */
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
media.icons.home = icon_load("../../demo/common/filebrowser/icon/home.png");
|
|
||||||
media.icons.directory = icon_load("../../demo/common/filebrowser/icon/directory.png");
|
|
||||||
media.icons.computer = icon_load("../../demo/common/filebrowser/icon/computer.png");
|
|
||||||
media.icons.desktop = icon_load("../../demo/common/filebrowser/icon/desktop.png");
|
|
||||||
media.icons.default_file = icon_load("../../demo/common/filebrowser/icon/default.png");
|
|
||||||
media.icons.text_file = icon_load("../../demo/common/filebrowser/icon/text.png");
|
|
||||||
media.icons.music_file = icon_load("../../demo/common/filebrowser/icon/music.png");
|
|
||||||
media.icons.font_file = icon_load("../../demo/common/filebrowser/icon/font.png");
|
|
||||||
media.icons.img_file = icon_load("../../demo/common/filebrowser/icon/img.png");
|
|
||||||
media.icons.movie_file = icon_load("../../demo/common/filebrowser/icon/movie.png");
|
|
||||||
media_init(&media);
|
|
||||||
|
|
||||||
file_browser_init(&browser, &media);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(win))
|
|
||||||
{
|
|
||||||
/* Input */
|
|
||||||
glfwPollEvents();
|
|
||||||
nk_glfw3_new_frame();
|
|
||||||
|
|
||||||
/* GUI */
|
|
||||||
if (nk_begin(ctx, "Demo", nk_rect(50, 50, 230, 250),
|
|
||||||
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
|
|
||||||
NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
|
|
||||||
{
|
|
||||||
enum {EASY, HARD};
|
|
||||||
static int op = EASY;
|
|
||||||
static int property = 20;
|
|
||||||
nk_layout_row_static(ctx, 30, 80, 1);
|
|
||||||
if (nk_button_label(ctx, "button"))
|
|
||||||
fprintf(stdout, "button pressed\n");
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 30, 2);
|
|
||||||
if (nk_option_label(ctx, "easy", op == EASY)) op = EASY;
|
|
||||||
if (nk_option_label(ctx, "hard", op == HARD)) op = HARD;
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1);
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 20, 1);
|
|
||||||
nk_label(ctx, "background:", NK_TEXT_LEFT);
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx),400))) {
|
|
||||||
nk_layout_row_dynamic(ctx, 120, 1);
|
|
||||||
bg = nk_color_picker(ctx, bg, NK_RGBA);
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f,0.005f);
|
|
||||||
nk_combo_end(ctx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nk_end(ctx);
|
|
||||||
|
|
||||||
/* -------------- EXAMPLES ---------------- */
|
|
||||||
#ifdef INCLUDE_CALCULATOR
|
|
||||||
calculator(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CANVAS
|
|
||||||
canvas(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_FILE_BROWSER
|
|
||||||
file_browser_run(&browser, ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_OVERVIEW
|
|
||||||
overview(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_NODE_EDITOR
|
|
||||||
node_editor(ctx);
|
|
||||||
#endif
|
|
||||||
/* ----------------------------------------- */
|
|
||||||
|
|
||||||
/* Draw */
|
|
||||||
glfwGetWindowSize(win, &width, &height);
|
|
||||||
glViewport(0, 0, width, height);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
glClearColor(bg.r, bg.g, bg.b, bg.a);
|
|
||||||
/* IMPORTANT: `nk_glfw_render` modifies some global OpenGL state
|
|
||||||
* with blending, scissor, face culling and depth test and defaults everything
|
|
||||||
* back into a default state. Make sure to either save and restore or
|
|
||||||
* reset your own state after drawing rendering the UI. */
|
|
||||||
nk_glfw3_render(NK_ANTI_ALIASING_ON);
|
|
||||||
glfwSwapBuffers(win);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef INCLUDE_FILE_BROWSER
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.home.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.directory.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.computer.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.desktop.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.default_file.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.text_file.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.music_file.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.font_file.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.img_file.handle.id);
|
|
||||||
glDeleteTextures(1,(const GLuint*)&media.icons.movie_file.handle.id);
|
|
||||||
|
|
||||||
file_browser_free(&browser);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nk_glfw3_shutdown();
|
|
||||||
glfwTerminate();
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,383 +0,0 @@
|
||||||
/*
|
|
||||||
* Nuklear - v1.32.0 - public domain
|
|
||||||
* no warrenty implied; use at your own risk.
|
|
||||||
* authored from 2015-2017 by Micha Mettke
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* ==============================================================
|
|
||||||
*
|
|
||||||
* API
|
|
||||||
*
|
|
||||||
* ===============================================================
|
|
||||||
*/
|
|
||||||
#ifndef NK_GLFW_GL2_H_
|
|
||||||
#define NK_GLFW_GL2_H_
|
|
||||||
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
enum nk_glfw_init_state{
|
|
||||||
NK_GLFW3_DEFAULT = 0,
|
|
||||||
NK_GLFW3_INSTALL_CALLBACKS
|
|
||||||
};
|
|
||||||
NK_API struct nk_context* nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state);
|
|
||||||
NK_API void nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas);
|
|
||||||
NK_API void nk_glfw3_font_stash_end(void);
|
|
||||||
|
|
||||||
NK_API void nk_glfw3_new_frame(void);
|
|
||||||
NK_API void nk_glfw3_render(enum nk_anti_aliasing);
|
|
||||||
NK_API void nk_glfw3_shutdown(void);
|
|
||||||
|
|
||||||
NK_API void nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint);
|
|
||||||
NK_API void nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ==============================================================
|
|
||||||
*
|
|
||||||
* IMPLEMENTATION
|
|
||||||
*
|
|
||||||
* ===============================================================
|
|
||||||
*/
|
|
||||||
#ifdef NK_GLFW_GL2_IMPLEMENTATION
|
|
||||||
|
|
||||||
#ifndef NK_GLFW_TEXT_MAX
|
|
||||||
#define NK_GLFW_TEXT_MAX 256
|
|
||||||
#endif
|
|
||||||
#ifndef NK_GLFW_DOUBLE_CLICK_LO
|
|
||||||
#define NK_GLFW_DOUBLE_CLICK_LO 0.02
|
|
||||||
#endif
|
|
||||||
#ifndef NK_GLFW_DOUBLE_CLICK_HI
|
|
||||||
#define NK_GLFW_DOUBLE_CLICK_HI 0.2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct nk_glfw_device {
|
|
||||||
struct nk_buffer cmds;
|
|
||||||
struct nk_draw_null_texture null;
|
|
||||||
GLuint font_tex;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nk_glfw_vertex {
|
|
||||||
float position[2];
|
|
||||||
float uv[2];
|
|
||||||
nk_byte col[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct nk_glfw {
|
|
||||||
GLFWwindow *win;
|
|
||||||
int width, height;
|
|
||||||
int display_width, display_height;
|
|
||||||
struct nk_glfw_device ogl;
|
|
||||||
struct nk_context ctx;
|
|
||||||
struct nk_font_atlas atlas;
|
|
||||||
struct nk_vec2 fb_scale;
|
|
||||||
unsigned int text[NK_GLFW_TEXT_MAX];
|
|
||||||
int text_len;
|
|
||||||
struct nk_vec2 scroll;
|
|
||||||
double last_button_click;
|
|
||||||
int is_double_click_down;
|
|
||||||
struct nk_vec2 double_click_pos;
|
|
||||||
} glfw;
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_device_upload_atlas(const void *image, int width, int height)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
glGenTextures(1, &dev->font_tex);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, dev->font_tex);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0,
|
|
||||||
GL_RGBA, GL_UNSIGNED_BYTE, image);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_render(enum nk_anti_aliasing AA)
|
|
||||||
{
|
|
||||||
/* setup global state */
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
glPushAttrib(GL_ENABLE_BIT|GL_COLOR_BUFFER_BIT|GL_TRANSFORM_BIT);
|
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
/* setup viewport/project */
|
|
||||||
glViewport(0,0,(GLsizei)glfw.display_width,(GLsizei)glfw.display_height);
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
|
||||||
glPushMatrix();
|
|
||||||
glLoadIdentity();
|
|
||||||
glOrtho(0.0f, glfw.width, glfw.height, 0.0f, -1.0f, 1.0f);
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
|
||||||
glPushMatrix();
|
|
||||||
glLoadIdentity();
|
|
||||||
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
glEnableClientState(GL_COLOR_ARRAY);
|
|
||||||
{
|
|
||||||
GLsizei vs = sizeof(struct nk_glfw_vertex);
|
|
||||||
size_t vp = offsetof(struct nk_glfw_vertex, position);
|
|
||||||
size_t vt = offsetof(struct nk_glfw_vertex, uv);
|
|
||||||
size_t vc = offsetof(struct nk_glfw_vertex, col);
|
|
||||||
|
|
||||||
/* convert from command queue into draw list and draw to screen */
|
|
||||||
const struct nk_draw_command *cmd;
|
|
||||||
const nk_draw_index *offset = NULL;
|
|
||||||
struct nk_buffer vbuf, ebuf;
|
|
||||||
|
|
||||||
/* fill convert configuration */
|
|
||||||
struct nk_convert_config config;
|
|
||||||
static const struct nk_draw_vertex_layout_element vertex_layout[] = {
|
|
||||||
{NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, position)},
|
|
||||||
{NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, uv)},
|
|
||||||
{NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct nk_glfw_vertex, col)},
|
|
||||||
{NK_VERTEX_LAYOUT_END}
|
|
||||||
};
|
|
||||||
memset(&config, 0, sizeof(config));
|
|
||||||
config.vertex_layout = vertex_layout;
|
|
||||||
config.vertex_size = sizeof(struct nk_glfw_vertex);
|
|
||||||
config.vertex_alignment = NK_ALIGNOF(struct nk_glfw_vertex);
|
|
||||||
config.null = dev->null;
|
|
||||||
config.circle_segment_count = 22;
|
|
||||||
config.curve_segment_count = 22;
|
|
||||||
config.arc_segment_count = 22;
|
|
||||||
config.global_alpha = 1.0f;
|
|
||||||
config.shape_AA = AA;
|
|
||||||
config.line_AA = AA;
|
|
||||||
|
|
||||||
/* convert shapes into vertexes */
|
|
||||||
nk_buffer_init_default(&vbuf);
|
|
||||||
nk_buffer_init_default(&ebuf);
|
|
||||||
nk_convert(&glfw.ctx, &dev->cmds, &vbuf, &ebuf, &config);
|
|
||||||
|
|
||||||
/* setup vertex buffer pointer */
|
|
||||||
{const void *vertices = nk_buffer_memory_const(&vbuf);
|
|
||||||
glVertexPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vp));
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vt));
|
|
||||||
glColorPointer(4, GL_UNSIGNED_BYTE, vs, (const void*)((const nk_byte*)vertices + vc));}
|
|
||||||
|
|
||||||
/* iterate over and execute each draw command */
|
|
||||||
offset = (const nk_draw_index*)nk_buffer_memory_const(&ebuf);
|
|
||||||
nk_draw_foreach(cmd, &glfw.ctx, &dev->cmds)
|
|
||||||
{
|
|
||||||
if (!cmd->elem_count) continue;
|
|
||||||
glBindTexture(GL_TEXTURE_2D, (GLuint)cmd->texture.id);
|
|
||||||
glScissor(
|
|
||||||
(GLint)(cmd->clip_rect.x * glfw.fb_scale.x),
|
|
||||||
(GLint)((glfw.height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h)) * glfw.fb_scale.y),
|
|
||||||
(GLint)(cmd->clip_rect.w * glfw.fb_scale.x),
|
|
||||||
(GLint)(cmd->clip_rect.h * glfw.fb_scale.y));
|
|
||||||
glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, GL_UNSIGNED_SHORT, offset);
|
|
||||||
offset += cmd->elem_count;
|
|
||||||
}
|
|
||||||
nk_clear(&glfw.ctx);
|
|
||||||
nk_buffer_clear(&dev->cmds);
|
|
||||||
nk_buffer_free(&vbuf);
|
|
||||||
nk_buffer_free(&ebuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* default OpenGL state */
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
glDisableClientState(GL_COLOR_ARRAY);
|
|
||||||
|
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
glDisable(GL_SCISSOR_TEST);
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
|
||||||
glPopMatrix();
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
|
||||||
glPopMatrix();
|
|
||||||
glPopAttrib();
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint)
|
|
||||||
{
|
|
||||||
(void)win;
|
|
||||||
if (glfw.text_len < NK_GLFW_TEXT_MAX)
|
|
||||||
glfw.text[glfw.text_len++] = codepoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
|
|
||||||
{
|
|
||||||
(void)win; (void)xoff;
|
|
||||||
glfw.scroll.x += (float)xoff;
|
|
||||||
glfw.scroll.y += (float)yoff;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
|
||||||
{
|
|
||||||
double x, y;
|
|
||||||
NK_UNUSED(mods);
|
|
||||||
if (button != GLFW_MOUSE_BUTTON_LEFT) return;
|
|
||||||
glfwGetCursorPos(window, &x, &y);
|
|
||||||
if (action == GLFW_PRESS) {
|
|
||||||
double dt = glfwGetTime() - glfw.last_button_click;
|
|
||||||
if (dt > NK_GLFW_DOUBLE_CLICK_LO && dt < NK_GLFW_DOUBLE_CLICK_HI) {
|
|
||||||
glfw.is_double_click_down = nk_true;
|
|
||||||
glfw.double_click_pos = nk_vec2((float)x, (float)y);
|
|
||||||
}
|
|
||||||
glfw.last_button_click = glfwGetTime();
|
|
||||||
} else glfw.is_double_click_down = nk_false;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit)
|
|
||||||
{
|
|
||||||
const char *text = glfwGetClipboardString(glfw.win);
|
|
||||||
if (text) nk_textedit_paste(edit, text, nk_strlen(text));
|
|
||||||
(void)usr;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len)
|
|
||||||
{
|
|
||||||
char *str = 0;
|
|
||||||
(void)usr;
|
|
||||||
if (!len) return;
|
|
||||||
str = (char*)malloc((size_t)len+1);
|
|
||||||
if (!str) return;
|
|
||||||
memcpy(str, text, (size_t)len);
|
|
||||||
str[len] = '\0';
|
|
||||||
glfwSetClipboardString(glfw.win, str);
|
|
||||||
free(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API struct nk_context*
|
|
||||||
nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state init_state)
|
|
||||||
{
|
|
||||||
glfw.win = win;
|
|
||||||
if (init_state == NK_GLFW3_INSTALL_CALLBACKS) {
|
|
||||||
glfwSetScrollCallback(win, nk_gflw3_scroll_callback);
|
|
||||||
glfwSetCharCallback(win, nk_glfw3_char_callback);
|
|
||||||
glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);
|
|
||||||
}
|
|
||||||
nk_init_default(&glfw.ctx, 0);
|
|
||||||
glfw.ctx.clip.copy = nk_glfw3_clipboard_copy;
|
|
||||||
glfw.ctx.clip.paste = nk_glfw3_clipboard_paste;
|
|
||||||
glfw.ctx.clip.userdata = nk_handle_ptr(0);
|
|
||||||
nk_buffer_init_default(&glfw.ogl.cmds);
|
|
||||||
|
|
||||||
glfw.is_double_click_down = nk_false;
|
|
||||||
glfw.double_click_pos = nk_vec2(0, 0);
|
|
||||||
|
|
||||||
return &glfw.ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas)
|
|
||||||
{
|
|
||||||
nk_font_atlas_init_default(&glfw.atlas);
|
|
||||||
nk_font_atlas_begin(&glfw.atlas);
|
|
||||||
*atlas = &glfw.atlas;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_font_stash_end(void)
|
|
||||||
{
|
|
||||||
const void *image; int w, h;
|
|
||||||
image = nk_font_atlas_bake(&glfw.atlas, &w, &h, NK_FONT_ATLAS_RGBA32);
|
|
||||||
nk_glfw3_device_upload_atlas(image, w, h);
|
|
||||||
nk_font_atlas_end(&glfw.atlas, nk_handle_id((int)glfw.ogl.font_tex), &glfw.ogl.null);
|
|
||||||
if (glfw.atlas.default_font)
|
|
||||||
nk_style_set_font(&glfw.ctx, &glfw.atlas.default_font->handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_new_frame(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x, y;
|
|
||||||
struct nk_context *ctx = &glfw.ctx;
|
|
||||||
struct GLFWwindow *win = glfw.win;
|
|
||||||
|
|
||||||
glfwGetWindowSize(win, &glfw.width, &glfw.height);
|
|
||||||
glfwGetFramebufferSize(win, &glfw.display_width, &glfw.display_height);
|
|
||||||
glfw.fb_scale.x = (float)glfw.display_width/(float)glfw.width;
|
|
||||||
glfw.fb_scale.y = (float)glfw.display_height/(float)glfw.height;
|
|
||||||
|
|
||||||
nk_input_begin(ctx);
|
|
||||||
for (i = 0; i < glfw.text_len; ++i)
|
|
||||||
nk_input_unicode(ctx, glfw.text[i]);
|
|
||||||
|
|
||||||
/* optional grabbing behavior */
|
|
||||||
if (ctx->input.mouse.grab)
|
|
||||||
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
|
||||||
else if (ctx->input.mouse.ungrab)
|
|
||||||
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
|
||||||
|
|
||||||
nk_input_key(ctx, NK_KEY_DEL, glfwGetKey(win, GLFW_KEY_DELETE) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_ENTER, glfwGetKey(win, GLFW_KEY_ENTER) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TAB, glfwGetKey(win, GLFW_KEY_TAB) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_BACKSPACE, glfwGetKey(win, GLFW_KEY_BACKSPACE) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_UP, glfwGetKey(win, GLFW_KEY_UP) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_DOWN, glfwGetKey(win, GLFW_KEY_DOWN) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_DOWN, glfwGetKey(win, GLFW_KEY_PAGE_DOWN) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_UP, glfwGetKey(win, GLFW_KEY_PAGE_UP) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SHIFT, glfwGetKey(win, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS||
|
|
||||||
glfwGetKey(win, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);
|
|
||||||
|
|
||||||
if (glfwGetKey(win, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS ||
|
|
||||||
glfwGetKey(win, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {
|
|
||||||
nk_input_key(ctx, NK_KEY_COPY, glfwGetKey(win, GLFW_KEY_C) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_PASTE, glfwGetKey(win, GLFW_KEY_V) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_CUT, glfwGetKey(win, GLFW_KEY_X) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_UNDO, glfwGetKey(win, GLFW_KEY_Z) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_REDO, glfwGetKey(win, GLFW_KEY_R) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_LINE_START, glfwGetKey(win, GLFW_KEY_B) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_LINE_END, glfwGetKey(win, GLFW_KEY_E) == GLFW_PRESS);
|
|
||||||
} else {
|
|
||||||
nk_input_key(ctx, NK_KEY_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_COPY, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_PASTE, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_CUT, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_SHIFT, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwGetCursorPos(win, &x, &y);
|
|
||||||
nk_input_motion(ctx, (int)x, (int)y);
|
|
||||||
if (ctx->input.mouse.grabbed) {
|
|
||||||
glfwSetCursorPos(glfw.win, (double)ctx->input.mouse.prev.x, (double)ctx->input.mouse.prev.y);
|
|
||||||
ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;
|
|
||||||
ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
nk_input_button(ctx, NK_BUTTON_LEFT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_MIDDLE, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_RIGHT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_DOUBLE, (int)glfw.double_click_pos.x, (int)glfw.double_click_pos.y, glfw.is_double_click_down);
|
|
||||||
nk_input_scroll(ctx, glfw.scroll);
|
|
||||||
nk_input_end(&glfw.ctx);
|
|
||||||
glfw.text_len = 0;
|
|
||||||
glfw.scroll = nk_vec2(0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API
|
|
||||||
void nk_glfw3_shutdown(void)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
nk_font_atlas_clear(&glfw.atlas);
|
|
||||||
nk_free(&glfw.ctx);
|
|
||||||
glDeleteTextures(1, &dev->font_tex);
|
|
||||||
nk_buffer_free(&dev->cmds);
|
|
||||||
memset(&glfw, 0, sizeof(glfw));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,26 +0,0 @@
|
||||||
# Install
|
|
||||||
BIN = demo
|
|
||||||
|
|
||||||
# Flags
|
|
||||||
CFLAGS += -std=c89 -Wall -Wextra -pedantic -O2
|
|
||||||
|
|
||||||
SRC = main.c
|
|
||||||
OBJ = $(SRC:.c=.o)
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
BIN := $(BIN).exe
|
|
||||||
LIBS = -lglfw3 -lopengl32 -lm -lGLU32 -lGLEW32
|
|
||||||
else
|
|
||||||
UNAME_S := $(shell uname -s)
|
|
||||||
GLFW3 := $(shell pkg-config --libs glfw3)
|
|
||||||
ifeq ($(UNAME_S),Darwin)
|
|
||||||
LIBS := $(GLFW3) -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo -lm -lGLEW -L/usr/local/lib
|
|
||||||
else
|
|
||||||
LIBS = $(GLFW3) -lGL -lm -lGLU -lGLEW
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(BIN):
|
|
||||||
@mkdir -p bin
|
|
||||||
rm -f bin/$(BIN) $(OBJS)
|
|
||||||
$(CC) $(SRC) $(CFLAGS) -o bin/$(BIN) $(LIBS)
|
|
|
@ -1,209 +0,0 @@
|
||||||
/* nuklear - 1.32.0 - public domain */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <GL/glew.h>
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
#define NK_INCLUDE_FIXED_TYPES
|
|
||||||
#define NK_INCLUDE_STANDARD_IO
|
|
||||||
#define NK_INCLUDE_STANDARD_VARARGS
|
|
||||||
#define NK_INCLUDE_DEFAULT_ALLOCATOR
|
|
||||||
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
|
|
||||||
#define NK_INCLUDE_FONT_BAKING
|
|
||||||
#define NK_INCLUDE_DEFAULT_FONT
|
|
||||||
#define NK_IMPLEMENTATION
|
|
||||||
#define NK_GLFW_GL3_IMPLEMENTATION
|
|
||||||
#define NK_KEYSTATE_BASED_INPUT
|
|
||||||
#include "../../nuklear.h"
|
|
||||||
#include "nuklear_glfw_gl3.h"
|
|
||||||
|
|
||||||
#define WINDOW_WIDTH 1200
|
|
||||||
#define WINDOW_HEIGHT 800
|
|
||||||
|
|
||||||
#define MAX_VERTEX_BUFFER 512 * 1024
|
|
||||||
#define MAX_ELEMENT_BUFFER 128 * 1024
|
|
||||||
|
|
||||||
/* ===============================================================
|
|
||||||
*
|
|
||||||
* EXAMPLE
|
|
||||||
*
|
|
||||||
* ===============================================================*/
|
|
||||||
/* This are some code examples to provide a small overview of what can be
|
|
||||||
* done with this library. To try out an example uncomment the defines */
|
|
||||||
/*#define INCLUDE_ALL */
|
|
||||||
/*#define INCLUDE_STYLE */
|
|
||||||
/*#define INCLUDE_CALCULATOR */
|
|
||||||
/*#define INCLUDE_CANVAS */
|
|
||||||
#define INCLUDE_OVERVIEW
|
|
||||||
/*#define INCLUDE_NODE_EDITOR */
|
|
||||||
|
|
||||||
#ifdef INCLUDE_ALL
|
|
||||||
#define INCLUDE_STYLE
|
|
||||||
#define INCLUDE_CALCULATOR
|
|
||||||
#define INCLUDE_CANVAS
|
|
||||||
#define INCLUDE_OVERVIEW
|
|
||||||
#define INCLUDE_NODE_EDITOR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef INCLUDE_STYLE
|
|
||||||
#include "../../demo/common/style.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CALCULATOR
|
|
||||||
#include "../../demo/common/calculator.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CANVAS
|
|
||||||
#include "../../demo/common/canvas.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_OVERVIEW
|
|
||||||
#include "../../demo/common/overview.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_NODE_EDITOR
|
|
||||||
#include "../../demo/common/node_editor.c"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ===============================================================
|
|
||||||
*
|
|
||||||
* DEMO
|
|
||||||
*
|
|
||||||
* ===============================================================*/
|
|
||||||
static void error_callback(int e, const char *d)
|
|
||||||
{printf("Error %d: %s\n", e, d);}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
/* Platform */
|
|
||||||
// struct nk_glfw glfw = {0};
|
|
||||||
static GLFWwindow *win;
|
|
||||||
int width = 0, height = 0;
|
|
||||||
struct nk_context *ctx;
|
|
||||||
struct nk_colorf bg;
|
|
||||||
|
|
||||||
/* GLFW */
|
|
||||||
glfwSetErrorCallback(error_callback);
|
|
||||||
if (!glfwInit()) {
|
|
||||||
fprintf(stdout, "[GFLW] failed to init!\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
#ifdef __APPLE__
|
|
||||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
|
||||||
#endif
|
|
||||||
win = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Demo", NULL, NULL);
|
|
||||||
glfwMakeContextCurrent(win);
|
|
||||||
glfwGetWindowSize(win, &width, &height);
|
|
||||||
|
|
||||||
/* OpenGL */
|
|
||||||
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
|
|
||||||
glewExperimental = 1;
|
|
||||||
if (glewInit() != GLEW_OK) {
|
|
||||||
fprintf(stderr, "Failed to setup GLEW\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx = nk_glfw3_init(&glfw, win, NK_GLFW3_INSTALL_CALLBACKS);
|
|
||||||
/* Load Fonts: if none of these are loaded a default font will be used */
|
|
||||||
/* Load Cursor: if you uncomment cursor loading please hide the cursor */
|
|
||||||
{struct nk_font_atlas *atlas;
|
|
||||||
nk_glfw3_font_stash_begin(&glfw, &atlas);
|
|
||||||
/*struct nk_font *droid = nk_font_atlas_add_from_file(atlas, "../../../extra_font/DroidSans.ttf", 14, 0);*/
|
|
||||||
/*struct nk_font *roboto = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Roboto-Regular.ttf", 14, 0);*/
|
|
||||||
/*struct nk_font *future = nk_font_atlas_add_from_file(atlas, "../../../extra_font/kenvector_future_thin.ttf", 13, 0);*/
|
|
||||||
/*struct nk_font *clean = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyClean.ttf", 12, 0);*/
|
|
||||||
/*struct nk_font *tiny = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyTiny.ttf", 10, 0);*/
|
|
||||||
/*struct nk_font *cousine = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Cousine-Regular.ttf", 13, 0);*/
|
|
||||||
nk_glfw3_font_stash_end(&glfw);
|
|
||||||
/*nk_style_load_all_cursors(ctx, atlas->cursors);*/
|
|
||||||
/*nk_style_set_font(ctx, &droid->handle);*/}
|
|
||||||
|
|
||||||
#ifdef INCLUDE_STYLE
|
|
||||||
/*set_style(ctx, THEME_WHITE);*/
|
|
||||||
/*set_style(ctx, THEME_RED);*/
|
|
||||||
/*set_style(ctx, THEME_BLUE);*/
|
|
||||||
/*set_style(ctx, THEME_DARK);*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bg.r = 0.10f, bg.g = 0.18f, bg.b = 0.24f, bg.a = 1.0f;
|
|
||||||
while (!glfwWindowShouldClose(win))
|
|
||||||
{
|
|
||||||
/* Input */
|
|
||||||
glfwPollEvents();
|
|
||||||
nk_glfw3_new_frame(&glfw);
|
|
||||||
|
|
||||||
/* GUI */
|
|
||||||
if (nk_begin(ctx, "Demo", nk_rect(50, 50, 230, 250),
|
|
||||||
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
|
|
||||||
NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
|
|
||||||
{
|
|
||||||
enum {EASY, HARD};
|
|
||||||
static int op = EASY;
|
|
||||||
static int property = 20;
|
|
||||||
nk_layout_row_static(ctx, 30, 80, 1);
|
|
||||||
if (nk_button_label(ctx, "button"))
|
|
||||||
fprintf(stdout, "button pressed\n");
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 30, 2);
|
|
||||||
if (nk_option_label(ctx, "easy", op == EASY)) op = EASY;
|
|
||||||
if (nk_option_label(ctx, "hard", op == HARD)) op = HARD;
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1);
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 20, 1);
|
|
||||||
nk_label(ctx, "background:", NK_TEXT_LEFT);
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx),400))) {
|
|
||||||
nk_layout_row_dynamic(ctx, 120, 1);
|
|
||||||
bg = nk_color_picker(ctx, bg, NK_RGBA);
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f,0.005f);
|
|
||||||
nk_combo_end(ctx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nk_end(ctx);
|
|
||||||
|
|
||||||
/* -------------- EXAMPLES ---------------- */
|
|
||||||
#ifdef INCLUDE_CALCULATOR
|
|
||||||
calculator(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CANVAS
|
|
||||||
canvas(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_OVERVIEW
|
|
||||||
overview(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_NODE_EDITOR
|
|
||||||
node_editor(ctx);
|
|
||||||
#endif
|
|
||||||
/* ----------------------------------------- */
|
|
||||||
|
|
||||||
/* Draw */
|
|
||||||
glfwGetWindowSize(win, &width, &height);
|
|
||||||
glViewport(0, 0, width, height);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
glClearColor(bg.r, bg.g, bg.b, bg.a);
|
|
||||||
/* IMPORTANT: `nk_glfw_render` modifies some global OpenGL state
|
|
||||||
* with blending, scissor, face culling, depth test and viewport and
|
|
||||||
* defaults everything back into a default state.
|
|
||||||
* Make sure to either a.) save and restore or b.) reset your own state after
|
|
||||||
* rendering the UI. */
|
|
||||||
nk_glfw3_render(&glfw, NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);
|
|
||||||
glfwSwapBuffers(win);
|
|
||||||
}
|
|
||||||
nk_glfw3_shutdown(&glfw);
|
|
||||||
glfwTerminate();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
# Install
|
|
||||||
BIN = demo
|
|
||||||
|
|
||||||
# Flags
|
|
||||||
CFLAGS += -std=c89 -Wall -Wextra -pedantic -O2
|
|
||||||
|
|
||||||
SRC = main.c
|
|
||||||
OBJ = $(SRC:.c=.o)
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
BIN := $(BIN).exe
|
|
||||||
LIBS = -lglfw3 -lopengl32 -lm -lGLU32 -lGLEW32
|
|
||||||
else
|
|
||||||
UNAME_S := $(shell uname -s)
|
|
||||||
GLFW3 := $(shell pkg-config --libs glfw3)
|
|
||||||
ifeq ($(UNAME_S),Darwin)
|
|
||||||
LIBS := $(GLFW3) -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo -lm -lGLEW -L/usr/local/lib
|
|
||||||
else
|
|
||||||
LIBS = $(GLFW3) -lGL -lm -lGLU -lGLEW
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(BIN):
|
|
||||||
@mkdir -p bin
|
|
||||||
rm -f bin/$(BIN) $(OBJS)
|
|
||||||
$(CC) $(SRC) $(CFLAGS) -o bin/$(BIN) $(LIBS)
|
|
|
@ -1,230 +0,0 @@
|
||||||
/* nuklear - 1.32.0 - public domain */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <GL/glew.h>
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
#define NK_INCLUDE_FIXED_TYPES
|
|
||||||
#define NK_INCLUDE_STANDARD_IO
|
|
||||||
#define NK_INCLUDE_STANDARD_VARARGS
|
|
||||||
#define NK_INCLUDE_DEFAULT_ALLOCATOR
|
|
||||||
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
|
|
||||||
#define NK_INCLUDE_FONT_BAKING
|
|
||||||
#define NK_INCLUDE_DEFAULT_FONT
|
|
||||||
#define NK_IMPLEMENTATION
|
|
||||||
#define NK_GLFW_GL4_IMPLEMENTATION
|
|
||||||
#define NK_KEYSTATE_BASED_INPUT
|
|
||||||
#include "../../nuklear.h"
|
|
||||||
#include "nuklear_glfw_gl4.h"
|
|
||||||
|
|
||||||
#define WINDOW_WIDTH 1200
|
|
||||||
#define WINDOW_HEIGHT 800
|
|
||||||
|
|
||||||
#define MAX_VERTEX_BUFFER 512 * 1024
|
|
||||||
#define MAX_ELEMENT_BUFFER 128 * 1024
|
|
||||||
|
|
||||||
/* ===============================================================
|
|
||||||
*
|
|
||||||
* EXAMPLE
|
|
||||||
*
|
|
||||||
* ===============================================================*/
|
|
||||||
/* This are some code examples to provide a small overview of what can be
|
|
||||||
* done with this library. To try out an example uncomment the defines */
|
|
||||||
/*#define INCLUDE_ALL */
|
|
||||||
/*#define INCLUDE_STYLE */
|
|
||||||
/*#define INCLUDE_CALCULATOR */
|
|
||||||
/*#define INCLUDE_CANVAS */
|
|
||||||
#define INCLUDE_OVERVIEW
|
|
||||||
/*#define INCLUDE_NODE_EDITOR */
|
|
||||||
|
|
||||||
#ifdef INCLUDE_ALL
|
|
||||||
#define INCLUDE_STYLE
|
|
||||||
#define INCLUDE_CALCULATOR
|
|
||||||
#define INCLUDE_CANVAS
|
|
||||||
#define INCLUDE_OVERVIEW
|
|
||||||
#define INCLUDE_NODE_EDITOR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef INCLUDE_STYLE
|
|
||||||
#include "../../demo/common/style.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CALCULATOR
|
|
||||||
#include "../../demo/common/calculator.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CANVAS
|
|
||||||
#include "../../demo/common/canvas.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_OVERVIEW
|
|
||||||
#include "../../demo/common/overview.c"
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_NODE_EDITOR
|
|
||||||
#include "../../demo/common/node_editor.c"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ===============================================================
|
|
||||||
*
|
|
||||||
* DEMO
|
|
||||||
*
|
|
||||||
* ===============================================================*/
|
|
||||||
static void error_callback(int e, const char *d)
|
|
||||||
{printf("Error %d: %s\n", e, d);}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
/* Platform */
|
|
||||||
static GLFWwindow *win;
|
|
||||||
int width = 0, height = 0;
|
|
||||||
struct nk_context *ctx;
|
|
||||||
struct nk_colorf bg;
|
|
||||||
struct nk_image img;
|
|
||||||
|
|
||||||
/* GLFW */
|
|
||||||
glfwSetErrorCallback(error_callback);
|
|
||||||
if (!glfwInit()) {
|
|
||||||
fprintf(stdout, "[GFLW] failed to init!\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
#ifdef __APPLE__
|
|
||||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
|
||||||
#endif
|
|
||||||
win = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Demo", NULL, NULL);
|
|
||||||
glfwMakeContextCurrent(win);
|
|
||||||
glfwGetWindowSize(win, &width, &height);
|
|
||||||
|
|
||||||
/* OpenGL */
|
|
||||||
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
|
|
||||||
glewExperimental = 1;
|
|
||||||
if (glewInit() != GLEW_OK) {
|
|
||||||
fprintf(stderr, "Failed to setup GLEW\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx = nk_glfw3_init(win, NK_GLFW3_INSTALL_CALLBACKS, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);
|
|
||||||
/* Load Fonts: if none of these are loaded a default font will be used */
|
|
||||||
/* Load Cursor: if you uncomment cursor loading please hide the cursor */
|
|
||||||
{struct nk_font_atlas *atlas;
|
|
||||||
nk_glfw3_font_stash_begin(&atlas);
|
|
||||||
/*struct nk_font *droid = nk_font_atlas_add_from_file(atlas, "../../../extra_font/DroidSans.ttf", 14, 0);*/
|
|
||||||
/*struct nk_font *roboto = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Roboto-Regular.ttf", 14, 0);*/
|
|
||||||
/*struct nk_font *future = nk_font_atlas_add_from_file(atlas, "../../../extra_font/kenvector_future_thin.ttf", 13, 0);*/
|
|
||||||
/*struct nk_font *clean = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyClean.ttf", 12, 0);*/
|
|
||||||
/*struct nk_font *tiny = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyTiny.ttf", 10, 0);*/
|
|
||||||
/*struct nk_font *cousine = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Cousine-Regular.ttf", 13, 0);*/
|
|
||||||
nk_glfw3_font_stash_end();
|
|
||||||
/*nk_style_load_all_cursors(ctx, atlas->cursors);*/
|
|
||||||
/*nk_style_set_font(ctx, &droid->handle);*/}
|
|
||||||
|
|
||||||
#ifdef INCLUDE_STYLE
|
|
||||||
/*set_style(ctx, THEME_WHITE);*/
|
|
||||||
/*set_style(ctx, THEME_RED);*/
|
|
||||||
/*set_style(ctx, THEME_BLUE);*/
|
|
||||||
/*set_style(ctx, THEME_DARK);*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Create bindless texture.
|
|
||||||
* The index returned is not the opengl resource id.
|
|
||||||
* IF you need the GL resource id use: nk_glfw3_get_tex_ogl_id() */
|
|
||||||
{int tex_index = 0;
|
|
||||||
enum {tex_width = 256, tex_height = 256};
|
|
||||||
char pixels[tex_width * tex_height * 4];
|
|
||||||
memset(pixels, 128, sizeof(pixels));
|
|
||||||
tex_index = nk_glfw3_create_texture(pixels, tex_width, tex_height);
|
|
||||||
img = nk_image_id(tex_index);}
|
|
||||||
|
|
||||||
bg.r = 0.10f, bg.g = 0.18f, bg.b = 0.24f, bg.a = 1.0f;
|
|
||||||
while (!glfwWindowShouldClose(win))
|
|
||||||
{
|
|
||||||
/* Input */
|
|
||||||
glfwPollEvents();
|
|
||||||
nk_glfw3_new_frame();
|
|
||||||
|
|
||||||
/* GUI */
|
|
||||||
if (nk_begin(ctx, "Demo", nk_rect(50, 50, 230, 250),
|
|
||||||
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
|
|
||||||
NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
|
|
||||||
{
|
|
||||||
enum {EASY, HARD};
|
|
||||||
static int op = EASY;
|
|
||||||
static int property = 20;
|
|
||||||
nk_layout_row_static(ctx, 30, 80, 1);
|
|
||||||
if (nk_button_label(ctx, "button"))
|
|
||||||
fprintf(stdout, "button pressed\n");
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 30, 2);
|
|
||||||
if (nk_option_label(ctx, "easy", op == EASY)) op = EASY;
|
|
||||||
if (nk_option_label(ctx, "hard", op == HARD)) op = HARD;
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1);
|
|
||||||
|
|
||||||
nk_layout_row_dynamic(ctx, 20, 1);
|
|
||||||
nk_label(ctx, "background:", NK_TEXT_LEFT);
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx),400))) {
|
|
||||||
nk_layout_row_dynamic(ctx, 120, 1);
|
|
||||||
bg = nk_color_picker(ctx, bg, NK_RGBA);
|
|
||||||
nk_layout_row_dynamic(ctx, 25, 1);
|
|
||||||
bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f,0.005f);
|
|
||||||
bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f,0.005f);
|
|
||||||
nk_combo_end(ctx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nk_end(ctx);
|
|
||||||
|
|
||||||
/* Bindless Texture */
|
|
||||||
if (nk_begin(ctx, "Texture", nk_rect(250, 150, 230, 250),
|
|
||||||
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
|
|
||||||
NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
|
|
||||||
{
|
|
||||||
struct nk_command_buffer *canvas = nk_window_get_canvas(ctx);
|
|
||||||
struct nk_rect total_space = nk_window_get_content_region(ctx);
|
|
||||||
nk_draw_image(canvas, total_space, &img, nk_white);
|
|
||||||
}
|
|
||||||
nk_end(ctx);
|
|
||||||
|
|
||||||
/* -------------- EXAMPLES ---------------- */
|
|
||||||
#ifdef INCLUDE_CALCULATOR
|
|
||||||
calculator(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_CANVAS
|
|
||||||
canvas(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_OVERVIEW
|
|
||||||
overview(ctx);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_NODE_EDITOR
|
|
||||||
node_editor(ctx);
|
|
||||||
#endif
|
|
||||||
/* ----------------------------------------- */
|
|
||||||
|
|
||||||
/* Draw */
|
|
||||||
glfwGetWindowSize(win, &width, &height);
|
|
||||||
glViewport(0, 0, width, height);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
glClearColor(bg.r, bg.g, bg.b, bg.a);
|
|
||||||
/* IMPORTANT: `nk_glfw_render` modifies some global OpenGL state
|
|
||||||
* with blending, scissor, face culling, depth test and viewport and
|
|
||||||
* defaults everything back into a default state.
|
|
||||||
* Make sure to either a.) save and restore or b.) reset your own state after
|
|
||||||
* rendering the UI. */
|
|
||||||
nk_glfw3_render(NK_ANTI_ALIASING_ON);
|
|
||||||
glfwSwapBuffers(win);
|
|
||||||
}
|
|
||||||
nk_glfw3_shutdown();
|
|
||||||
glfwTerminate();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,650 +0,0 @@
|
||||||
/*
|
|
||||||
* Nuklear - 1.32.0 - public domain
|
|
||||||
* no warrenty implied; use at your own risk.
|
|
||||||
* authored from 2015-2016 by Micha Mettke
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* ==============================================================
|
|
||||||
*
|
|
||||||
* API
|
|
||||||
*
|
|
||||||
* ===============================================================
|
|
||||||
*/
|
|
||||||
#ifndef NK_GLFW_GL4_H_
|
|
||||||
#define NK_GLFW_GL4_H_
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
enum nk_glfw_init_state{
|
|
||||||
NK_GLFW3_DEFAULT = 0,
|
|
||||||
NK_GLFW3_INSTALL_CALLBACKS
|
|
||||||
};
|
|
||||||
|
|
||||||
NK_API struct nk_context* nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state, int max_vertex_buffer, int max_element_buffer);
|
|
||||||
NK_API void nk_glfw3_shutdown(void);
|
|
||||||
NK_API void nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas);
|
|
||||||
NK_API void nk_glfw3_font_stash_end(void);
|
|
||||||
NK_API void nk_glfw3_new_frame(void);
|
|
||||||
NK_API void nk_glfw3_render(enum nk_anti_aliasing);
|
|
||||||
|
|
||||||
NK_API void nk_glfw3_device_destroy(void);
|
|
||||||
NK_API void nk_glfw3_device_create(void);
|
|
||||||
|
|
||||||
NK_API void nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint);
|
|
||||||
NK_API void nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);
|
|
||||||
NK_API void nk_glfw3_mouse_button_callback(GLFWwindow *win, int button, int action, int mods);
|
|
||||||
|
|
||||||
NK_API GLuint nk_glfw3_get_tex_ogl_id(int tex_index);
|
|
||||||
NK_API GLuint64 nk_glfw3_get_tex_ogl_handle(int tex_index);
|
|
||||||
NK_API int nk_glfw3_create_texture(const void* image, int width, int height);
|
|
||||||
NK_API void nk_glfw3_destroy_texture(int tex_index);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* ==============================================================
|
|
||||||
*
|
|
||||||
* IMPLEMENTATION
|
|
||||||
*
|
|
||||||
* ===============================================================
|
|
||||||
*/
|
|
||||||
#ifdef NK_GLFW_GL4_IMPLEMENTATION
|
|
||||||
#undef NK_GLFW_GL4_IMPLEMENTATION
|
|
||||||
|
|
||||||
#ifndef NK_GLFW_TEXT_MAX
|
|
||||||
#define NK_GLFW_TEXT_MAX 256
|
|
||||||
#endif
|
|
||||||
#ifndef NK_GLFW_DOUBLE_CLICK_LO
|
|
||||||
#define NK_GLFW_DOUBLE_CLICK_LO 0.02
|
|
||||||
#endif
|
|
||||||
#ifndef NK_GLFW_DOUBLE_CLICK_HI
|
|
||||||
#define NK_GLFW_DOUBLE_CLICK_HI 0.2
|
|
||||||
#endif
|
|
||||||
#ifndef NK_GLFW_MAX_TEXTURES
|
|
||||||
#define NK_GLFW_MAX_TEXTURES 256
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct nk_glfw_vertex {
|
|
||||||
float position[2];
|
|
||||||
float uv[2];
|
|
||||||
nk_byte col[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nk_glfw_device {
|
|
||||||
struct nk_buffer cmds;
|
|
||||||
struct nk_draw_null_texture null;
|
|
||||||
GLuint vbo, vao, ebo;
|
|
||||||
GLuint prog;
|
|
||||||
GLuint vert_shdr;
|
|
||||||
GLuint frag_shdr;
|
|
||||||
GLint attrib_pos;
|
|
||||||
GLint attrib_uv;
|
|
||||||
GLint attrib_col;
|
|
||||||
GLint uniform_tex;
|
|
||||||
GLint uniform_proj;
|
|
||||||
int font_tex_index;
|
|
||||||
int max_vertex_buffer;
|
|
||||||
int max_element_buffer;
|
|
||||||
struct nk_glfw_vertex *vert_buffer;
|
|
||||||
int *elem_buffer;
|
|
||||||
GLsync buffer_sync;
|
|
||||||
GLuint tex_ids[NK_GLFW_MAX_TEXTURES];
|
|
||||||
GLuint64 tex_handles[NK_GLFW_MAX_TEXTURES];
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct nk_glfw {
|
|
||||||
GLFWwindow *win;
|
|
||||||
int width, height;
|
|
||||||
int display_width, display_height;
|
|
||||||
struct nk_glfw_device ogl;
|
|
||||||
struct nk_context ctx;
|
|
||||||
struct nk_font_atlas atlas;
|
|
||||||
struct nk_vec2 fb_scale;
|
|
||||||
unsigned int text[NK_GLFW_TEXT_MAX];
|
|
||||||
int text_len;
|
|
||||||
struct nk_vec2 scroll;
|
|
||||||
double last_button_click;
|
|
||||||
int is_double_click_down;
|
|
||||||
struct nk_vec2 double_click_pos;
|
|
||||||
} glfw;
|
|
||||||
|
|
||||||
#define NK_SHADER_VERSION "#version 450 core\n"
|
|
||||||
#define NK_SHADER_BINDLESS "#extension GL_ARB_bindless_texture : require\n"
|
|
||||||
#define NK_SHADER_64BIT "#extension GL_ARB_gpu_shader_int64 : require\n"
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_device_create()
|
|
||||||
{
|
|
||||||
GLint status;
|
|
||||||
GLint len = 0;
|
|
||||||
static const GLchar *vertex_shader =
|
|
||||||
NK_SHADER_VERSION
|
|
||||||
NK_SHADER_BINDLESS
|
|
||||||
NK_SHADER_64BIT
|
|
||||||
"uniform mat4 ProjMtx;\n"
|
|
||||||
"in vec2 Position;\n"
|
|
||||||
"in vec2 TexCoord;\n"
|
|
||||||
"in vec4 Color;\n"
|
|
||||||
"out vec2 Frag_UV;\n"
|
|
||||||
"out vec4 Frag_Color;\n"
|
|
||||||
"void main() {\n"
|
|
||||||
" Frag_UV = TexCoord;\n"
|
|
||||||
" Frag_Color = Color;\n"
|
|
||||||
" gl_Position = ProjMtx * vec4(Position.xy, 0, 1);\n"
|
|
||||||
"}\n";
|
|
||||||
static const GLchar *fragment_shader =
|
|
||||||
NK_SHADER_VERSION
|
|
||||||
NK_SHADER_BINDLESS
|
|
||||||
NK_SHADER_64BIT
|
|
||||||
"precision mediump float;\n"
|
|
||||||
"uniform uint64_t Texture;\n"
|
|
||||||
"in vec2 Frag_UV;\n"
|
|
||||||
"in vec4 Frag_Color;\n"
|
|
||||||
"out vec4 Out_Color;\n"
|
|
||||||
"void main(){\n"
|
|
||||||
" sampler2D smp = sampler2D(Texture);\n"
|
|
||||||
" Out_Color = Frag_Color * texture(smp, Frag_UV.st);\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
nk_buffer_init_default(&dev->cmds);
|
|
||||||
dev->prog = glCreateProgram();
|
|
||||||
dev->vert_shdr = glCreateShader(GL_VERTEX_SHADER);
|
|
||||||
dev->frag_shdr = glCreateShader(GL_FRAGMENT_SHADER);
|
|
||||||
glShaderSource(dev->vert_shdr, 1, &vertex_shader, 0);
|
|
||||||
glShaderSource(dev->frag_shdr, 1, &fragment_shader, 0);
|
|
||||||
glCompileShader(dev->vert_shdr);
|
|
||||||
glCompileShader(dev->frag_shdr);
|
|
||||||
glGetShaderiv(dev->vert_shdr, GL_COMPILE_STATUS, &status);
|
|
||||||
|
|
||||||
glGetShaderiv(dev->vert_shdr, GL_INFO_LOG_LENGTH, &len);
|
|
||||||
if (len > 1) {
|
|
||||||
char *log = (char*)calloc((size_t)len, sizeof(char));
|
|
||||||
glGetShaderInfoLog(dev->vert_shdr, len, NULL, log);
|
|
||||||
fprintf(stdout, "[GL]: failed to compile shader: %s", log);
|
|
||||||
free(log);
|
|
||||||
}
|
|
||||||
|
|
||||||
glGetShaderiv(dev->frag_shdr, GL_INFO_LOG_LENGTH, &len);
|
|
||||||
if (len > 1) {
|
|
||||||
char *log = (char*)calloc((size_t)len, sizeof(char));
|
|
||||||
glGetShaderInfoLog(dev->frag_shdr, len, NULL, log);
|
|
||||||
fprintf(stdout, "[GL]: failed to compile shader: %s", log);
|
|
||||||
free(log);
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(status == GL_TRUE);
|
|
||||||
glGetShaderiv(dev->frag_shdr, GL_COMPILE_STATUS, &status);
|
|
||||||
assert(status == GL_TRUE);
|
|
||||||
glAttachShader(dev->prog, dev->vert_shdr);
|
|
||||||
glAttachShader(dev->prog, dev->frag_shdr);
|
|
||||||
glLinkProgram(dev->prog);
|
|
||||||
glGetProgramiv(dev->prog, GL_LINK_STATUS, &status);
|
|
||||||
assert(status == GL_TRUE);
|
|
||||||
|
|
||||||
dev->uniform_tex = glGetUniformLocation(dev->prog, "Texture");
|
|
||||||
dev->uniform_proj = glGetUniformLocation(dev->prog, "ProjMtx");
|
|
||||||
dev->attrib_pos = glGetAttribLocation(dev->prog, "Position");
|
|
||||||
dev->attrib_uv = glGetAttribLocation(dev->prog, "TexCoord");
|
|
||||||
dev->attrib_col = glGetAttribLocation(dev->prog, "Color");
|
|
||||||
|
|
||||||
{
|
|
||||||
/* buffer setup */
|
|
||||||
GLsizei vs = sizeof(struct nk_glfw_vertex);
|
|
||||||
size_t vp = offsetof(struct nk_glfw_vertex, position);
|
|
||||||
size_t vt = offsetof(struct nk_glfw_vertex, uv);
|
|
||||||
size_t vc = offsetof(struct nk_glfw_vertex, col);
|
|
||||||
|
|
||||||
GLuint pos = (GLuint)dev->attrib_pos;
|
|
||||||
GLuint uv = (GLuint)dev->attrib_uv;
|
|
||||||
GLuint col = (GLuint)dev->attrib_col;
|
|
||||||
|
|
||||||
glCreateVertexArrays(1, &dev->vao);
|
|
||||||
glCreateBuffers(1, &dev->vbo);
|
|
||||||
glCreateBuffers(1, &dev->ebo);
|
|
||||||
|
|
||||||
glEnableVertexArrayAttrib(dev->vao, pos);
|
|
||||||
glEnableVertexArrayAttrib(dev->vao, uv);
|
|
||||||
glEnableVertexArrayAttrib(dev->vao, col);
|
|
||||||
|
|
||||||
glVertexArrayAttribBinding(dev->vao, pos, 0);
|
|
||||||
glVertexArrayAttribBinding(dev->vao, uv, 0);
|
|
||||||
glVertexArrayAttribBinding(dev->vao, col, 0);
|
|
||||||
|
|
||||||
glVertexArrayAttribFormat(dev->vao, pos, 2, GL_FLOAT, GL_FALSE, vp);
|
|
||||||
glVertexArrayAttribFormat(dev->vao, uv, 2, GL_FLOAT, GL_FALSE, vt);
|
|
||||||
glVertexArrayAttribFormat(dev->vao, col, 4, GL_UNSIGNED_BYTE, GL_TRUE, vc);
|
|
||||||
|
|
||||||
glVertexArrayElementBuffer(dev->vao, dev->ebo);
|
|
||||||
glVertexArrayVertexBuffer(dev->vao, 0, dev->vbo, 0, vs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Persistent mapped buffers */
|
|
||||||
{GLsizei vb_size = dev->max_vertex_buffer;
|
|
||||||
GLsizei eb_size = dev->max_element_buffer;
|
|
||||||
GLbitfield flags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
|
|
||||||
glNamedBufferStorage(dev->vbo, vb_size, 0, flags);
|
|
||||||
glNamedBufferStorage(dev->ebo, eb_size, 0, flags);
|
|
||||||
dev->vert_buffer = (struct nk_glfw_vertex*) glMapNamedBufferRange(dev->vbo, 0, vb_size, flags);
|
|
||||||
dev->elem_buffer = (int*) glMapNamedBufferRange(dev->ebo, 0, eb_size, flags);}
|
|
||||||
|
|
||||||
memset(dev->tex_ids, 0, sizeof(dev->tex_ids));
|
|
||||||
memset(dev->tex_handles, 0, sizeof(dev->tex_handles));
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN int
|
|
||||||
nk_glfw3_get_available_tex_index()
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
for (i = 0; i < NK_GLFW_MAX_TEXTURES; i++) {
|
|
||||||
if (dev->tex_ids[i] == 0)
|
|
||||||
return i;
|
|
||||||
} assert(0); /* max textures reached */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API GLuint
|
|
||||||
nk_glfw3_get_tex_ogl_id(int tex_index)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
assert(tex_index >= 0 && tex_index < NK_GLFW_MAX_TEXTURES);
|
|
||||||
return dev->tex_ids[tex_index];
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API GLuint64
|
|
||||||
nk_glfw3_get_tex_ogl_handle(int tex_index)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
assert(tex_index >= 0 && tex_index < NK_GLFW_MAX_TEXTURES);
|
|
||||||
return dev->tex_handles[tex_index];
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API int
|
|
||||||
nk_glfw3_create_texture(const void* image, int width, int height)
|
|
||||||
{
|
|
||||||
GLuint id;
|
|
||||||
GLsizei w = (GLsizei)width;
|
|
||||||
GLsizei h = (GLsizei)height;
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
int tex_index = nk_glfw3_get_available_tex_index();
|
|
||||||
if (tex_index < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
glCreateTextures(GL_TEXTURE_2D, 1, &id);
|
|
||||||
dev->tex_ids[tex_index] = id;
|
|
||||||
|
|
||||||
glTextureParameteri(id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
glTextureParameteri(id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
glTextureParameteri(id, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTextureParameteri(id, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTextureStorage2D(id, 1, GL_RGBA8, w, h);
|
|
||||||
if (image)
|
|
||||||
glTextureSubImage2D(id, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, image);
|
|
||||||
else glClearTexImage(id, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
|
||||||
|
|
||||||
{GLuint64 handle = glGetTextureHandleARB(id);
|
|
||||||
glMakeTextureHandleResidentARB(handle);
|
|
||||||
dev->tex_handles[tex_index] = handle;
|
|
||||||
return tex_index;}
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_destroy_texture(int tex_index)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
GLuint id = nk_glfw3_get_tex_ogl_id(tex_index);
|
|
||||||
if (id == 0) return;
|
|
||||||
|
|
||||||
{GLuint64 handle = nk_glfw3_get_tex_ogl_handle(tex_index);
|
|
||||||
glMakeTextureHandleNonResidentARB(handle);
|
|
||||||
glDeleteTextures(1, &id);
|
|
||||||
dev->tex_ids[tex_index] = 0;
|
|
||||||
dev->tex_handles[tex_index] = 0;}
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_device_upload_atlas(const void *image, int width, int height)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
dev->font_tex_index = nk_glfw3_create_texture(image, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_device_destroy(void)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
glDetachShader(dev->prog, dev->vert_shdr);
|
|
||||||
glDetachShader(dev->prog, dev->frag_shdr);
|
|
||||||
glDeleteShader(dev->vert_shdr);
|
|
||||||
glDeleteShader(dev->frag_shdr);
|
|
||||||
glDeleteProgram(dev->prog);
|
|
||||||
nk_glfw3_destroy_texture(dev->font_tex_index);
|
|
||||||
|
|
||||||
for (i = 0; i < NK_GLFW_MAX_TEXTURES; i++)
|
|
||||||
nk_glfw3_destroy_texture(i);
|
|
||||||
glUnmapNamedBuffer(dev->vbo);
|
|
||||||
glUnmapNamedBuffer(dev->ebo);
|
|
||||||
glDeleteBuffers(1, &dev->vbo);
|
|
||||||
glDeleteBuffers(1, &dev->ebo);
|
|
||||||
glDeleteVertexArrays(1, &dev->vao);
|
|
||||||
nk_buffer_free(&dev->cmds);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_wait_for_buffer_unlock()
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
if(!dev->buffer_sync)
|
|
||||||
return;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
GLenum wait = glClientWaitSync(dev->buffer_sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1);
|
|
||||||
if (wait == GL_ALREADY_SIGNALED || wait == GL_CONDITION_SATISFIED)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_lock_buffer()
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
if(dev->buffer_sync) glDeleteSync(dev->buffer_sync);
|
|
||||||
dev->buffer_sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_render(enum nk_anti_aliasing AA)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
struct nk_buffer vbuf, ebuf;
|
|
||||||
GLfloat ortho[4][4] = {
|
|
||||||
{2.0f, 0.0f, 0.0f, 0.0f},
|
|
||||||
{0.0f,-2.0f, 0.0f, 0.0f},
|
|
||||||
{0.0f, 0.0f,-1.0f, 0.0f},
|
|
||||||
{-1.0f,1.0f, 0.0f, 1.0f},
|
|
||||||
};
|
|
||||||
ortho[0][0] /= (GLfloat)glfw.width;
|
|
||||||
ortho[1][1] /= (GLfloat)glfw.height;
|
|
||||||
|
|
||||||
/* setup global state */
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
|
||||||
|
|
||||||
/* setup program */
|
|
||||||
glUseProgram(dev->prog);
|
|
||||||
glUniformMatrix4fv(dev->uniform_proj, 1, GL_FALSE, &ortho[0][0]);
|
|
||||||
glViewport(0,0,(GLsizei)glfw.display_width,(GLsizei)glfw.display_height);
|
|
||||||
{
|
|
||||||
/* convert from command queue into draw list and draw to screen */
|
|
||||||
const struct nk_draw_command *cmd;
|
|
||||||
void *vertices, *elements;
|
|
||||||
const nk_draw_index *offset = NULL;
|
|
||||||
|
|
||||||
glBindVertexArray(dev->vao);
|
|
||||||
|
|
||||||
/* load draw vertices & elements directly into vertex + element buffer */
|
|
||||||
vertices = dev->vert_buffer;
|
|
||||||
elements = dev->elem_buffer;
|
|
||||||
{
|
|
||||||
/* Wait until GPU is done with buffer */
|
|
||||||
nk_glfw3_wait_for_buffer_unlock();
|
|
||||||
{
|
|
||||||
/* fill convert configuration */
|
|
||||||
struct nk_convert_config config;
|
|
||||||
static const struct nk_draw_vertex_layout_element vertex_layout[] = {
|
|
||||||
{NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, position)},
|
|
||||||
{NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, uv)},
|
|
||||||
{NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct nk_glfw_vertex, col)},
|
|
||||||
{NK_VERTEX_LAYOUT_END}
|
|
||||||
};
|
|
||||||
memset(&config, 0, sizeof(config));
|
|
||||||
config.vertex_layout = vertex_layout;
|
|
||||||
config.vertex_size = sizeof(struct nk_glfw_vertex);
|
|
||||||
config.vertex_alignment = NK_ALIGNOF(struct nk_glfw_vertex);
|
|
||||||
config.null = dev->null;
|
|
||||||
config.circle_segment_count = 22;
|
|
||||||
config.curve_segment_count = 22;
|
|
||||||
config.arc_segment_count = 22;
|
|
||||||
config.global_alpha = 1.0f;
|
|
||||||
config.shape_AA = AA;
|
|
||||||
config.line_AA = AA;
|
|
||||||
|
|
||||||
/* setup buffers to load vertices and elements */
|
|
||||||
nk_buffer_init_fixed(&vbuf, vertices, (size_t)dev->max_vertex_buffer);
|
|
||||||
nk_buffer_init_fixed(&ebuf, elements, (size_t)dev->max_element_buffer);
|
|
||||||
nk_convert(&glfw.ctx, &dev->cmds, &vbuf, &ebuf, &config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* iterate over and execute each draw command */
|
|
||||||
nk_draw_foreach(cmd, &glfw.ctx, &dev->cmds)
|
|
||||||
{
|
|
||||||
int tex_index;
|
|
||||||
GLuint64 tex_handle;
|
|
||||||
if (!cmd->elem_count) continue;
|
|
||||||
|
|
||||||
tex_index = cmd->texture.id;
|
|
||||||
tex_handle = nk_glfw3_get_tex_ogl_handle(tex_index);
|
|
||||||
|
|
||||||
/* tex handle must be made resident in each context that uses it */
|
|
||||||
if (!glIsTextureHandleResidentARB(tex_handle))
|
|
||||||
glMakeTextureHandleResidentARB(tex_handle);
|
|
||||||
|
|
||||||
glUniformHandleui64ARB(dev->uniform_tex, tex_handle);
|
|
||||||
glScissor(
|
|
||||||
(GLint)(cmd->clip_rect.x * glfw.fb_scale.x),
|
|
||||||
(GLint)((glfw.height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h)) * glfw.fb_scale.y),
|
|
||||||
(GLint)(cmd->clip_rect.w * glfw.fb_scale.x),
|
|
||||||
(GLint)(cmd->clip_rect.h * glfw.fb_scale.y));
|
|
||||||
glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, GL_UNSIGNED_SHORT, offset);
|
|
||||||
offset += cmd->elem_count;
|
|
||||||
}
|
|
||||||
nk_clear(&glfw.ctx);
|
|
||||||
nk_buffer_clear(&dev->cmds);
|
|
||||||
}
|
|
||||||
/* default OpenGL state */
|
|
||||||
glUseProgram(0);
|
|
||||||
glBindVertexArray(0);
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
glDisable(GL_SCISSOR_TEST);
|
|
||||||
/* Lock buffer until GPU has finished draw command */
|
|
||||||
nk_glfw3_lock_buffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint)
|
|
||||||
{
|
|
||||||
(void)win;
|
|
||||||
if (glfw.text_len < NK_GLFW_TEXT_MAX)
|
|
||||||
glfw.text[glfw.text_len++] = codepoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
|
|
||||||
{
|
|
||||||
(void)win; (void)xoff;
|
|
||||||
glfw.scroll.x += (float)xoff;
|
|
||||||
glfw.scroll.y += (float)yoff;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
|
||||||
{
|
|
||||||
double x, y;
|
|
||||||
NK_UNUSED(mods);
|
|
||||||
if (button != GLFW_MOUSE_BUTTON_LEFT) return;
|
|
||||||
glfwGetCursorPos(window, &x, &y);
|
|
||||||
if (action == GLFW_PRESS) {
|
|
||||||
double dt = glfwGetTime() - glfw.last_button_click;
|
|
||||||
if (dt > NK_GLFW_DOUBLE_CLICK_LO && dt < NK_GLFW_DOUBLE_CLICK_HI) {
|
|
||||||
glfw.is_double_click_down = nk_true;
|
|
||||||
glfw.double_click_pos = nk_vec2((float)x, (float)y);
|
|
||||||
}
|
|
||||||
glfw.last_button_click = glfwGetTime();
|
|
||||||
} else glfw.is_double_click_down = nk_false;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit)
|
|
||||||
{
|
|
||||||
const char *text = glfwGetClipboardString(glfw.win);
|
|
||||||
if (text) nk_textedit_paste(edit, text, nk_strlen(text));
|
|
||||||
(void)usr;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len)
|
|
||||||
{
|
|
||||||
char *str = 0;
|
|
||||||
(void)usr;
|
|
||||||
if (!len) return;
|
|
||||||
str = (char*)malloc((size_t)len+1);
|
|
||||||
if (!str) return;
|
|
||||||
memcpy(str, text, (size_t)len);
|
|
||||||
str[len] = '\0';
|
|
||||||
glfwSetClipboardString(glfw.win, str);
|
|
||||||
free(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API struct nk_context*
|
|
||||||
nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state init_state,
|
|
||||||
int max_vertex_buffer, int max_element_buffer)
|
|
||||||
{
|
|
||||||
glfw.win = win;
|
|
||||||
if (init_state == NK_GLFW3_INSTALL_CALLBACKS) {
|
|
||||||
glfwSetScrollCallback(win, nk_gflw3_scroll_callback);
|
|
||||||
glfwSetCharCallback(win, nk_glfw3_char_callback);
|
|
||||||
glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);
|
|
||||||
}
|
|
||||||
nk_init_default(&glfw.ctx, 0);
|
|
||||||
glfw.ctx.clip.copy = nk_glfw3_clipboard_copy;
|
|
||||||
glfw.ctx.clip.paste = nk_glfw3_clipboard_paste;
|
|
||||||
glfw.ctx.clip.userdata = nk_handle_ptr(0);
|
|
||||||
glfw.last_button_click = 0;
|
|
||||||
|
|
||||||
{struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
dev->max_vertex_buffer = max_vertex_buffer;
|
|
||||||
dev->max_element_buffer = max_element_buffer;
|
|
||||||
nk_glfw3_device_create();}
|
|
||||||
|
|
||||||
glfw.is_double_click_down = nk_false;
|
|
||||||
glfw.double_click_pos = nk_vec2(0, 0);
|
|
||||||
|
|
||||||
return &glfw.ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas)
|
|
||||||
{
|
|
||||||
nk_font_atlas_init_default(&glfw.atlas);
|
|
||||||
nk_font_atlas_begin(&glfw.atlas);
|
|
||||||
*atlas = &glfw.atlas;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_font_stash_end(void)
|
|
||||||
{
|
|
||||||
const void *image; int w, h;
|
|
||||||
image = nk_font_atlas_bake(&glfw.atlas, &w, &h, NK_FONT_ATLAS_RGBA32);
|
|
||||||
nk_glfw3_device_upload_atlas(image, w, h);
|
|
||||||
nk_font_atlas_end(&glfw.atlas, nk_handle_id((int)glfw.ogl.font_tex_index), &glfw.ogl.null);
|
|
||||||
if (glfw.atlas.default_font)
|
|
||||||
nk_style_set_font(&glfw.ctx, &glfw.atlas.default_font->handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_new_frame(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x, y;
|
|
||||||
struct nk_context *ctx = &glfw.ctx;
|
|
||||||
struct GLFWwindow *win = glfw.win;
|
|
||||||
|
|
||||||
glfwGetWindowSize(win, &glfw.width, &glfw.height);
|
|
||||||
glfwGetFramebufferSize(win, &glfw.display_width, &glfw.display_height);
|
|
||||||
glfw.fb_scale.x = (float)glfw.display_width/(float)glfw.width;
|
|
||||||
glfw.fb_scale.y = (float)glfw.display_height/(float)glfw.height;
|
|
||||||
|
|
||||||
nk_input_begin(ctx);
|
|
||||||
for (i = 0; i < glfw.text_len; ++i)
|
|
||||||
nk_input_unicode(ctx, glfw.text[i]);
|
|
||||||
|
|
||||||
#ifdef NK_GLFW_GL4_MOUSE_GRABBING
|
|
||||||
/* optional grabbing behavior */
|
|
||||||
if (ctx->input.mouse.grab)
|
|
||||||
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
|
||||||
else if (ctx->input.mouse.ungrab)
|
|
||||||
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nk_input_key(ctx, NK_KEY_DEL, glfwGetKey(win, GLFW_KEY_DELETE) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_ENTER, glfwGetKey(win, GLFW_KEY_ENTER) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TAB, glfwGetKey(win, GLFW_KEY_TAB) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_BACKSPACE, glfwGetKey(win, GLFW_KEY_BACKSPACE) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_UP, glfwGetKey(win, GLFW_KEY_UP) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_DOWN, glfwGetKey(win, GLFW_KEY_DOWN) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_DOWN, glfwGetKey(win, GLFW_KEY_PAGE_DOWN) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_UP, glfwGetKey(win, GLFW_KEY_PAGE_UP) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SHIFT, glfwGetKey(win, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS||
|
|
||||||
glfwGetKey(win, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);
|
|
||||||
|
|
||||||
if (glfwGetKey(win, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS ||
|
|
||||||
glfwGetKey(win, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {
|
|
||||||
nk_input_key(ctx, NK_KEY_COPY, glfwGetKey(win, GLFW_KEY_C) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_PASTE, glfwGetKey(win, GLFW_KEY_V) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_CUT, glfwGetKey(win, GLFW_KEY_X) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_UNDO, glfwGetKey(win, GLFW_KEY_Z) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_REDO, glfwGetKey(win, GLFW_KEY_R) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_LINE_START, glfwGetKey(win, GLFW_KEY_B) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_LINE_END, glfwGetKey(win, GLFW_KEY_E) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, glfwGetKey(win, GLFW_KEY_A) == GLFW_PRESS);
|
|
||||||
} else {
|
|
||||||
nk_input_key(ctx, NK_KEY_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_COPY, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_PASTE, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_CUT, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_SHIFT, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwGetCursorPos(win, &x, &y);
|
|
||||||
nk_input_motion(ctx, (int)x, (int)y);
|
|
||||||
#ifdef NK_GLFW_GL4_MOUSE_GRABBING
|
|
||||||
if (ctx->input.mouse.grabbed) {
|
|
||||||
glfwSetCursorPos(glfw.win, ctx->input.mouse.prev.x, ctx->input.mouse.prev.y);
|
|
||||||
ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;
|
|
||||||
ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
nk_input_button(ctx, NK_BUTTON_LEFT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_MIDDLE, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_RIGHT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_DOUBLE, (int)glfw.double_click_pos.x, (int)glfw.double_click_pos.y, glfw.is_double_click_down);
|
|
||||||
nk_input_scroll(ctx, glfw.scroll);
|
|
||||||
nk_input_end(&glfw.ctx);
|
|
||||||
glfw.text_len = 0;
|
|
||||||
glfw.scroll = nk_vec2(0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API
|
|
||||||
void nk_glfw3_shutdown(void)
|
|
||||||
{
|
|
||||||
nk_font_atlas_clear(&glfw.atlas);
|
|
||||||
nk_free(&glfw.ctx);
|
|
||||||
nk_glfw3_device_destroy();
|
|
||||||
memset(&glfw, 0, sizeof(glfw));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include nuke.h
|
#include "nuke.h"
|
||||||
|
|
||||||
#include "openglrender.h"
|
#include "openglrender.h"
|
||||||
#include "editor.h"
|
#include "editor.h"
|
||||||
|
@ -22,7 +22,6 @@
|
||||||
#include <chipmunk/chipmunk.h>
|
#include <chipmunk/chipmunk.h>
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "pinball.h"
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "vec.h"
|
#include "vec.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -421,13 +420,7 @@ void editor_init(struct mSDLWindow *window)
|
||||||
fclose(feditor);
|
fclose(feditor);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx = nk_glfw3_init(&nkglfw, window->window, NK_GLFW3_INSTALL_CALLBACKS);
|
nuke_init(window);
|
||||||
|
|
||||||
|
|
||||||
struct nk_font_atlas *atlas;
|
|
||||||
nk_glfw3_font_stash_begin(&nkglfw, &atlas);
|
|
||||||
struct nk_font *droid = nk_font_atlas_add_from_file(atlas, "fonts/notosans.tff", 14, 0);
|
|
||||||
nk_glfw3_font_stash_end(&nkglfw);
|
|
||||||
|
|
||||||
glfwSetKeyCallback(window->window, edit_input_cb);
|
glfwSetKeyCallback(window->window, edit_input_cb);
|
||||||
glfwSetMouseButtonCallback(window->window, edit_mouse_cb);
|
glfwSetMouseButtonCallback(window->window, edit_mouse_cb);
|
||||||
|
@ -842,7 +835,7 @@ nk_end(ctx);
|
||||||
|
|
||||||
void editor_render()
|
void editor_render()
|
||||||
{
|
{
|
||||||
nk_glfw3_new_frame(&nkglfw);
|
nuke_start();
|
||||||
|
|
||||||
struct nk_colorf bg;
|
struct nk_colorf bg;
|
||||||
bg.r = 0.10f, bg.g = 0.18f, bg.b = 0.24f, bg.a = 1.0f;
|
bg.r = 0.10f, bg.g = 0.18f, bg.b = 0.24f, bg.a = 1.0f;
|
||||||
|
@ -854,7 +847,7 @@ void editor_render()
|
||||||
|
|
||||||
editor_project_gui();
|
editor_project_gui();
|
||||||
|
|
||||||
nk_glfw3_render(&nkglfw, NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);
|
nuke_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1473,9 +1466,3 @@ void game_pause()
|
||||||
physOn = 0;
|
physOn = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pinball_flipper_gui(struct flipper *flip)
|
|
||||||
{
|
|
||||||
nk_property_float(ctx, "Angle start", 0.f, &flip->angle1, 360.f, 1.f, 0.1f);
|
|
||||||
nk_property_float(ctx, "Angle end", 0.f, &flip->angle2, 360.f, 1.f, 0.1f);
|
|
||||||
nk_property_float(ctx, "Flipper speed", 0.f, &flip->flipspeed, 100.f, 1.f, 0.1f);
|
|
||||||
}
|
|
2452
source/engine/parson.c
Normal file
2452
source/engine/parson.c
Normal file
File diff suppressed because it is too large
Load diff
264
source/engine/parson.h
Normal file
264
source/engine/parson.h
Normal file
|
@ -0,0 +1,264 @@
|
||||||
|
/*
|
||||||
|
SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
Parson 1.4.0 (https://github.com/kgabis/parson)
|
||||||
|
Copyright (c) 2012 - 2022 Krzysztof Gabis
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef parson_parson_h
|
||||||
|
#define parson_parson_h
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
|
} /* unconfuse xcode */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PARSON_VERSION_MAJOR 1
|
||||||
|
#define PARSON_VERSION_MINOR 4
|
||||||
|
#define PARSON_VERSION_PATCH 0
|
||||||
|
|
||||||
|
#define PARSON_VERSION_STRING "1.4.0"
|
||||||
|
|
||||||
|
#include <stddef.h> /* size_t */
|
||||||
|
|
||||||
|
/* Types and enums */
|
||||||
|
typedef struct json_object_t JSON_Object;
|
||||||
|
typedef struct json_array_t JSON_Array;
|
||||||
|
typedef struct json_value_t JSON_Value;
|
||||||
|
|
||||||
|
enum json_value_type {
|
||||||
|
JSONError = -1,
|
||||||
|
JSONNull = 1,
|
||||||
|
JSONString = 2,
|
||||||
|
JSONNumber = 3,
|
||||||
|
JSONObject = 4,
|
||||||
|
JSONArray = 5,
|
||||||
|
JSONBoolean = 6
|
||||||
|
};
|
||||||
|
typedef int JSON_Value_Type;
|
||||||
|
|
||||||
|
enum json_result_t {
|
||||||
|
JSONSuccess = 0,
|
||||||
|
JSONFailure = -1
|
||||||
|
};
|
||||||
|
typedef int JSON_Status;
|
||||||
|
|
||||||
|
typedef void * (*JSON_Malloc_Function)(size_t);
|
||||||
|
typedef void (*JSON_Free_Function)(void *);
|
||||||
|
|
||||||
|
/* Call only once, before calling any other function from parson API. If not called, malloc and free
|
||||||
|
from stdlib will be used for all allocations */
|
||||||
|
void json_set_allocation_functions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun);
|
||||||
|
|
||||||
|
/* Sets if slashes should be escaped or not when serializing JSON. By default slashes are escaped.
|
||||||
|
This function sets a global setting and is not thread safe. */
|
||||||
|
void json_set_escape_slashes(int escape_slashes);
|
||||||
|
|
||||||
|
/* Sets float format used for serialization of numbers.
|
||||||
|
Make sure it can't serialize to a string longer than PARSON_NUM_BUF_SIZE.
|
||||||
|
If format is null then the default format is used. */
|
||||||
|
void json_set_float_serialization_format(const char *format);
|
||||||
|
|
||||||
|
/* Parses first JSON value in a file, returns NULL in case of error */
|
||||||
|
JSON_Value * json_parse_file(const char *filename);
|
||||||
|
|
||||||
|
/* Parses first JSON value in a file and ignores comments (/ * * / and //),
|
||||||
|
returns NULL in case of error */
|
||||||
|
JSON_Value * json_parse_file_with_comments(const char *filename);
|
||||||
|
|
||||||
|
/* Parses first JSON value in a string, returns NULL in case of error */
|
||||||
|
JSON_Value * json_parse_string(const char *string);
|
||||||
|
|
||||||
|
/* Parses first JSON value in a string and ignores comments (/ * * / and //),
|
||||||
|
returns NULL in case of error */
|
||||||
|
JSON_Value * json_parse_string_with_comments(const char *string);
|
||||||
|
|
||||||
|
/* Serialization */
|
||||||
|
size_t json_serialization_size(const JSON_Value *value); /* returns 0 on fail */
|
||||||
|
JSON_Status json_serialize_to_buffer(const JSON_Value *value, char *buf, size_t buf_size_in_bytes);
|
||||||
|
JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename);
|
||||||
|
char * json_serialize_to_string(const JSON_Value *value);
|
||||||
|
|
||||||
|
/* Pretty serialization */
|
||||||
|
size_t json_serialization_size_pretty(const JSON_Value *value); /* returns 0 on fail */
|
||||||
|
JSON_Status json_serialize_to_buffer_pretty(const JSON_Value *value, char *buf, size_t buf_size_in_bytes);
|
||||||
|
JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename);
|
||||||
|
char * json_serialize_to_string_pretty(const JSON_Value *value);
|
||||||
|
|
||||||
|
void json_free_serialized_string(char *string); /* frees string from json_serialize_to_string and json_serialize_to_string_pretty */
|
||||||
|
|
||||||
|
/* Comparing */
|
||||||
|
int json_value_equals(const JSON_Value *a, const JSON_Value *b);
|
||||||
|
|
||||||
|
/* Validation
|
||||||
|
This is *NOT* JSON Schema. It validates json by checking if object have identically
|
||||||
|
named fields with matching types.
|
||||||
|
For example schema {"name":"", "age":0} will validate
|
||||||
|
{"name":"Joe", "age":25} and {"name":"Joe", "age":25, "gender":"m"},
|
||||||
|
but not {"name":"Joe"} or {"name":"Joe", "age":"Cucumber"}.
|
||||||
|
In case of arrays, only first value in schema is checked against all values in tested array.
|
||||||
|
Empty objects ({}) validate all objects, empty arrays ([]) validate all arrays,
|
||||||
|
null validates values of every type.
|
||||||
|
*/
|
||||||
|
JSON_Status json_validate(const JSON_Value *schema, const JSON_Value *value);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JSON Object
|
||||||
|
*/
|
||||||
|
JSON_Value * json_object_get_value (const JSON_Object *object, const char *name);
|
||||||
|
const char * json_object_get_string (const JSON_Object *object, const char *name);
|
||||||
|
size_t json_object_get_string_len(const JSON_Object *object, const char *name); /* doesn't account for last null character */
|
||||||
|
JSON_Object * json_object_get_object (const JSON_Object *object, const char *name);
|
||||||
|
JSON_Array * json_object_get_array (const JSON_Object *object, const char *name);
|
||||||
|
double json_object_get_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
|
||||||
|
int json_object_get_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */
|
||||||
|
|
||||||
|
/* dotget functions enable addressing values with dot notation in nested objects,
|
||||||
|
just like in structs or c++/java/c# objects (e.g. objectA.objectB.value).
|
||||||
|
Because valid names in JSON can contain dots, some values may be inaccessible
|
||||||
|
this way. */
|
||||||
|
JSON_Value * json_object_dotget_value (const JSON_Object *object, const char *name);
|
||||||
|
const char * json_object_dotget_string (const JSON_Object *object, const char *name);
|
||||||
|
size_t json_object_dotget_string_len(const JSON_Object *object, const char *name); /* doesn't account for last null character */
|
||||||
|
JSON_Object * json_object_dotget_object (const JSON_Object *object, const char *name);
|
||||||
|
JSON_Array * json_object_dotget_array (const JSON_Object *object, const char *name);
|
||||||
|
double json_object_dotget_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
|
||||||
|
int json_object_dotget_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */
|
||||||
|
|
||||||
|
/* Functions to get available names */
|
||||||
|
size_t json_object_get_count (const JSON_Object *object);
|
||||||
|
const char * json_object_get_name (const JSON_Object *object, size_t index);
|
||||||
|
JSON_Value * json_object_get_value_at(const JSON_Object *object, size_t index);
|
||||||
|
JSON_Value * json_object_get_wrapping_value(const JSON_Object *object);
|
||||||
|
|
||||||
|
/* Functions to check if object has a value with a specific name. Returned value is 1 if object has
|
||||||
|
* a value and 0 if it doesn't. dothas functions behave exactly like dotget functions. */
|
||||||
|
int json_object_has_value (const JSON_Object *object, const char *name);
|
||||||
|
int json_object_has_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type);
|
||||||
|
|
||||||
|
int json_object_dothas_value (const JSON_Object *object, const char *name);
|
||||||
|
int json_object_dothas_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type);
|
||||||
|
|
||||||
|
/* Creates new name-value pair or frees and replaces old value with a new one.
|
||||||
|
* json_object_set_value does not copy passed value so it shouldn't be freed afterwards. */
|
||||||
|
JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value);
|
||||||
|
JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string);
|
||||||
|
JSON_Status json_object_set_string_with_len(JSON_Object *object, const char *name, const char *string, size_t len); /* length shouldn't include last null character */
|
||||||
|
JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number);
|
||||||
|
JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean);
|
||||||
|
JSON_Status json_object_set_null(JSON_Object *object, const char *name);
|
||||||
|
|
||||||
|
/* Works like dotget functions, but creates whole hierarchy if necessary.
|
||||||
|
* json_object_dotset_value does not copy passed value so it shouldn't be freed afterwards. */
|
||||||
|
JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value);
|
||||||
|
JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string);
|
||||||
|
JSON_Status json_object_dotset_string_with_len(JSON_Object *object, const char *name, const char *string, size_t len); /* length shouldn't include last null character */
|
||||||
|
JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number);
|
||||||
|
JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean);
|
||||||
|
JSON_Status json_object_dotset_null(JSON_Object *object, const char *name);
|
||||||
|
|
||||||
|
/* Frees and removes name-value pair */
|
||||||
|
JSON_Status json_object_remove(JSON_Object *object, const char *name);
|
||||||
|
|
||||||
|
/* Works like dotget function, but removes name-value pair only on exact match. */
|
||||||
|
JSON_Status json_object_dotremove(JSON_Object *object, const char *key);
|
||||||
|
|
||||||
|
/* Removes all name-value pairs in object */
|
||||||
|
JSON_Status json_object_clear(JSON_Object *object);
|
||||||
|
|
||||||
|
/*
|
||||||
|
*JSON Array
|
||||||
|
*/
|
||||||
|
JSON_Value * json_array_get_value (const JSON_Array *array, size_t index);
|
||||||
|
const char * json_array_get_string (const JSON_Array *array, size_t index);
|
||||||
|
size_t json_array_get_string_len(const JSON_Array *array, size_t index); /* doesn't account for last null character */
|
||||||
|
JSON_Object * json_array_get_object (const JSON_Array *array, size_t index);
|
||||||
|
JSON_Array * json_array_get_array (const JSON_Array *array, size_t index);
|
||||||
|
double json_array_get_number (const JSON_Array *array, size_t index); /* returns 0 on fail */
|
||||||
|
int json_array_get_boolean(const JSON_Array *array, size_t index); /* returns -1 on fail */
|
||||||
|
size_t json_array_get_count (const JSON_Array *array);
|
||||||
|
JSON_Value * json_array_get_wrapping_value(const JSON_Array *array);
|
||||||
|
|
||||||
|
/* Frees and removes value at given index, does nothing and returns JSONFailure if index doesn't exist.
|
||||||
|
* Order of values in array may change during execution. */
|
||||||
|
JSON_Status json_array_remove(JSON_Array *array, size_t i);
|
||||||
|
|
||||||
|
/* Frees and removes from array value at given index and replaces it with given one.
|
||||||
|
* Does nothing and returns JSONFailure if index doesn't exist.
|
||||||
|
* json_array_replace_value does not copy passed value so it shouldn't be freed afterwards. */
|
||||||
|
JSON_Status json_array_replace_value(JSON_Array *array, size_t i, JSON_Value *value);
|
||||||
|
JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string);
|
||||||
|
JSON_Status json_array_replace_string_with_len(JSON_Array *array, size_t i, const char *string, size_t len); /* length shouldn't include last null character */
|
||||||
|
JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number);
|
||||||
|
JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean);
|
||||||
|
JSON_Status json_array_replace_null(JSON_Array *array, size_t i);
|
||||||
|
|
||||||
|
/* Frees and removes all values from array */
|
||||||
|
JSON_Status json_array_clear(JSON_Array *array);
|
||||||
|
|
||||||
|
/* Appends new value at the end of array.
|
||||||
|
* json_array_append_value does not copy passed value so it shouldn't be freed afterwards. */
|
||||||
|
JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value);
|
||||||
|
JSON_Status json_array_append_string(JSON_Array *array, const char *string);
|
||||||
|
JSON_Status json_array_append_string_with_len(JSON_Array *array, const char *string, size_t len); /* length shouldn't include last null character */
|
||||||
|
JSON_Status json_array_append_number(JSON_Array *array, double number);
|
||||||
|
JSON_Status json_array_append_boolean(JSON_Array *array, int boolean);
|
||||||
|
JSON_Status json_array_append_null(JSON_Array *array);
|
||||||
|
|
||||||
|
/*
|
||||||
|
*JSON Value
|
||||||
|
*/
|
||||||
|
JSON_Value * json_value_init_object (void);
|
||||||
|
JSON_Value * json_value_init_array (void);
|
||||||
|
JSON_Value * json_value_init_string (const char *string); /* copies passed string */
|
||||||
|
JSON_Value * json_value_init_string_with_len(const char *string, size_t length); /* copies passed string, length shouldn't include last null character */
|
||||||
|
JSON_Value * json_value_init_number (double number);
|
||||||
|
JSON_Value * json_value_init_boolean(int boolean);
|
||||||
|
JSON_Value * json_value_init_null (void);
|
||||||
|
JSON_Value * json_value_deep_copy (const JSON_Value *value);
|
||||||
|
void json_value_free (JSON_Value *value);
|
||||||
|
|
||||||
|
JSON_Value_Type json_value_get_type (const JSON_Value *value);
|
||||||
|
JSON_Object * json_value_get_object (const JSON_Value *value);
|
||||||
|
JSON_Array * json_value_get_array (const JSON_Value *value);
|
||||||
|
const char * json_value_get_string (const JSON_Value *value);
|
||||||
|
size_t json_value_get_string_len(const JSON_Value *value); /* doesn't account for last null character */
|
||||||
|
double json_value_get_number (const JSON_Value *value);
|
||||||
|
int json_value_get_boolean(const JSON_Value *value);
|
||||||
|
JSON_Value * json_value_get_parent (const JSON_Value *value);
|
||||||
|
|
||||||
|
/* Same as above, but shorter */
|
||||||
|
JSON_Value_Type json_type (const JSON_Value *value);
|
||||||
|
JSON_Object * json_object (const JSON_Value *value);
|
||||||
|
JSON_Array * json_array (const JSON_Value *value);
|
||||||
|
const char * json_string (const JSON_Value *value);
|
||||||
|
size_t json_string_len(const JSON_Value *value); /* doesn't account for last null character */
|
||||||
|
double json_number (const JSON_Value *value);
|
||||||
|
int json_boolean(const JSON_Value *value);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -3,7 +3,6 @@
|
||||||
#include "2dphysics.h"
|
#include "2dphysics.h"
|
||||||
#include <editor.h>
|
#include <editor.h>
|
||||||
#include "sprite.h"
|
#include "sprite.h"
|
||||||
#include "pinball.h"
|
|
||||||
|
|
||||||
struct component components[MAXNAME] = { 0 };
|
struct component components[MAXNAME] = { 0 };
|
||||||
|
|
||||||
|
@ -28,11 +27,6 @@ void registry_init()
|
||||||
register_component("2D Edge", sizeof(struct phys2d_edge), &Make2DEdge,
|
register_component("2D Edge", sizeof(struct phys2d_edge), &Make2DEdge,
|
||||||
&phys2d_dbgdrawedge, &edge_gui, &phys2d_edgeinit,
|
&phys2d_dbgdrawedge, &edge_gui, &phys2d_edgeinit,
|
||||||
NULL);
|
NULL);
|
||||||
/*
|
|
||||||
register_component("Flipper", sizeof(struct flipper),
|
|
||||||
&pinball_flipper_make, NULL, &pinball_flipper_gui,
|
|
||||||
&pinball_flipper_init, &pinball_flipper_update);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void register_component(const char *name, size_t size,
|
void register_component(const char *name, size_t size,
|
||||||
|
|
6397
source/engine/thirdparty/GLFW/glfw3.h
vendored
Normal file
6397
source/engine/thirdparty/GLFW/glfw3.h
vendored
Normal file
File diff suppressed because it is too large
Load diff
628
source/engine/thirdparty/GLFW/glfw3native.h
vendored
Normal file
628
source/engine/thirdparty/GLFW/glfw3native.h
vendored
Normal file
|
@ -0,0 +1,628 @@
|
||||||
|
/*************************************************************************
|
||||||
|
* GLFW 3.4 - www.glfw.org
|
||||||
|
* A library for OpenGL, window and input
|
||||||
|
*------------------------------------------------------------------------
|
||||||
|
* Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
* Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would
|
||||||
|
* be appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
* be misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _glfw3_native_h_
|
||||||
|
#define _glfw3_native_h_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Doxygen documentation
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
/*! @file glfw3native.h
|
||||||
|
* @brief The header of the native access functions.
|
||||||
|
*
|
||||||
|
* This is the header file of the native access functions. See @ref native for
|
||||||
|
* more information.
|
||||||
|
*/
|
||||||
|
/*! @defgroup native Native access
|
||||||
|
* @brief Functions related to accessing native handles.
|
||||||
|
*
|
||||||
|
* **By using the native access functions you assert that you know what you're
|
||||||
|
* doing and how to fix problems caused by using them. If you don't, you
|
||||||
|
* shouldn't be using them.**
|
||||||
|
*
|
||||||
|
* Before the inclusion of @ref glfw3native.h, you may define zero or more
|
||||||
|
* window system API macro and zero or more context creation API macros.
|
||||||
|
*
|
||||||
|
* The chosen backends must match those the library was compiled for. Failure
|
||||||
|
* to do this will cause a link-time error.
|
||||||
|
*
|
||||||
|
* The available window API macros are:
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_WIN32`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_COCOA`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_X11`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_WAYLAND`
|
||||||
|
*
|
||||||
|
* The available context API macros are:
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_WGL`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_NSGL`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_GLX`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_EGL`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_OSMESA`
|
||||||
|
*
|
||||||
|
* These macros select which of the native access functions that are declared
|
||||||
|
* and which platform-specific headers to include. It is then up your (by
|
||||||
|
* definition platform-specific) code to handle which of these should be
|
||||||
|
* defined.
|
||||||
|
*
|
||||||
|
* If you do not want the platform-specific headers to be included, define
|
||||||
|
* `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header.
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* #define GLFW_EXPOSE_NATIVE_WIN32
|
||||||
|
* #define GLFW_EXPOSE_NATIVE_WGL
|
||||||
|
* #define GLFW_NATIVE_INCLUDE_NONE
|
||||||
|
* #include <GLFW/glfw3native.h>
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* System headers and types
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#if !defined(GLFW_NATIVE_INCLUDE_NONE)
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||||
|
/* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
||||||
|
* example to allow applications to correctly declare a GL_KHR_debug callback)
|
||||||
|
* but windows.h assumes no one will define APIENTRY before it does
|
||||||
|
*/
|
||||||
|
#if defined(GLFW_APIENTRY_DEFINED)
|
||||||
|
#undef APIENTRY
|
||||||
|
#undef GLFW_APIENTRY_DEFINED
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#elif defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||||
|
#if defined(__OBJC__)
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#else
|
||||||
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
|
#include <objc/objc.h>
|
||||||
|
#endif
|
||||||
|
#elif defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/extensions/Xrandr.h>
|
||||||
|
#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
||||||
|
#include <wayland-client.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||||
|
/* WGL is declared by windows.h */
|
||||||
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||||
|
/* NSGL is declared by Cocoa.h */
|
||||||
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
|
/* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by
|
||||||
|
* default it also acts as an OpenGL header
|
||||||
|
* However, glx.h will include gl.h, which will define it unconditionally
|
||||||
|
*/
|
||||||
|
#if defined(GLFW_GLAPIENTRY_DEFINED)
|
||||||
|
#undef GLAPIENTRY
|
||||||
|
#undef GLFW_GLAPIENTRY_DEFINED
|
||||||
|
#endif
|
||||||
|
#include <GL/glx.h>
|
||||||
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
|
||||||
|
/* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by
|
||||||
|
* default it also acts as an OpenGL header
|
||||||
|
* However, osmesa.h will include gl.h, which will define it unconditionally
|
||||||
|
*/
|
||||||
|
#if defined(GLFW_GLAPIENTRY_DEFINED)
|
||||||
|
#undef GLAPIENTRY
|
||||||
|
#undef GLFW_GLAPIENTRY_DEFINED
|
||||||
|
#endif
|
||||||
|
#include <GL/osmesa.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*GLFW_NATIVE_INCLUDE_NONE*/
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Functions
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
|
||||||
|
/*! @brief Returns the adapter device name of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`)
|
||||||
|
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
|
||||||
|
* occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.1.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the display device name of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The UTF-8 encoded display device name (for example
|
||||||
|
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.1.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the `HWND` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `HWND` of the specified window, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @remark The `HDC` associated with the window can be queried with the
|
||||||
|
* [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc)
|
||||||
|
* function.
|
||||||
|
* @code
|
||||||
|
* HDC dc = GetDC(glfwGetWin32Window(window));
|
||||||
|
* @endcode
|
||||||
|
* This DC is private and does not need to be released.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||||
|
/*! @brief Returns the `HGLRC` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `HGLRC` of the specified window, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @remark The `HDC` associated with the window can be queried with the
|
||||||
|
* [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc)
|
||||||
|
* function.
|
||||||
|
* @code
|
||||||
|
* HDC dc = GetDC(glfwGetWin32Window(window));
|
||||||
|
* @endcode
|
||||||
|
* This DC is private and does not need to be released.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_COCOA)
|
||||||
|
/*! @brief Returns the `CGDirectDisplayID` of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The `CGDirectDisplayID` of the specified monitor, or
|
||||||
|
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.1.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the `NSWindow` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `NSWindow` of the specified window, or `nil` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||||
|
/*! @brief Returns the `NSOpenGLContext` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_X11)
|
||||||
|
/*! @brief Returns the `Display` used by GLFW.
|
||||||
|
*
|
||||||
|
* @return The `Display` used by GLFW, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI Display* glfwGetX11Display(void);
|
||||||
|
|
||||||
|
/*! @brief Returns the `RRCrtc` of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The `RRCrtc` of the specified monitor, or `None` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.1.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the `RROutput` of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The `RROutput` of the specified monitor, or `None` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.1.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the `Window` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `Window` of the specified window, or `None` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Sets the current primary selection to the specified string.
|
||||||
|
*
|
||||||
|
* @param[in] string A UTF-8 encoded string.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_PLATFORM_ERROR.
|
||||||
|
*
|
||||||
|
* @pointer_lifetime The specified string is copied before this function
|
||||||
|
* returns.
|
||||||
|
*
|
||||||
|
* @thread_safety This function must only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref clipboard
|
||||||
|
* @sa glfwGetX11SelectionString
|
||||||
|
* @sa glfwSetClipboardString
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI void glfwSetX11SelectionString(const char* string);
|
||||||
|
|
||||||
|
/*! @brief Returns the contents of the current primary selection as a string.
|
||||||
|
*
|
||||||
|
* If the selection is empty or if its contents cannot be converted, `NULL`
|
||||||
|
* is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated.
|
||||||
|
*
|
||||||
|
* @return The contents of the selection as a UTF-8 encoded string, or `NULL`
|
||||||
|
* if an [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_PLATFORM_ERROR.
|
||||||
|
*
|
||||||
|
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
|
||||||
|
* should not free it yourself. It is valid until the next call to @ref
|
||||||
|
* glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the
|
||||||
|
* library is terminated.
|
||||||
|
*
|
||||||
|
* @thread_safety This function must only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref clipboard
|
||||||
|
* @sa glfwSetX11SelectionString
|
||||||
|
* @sa glfwGetClipboardString
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI const char* glfwGetX11SelectionString(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
|
/*! @brief Returns the `GLXContext` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `GLXContext` of the specified window, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Returns the `GLXWindow` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `GLXWindow` of the specified window, or `None` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
||||||
|
/*! @brief Returns the `struct wl_display*` used by GLFW.
|
||||||
|
*
|
||||||
|
* @return The `struct wl_display*` used by GLFW, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI struct wl_display* glfwGetWaylandDisplay(void);
|
||||||
|
|
||||||
|
/*! @brief Returns the `struct wl_output*` of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The `struct wl_output*` of the specified monitor, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the main `struct wl_surface*` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The main `struct wl_surface*` of the specified window, or `NULL` if
|
||||||
|
* an [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||||
|
/*! @brief Returns the `EGLDisplay` used by GLFW.
|
||||||
|
*
|
||||||
|
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @remark Because EGL is initialized on demand, this function will return
|
||||||
|
* `EGL_NO_DISPLAY` until the first context has been created via EGL.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI EGLDisplay glfwGetEGLDisplay(void);
|
||||||
|
|
||||||
|
/*! @brief Returns the `EGLContext` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Returns the `EGLSurface` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.0.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
|
||||||
|
/*! @brief Retrieves the color buffer associated with the specified window.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose color buffer to retrieve.
|
||||||
|
* @param[out] width Where to store the width of the color buffer, or `NULL`.
|
||||||
|
* @param[out] height Where to store the height of the color buffer, or `NULL`.
|
||||||
|
* @param[out] format Where to store the OSMesa pixel format of the color
|
||||||
|
* buffer, or `NULL`.
|
||||||
|
* @param[out] buffer Where to store the address of the color buffer, or
|
||||||
|
* `NULL`.
|
||||||
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer);
|
||||||
|
|
||||||
|
/*! @brief Retrieves the depth buffer associated with the specified window.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose depth buffer to retrieve.
|
||||||
|
* @param[out] width Where to store the width of the depth buffer, or `NULL`.
|
||||||
|
* @param[out] height Where to store the height of the depth buffer, or `NULL`.
|
||||||
|
* @param[out] bytesPerValue Where to store the number of bytes per depth
|
||||||
|
* buffer element, or `NULL`.
|
||||||
|
* @param[out] buffer Where to store the address of the depth buffer, or
|
||||||
|
* `NULL`.
|
||||||
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer);
|
||||||
|
|
||||||
|
/*! @brief Returns the `OSMesaContext` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `OSMesaContext` of the specified window, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _glfw3_native_h_ */
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
#include "editor.h"
|
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "2dphysics.h"
|
#include "2dphysics.h"
|
||||||
#include "openglrender.h"
|
#include "openglrender.h"
|
||||||
|
|
28
source/scripts/engine.rb
Normal file
28
source/scripts/engine.rb
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
class Component
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
class Sprite
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
class CircleCollider2D
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
class Segment2D
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
class Box2D
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
class Polygon2D
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
class Edge2D
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in a new issue