Large refactoring. Working state
This commit is contained in:
parent
f2db0dc5e8
commit
8e89e7d905
Binary file not shown.
Binary file not shown.
2
Makefile
2
Makefile
@ -15,7 +15,7 @@ DEPEXT := d
|
|||||||
OBJEXT := o
|
OBJEXT := o
|
||||||
|
|
||||||
#Flags, Libraries and Includes
|
#Flags, Libraries and Includes
|
||||||
CFLAGS := -Wall -pedantic
|
CFLAGS := -Wall -pedantic -Wno-gnu-statement-expression
|
||||||
CFLAGS += -Ilib/cglm/include -Ilib/glad/include -Ilib/glfw/include -Ilib/stb
|
CFLAGS += -Ilib/cglm/include -Ilib/glad/include -Ilib/glfw/include -Ilib/stb
|
||||||
CFLAGS += -Iinclude/ -I/usr/include/freetype2 -I/usr/include/stb
|
CFLAGS += -Iinclude/ -I/usr/include/freetype2 -I/usr/include/stb
|
||||||
LDFLAGS := -lglfw -ldl -lmpv -lfreetype -lm
|
LDFLAGS := -lglfw -ldl -lmpv -lfreetype -lm
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
"/usr/bin/clang",
|
"/usr/bin/clang",
|
||||||
"-Wall",
|
"-Wall",
|
||||||
"-pedantic",
|
"-pedantic",
|
||||||
|
"-Wno-gnu-statement-expression",
|
||||||
"-Ilib/cglm/include",
|
"-Ilib/cglm/include",
|
||||||
"-Ilib/glad/include",
|
"-Ilib/glad/include",
|
||||||
"-Ilib/glfw/include",
|
"-Ilib/glfw/include",
|
||||||
|
25
src/chat/ircRead.py
Normal file
25
src/chat/ircRead.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import socket
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
|
||||||
|
server = "irc.rizon.net" #settings
|
||||||
|
channel = "#soranowoto"
|
||||||
|
botnick = "assam__"
|
||||||
|
|
||||||
|
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
|
||||||
|
print("connecting to:"+server)
|
||||||
|
|
||||||
|
irc.connect((server, 6667))
|
||||||
|
irc.send(bytes("NICK "+ botnick +"\n", encoding='utf8'))
|
||||||
|
irc.send(bytes("PASS PekoRrat\n", encoding='utf8'))
|
||||||
|
irc.send(bytes("USER "+ botnick +" " + "assam assam " + "assam\n", encoding='utf8'))
|
||||||
|
time.sleep(5)
|
||||||
|
irc.send(bytes("JOIN "+ channel +"\n", encoding='utf8'))
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
text=irc.recv(2040)
|
||||||
|
print(text)
|
||||||
|
|
||||||
|
if text.find(bytes('PING', encoding='utf8')) != -1: #check if 'PING' is found
|
||||||
|
irc.send(bytes('PONG ', encoding='utf8') + text.split()[1] + bytes('\r\n', encoding='utf8') )
|
||||||
|
|
26
src/chat/test.py
Normal file
26
src/chat/test.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import socket, string, time, thread
|
||||||
|
SERVER = 'irc.rizon.net'
|
||||||
|
PORT = 6667
|
||||||
|
NICKNAME = 'GataGoto'
|
||||||
|
CHANNEL = '#soranowoto'
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global IRC
|
||||||
|
IRC = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
IRC.connect((SERVER, PORT))
|
||||||
|
thread.start_new_thread(Listener(),("Thread No:1",2))
|
||||||
|
|
||||||
|
def send_data(command):
|
||||||
|
IRC.send(command + '\n')
|
||||||
|
|
||||||
|
def Listener():
|
||||||
|
send_data('USER Blah')
|
||||||
|
send_data('NICK Blah')
|
||||||
|
while (1):
|
||||||
|
buffer = IRC.recv(1024)
|
||||||
|
msg = string.split(buffer)
|
||||||
|
if msg[0] == "PING":
|
||||||
|
print('Pinged!')
|
||||||
|
IRC.send("PONG %s" % msg[1] + '\n')
|
||||||
|
|
||||||
|
main()
|
179
src/gfx/window.c
179
src/gfx/window.c
@ -3,71 +3,34 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
// global window
|
|
||||||
struct Window window;
|
|
||||||
|
|
||||||
static void _size_callback(GLFWwindow *handle, int width, int height) {
|
static void _size_callback(GLFWwindow *handle, int width, int height) {
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
window.size = (ivec2s) {{height, width}};
|
window->size = (ivec2s) {{height, width}};
|
||||||
|
|
||||||
|
window->size.x = width;
|
||||||
|
window->size.y = height;
|
||||||
|
glBindTexture(GL_TEXTURE_2D, renderer->screen_textureColorbuffer);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, screen_rbo);
|
||||||
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
//static void _cursor_callback(GLFWwindow *handle, double xp, double yp) {
|
|
||||||
// vec2s p = {{xp, yp}};
|
|
||||||
//
|
|
||||||
// window.mouse.delta = glms_vec2_sub(p, window.mouse.position);
|
|
||||||
// window.mouse.delta.x = clamp(window.mouse.delta.x, -100.0f, 100.0f);
|
|
||||||
// window.mouse.delta.y = clamp(window.mouse.delta.y, -100.0f, 100.0f);
|
|
||||||
//
|
|
||||||
// window.mouse.position = p;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//static void _key_callback(GLFWwindow *handle, int key, int scancode, int action, int mods) {
|
|
||||||
// if (key < 0) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// switch (action) {
|
|
||||||
// case GLFW_PRESS:
|
|
||||||
// window.keyboard.keys[key].down = true;
|
|
||||||
// break;
|
|
||||||
// case GLFW_RELEASE:
|
|
||||||
// window.keyboard.keys[key].down = false;
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
//static void _mouse_callback(GLFWwindow *handle, int button, int action, int mods) {
|
|
||||||
// if (button < 0) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// switch (action) {
|
|
||||||
// case GLFW_PRESS:
|
|
||||||
// window.mouse.buttons[button].down = true;
|
|
||||||
// break;
|
|
||||||
// case GLFW_RELEASE:
|
|
||||||
// window.mouse.buttons[button].down = false;
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
static void _error_callback(int code, const char *description) {
|
static void _error_callback(int code, const char *description) {
|
||||||
fprintf(stderr, "GLFW error %d: %s\n", code, description);
|
fprintf(stderr, "GLFW error %d: %s\n", code, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
void window_create(FWindow init, FWindow destroy, FWindow tick, FWindow update, FWindow render) {
|
struct Window *window_create(FWindow init, FWindow destroy, FWindow tick, FWindow update, FWindow render) {
|
||||||
window.init = init;
|
struct Window *window = malloc(sizeof(struct Window));
|
||||||
window.destroy = destroy;
|
|
||||||
window.tick = tick;
|
|
||||||
window.update = update;
|
|
||||||
window.render = render;
|
|
||||||
|
|
||||||
window.last_frame = NOW();
|
window->init = init;
|
||||||
window.last_second = NOW();
|
window->destroy = destroy;
|
||||||
|
window->tick = tick;
|
||||||
|
window->update = update;
|
||||||
|
window->render = render;
|
||||||
|
|
||||||
|
window->last_frame = time(NULL);
|
||||||
|
window->last_second = time(NULL);
|
||||||
|
|
||||||
glfwSetErrorCallback(_error_callback);
|
glfwSetErrorCallback(_error_callback);
|
||||||
|
|
||||||
@ -82,21 +45,18 @@ void window_create(FWindow init, FWindow destroy, FWindow tick, FWindow update,
|
|||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||||
|
|
||||||
window.size = (ivec2s) {{1280, 720}};
|
window->size = (ivec2s) {{1920, 1080}};
|
||||||
window.handle = glfwCreateWindow(window.size.x, window.size.y, "Project", NULL, NULL);
|
window->handle = glfwCreateWindow(window->size.x, window->size.y, WINDOW_NAME, NULL, NULL);
|
||||||
if (window.handle == NULL) {
|
if (window->handle == NULL) {
|
||||||
fprintf(stderr, "%s", "error creating window\n");
|
fprintf(stderr, "%s", "error creating window\n");
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent(window.handle);
|
glfwMakeContextCurrent(window->handle);
|
||||||
|
|
||||||
// configure callbacks
|
// configure callbacks
|
||||||
glfwSetFramebufferSizeCallback(window.handle, _size_callback);
|
glfwSetFramebufferSizeCallback(window->handle, _size_callback);
|
||||||
//glfwSetCursorPosCallback(window.handle, _cursor_callback);
|
|
||||||
//glfwSetKeyCallback(window.handle, _key_callback);
|
|
||||||
//glfwSetMouseButtonCallback(window.handle, _mouse_callback);
|
|
||||||
|
|
||||||
if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) {
|
if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) {
|
||||||
fprintf(stderr, "%s", "error initializing GLAD\n");
|
fprintf(stderr, "%s", "error initializing GLAD\n");
|
||||||
@ -104,85 +64,78 @@ void window_create(FWindow init, FWindow destroy, FWindow tick, FWindow update,
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH);
|
||||||
|
glEnable(GL_MULTISAMPLE);
|
||||||
|
glfwWindowHint(GLFW_SAMPLES, 4);
|
||||||
|
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
}
|
|
||||||
|
|
||||||
static void button_array_tick(size_t n, struct Button *buttons) {
|
return window;
|
||||||
for (size_t i = 0; i < n; i++) {
|
|
||||||
buttons[i].pressed_tick = buttons[i].down && !buttons[i].last_tick;
|
|
||||||
buttons[i].last_tick = buttons[i].down;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void button_array_update(size_t n, struct Button *buttons) {
|
|
||||||
for (size_t i = 0; i < n; i++) {
|
|
||||||
buttons[i].pressed = buttons[i].down && !buttons[i].last;
|
|
||||||
buttons[i].last = buttons[i].down;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _init() {
|
static void _init() {
|
||||||
window.init();
|
window->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _destroy() {
|
static void _destroy() {
|
||||||
window.destroy();
|
window->destroy();
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _tick() {
|
static void _tick() {
|
||||||
window.ticks++;
|
window->ticks++;
|
||||||
button_array_tick(GLFW_MOUSE_BUTTON_LAST, window.mouse.buttons);
|
window->tick();
|
||||||
button_array_tick(GLFW_KEY_LAST, window.keyboard.keys);
|
|
||||||
window.tick();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _update() {
|
static void _update() {
|
||||||
button_array_update(GLFW_MOUSE_BUTTON_LAST, window.mouse.buttons);
|
window->update();
|
||||||
button_array_update(GLFW_KEY_LAST, window.keyboard.keys);
|
|
||||||
window.update();
|
|
||||||
|
|
||||||
// reset update delta
|
|
||||||
window.mouse.delta = GLMS_VEC2_ZERO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _render() {
|
static void _render() {
|
||||||
window.frames++;
|
window->frames++;
|
||||||
window.render();
|
window->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void window_loop() {
|
void window_loop() {
|
||||||
_init();
|
//_init();
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window.handle)) {
|
while (!glfwWindowShouldClose(window->handle)) {
|
||||||
const u64 now = NOW();
|
const u64 now = time(NULL);
|
||||||
|
|
||||||
window.frame_delta = now - window.last_frame;
|
window->frame_delta = now - window->last_frame;
|
||||||
window.last_frame = now;
|
window->last_frame = now;
|
||||||
|
|
||||||
if (now - window.last_second > NS_PER_SECOND) {
|
if (now - window->last_second > NS_PER_SECOND) {
|
||||||
window.fps = window.frames;
|
window->fps = window->frames;
|
||||||
window.tps = window.ticks;
|
window->tps = window->ticks;
|
||||||
window.frames = 0;
|
window->frames = 0;
|
||||||
window.ticks = 0;
|
window->ticks = 0;
|
||||||
window.last_second = now;
|
window->last_second = now;
|
||||||
|
|
||||||
printf("FPS: %lld | TPS: %lld\n", window.fps, window.tps);
|
printf("FPS: %ld | TPS: %ld\n", window->fps, window->tps);
|
||||||
}
|
}
|
||||||
|
/* TEST FOR REPLACEMENET OF MAIN LOOP
|
||||||
|
*/
|
||||||
|
|
||||||
// tick processing
|
|
||||||
const u64 NS_PER_TICK = (NS_PER_SECOND / 60);
|
/* END TEST FOR REPLACEMENET OF MAIN LOOP
|
||||||
u64 tick_time = window.frame_delta + window.tick_remainder;
|
*/
|
||||||
while (tick_time > NS_PER_TICK) {
|
|
||||||
_tick();
|
|
||||||
tick_time -= NS_PER_TICK;
|
//// tick processing
|
||||||
}
|
//const u64 NS_PER_TICK = (NS_PER_SECOND / 60);
|
||||||
window.tick_remainder = max(tick_time, 0);
|
//u64 tick_time = window->frame_delta + window->tick_remainder;
|
||||||
|
//while (tick_time > NS_PER_TICK) {
|
||||||
|
// _tick();
|
||||||
|
// tick_time -= NS_PER_TICK;
|
||||||
|
//}
|
||||||
|
//window->tick_remainder = MAX(tick_time, 0);
|
||||||
|
|
||||||
_update();
|
_update();
|
||||||
_render();
|
_render();
|
||||||
glfwSwapBuffers(window.handle);
|
glfwSwapBuffers(window->handle);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
usleep(16 * 1000); // we LIMIT the main render loop to 100FPS! If VSYSNC is enabled the limit is the VSYNC limit (~60fps)
|
||||||
}
|
}
|
||||||
|
|
||||||
_destroy();
|
_destroy();
|
||||||
@ -190,9 +143,9 @@ void window_loop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void mouse_set_grabbed(bool grabbed) {
|
void mouse_set_grabbed(bool grabbed) {
|
||||||
glfwSetInputMode(window.handle, GLFW_CURSOR, grabbed ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL);
|
glfwSetInputMode(window->handle, GLFW_CURSOR, grabbed ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mouse_get_grabbed() {
|
bool mouse_get_grabbed() {
|
||||||
return glfwGetInputMode(window.handle, GLFW_CURSOR) == GLFW_CURSOR_DISABLED;
|
return glfwGetInputMode(window->handle, GLFW_CURSOR) == GLFW_CURSOR_DISABLED;
|
||||||
}
|
}
|
||||||
|
@ -3,29 +3,36 @@
|
|||||||
|
|
||||||
#include "gfx.h"
|
#include "gfx.h"
|
||||||
#include "../util/util.h"
|
#include "../util/util.h"
|
||||||
|
#include "./renderer.h"
|
||||||
|
#include "player.h"
|
||||||
|
|
||||||
|
#define WINDOW_NAME "wotos + mpv"
|
||||||
|
|
||||||
|
#include <unistd.h> // for usleep
|
||||||
|
|
||||||
|
#define MAX(a,b) \
|
||||||
|
({ __typeof__ (a) _a = (a); \
|
||||||
|
__typeof__ (b) _b = (b); \
|
||||||
|
_a > _b ? _a : _b; })
|
||||||
|
|
||||||
|
extern struct Renderer *renderer;
|
||||||
|
extern struct Window *window;
|
||||||
|
|
||||||
|
extern unsigned int screen_rbo;
|
||||||
|
extern int wakeup;
|
||||||
|
extern mpv_render_context *mpv_ctx;
|
||||||
|
|
||||||
struct Button {
|
struct Button {
|
||||||
bool down, last, last_tick, pressed, pressed_tick;
|
bool down, last, last_tick, pressed, pressed_tick;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Mouse {
|
|
||||||
struct Button buttons[GLFW_MOUSE_BUTTON_LAST];
|
|
||||||
vec2s position, delta;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Keyboard {
|
|
||||||
struct Button keys[GLFW_KEY_LAST];
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef void (*FWindow)();
|
typedef void (*FWindow)();
|
||||||
|
|
||||||
struct Window {
|
struct Window {
|
||||||
GLFWwindow *handle;
|
GLFWwindow *handle;
|
||||||
ivec2s size;
|
ivec2s size;
|
||||||
FWindow init, destroy, tick, update, render;
|
FWindow init, destroy, tick, update, render;
|
||||||
struct Mouse mouse;
|
|
||||||
struct Keyboard keyboard;
|
|
||||||
|
|
||||||
// timing variables
|
// timing variables
|
||||||
u64 last_second;
|
u64 last_second;
|
||||||
@ -33,13 +40,6 @@ struct Window {
|
|||||||
u64 ticks, tps, tick_remainder;
|
u64 ticks, tps, tick_remainder;
|
||||||
};
|
};
|
||||||
|
|
||||||
// global window
|
|
||||||
extern struct Window window;
|
|
||||||
|
|
||||||
void window_loop();
|
void window_loop();
|
||||||
void window_create(FWindow init, FWindow destroy, FWindow tick, FWindow update, FWindow render);
|
struct Window *window_create(FWindow init, FWindow destroy, FWindow tick, FWindow update, FWindow render);
|
||||||
//void mouse_set_grabbed(bool grabbed);
|
|
||||||
//bool mouse_get_grabbed();
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
15685
src/glad/glad.h
Normal file
15685
src/glad/glad.h
Normal file
File diff suppressed because one or more lines are too long
172
src/main.c
172
src/main.c
@ -5,97 +5,24 @@
|
|||||||
|
|
||||||
static inline void check_error(int);
|
static inline void check_error(int);
|
||||||
|
|
||||||
int main(int argc, char const *argv[])
|
void init() {
|
||||||
{
|
|
||||||
if (argc < 2){
|
|
||||||
//std::cout << "Usage: " << argv[0] << " videofilename" << std::endl;
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////// GLFW INIT
|
void update() {
|
||||||
glfwInit();
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
|
|
||||||
///////// Create window
|
|
||||||
if ((wwindow = glfwCreateWindow(window_width, window_height, "a-mpv", NULL, NULL)) == NULL){
|
|
||||||
printf("ERROR::GLFW::Failed to create window\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
glfwMakeContextCurrent(wwindow);
|
|
||||||
glfwSetFramebufferSizeCallback(wwindow, framebuffer_size_callback);
|
|
||||||
|
|
||||||
///////// Load GLAD
|
|
||||||
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
|
|
||||||
printf("ERROR::GLAD::Failed to initialize GLAD\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////// Initializing placeholder for FT text glyphs
|
|
||||||
//std::map<char, Character> Characters;
|
|
||||||
//makeBitmaps(Characters);
|
|
||||||
|
|
||||||
///////// GL parameters
|
|
||||||
glEnable(GL_DEPTH);
|
|
||||||
glEnable(GL_MULTISAMPLE);
|
|
||||||
glfwWindowHint(GLFW_SAMPLES, 4);
|
|
||||||
|
|
||||||
/* Glyph shenanigans
|
|
||||||
*/
|
|
||||||
|
|
||||||
//mat4s transformation = glms_ortho(0.0f, (float)(window_width), 0.0f, (float)window_height, -100, 100);
|
|
||||||
|
|
||||||
/* Setting up MPV player
|
|
||||||
The mpv and mpv_ctx variables are temporary
|
|
||||||
*/
|
|
||||||
player = player_create();
|
|
||||||
player_init(player);
|
|
||||||
mpv = player->handle;
|
|
||||||
mpv_ctx = player->ctx;
|
|
||||||
|
|
||||||
/* Setting the renderer
|
|
||||||
The mpv and mpv_ctx variables are temporary
|
|
||||||
*/
|
|
||||||
renderer = renderer_create();
|
|
||||||
renderer_init(renderer);
|
|
||||||
|
|
||||||
// this doesn't work when called inside the Renderer struct...
|
|
||||||
int flip_y = 1;
|
|
||||||
renderer->params_fbo = (mpv_render_param [3]){
|
|
||||||
{MPV_RENDER_PARAM_OPENGL_FBO, &(renderer->mpv_fbo)},
|
|
||||||
{MPV_RENDER_PARAM_FLIP_Y, &flip_y},
|
|
||||||
{MPV_RENDER_PARAM_INVALID, NULL}};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Start video playback
|
|
||||||
*/
|
|
||||||
const char filename[] = "https://stream.wotos.eu/snw_master.m3u8";
|
|
||||||
player_loadfile(player, filename);
|
|
||||||
|
|
||||||
const char *text = "I Joe";
|
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(wwindow))
|
|
||||||
{
|
|
||||||
fcount++;
|
|
||||||
float currentFrame = glfwGetTime();
|
|
||||||
deltaTime = currentFrame - lastFrame;
|
|
||||||
lastFrame = currentFrame;
|
|
||||||
//if (fcount % 100 == 0){
|
|
||||||
// std::cout << "FPS: " << 1 / deltaTime << "\n" << std::endl;
|
|
||||||
// }
|
|
||||||
processGLFWInput(wwindow, mpv);
|
processGLFWInput(wwindow, mpv);
|
||||||
// -----
|
|
||||||
|
|
||||||
if (wakeup)
|
if (wakeup)
|
||||||
{
|
{
|
||||||
if ((mpv_render_context_update(mpv_ctx) & MPV_RENDER_UPDATE_FRAME))
|
if ((mpv_render_context_update(mpv_ctx) & MPV_RENDER_UPDATE_FRAME))
|
||||||
{
|
{
|
||||||
mpv_render_context_render(mpv_ctx, renderer->params_fbo); // this "renders" to the video_framebuffer "linked by ID" in the params_fbo - BLOCKING
|
mpv_render_context_render(mpv_ctx, renderer->params_fbo);
|
||||||
glViewport(0, 0, window_width, window_height); // fucky
|
glViewport(0, 0, window->size.x, window->size.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//screenShader->use();
|
}
|
||||||
|
|
||||||
|
void render(){
|
||||||
shader_bind(renderer->shaders[SHADER_MPV]);
|
shader_bind(renderer->shaders[SHADER_MPV]);
|
||||||
|
|
||||||
vao_bind(renderer->screenVAO);
|
vao_bind(renderer->screenVAO);
|
||||||
@ -109,45 +36,74 @@ int main(int argc, char const *argv[])
|
|||||||
wakeup = 0;
|
wakeup = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *text = "I Joe you Joe ;)";
|
||||||
render_text(renderer, text, strlen(text), 0, 0, 0.001, (float [3]){0.0, 1.0, 0.0});
|
render_text(renderer, text, strlen(text), 0, 0, 0.001, (float [3]){0.0, 1.0, 0.0});
|
||||||
|
}
|
||||||
|
|
||||||
//glUniformMatrix4fv(glGetUniformLocation(renderer->shaders[SHADER_GLYPH].handle, "ransformation"), 1, GL_FALSE, (GLfloat *)&transformation.raw);
|
int main(int argc, char const *argv[])
|
||||||
|
{
|
||||||
//Distance during deltaTime for consistent translation
|
if (argc < 2){
|
||||||
|
//std::cout << "Usage: " << argv[0] << " videofilename" << std::endl;
|
||||||
//// Draw image
|
return -1;
|
||||||
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
}
|
||||||
|
|
||||||
//imgShader->use();
|
|
||||||
//glBindVertexArray(imgVBO); // <-- The SCREEN QUAD
|
|
||||||
//glBindTexture(GL_TEXTURE_2D, imgTex); // <-- SCREEN Colorbuffer IS THE TEXTURE
|
|
||||||
|
|
||||||
//imgMatrix = glm::translate(imgMatrix, glm::vec3(0.5/deltaPix, 0.0f, 0.0f));
|
|
||||||
//glUniformMatrix4fv(glGetUniformLocation(imgShader->ID, "transformation"), 1, GL_FALSE, glm::value_ptr(imgMatrix));
|
|
||||||
|
|
||||||
//glDrawArrays(GL_TRIANGLES, 0, 6);
|
|
||||||
|
|
||||||
|
|
||||||
// // Glyphs
|
/*
|
||||||
//transformation = glm::translate(transformation, glm::vec3(deltaPix , 0.0f, 0.0f));
|
Create the main window
|
||||||
|
wwindow is temporary
|
||||||
|
*/
|
||||||
|
FWindow nof = NULL;
|
||||||
|
window = window_create(init, nof, nof, update, render);
|
||||||
|
|
||||||
|
wwindow = window->handle;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Set up the MPV player
|
||||||
|
The mpv and mpv_ctx variables are temporary
|
||||||
|
*/
|
||||||
|
player = player_create();
|
||||||
|
player_init(player);
|
||||||
|
mpv = player->handle;
|
||||||
|
mpv_ctx = player->ctx;
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////// SOCKET
|
/* Setting the renderer
|
||||||
|
*/
|
||||||
|
renderer = renderer_create();
|
||||||
|
renderer_init(renderer);
|
||||||
|
|
||||||
//recv_bytes = recv(sock, buffer, RECV_BUFFER_SIZE, 0);
|
/*
|
||||||
//if(recv_bytes >= 1){
|
Glyph shenanigans
|
||||||
// danmakus.push_back({buffer, 1, (float)window_width, 400.0f, 1, 0, 0});
|
*/
|
||||||
//}
|
//mat4s transformation = glms_ortho(0.0f, (float)(window_width), 0.0f, (float)window_height, -100, 100);
|
||||||
//std::cout << danmakus.front().text << std::endl;
|
|
||||||
|
|
||||||
|
|
||||||
|
// this doesn't work when called from inside the Renderer struct...
|
||||||
|
int flip_y = 1;
|
||||||
|
renderer->params_fbo = (mpv_render_param [3]){
|
||||||
|
{MPV_RENDER_PARAM_OPENGL_FBO, &(renderer->mpv_fbo)},
|
||||||
|
{MPV_RENDER_PARAM_FLIP_Y, &flip_y},
|
||||||
|
{MPV_RENDER_PARAM_INVALID, NULL}};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Start video playback
|
||||||
|
*/
|
||||||
|
player_loadfile(player, argv[1]);
|
||||||
|
|
||||||
|
|
||||||
|
window_loop();
|
||||||
|
|
||||||
|
while (!glfwWindowShouldClose(wwindow))
|
||||||
|
{
|
||||||
|
float currentFrame = glfwGetTime();
|
||||||
|
deltaTime = currentFrame - lastFrame;
|
||||||
|
lastFrame = currentFrame;
|
||||||
|
|
||||||
/////////////////////////////////////////// Danmaku update
|
|
||||||
//updateDanmakus(r);
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
glfwSwapBuffers(wwindow);
|
glfwSwapBuffers(wwindow);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
usleep(16 * 1000); // we LIMIT the main render loop to 100FPS! If VSYSNC is enabled the limit is the VSYNC limit (~60fps)
|
|
||||||
}
|
}
|
||||||
renderer_destroy(renderer);
|
renderer_destroy(renderer);
|
||||||
player_destroy(player);
|
player_destroy(player);
|
||||||
|
11
src/main.h
11
src/main.h
@ -11,10 +11,10 @@
|
|||||||
#include "gfx/vbo.h"
|
#include "gfx/vbo.h"
|
||||||
#include "gfx/player.h"
|
#include "gfx/player.h"
|
||||||
#include "gfx/renderer.h"
|
#include "gfx/renderer.h"
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "gfx/shader.h"
|
#include "gfx/shader.h"
|
||||||
#include "gfx/bitmap.h"
|
#include "gfx/bitmap.h"
|
||||||
|
#include "gfx/window.h"
|
||||||
|
|
||||||
|
|
||||||
//#include <sys/socket.h>
|
//#include <sys/socket.h>
|
||||||
//#include <sys/types.h>
|
//#include <sys/types.h>
|
||||||
@ -41,6 +41,7 @@ int main(int argc, char const *argv[]);
|
|||||||
int window_width = 1920;
|
int window_width = 1920;
|
||||||
int window_height = 1080;
|
int window_height = 1080;
|
||||||
|
|
||||||
|
struct Window *window;
|
||||||
GLFWwindow *wwindow = NULL;
|
GLFWwindow *wwindow = NULL;
|
||||||
mpv_handle *mpv;
|
mpv_handle *mpv;
|
||||||
mpv_render_context *mpv_ctx;
|
mpv_render_context *mpv_ctx;
|
||||||
@ -50,14 +51,10 @@ unsigned int video_rbo;
|
|||||||
unsigned int quadVAO, quadVBO;
|
unsigned int quadVAO, quadVBO;
|
||||||
unsigned int cubeVAO, cubeVBO;
|
unsigned int cubeVAO, cubeVBO;
|
||||||
|
|
||||||
struct VAO quadVAOTEST;
|
|
||||||
struct VBO quadVBOTEST;
|
|
||||||
|
|
||||||
struct Player *player;
|
struct Player *player;
|
||||||
struct Renderer *renderer;
|
struct Renderer *renderer;
|
||||||
|
|
||||||
float deltaTime, lastFrame;
|
float deltaTime, lastFrame;
|
||||||
unsigned int fcount = 0;
|
|
||||||
bool animation=true;
|
bool animation=true;
|
||||||
|
|
||||||
//static void *get_proc_address(void *ctx, const char *name);
|
//static void *get_proc_address(void *ctx, const char *name);
|
||||||
@ -79,7 +76,7 @@ float imgVertices[] = {
|
|||||||
//static void on_mpv_events(void *ctx);
|
//static void on_mpv_events(void *ctx);
|
||||||
|
|
||||||
int wakeup = 0;
|
int wakeup = 0;
|
||||||
extern int wakeup;
|
//extern int wakeup;
|
||||||
|
|
||||||
|
|
||||||
bool SetSocketBlockingEnabled(int fd, bool blocking);
|
bool SetSocketBlockingEnabled(int fd, bool blocking);
|
||||||
|
@ -1,103 +0,0 @@
|
|||||||
import json
|
|
||||||
import queue
|
|
||||||
import requests
|
|
||||||
import websocket
|
|
||||||
|
|
||||||
from helper import *
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import socket
|
|
||||||
import fcntl, os
|
|
||||||
|
|
||||||
SEND_BUFFER_SIZE = 2048
|
|
||||||
connected = 0
|
|
||||||
|
|
||||||
try: import thread
|
|
||||||
except ImportError: import _thread as thread
|
|
||||||
|
|
||||||
class Socket_:
|
|
||||||
def __init__(self, queue = None):
|
|
||||||
self.URL = None
|
|
||||||
self.sid = None
|
|
||||||
self.sidWSS = None
|
|
||||||
self.parser = Parser().parser
|
|
||||||
self.queue = queue
|
|
||||||
self.ws = None
|
|
||||||
|
|
||||||
self.sock = None
|
|
||||||
|
|
||||||
# Start the connection
|
|
||||||
self.handshake()
|
|
||||||
|
|
||||||
def handshake(self):
|
|
||||||
# First, establish a polling-transport HTTP connection
|
|
||||||
resp_1 = requests.get(POLLING_URL_1, headers = HEADER)
|
|
||||||
print('Resp 1: ', resp_1.text)
|
|
||||||
# Ignore the bin-packed preliminaries and extract the session ID
|
|
||||||
# WOTOS: self.sid = json.loads(str(resp_1.content)[3:-1])['sid']
|
|
||||||
self.sid = json.loads(str(resp_1.content)[3:-1])['sid']
|
|
||||||
# Second polling with POST, response should be 'ok'
|
|
||||||
resp_2 = requests.post(POLLING_URL_2.format(self.sid), headers = HEADER, data = b'40')
|
|
||||||
print('Resp 2: ', resp_2.text)
|
|
||||||
# Third polling
|
|
||||||
resp_3 = requests.get(POLLING_URL_3.format(self.sid), headers = HEADER)
|
|
||||||
print('Resp 3: ', resp_3.text)
|
|
||||||
# WOTOS: self.sid = json.loads(str(resp_1.content)[3:-1])['sid']
|
|
||||||
index = str(resp_3.content).find('\\x1e42[')
|
|
||||||
substr = str(resp_3.content)[4:index]
|
|
||||||
self.sidWSS = json.loads(substr)['sid']
|
|
||||||
# Fourth polling with POST
|
|
||||||
resp_4 = requests.post(POLLING_URL_4.format(self.sid), headers = HEADER, data = b'42["joinChannel",{"name":"testam"}]')
|
|
||||||
print('Resp 4: ', resp_4.text)
|
|
||||||
# Fourth polling with GET
|
|
||||||
resp_5 = requests.get(POLLING_URL_5.format(self.sid), headers = HEADER)
|
|
||||||
print('Resp 5: ', resp_5.text)
|
|
||||||
|
|
||||||
|
|
||||||
# WSS url
|
|
||||||
self.URL = WSS_URL.format(self.sid)
|
|
||||||
print(self.URL)
|
|
||||||
|
|
||||||
def on_open(self, ws):
|
|
||||||
print('### Socket open ###')
|
|
||||||
ws.send("2probe")
|
|
||||||
def on_close(self, ws):
|
|
||||||
print("### Socket closed ###")
|
|
||||||
self.sock.close()
|
|
||||||
def on_error(self, ws, error):
|
|
||||||
print('\nSocket error :\n{}\n'.format(error))
|
|
||||||
|
|
||||||
def on_message(self, ws, message):
|
|
||||||
if message == '2': ws.send('3')
|
|
||||||
elif message == '3probe': ws.send('5')
|
|
||||||
elif message[:2] == '42':
|
|
||||||
j = message[2:].replace("'", '"')
|
|
||||||
parsed = json.loads(j)
|
|
||||||
print("received: ", message)
|
|
||||||
reason = parsed[0]
|
|
||||||
if reason == 'chatMsg':
|
|
||||||
data = bytes(parsed[1]['msg'], "utf-8")
|
|
||||||
data += bytes(SEND_BUFFER_SIZE-len(data))
|
|
||||||
self.sock.send(data)
|
|
||||||
else: pass
|
|
||||||
|
|
||||||
def listenForever(self):
|
|
||||||
# SOCKET
|
|
||||||
server_ip = "localhost"
|
|
||||||
server_port = 10000
|
|
||||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
self.sock.connect((server_ip, server_port))
|
|
||||||
fcntl.fcntl(self.sock, fcntl.F_SETFL, os.O_NONBLOCK)
|
|
||||||
|
|
||||||
try:
|
|
||||||
#websocket.enableTrace(True)
|
|
||||||
self.ws = websocket.WebSocketApp(self.URL,
|
|
||||||
on_open = self.on_open,
|
|
||||||
on_message = self.on_message,
|
|
||||||
on_error = self.on_error,
|
|
||||||
on_close = self.on_close,
|
|
||||||
header = HEADER_WSS
|
|
||||||
)
|
|
||||||
self.ws.run_forever(ping_interval = 25, ping_timeout = 5 )
|
|
||||||
except Exception as e:
|
|
||||||
print("Socket::ListenForever: Exception {}", format(e))
|
|
Reference in New Issue
Block a user