From 835144d6f3d517d8eddec7fccdcd069441368b25 Mon Sep 17 00:00:00 2001 From: Relintai Date: Thu, 18 Jan 2024 22:42:51 +0100 Subject: [PATCH] Added the current GameScene demos as a new merged example. Also fixed smaller issues. --- sfw/core/socket.cpp | 2 + sfw/core/thread.cpp | 4 + sfw/core/thread.h | 5 + tools/merger/sfw_full.cpp.inl | 8 + tools/merger/test_app/compile_linux.sh | 13 + tools/merger/test_app/game_application.h | 21 + tools/merger/test_app/game_scene.cpp | 668 +++++++++++++++++++++++ tools/merger/test_app/game_scene.h | 76 +++ tools/merger/test_app/icon.png | Bin 0 -> 12259 bytes tools/merger/test_app/main.cpp | 11 + 10 files changed, 808 insertions(+) create mode 100755 tools/merger/test_app/compile_linux.sh create mode 100644 tools/merger/test_app/game_application.h create mode 100644 tools/merger/test_app/game_scene.cpp create mode 100644 tools/merger/test_app/game_scene.h create mode 100644 tools/merger/test_app/icon.png create mode 100644 tools/merger/test_app/main.cpp diff --git a/sfw/core/socket.cpp b/sfw/core/socket.cpp index a71e638..93c48ca 100644 --- a/sfw/core/socket.cpp +++ b/sfw/core/socket.cpp @@ -1,4 +1,6 @@ +//--STRIP #include "socket.h" +//--STRIP //Based on: diff --git a/sfw/core/thread.cpp b/sfw/core/thread.cpp index a761ccb..0b5c26a 100644 --- a/sfw/core/thread.cpp +++ b/sfw/core/thread.cpp @@ -3,12 +3,16 @@ /* From https://github.com/Relintai/pandemonium_engine (MIT) */ /*************************************************************************/ +//--STRIP #include "thread.h" +//--STRIP #if !defined(NO_THREADS) +//--STRIP #include "core/error_macros.h" #include "core/safe_refcount.h" +//--STRIP Error (*Thread::set_name_func)(const String &) = nullptr; void (*Thread::set_priority_func)(Thread::Priority) = nullptr; diff --git a/sfw/core/thread.h b/sfw/core/thread.h index 3129935..97e4e13 100644 --- a/sfw/core/thread.h +++ b/sfw/core/thread.h @@ -8,10 +8,15 @@ /* From https://github.com/Relintai/pandemonium_engine (MIT) */ /*************************************************************************/ +//--STRIP #include "core/typedefs.h" #if !defined(NO_THREADS) #include "core/safe_refcount.h" +#endif +//--STRIP + +#if !defined(NO_THREADS) #include #endif diff --git a/tools/merger/sfw_full.cpp.inl b/tools/merger/sfw_full.cpp.inl index ac00040..fe6492e 100644 --- a/tools/merger/sfw_full.cpp.inl +++ b/tools/merger/sfw_full.cpp.inl @@ -211,6 +211,14 @@ //#include "core/error/error_macros.h" //--STRIP {{FILE:sfw/core/safe_refcount.cpp}} +//--STRIP +//--STRIP +//#include "thread.h" +//#include "core/error_macros.h" +//#include "core/safe_refcount.h" +//--STRIP +//--STRIP +{{FILE:sfw/core/thread.cpp}} //--STRIP //#include "core/sfw_time.h" diff --git a/tools/merger/test_app/compile_linux.sh b/tools/merger/test_app/compile_linux.sh new file mode 100755 index 0000000..7e3e26a --- /dev/null +++ b/tools/merger/test_app/compile_linux.sh @@ -0,0 +1,13 @@ +cp -u ../out/full/sfw.h sfw.h +cp -u ../out/full/sfw.cpp sfw.cpp +cp -u ../out/full/sfw_3rd.m sfw_3rd.m + + +ccache g++ -Wall -g -c sfw.cpp -o sfw.o +ccache g++ -Wall -g -c game_scene.cpp -o game_scene.o +ccache g++ -Wall -g -c main.cpp -o main.o + +#-static-libgcc -static-libstdc++ + +ccache g++ -Wall -lX11 -static-libgcc -static-libstdc++ -g sfw.o game_scene.o main.o -o game + diff --git a/tools/merger/test_app/game_application.h b/tools/merger/test_app/game_application.h new file mode 100644 index 0000000..f5d44e9 --- /dev/null +++ b/tools/merger/test_app/game_application.h @@ -0,0 +1,21 @@ +#ifndef GAME_APPLICATION_H +#define GAME_APPLICATION_H + +#include "sfw.h" + +#include "game_scene.h" + +class GameApplication : public Application { + SFW_OBJECT(GameApplication, Application); + +public: + GameApplication() { + scene = Ref(memnew(GameScene())); + } + + ~GameApplication() { + scene.unref(); + } +}; + +#endif // GAME_APPLICATION_H diff --git a/tools/merger/test_app/game_scene.cpp b/tools/merger/test_app/game_scene.cpp new file mode 100644 index 0000000..aebc5ed --- /dev/null +++ b/tools/merger/test_app/game_scene.cpp @@ -0,0 +1,668 @@ +#include "game_scene.h" + +#include + +void GameScene::input_event(const Ref &event) { + //ERR_PRINT(event->as_text()); + + Ref k = event; + + if (k.is_valid()) { + if (k->is_echo()) { + return; + } + + uint32_t scancode = k->get_scancode(); + bool pressed = k->is_pressed(); + + if (scancode == KEY_W) { + up = pressed; + } else if (scancode == KEY_A) { + left = pressed; + } else if (scancode == KEY_S) { + down = pressed; + } else if (scancode == KEY_D) { + right = pressed; + } + + if (k->get_physical_scancode() == KEY_SPACE) { + if (pressed) { + ++render_type; + + if (render_type >= RENDER_TYPE_MAX) { + render_type = 0; + } + } + } + + if (k->get_physical_scancode() == KEY_K) { + if (pressed) { + image->save_png("test_image_save.png"); + image->save_bmp("test_image_save.bmp"); + image->save_tga("test_image_save.tga"); + image->save_jpg("test_image_save.jpg", 70); + + Ref fimage = image->duplicate(); + fimage->convert(Image::FORMAT_RGBAF); + fimage->save_hdr("test_image_save.hdr"); + + Ref timg = texture->get_data(); + + timg->save_png("timg.png"); + + ERR_PRINT("Test images Saved!"); + } + } + + if (k->get_physical_scancode() == KEY_T) { + if (pressed) { + toggle_thread(); + } + } + + if (k->get_physical_scancode() == KEY_P) { + if (pressed) { + toggle_socket(); + } + } + + return; + } + + Ref mm = event; + + if (mm.is_valid()) { + if (mm->get_button_mask() & BUTTON_MASK_LEFT) { + tile_map->transform.translate(mm->get_relative()); + } + } +} + +void GameScene::update(float delta) { + Vector2 trn; + + if (up) { + trn.y -= delta * 30.0; + } + + if (down) { + trn.y += delta * 30.0; + } + + if (left) { + trn.x -= delta * 30.0; + } + + if (right) { + trn.x += delta * 30.0; + } + + if (up || down || left || right) { + sprite->transform.translate(trn); + } +} + +void GameScene::render() { + glEnable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + + AppWindow::get_singleton()->reset_viewport(); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + static float rotmi = 0; + + if (render_type == 0) { + render_obj(); + } else if (render_type == 1) { + render_immediate(); + } else if (render_type == 2) { + _mesh_utils_test->clear(); + MeshUtils::create_simple_test_cone(_mesh_utils_test); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 3) { + _mesh_utils_test->clear(); + MeshUtils::create_capsule(_mesh_utils_test, 0.5, 0.5); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 4) { + _mesh_utils_test->clear(); + MeshUtils::create_cube(_mesh_utils_test, Vector3(0.5, 0.5, 0.5)); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 5) { + _mesh_utils_test->clear(); + MeshUtils::create_cylinder(_mesh_utils_test, 0.2, 0.5, 1); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 6) { + _mesh_utils_test->clear(); + MeshUtils::create_plane(_mesh_utils_test); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 7) { + _mesh_utils_test->clear(); + MeshUtils::create_prism(_mesh_utils_test); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 8) { + _mesh_utils_test->clear(); + MeshUtils::create_quad(_mesh_utils_test); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 9) { + _mesh_utils_test->clear(); + MeshUtils::create_quad_with_indices(_mesh_utils_test); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 10) { + _mesh_utils_test->clear(); + MeshUtils::create_sphere(_mesh_utils_test, 0.5, 0.5); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 11) { + _mesh_utils_test->clear(); + MeshUtils::create_point(_mesh_utils_test); + _mesh_utils_test->fill_colors_interpolated(Color(0.2, 0, 0), Color(1, 0, 0)); + _mesh_utils_test->upload(); + + camera->bind(); + + _mesh_utils_test_mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + _mesh_utils_test_mi->render(); + + _mesh_utils_test_mi->render(); + } else if (render_type == 12) { + render_immediate_3d(); + } +} +void GameScene::render_immediate() { + Renderer *r = Renderer::get_singleton(); + + r->clear_screen(Color()); + r->camera_2d_projection_set_to_window(); + + r->draw_point(Vector2(15, 15)); + r->draw_point(Vector2(18, 18), Color(1, 1, 0)); + + r->draw_line(Vector2(20, 20), Vector2(80, 20)); + r->draw_line(Vector2(20, 20), Vector2(80, 40)); + r->draw_line(Vector2(20, 30), Vector2(80, 30), Color(1, 1, 0)); + r->draw_line(Vector2(20, 40), Vector2(80, 40), Color(1, 1, 0), 4); + r->draw_line(Vector2(20, 40), Vector2(80, 60), Color(1, 1, 0), 4); + + r->draw_line_rect(Rect2(100, 100, 40, 40)); + r->draw_line_rect(Rect2(150, 100, 40, 40), Color(1, 1, 0)); + r->draw_line_rect(Rect2(200, 100, 40, 40), Color(1, 1, 1), 4); + + r->draw_rect(Rect2(100, 150, 40, 40)); + r->draw_rect(Rect2(150, 150, 40, 40), Color(1, 1, 0)); + + r->draw_texture(texture, Rect2(100, 200, 40, 40)); + r->draw_texture(texture, Rect2(150, 200, 40, 40), Color(1, 0, 0)); + + r->draw_texture_clipped(texture, Rect2(20, 20, 30, 30), Rect2(100, 250, 40, 40)); + r->draw_texture_clipped(texture, Rect2(20, 20, 30, 30), Rect2(150, 250, 40, 40), Color(1, 0, 0)); + + Transform2D t = Transform2D().rotated(Math_PI / 26.0); + + r->draw_texture_tr(t, texture, Rect2(100, 300, 40, 40)); + r->draw_texture_tr(t, texture, Rect2(150, 300, 40, 40), Color(1, 0, 0)); + + r->draw_texture_clipped_tr(t, texture, Rect2(20, 20, 30, 30), Rect2(100, 350, 40, 40)); + r->draw_texture_clipped_tr(t, texture, Rect2(20, 20, 30, 30), Rect2(150, 350, 40, 40), Color(1, 0, 0)); + + //r->draw_mesh_2d(sprite->mesh_instance->mesh, texture, Vector2(1000, 500)); + //r->draw_mesh_2d_tr(sprite->mesh_instance->mesh, texture, Transform2D().rotated(Math_PI / 26.0).translated(Vector2(1000, 500))); + //r->draw_mesh_2d_mat(sprite->mesh_instance->mesh, material, Vector2(1000, 500)); + //r->draw_mesh_2d_mat_tr(sprite->mesh_instance->mesh, material, Transform2D().rotated(Math_PI / 26.0).translated(Vector2(1000, 600))); + + r->draw_text_2d("draw_text_2d1", _font, Vector2(700, 100)); + r->draw_text_2d("draw_text_2d2", _font, Vector2(800, 100), Color(1, 1, 0)); + + r->draw_text_2d_tf("draw_text_2d_tf1", _font, Transform2D().rotated(Math_PI / 26.0).translated(Vector2(1000, 500))); + r->draw_text_2d_tf("draw_text_2d_tf2", _font, Transform2D().rotated(Math_PI / 26.0).translated(Vector2(1200, 500)), Color(0, 1, 0)); + + r->draw_text_2d_tf_material("draw_text_2d_tf_material1", _font, _font_test_mat, Transform2D().rotated(Math_PI / 26.0).translated(Vector2(1000, 800))); + r->draw_text_2d_tf_material("draw_text_2d_tf_material2", _font, _font_test_mat, Transform2D().rotated(Math_PI / 26.0).translated(Vector2(1200, 800)), Color(1, 0, 0)); +} + +void GameScene::render_obj() { + //static float rot = 0; + //Transform t = camera->get_camera_transform(); + //t.basis = Basis(Vector3(0, 1, 0), rot); + //camera->set_camera_transform(t); + //rot += 0.01; + + //Ref d = texture->get_data(); + //texture->create_from_image(d); + + camera->bind(); + + static float rotmi = 0; + mi->transform.basis = Basis(Vector3(1, 0, 0), rotmi); + rotmi += 0.01; + mi->render(); + + camera_2d->bind(); + sprite->render(); + tile_map->render(); + _font_test_sprite->render(); + _font_test_mi->render(); + + _text_2d->render(); + + //TextRenderer::get_singleton()->font_init(); + //TextRenderer::get_singleton()->font_print("test"); +} + +void GameScene::render_immediate_3d() { + Renderer *r = Renderer::get_singleton(); + + r->clear_screen(Color()); + r->camera_2d_projection_set_to_window(); + + r->camera_3d_bind(); + r->camera_3d_projection_set_to_perspective(AppWindow::get_singleton()->get_aspect()); + + static float rotmi = 0; + + _mesh_utils_test->clear(); + MeshUtils::create_simple_test_cone(_mesh_utils_test); + _mesh_utils_test->upload(); + + Transform tf; + tf.basis = Basis(Vector3(1, 0, 0), rotmi); + tf.origin.z -= 2; + + r->draw_mesh_3d_vertex_colored(_mesh_utils_test, tf); + + rotmi += 0.01; +} + +void GameScene::toggle_thread() { + if (_thread) { + _thread_running = false; + + _thread->wait_to_finish(); + + memdelete(_thread); + _thread = NULL; + } else { + _thread_running = true; + + _thread = memnew(Thread); + _thread->start(test_thread_func, this); + } +} + +void GameScene::test_thread_func(void *data) { + GameScene *self = (GameScene *)data; + + while (self->_thread_running) { + ERR_PRINT("Test Thread!"); + } +} + +void GameScene::toggle_socket() { + static bool sockets_inited = false; + if (!sockets_inited) { + // This will make the windows popup appear where it asks for permission to communicate + // Without this Sockets won't work on windows. + Socket::global_init(); + } + + if (_server_socket) { + _socket_thread_running = false; + + _server_socket_thread->wait_to_finish(); + + memdelete(_server_socket_thread); + _server_socket_thread = NULL; + } else { + _socket_thread_running = true; + + _server_socket_thread = memnew(Thread); + _server_socket_thread->start(socket_thread_func, this); + } +} +void GameScene::socket_thread_func(void *data) { + GameScene *self = (GameScene *)data; + + self->_server_socket = memnew(Socket); + + InetAddress addr(8080); + + self->_server_socket->create_net_socket(); + self->_server_socket->set_non_block(); + self->_server_socket->bind_address(addr); + self->_server_socket->listen(); + + ERR_PRINT("TEST SERVER IS LISTENING on http://127.0.0.1:8080"); + + Vector client_sockets; + + //https://stackoverflow.com/questions/40448937/socket-recv-buffer-size + char buffer[8192]; + + Socket *client_socket = memnew(Socket); + + while (self->_socket_thread_running) { + int a = self->_server_socket->accept(client_socket); + + if (a != -1) { + printf("New connection! %d\n", a); + + client_sockets.push_back(client_socket); + client_socket = new Socket(); + } + + for (int i = 0; i < client_sockets.size(); ++i) { + Socket *s = client_sockets[i]; + + int l = s->read(buffer, 8192); + + if (l > 0) { + String request = String::utf8(buffer, l); + + ERR_PRINT("Read!\n"); + ERR_PRINT(request); + ERR_PRINT("Sending answer!\n"); + + String content = "Your browser sent the following request:

"; + content += request.newline_to_br(); + + String resp; + resp += "HTTP/1.1 200 OK\n"; + resp += "Connection: Close\n"; + resp += "Content-Type: text/html\n"; + resp += "Content-Length: " + itos(content.utf8().size()) + "\n"; + resp += "\n"; + resp += content; + + CharString cs = resp.utf8(); + + s->send(cs.get_data(), cs.size()); + + s->close_write(); + memdelete(s); + client_sockets.remove(i); + --i; + } + } + } + + for (int i = 0; i < client_sockets.size(); ++i) { + memdelete(client_sockets[i]); + } + + client_sockets.clear(); + + memdelete(client_socket); + + self->_server_socket->close_write(); + + memdelete(self->_server_socket); + self->_server_socket = NULL; +} + +GameScene::GameScene() { + render_type = 0; + + _thread_running = false; + _thread = NULL; + + _socket_thread_running = false; + _server_socket_thread = NULL; + _server_socket = NULL; + + left = false; + right = false; + up = false; + down = false; + + //int w; + //int h; + //SDL_GetWindowSize(Application::get_singleton()->window, &w, &h); + + //float ar = static_cast(w) / static_cast(h); + //camera->width = camera->height * ar; + + _font.instance(); + _font->load_default(31.5); + + _font_test_sprite = memnew(Sprite); + + _font_test_mat.instance(); + _font_test_mat->texture = _font->get_texture(); + _font_test_sprite->mesh_instance->material = _font_test_mat; + _font_test_sprite->width = _font->get_atlas_width(); + _font_test_sprite->height = _font->get_atlas_height(); + _font_test_sprite->transform.set_origin(Vector2(1000, 100)); + _font_test_sprite->update_mesh(); + + _font_test_mesh.instance(); + _font_test_mesh->vertex_dimesions = 2; + + _font_test_mi = memnew(MeshInstance2D()); + _font_test_mi->material = _font_test_mat; + _font_test_mi->mesh = _font_test_mesh; + //_font_test_mi->transform.scale(Vector2(10, 10)); + _font_test_mi->transform.set_origin(Vector2(1000, 400)); + + _font->generate_mesh("asdfgh\nasdfvb", _font_test_mesh, Color(1, 1, 0)); + _font_test_mesh->upload(); + + image.instance(); + image->load_from_file("icon.png"); + //image->bumpmap_to_normalmap(); + + texture.instance(); + //texture->load_image("icon.png"); + texture->create_from_image(image); + //ha a textúrának van alpha csatornája: + //texture->load_image("download.bmp", GL_RGBA, GL_RGBA); + + material.instance(); + material->texture = texture; + + sprite = new Sprite(); + sprite->mesh_instance->material = material; + sprite->width = 500; + sprite->height = 500; + sprite->transform.set_origin(Vector2(250, 250)); + //sprite->region_x = 7.0 * (1.0 / 16.0); + //sprite->region_y = 7.0 * (1.0 / 16.0); + //sprite->region_width = 1.0 / 16.0; + //sprite->region_height = 1.0 / 16.0; + sprite->update_mesh(); + + tile_map = new TileMap(); + tile_map->material = material; + tile_map->atlas_size_x = 2; + tile_map->atlas_size_y = 2; + + tile_map->allocate_data(); + + for (int x = 0; x < tile_map->size_x; ++x) { + for (int y = 0; y < tile_map->size_y; ++y) { + if (x == 0 || y == 0 || x == tile_map->size_x - 1 || y == tile_map->size_y - 1) { + tile_map->set_data(x, y, 2); + } else { + tile_map->set_data(x, y, 1); + } + } + } + + tile_map->build_mesh(); + + tile_map->transform.scale(Vector2(32, 32)); + tile_map->transform.set_origin(Vector2(500, 500)); + + camera = new PerspectiveCamera(); + Transform t = camera->get_camera_transform(); + //camera->width = 2; + //camera->height = 2; + //camera->position.x = 0; + //camera->position.y = 0; + //camera->position.z = -2; + t.origin.z -= 2; + camera->set_camera_transform(t); + + camera->screen_aspect_ratio = 1920.0 / 1080.0; + + camera_2d = memnew(Camera2D); + camera_2d->size = Vector2(1920, 1080); + + mesh = Ref(memnew(Mesh())); + //cmaterial = memnew(ColoredMaterial()); + //cmaterial->color = glm::vec4(1, 1, 0, 1); + color_material.instance(); + + //mesh->clear(); + + MeshUtils::create_simple_test_cone(mesh); + mesh->upload(); + + mi = memnew(MeshInstance3D()); + mi->material = color_material; + mi->mesh = mesh; + + mi2 = memnew(MeshInstance3D()); + mi2->material = color_material; + mi2->mesh = mesh; + mi2->transform.origin.x = 1; + + mi->children.push_back(mi2); + + //float width = 1; + //float height = 1; + + //float region_x = 0; + //float region_y = 0; + //float region_width = 1; + //float region_height = 1; + + //float w2 = width / 2.0; + //float h2 = height / 2.0; + + //mesh->add_uv(region_x, region_y); + //mesh->add_vertex2(-w2, h2); + + //mesh->add_uv(region_x + region_width, region_y + region_height); + //mesh->add_vertex2(w2, -h2); + + //mesh->add_uv(region_x, region_y + region_height); + //mesh->add_vertex2(-w2, -h2); + + //mesh->add_uv(region_x + region_width, region_y); + //mesh->add_vertex2(w2, h2); + + /* + mesh->add_vertex2(0, 0.5); + mesh->add_vertex2(-0.5, -0.5); + mesh->add_vertex2(0.5, -0.5); + + mesh->add_triangle(0, 1, 2); + //mesh->add_triangle(0, 1, 3); + + mesh->upload(); + */ + + _text_2d = memnew(Text2D); + _text_2d->set_font(_font); + _text_2d->set_text("Test Text2D.\n Newline."); + _text_2d->set_text_color(Color(1, 1, 0)); + _text_2d->update(); + _text_2d->transform.set_origin(Vector2(1200, 250)); + + _mesh_utils_test.instance(); + + Renderer::initialize(); + + _mesh_utils_test_mi = memnew(MeshInstance3D()); + _mesh_utils_test_mi->material = color_material; + _mesh_utils_test_mi->mesh = _mesh_utils_test; +} + +GameScene::~GameScene() { + Renderer::destroy(); + + memdelete(tile_map); + memdelete(camera); + memdelete(sprite); +} diff --git a/tools/merger/test_app/game_scene.h b/tools/merger/test_app/game_scene.h new file mode 100644 index 0000000..30437bf --- /dev/null +++ b/tools/merger/test_app/game_scene.h @@ -0,0 +1,76 @@ +#ifndef GAME_SCENE_H +#define GAME_SCENE_H + +#include "sfw.h" + +class Thread; +class Socket; + +class GameScene : public Scene { + SFW_OBJECT(GameScene, Scene); + +public: + enum RenderTypes { + RENDER_TYPE_MAX = 13 + }; + + virtual void input_event(const Ref &event); + virtual void update(float delta); + virtual void render(); + virtual void render_immediate(); + virtual void render_obj(); + virtual void render_immediate_3d(); + + void toggle_thread(); + static void test_thread_func(void *d); + + void toggle_socket(); + static void socket_thread_func(void *d); + + GameScene(); + ~GameScene(); + + int render_type; + + bool left; + bool right; + bool up; + bool down; + + Thread *_thread; + bool _thread_running; + + bool _socket_thread_running; + Thread *_server_socket_thread; + Socket *_server_socket; + + Ref image; + Ref texture; + Ref material; + + Ref _font; + Sprite *_font_test_sprite; + Ref _font_test_mat; + + Ref _font_test_mesh; + MeshInstance2D *_font_test_mi; + + Camera2D *camera_2d; + TileMap *tile_map; + Sprite *sprite; + + Camera3D *camera; + Ref mesh; + MeshInstance3D *mi; + MeshInstance3D *mi2; + Ref color_material; + + Text2D *_text_2d; + + Ref _mesh_utils_test; + MeshInstance3D *_mesh_utils_test_mi; + + //ColoredMaterial *cmaterial; +}; + +#endif diff --git a/tools/merger/test_app/icon.png b/tools/merger/test_app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a263d7572781d43daccb5cf0171afde14093cf83 GIT binary patch literal 12259 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
    u578RnV3p=$zSG79%Xwea5wll<>R=Y2#%!!7Fh z#{UQ-N=}i0{(c$YQ3i4H{&*ct8!?-FqThLdhwz&@z@~SCT~a0l@=W!*Xww5L4PX7x+ZM zHbQVX7+)I7;*!Eb3)k%yDb>814u+PhW?%Wz>`);^Y|jSHv94l@47jwe2|;swYzv-( zORjQzP)2Hc`Y1TqcaIWjKxVGhYoAYFcB&De^&GyF+}DeS>mH)r(0SKfLxH?8x2=G+ zH3Jb6657;>J_W6!K-B6{>0xS*@lCL{!i6Y5d-13@!)&B<-W}l^U~M6T_HAdIjNv8B zO;bE#*pRrWl8kW|tnK)WGT7k@SXu7&;dHN~*pQ~F3#d)IPd<@1f7^F0=Fqcj;LfA;paY&6>yZxq1IlCPnU#x{#8h6DY_i^55 zNx=d`wCfL(kB{Z1!mOY%gL<;&uW=P|wfc1h6fh5TrkzZtoz`EJZmM;cGqVqMX%%!) zIA?X@XU%UYU*REVE0bW5exn*3A*^3PN14-S-gAQ_4bB;xf2$l^IWllu;$|F@67V#) z_ZcN^U91|H*KK2aBA5`9?wNL8(=do_DhF%}0W{=|qh|+}rsaclrupzEd%JmUsiKY* zP`=KmLdZC69ZwP^3lZu%&49WL#DE_6#VmX|Kzh{F%4_h(^pB`rKq8dER%uu1_c6W+ zn1DC^kH-fmQs~yOY{}%ZdlV6&rsYHks2_PGP*GH;5?O=Q;if%>&N$7D&40y88e1u- zeeuz=vVz^m`_Y=&szir856l#01|ltVjBLNF&^9;h8oN44m_$0k!_T5Nzt)4;wE6$H zt&hK?X-Q>zS}UYP7d@UHHGr$@swS>32^+>PF9<=RP^5n-!@s%7KhDJg3_(BUEO*6N zhCRsZ7MvhFkmf(zA5Vn`8-Z_&Ib^2tXOg(wuvMr@=l^C^RPf8`=3r5|V-X(4atRf= zvsEFS{>z<Dj)l#YM0QoUxKe^G3-jg6fYbvF3GDpF{Jlnth1 zis|;T?^<100C!Xr(vR(v_{;6XYH^)1OlcK5Iy&vMgC+gB8jJ^SVYgdY;)4S=jP`ctsvlKS-A&~ z{Y>m*6p+~Y7G(w024`dv{ehU$eZaAhw}!)AXinscPC`?^vsa;~1K~Y3FnCbOcX?A2 zB++_+z{&@fXku8;rnXN`>Gbqc^b!0BM{pM8nO{k0XZ4Zz0yQ_}fuCrz97WC9*|`B( zwApzePVSS0xKmc=N|Nug$_?-08O=hpsAx`fV*uCy0JUAC>NwlyZnd%UdyNhJjsG3( zao-}wpkQpis1k$`?%^waA$y~_8w(Jh*A}#RGJydwz4@j3!<~RGJ|qvm9B@l`jN|)u z@;Tk50|R5;f{$>|K3Jv=u4602aXUd}__0B91#unyme38bVUs8mUrF`7{|M`<;@LP! nV{DrP3`ilA|DR(D^+lZ8YsE0@DWxAu&<7M`RHdswn1=ix_DE9( literal 0 HcmV?d00001 diff --git a/tools/merger/test_app/main.cpp b/tools/merger/test_app/main.cpp new file mode 100644 index 0000000..e7a681a --- /dev/null +++ b/tools/merger/test_app/main.cpp @@ -0,0 +1,11 @@ +#include "game_application.h" + +int main(int argc, char **argv) { + Application *application = memnew(GameApplication()); + + application->start_main_loop(); + + memdelete(application); + + return 0; +}