From 9e957d466fda7b2869c25264761fd5a2a971a19e Mon Sep 17 00:00:00 2001 From: Bubblegumdrop Date: Sat, 8 Jan 2022 18:59:40 -0500 Subject: [PATCH] Client and Server tweaks. This commit breaks the Client. Server listens correctly with threads and stdin reader thread. Client does nothing currently gutting UDP_Write for a UDPbase class introduced in this commit. --- Makefile | 10 ++- glsl/camera.v.glsl | 17 +++++ include/Client.h | 28 -------- include/FileIO.h | 20 ++---- include/Server.h | 45 ++++++------ include/ToggleFullscreen.h | 0 include/UDP_Write.h | 8 --- include/UDPbase.h | 61 ++++++++++++++++ include/camera.h | 39 ++++++----- include/debug.h | 23 ++++-- include/events_common.h | 4 +- include/glCheckErrors.h | 4 ++ include/lib_SDL_common.h | 4 ++ include/lib_lua_common.h | 10 +-- include/shader.h | 27 +++---- include/util.h | 10 +-- src/Client.cpp | 57 --------------- src/FileIO.cpp | 27 +++++-- src/Server.cpp | 163 ++++++++++++++++++++++--------------------- src/UDP_Write.cpp | 129 ---------------------------------- src/camera.cpp | 37 +++++----- src/client_main.cpp | 101 ++++++++++++++++++++------- src/cube.cpp | 99 +++++++++++++------------- src/lib_SDL_common.cpp | 53 +++++++++++--- src/lib_lua_common.cpp | 27 ++++--- src/server_main.cpp | 96 +++++++++++++++++++------ src/shader.cpp | 93 +++++++++++++----------- src/signal_common.cpp | 12 ++-- src/util.cpp | 77 ++++++++++---------- test/test_Client | Bin 373808 -> 0 bytes test/test_Client.cpp | 64 ----------------- test/test_FileIO.cpp | 3 - test/test_File_Write_UDP.cpp | 89 ----------------------- test/test_Object.cpp | 70 ------------------- test/test_UDP_DumpPacket.cpp | 35 ---------- 35 files changed, 660 insertions(+), 882 deletions(-) create mode 100644 glsl/camera.v.glsl delete mode 100644 include/Client.h delete mode 100644 include/ToggleFullscreen.h delete mode 100644 include/UDP_Write.h create mode 100644 include/UDPbase.h delete mode 100644 src/Client.cpp delete mode 100644 src/UDP_Write.cpp delete mode 100755 test/test_Client delete mode 100644 test/test_Client.cpp delete mode 100644 test/test_File_Write_UDP.cpp delete mode 100644 test/test_Object.cpp delete mode 100644 test/test_UDP_DumpPacket.cpp diff --git a/Makefile b/Makefile index 7ba3ff6..b1c7cae 100644 --- a/Makefile +++ b/Makefile @@ -42,14 +42,12 @@ SERVER_OBJS := \ CLIENT_OBJS := \ $(OBJDIR)/src/camera.o \ $(OBJDIR)/src/client_main.o \ - $(OBJDIR)/src/Client.o \ $(OBJDIR)/src/cube.o \ $(OBJDIR)/src/FileIO.o \ $(OBJDIR)/src/lib_GL_common.o \ $(OBJDIR)/src/object.o \ $(OBJDIR)/src/quad.o \ $(OBJDIR)/src/shader.o \ - $(OBJDIR)/src/UDP_Write.o \ $(COMMON_OBJS) IMGUI_OBJS := $(patsubst %,$(OBJDIR)/%.o,$(basename $(IMGUI_SRCS))) @@ -59,7 +57,7 @@ TEST_OBJ_COMMON := \ $(COMMON_OBJS) -TESTS := test_FileIO test_File_Write_UDP test_Object test_lua +TESTS := test_FileIO test_Object test_lua TEST_PROGS := $(addprefix $(TESTDIR)/,$(TESTS)) # {{{ Flags @@ -150,16 +148,16 @@ test: $(TEST_PROGS) test/test_FileIO: $(TEST_OBJ_COMMON) $(OBJDIR)/src/util.o -test/test_File_Write_UDP: $(TEST_OBJ_COMMON) $(OBJDIR)/src/UDP_Write.o $(OBJDIR)/src/Client.o - test/test_Object: $(TEST_OBJ_COMMON) $(OBJDIR)/src/object.o $(OBJDIR)/src/quad.o $(OBJDIR)/src/cube.o $(OBJDIR)/src/lib_GL_common.o test/test_lua: $(TEST_OBJ_COMMON) $(OBJDIR)/src/lib_lua_common.o -test/test_Client: $(TEST_OBJ_COMMON) $(OBJDIR)/src/UDP_Write.o $(OBJDIR)/src/Client.o +test/client: $(TEST_OBJ_COMMON) $(OBJDIR)/src/UDPbase.o $(OBJDIR)/src/lib_SDL_common.o test/test_UDP_DumpPacket: $(TEST_OBJ_COMMON) $(OBJDIR)/src/util.o +test/server: $(TEST_OBJ_COMMON) + $(OBJDIR)/%.o: %.c $(OBJDIR)/%.o: %.c $(DEPDIR)/%.d $(PRECOMPILE) diff --git a/glsl/camera.v.glsl b/glsl/camera.v.glsl new file mode 100644 index 0000000..c76ebfd --- /dev/null +++ b/glsl/camera.v.glsl @@ -0,0 +1,17 @@ +/* vim: set ft=c: */ + +#version 440 core + +layout(location = 0) in vec3 aPos; +layout(location = 1) in vec2 aTexCoord; + +out vec2 iTexCoord; + +uniform mat4 Model; +uniform mat4 View; +uniform mat4 Projection; + +void main(void) { + gl_Position = Projection * View * Model * vec4(aPos, 1.0f); + iTexCoord = aTexCoord; +} diff --git a/include/Client.h b/include/Client.h deleted file mode 100644 index be95d91..0000000 --- a/include/Client.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "debug.h" - -#include -#include - -#include - -class Client -{ - std::string mHost; - Uint16 mPort; - int mChannel; - std::vector UDPsocks; - public: - Client (void) - { - DEBUG_LOG ("Client::Client ()"); - } - Client (const char* host, const Uint16 port, const int channel); - UDPsocket UDP_Open (const char* host, const Uint16 port, const int channel); - void UDP_CloseAll (void); - UDPsocket First (void) - { - return UDPsocks.at (0); - } -}; diff --git a/include/FileIO.h b/include/FileIO.h index 6b60b96..ab9b96a 100644 --- a/include/FileIO.h +++ b/include/FileIO.h @@ -16,25 +16,15 @@ class FileIO FILE* fp; std::string path; public: - ~FileIO (void) - { - if (fp) - { - Close (); - fp = NULL; - } - } + FileIO (FILE* f); FileIO (const std::string&, const std::string&); - FileIO (FILE* f) - { - fp = f; - } - FILE* Open (const std::string&, const std::string&); + ~FileIO (void); + FILE *Open (const std::string&, const std::string&); int Close (void); int Seek (const off_t, const int); off_t Tell (void); - size_t Read(void*, const size_t); - size_t Write (const void*, const size_t); + size_t Read (void *, const size_t); + size_t Write (const void *, const size_t); void Rewind (void); /* I added these. */ time_t Mtime (void); diff --git a/include/Server.h b/include/Server.h index 89daeec..844c98c 100644 --- a/include/Server.h +++ b/include/Server.h @@ -3,40 +3,41 @@ #include #include -#include -#include +#include "lib_lua_common.h" +#include "UDPbase.h" -/* MTU */ -#define MAX_PACKET_SIZE (1024*1024) - -class Server +class Server : public UDPbase { SDL_mutex* mProcessPacketMutex; - SDL_TimerID mProcessPacketCallbackTimerID; - static Uint32 ProcessPacketCallback (Uint32, void*); + SDL_TimerID mFetchPacketsCallbackTimerID; + + std::vector TCPsocks; + std::vector UDPsocks; + UDPpacket** UDPPacketV; + SDLNet_SocketSet SocketSet; + lua_State *mLuaState; + public: - std::vector UDPsocks; - SDLNet_SocketSet SocketSet; - UDPpacket **UDPPacketV; - Server (void) - { - UDPsocks.clear (); - SocketSet = NULL; - UDPPacketV = NULL; - mProcessPacketMutex = NULL; - } Server (const char* host, const Uint16 port); - UDPsocket UDP_Open (Uint16 port); - void UDP_CloseAll (void); - void ProcessPacket (UDPpacket* packet); + ~Server (void); + + static Uint32 FetchPacketsCallback (Uint32 interval, void* param); + void ProcessPacketHelper (UDPpacket* packet); + void RunLua (const std::string& buf); + int AllocateApproximateBufferSpace (const int nclients); int Start (void); int Stop (void); int Lock (void) { return SDL_LockMutex (mProcessPacketMutex); } - int Unlock (void) + int Unlock (void) { return SDL_UnlockMutex (mProcessPacketMutex); } + lua_State* getLuaState(void) const { return mLuaState; } + const TCPsocket* getTCPsock (size_t idx) const { return &TCPsocks.at (idx); } + const UDPsocket* getUDPsock (size_t idx) const { return &UDPsocks.at (idx); } + UDPpacket* getUDPPacketV (size_t idx) const { return UDPPacketV[idx]; } + SDLNet_SocketSet getSocketSet (void) const { return SocketSet; } }; diff --git a/include/ToggleFullscreen.h b/include/ToggleFullscreen.h deleted file mode 100644 index e69de29..0000000 diff --git a/include/UDP_Write.h b/include/UDP_Write.h deleted file mode 100644 index ed63385..0000000 --- a/include/UDP_Write.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include - -int Buffer_Write_UDP (UDPsocket udpsock, const int channel, const size_t mtu, const void* buf, const size_t size); -int File_Write_UDP (UDPsocket udpsock, const int channel, const size_t mtu, const char* path); -int SendFile_UDP (const char* host, const Uint16 port, const int channel, const size_t mtu, const char* path); -int SendBuffer_UDP (const char* host, const Uint16 port, const int channel, const size_t mtu, const void* buf, const size_t size); diff --git a/include/UDPbase.h b/include/UDPbase.h new file mode 100644 index 0000000..12b68eb --- /dev/null +++ b/include/UDPbase.h @@ -0,0 +1,61 @@ +#pragma once + +#include +#include + +#define MAX_PACKET_SIZE 250 + +class UDPbase +{ + IPaddress addr; + public: + UDPbase (const char* host, const Uint16 port) + { + if (SDLNet_ResolveHost (&addr, host, SDLNet_Read16 (&port)) < 0) + { + throw "SDLNet_ResolveHost: " + std::string (SDLNet_GetError ()); + } + } + ~UDPbase (void) + { + } + UDPsocket Open (void) + { + return Open (addr.port); + } + UDPsocket Open (const Uint16 port) + { + UDPsocket sock = NULL; + IPaddress* addr; + if (NULL == (sock = SDLNet_UDP_Open (port))) + { + throw "SDLNet_UDP_Open: " + std::string (SDLNet_GetError ()); + } + if (NULL != (addr = SDLNet_UDP_GetPeerAddress (sock, -1))) + { + SDL_Log ("Opened UDP port %d", SDLNet_Read16 (&addr->port)); + } + return sock; + } + int Bind (UDPsocket sock, const int channel) + { + int binding; + SDL_assert (NULL != sock); + if (-1 == (binding = SDLNet_UDP_Bind (sock, channel, &addr))) + { + throw "SDLNet_UDP_Bind: " + std::string (SDLNet_GetError ()); + } + SDL_Log ("Binding UDP socket %s ch%d", this->toString ().c_str (), binding); + return binding; + } + void Close (UDPsocket sock) + { + SDL_assert (NULL != sock); + SDLNet_UDP_Close (sock); + sock = NULL; + } + std::string toString (void) + { + return std::string (SDLNet_ResolveIP (&addr)) + ":" + std::to_string (addr.port); + } +}; diff --git a/include/camera.h b/include/camera.h index b41c2e3..1931ed1 100644 --- a/include/camera.h +++ b/include/camera.h @@ -1,8 +1,6 @@ #pragma once -#include -#include -#include +#include /** * Default camera values @@ -14,6 +12,8 @@ #define DEFAULT_CAMERA_SENSITIVITY (1.0f) #define DEFAULT_CAMERA_JOYSENSITIVITY (1.0f) #define DEFAULT_CAMERA_ZOOM (45.0f) +#define DEFAULT_CAMERA_ZNEAR (0.1f) +#define DEFAULT_CAMERA_ZFAR (1000.0f) /* * Decelerate at gravity speed (9.8 m/s) / ??? @@ -25,19 +25,21 @@ class Camera { /** * An abstract camera class that processes input and calculates the corresponding + * ... */ glm::vec3 Position; glm::vec3 Front; - glm::vec3 Right; - glm::vec3 Up; glm::vec3 WorldUp; - /** Euler Angles, Vectors and Matrices for use in OpenGL. */ + /** + * ... Euler Angles, Vectors and Matrices for use in OpenGL. */ + glm::vec3 Right; + glm::vec3 Up; glm::vec3 Angles; - /* XXX Maybe we shouldn't let the camera move? */ + /* TODO combine with Object */ glm::vec3 Direction; /* Position movement */ - glm::vec2 ViewDirection; /* Yaw, Pitch movement */ + glm::vec3 ViewDirection; /* Yaw, Pitch movement */ void updateCameraVectors (void); @@ -52,20 +54,19 @@ class Camera }; /** Camera options */ - float MovementSpeed, MouseSensitivity, Zoom; - float DecelerationSpeed, ViewDecelerationSpeed, JoystickSensitivity; - float zNear, zFar; + float MovementSpeed, MouseSensitivity, JoystickSensitivity, DecelerationSpeed, ViewDecelerationSpeed; + float Zoom, zNear, zFar; Camera ( const glm::vec3 position = glm::vec3(0.0f, 0.0f, 1.0f) - , const glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f) - , const float yaw = DEFAULT_CAMERA_YAW - , const float pitch = DEFAULT_CAMERA_PITCH - , const float roll = DEFAULT_CAMERA_ROLL); + , const glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f) + , const float yaw = DEFAULT_CAMERA_YAW + , const float pitch = DEFAULT_CAMERA_PITCH + , const float roll = DEFAULT_CAMERA_ROLL); glm::mat4 GetViewMatrix (const bool constrainPitch = true); - void ProcessJoystickMovement (const float xoffset, const float yoffset, const float deltaTime); - void ProcessKeyboard (const Camera::Movement direction, const float deltaTime); - void ProcessMouseMovement (const float xoffset, const float yoffset, const float deltaTime); - void ProcessMouseScroll (const float xoffset, const float yoffset, const float deltaTime); + void ProcessJoystickMovement (const float, const float, const float); + void ProcessKeyboard (const Camera::Movement, const float); + void ProcessMouseMovement (const float, const float, const float); + void ProcessMouseScroll (const float, const float, const float); }; diff --git a/include/debug.h b/include/debug.h index 0fb7ac9..972a4f2 100644 --- a/include/debug.h +++ b/include/debug.h @@ -1,20 +1,29 @@ #pragma once #ifdef DEBUG + #include #include -#define DEBUG_LOG(...) debug_log (__FILE__, __LINE__, __func__, __VA_ARGS__) -static void debug_log (const char* filename, const int lineno, const char* func, const char* fmt, ...) -{ - char buf[8192]; - va_list ap; - SDL_memset (buf, 0, sizeof buf); +#define DEBUG_LOG(...) debug_log (__FILE__, __LINE__, __func__, __VA_ARGS__) + +static void +debug_log ( +const char* filename, +const int lineno, +const char* func, +const char* fmt, ...) +{ + va_list ap; + char buf[8192]; + + SDL_memset (buf, 0, sizeof buf); va_start (ap, fmt); vsnprintf (buf, (sizeof buf) - 1, fmt, ap); va_end (ap); - SDL_LogMessage (SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "%s:%d: %s(): %s", filename, lineno, func, buf); + SDL_LogMessage (SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, + "%s:%d: %s(): %s", filename, lineno, func, buf); } diff --git a/include/events_common.h b/include/events_common.h index 74db800..350985a 100644 --- a/include/events_common.h +++ b/include/events_common.h @@ -1,5 +1,7 @@ #pragma once +#include + enum { - PACKET_SDL_EVENT = SDL_USEREVENT, + PACKET_SDL_EVENT = SDL_USEREVENT, }; diff --git a/include/glCheckErrors.h b/include/glCheckErrors.h index 2a558db..d5cfa53 100644 --- a/include/glCheckErrors.h +++ b/include/glCheckErrors.h @@ -1,5 +1,6 @@ #pragma once +#ifdef DEBUG #include #include @@ -12,3 +13,6 @@ fprintf (stderr, "%s:%d: %s\n", __FILE__, __LINE__, glewGetErrorString(err)); \ } \ } while (0) +#else +#define glCheckErrors() +#endif diff --git a/include/lib_SDL_common.h b/include/lib_SDL_common.h index 67ff276..35698f9 100644 --- a/include/lib_SDL_common.h +++ b/include/lib_SDL_common.h @@ -11,6 +11,10 @@ #include #include +/* + * Start SDL with everything enabled. + * Also loads plugins. + */ void common_SDL_Init (void); void common_SDL_Quit (void); diff --git a/include/lib_lua_common.h b/include/lib_lua_common.h index f8deafc..2907c8e 100644 --- a/include/lib_lua_common.h +++ b/include/lib_lua_common.h @@ -5,11 +5,11 @@ #ifdef __cplusplus extern "C" { -#endif -#include -#include -#include -#ifdef __cplusplus + #endif + #include + #include + #include + #ifdef __cplusplus }; #endif diff --git a/include/shader.h b/include/shader.h index 37127f5..e4548fd 100644 --- a/include/shader.h +++ b/include/shader.h @@ -12,25 +12,26 @@ class ShaderProgram { bool mUniformLocationsNeedRefresh; std::map UniformLocationCache; - static GLint my_checkCompileSuccess (const GLuint id, const GLenum type); + static GLint my_checkCompileSuccess (const GLuint, const GLenum); public: GLuint ID; ShaderProgram (void); ShaderProgram (const std::string&, const std::string&, const std::string&); GLint getCachedLoc (const std::string&); void RefreshUniformLocations (void); - void Use (void); - void Bool (const std::string&, const bool&value); - void Float (const std::string&, const float&value); - void Int (const std::string&, const int&value); - void Vec2 (const std::string&, const glm::vec2& value); - void Vec3 (const std::string&, const glm::vec3& value); - void Vec4 (const std::string&, const glm::vec4& value); - void Mat2 (const std::string&, const glm::mat2& value); - void Mat3 (const std::string&, const glm::mat3& value); - void Mat4 (const std::string&, const glm::mat4& value); + void Use (void); + void Bool (const std::string&, const bool&); + void Float (const std::string&, const float&); + void Int (const std::string&, const int&); + void Vec2 (const std::string&, const glm::vec2&); + void Vec3 (const std::string&, const glm::vec3&); + void Vec4 (const std::string&, const glm::vec4&); + void Mat2 (const std::string&, const glm::mat2&); + void Mat3 (const std::string&, const glm::mat3&); + void Mat4 (const std::string&, const glm::mat4&); - GLuint CompileShaderBuffer (const std::string&, const GLenum type); - GLuint CompileShaderPath (const std::string&, const GLenum type); + GLuint CompileShaderBuffer (const std::string&, const GLenum); + GLuint Compile3ShaderBuffers (const std::string&, const std::string&, const std::string&); + GLuint CompileShaderPath (const std::string&, const GLenum); GLint LinkProgram (void); }; diff --git a/include/util.h b/include/util.h index 818b2f7..6178a9d 100644 --- a/include/util.h +++ b/include/util.h @@ -6,8 +6,10 @@ #include -int IsProbablyAscii (const void *, const size_t); -void HexDump (const void *, const size_t); +void error (const char*, ...); -void UDP_DumpPacket (UDPpacket*); -std::string HostAddress (IPaddress*); +int util_IsProbablyAscii (const void *, const size_t); +void util_HexDump (const void *, const size_t); + +void util_UDP_DumpPacket (UDPpacket*); +int util_UDP_ApproximatePacketVSize (UDPpacket*); diff --git a/src/Client.cpp b/src/Client.cpp deleted file mode 100644 index 76cf8a3..0000000 --- a/src/Client.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "debug.h" -#include "Client.h" -#include "util.h" - -Client::Client (const char *host, const Uint16 port, const int channel) -{ - UDPsocket udpsock; - DEBUG_LOG ("Attempting to connect %s:%d ch%d", host, port, channel); - if (NULL != (udpsock = UDP_Open (host, port, channel))) - { - mHost = host; - mPort = port; - mChannel = channel; - UDPsocks.push_back (udpsock); - } -} - - -UDPsocket -Client::UDP_Open (const char *host, const Uint16 port, const int channel) -{ - char hoststring[128]; - IPaddress ipaddress; - UDPsocket udpsock; - if (!(udpsock = SDLNet_UDP_Open (0))) - { - DEBUG_LOG ("SDLNet_UDP_Open: %s", SDLNet_GetError ()); - return NULL; - } - if (SDLNet_ResolveHost (&ipaddress, host, port) < 0) - { - DEBUG_LOG ("SDLNet_ResolveHost: %s", SDLNet_GetError ()); - return NULL; - } - if (SDLNet_UDP_Bind (udpsock, channel, &ipaddress) < 0) - { - DEBUG_LOG ("SDLNet_UDP_Bind: %s", SDLNet_GetError ()); - return NULL; - } - DEBUG_LOG ("Bound socket %s ch%d", HostAddress (&ipaddress).c_str (), channel); - return udpsock; -} - - -void -Client::UDP_CloseAll (void) -{ - size_t i; - const size_t nclients = UDPsocks.size (); - for (i = 0; i < nclients; i++) - { - SDLNet_UDP_Unbind (UDPsocks[i], mChannel); - SDLNet_UDP_Close (UDPsocks[i]); - UDPsocks[i] = NULL; - } - UDPsocks.clear (); -} diff --git a/src/FileIO.cpp b/src/FileIO.cpp index 00719cc..95dd8df 100644 --- a/src/FileIO.cpp +++ b/src/FileIO.cpp @@ -1,6 +1,7 @@ #include "FileIO.h" -#include +#include +#include #include /* errno */ #include /* FILE* */ @@ -8,6 +9,12 @@ #include /* stat */ #include /* stat */ +FileIO::FileIO (FILE* f) +{ + fp = f; +} + + FileIO::FileIO (const std::string& filename, const std::string& mode) { if (!(fp = Open (filename, mode))) @@ -16,6 +23,16 @@ FileIO::FileIO (const std::string& filename, const std::string& mode) } +FileIO::~FileIO(void) +{ + if (fp) + { + Close (); + fp = NULL; + } +} + + FILE* FileIO::Open (const std::string& filename, const std::string& mode) { @@ -93,8 +110,8 @@ FileIO::Size (void) std::string FileIO::ReadToString (void) { - off_t size = Size () + 1; - std::vector b (size); - off_t nread = Read (b.data (), size); - return std::string ((const char *) b.data (), nread); + off_t size = Size (); + std::string b (size + 1, 0); + Read (&b[0], size); + return b; } diff --git a/src/Server.cpp b/src/Server.cpp index d8737d7..7795fba 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -1,63 +1,46 @@ #include "debug.h" -#include "Server.h" #include "events_common.h" #include "util.h" +#include "Server.h" Server::Server (const char *host, const Uint16 port) +: UDPbase (host, port) { - IPaddress ipaddress; - UDPsocket udpsock; - if (SDLNet_ResolveHost (&ipaddress, host, SDL_SwapBE16 (port)) < 0) + UDPsocket sock; + mProcessPacketMutex = SDL_CreateMutex (); + if (NULL != (sock = Open (port))) { - DEBUG_LOG ("SDLNet_ResolveHost: %s", SDLNet_GetError ()); - return; - } - if (NULL != (udpsock = UDP_Open (ipaddress.port))) - { - UDPsocks.push_back (udpsock); - mProcessPacketMutex = SDL_CreateMutex (); - HostAddress (&ipaddress); - } - else - { - SDL_Log ("Unable to bind to port %d; is it in use?", ipaddress.port); + Bind (sock, -1); + UDPsocks.push_back (sock); } + SocketSet = NULL; + UDPPacketV = NULL; } -void -Server::UDP_CloseAll (void) +Server::~Server (void) { - const size_t nclients = UDPsocks.size (); - for (size_t i = 0; i < nclients; i++) - { + int i, n; + n = TCPsocks.size (); + for (i = 0; i < n; i++) + SDLNet_TCP_Close (TCPsocks[i]); + TCPsocks.clear (); + n = UDPsocks.size (); + for (i = 0; i < n; i++) SDLNet_UDP_Close (UDPsocks[i]); - UDPsocks[i] = NULL; - } UDPsocks.clear (); -} - - -/* - * Open and keep track of a UDP socket. - */ -UDPsocket -Server::UDP_Open (const Uint16 port) -{ - UDPsocket udpsock; - if (!(udpsock = SDLNet_UDP_Open (port))) + if (mProcessPacketMutex) { - DEBUG_LOG ("SDLNet_UDP_Open: %s", SDLNet_GetError ()); - return NULL; + SDL_DestroyMutex (mProcessPacketMutex); + mProcessPacketMutex = NULL; } - return udpsock; } void -Server::ProcessPacket (UDPpacket * packet) +Server::ProcessPacketHelper (UDPpacket* packet) { - size_t len; + int len; SDL_Event event; SDL_UserEvent userevent; UDPpacket *temp; @@ -79,15 +62,9 @@ Server::ProcessPacket (UDPpacket * packet) int -Server::Start (void) +Server::AllocateApproximateBufferSpace (const int nclients) { - int l; - int numused; - - if (!mProcessPacketMutex) - { - mProcessPacketMutex = SDL_CreateMutex (); - } + int i, l, numused, total; if ((l = Lock ()) < 0) { @@ -95,38 +72,53 @@ Server::Start (void) return l; } - const size_t nclients = UDPsocks.size (); - if (!nclients) - { - SDL_Log ("No Clients!"); - return -1; - } - else - { - DEBUG_LOG ("Serving %ld clients", nclients); - } + SDL_Log ("Serving %d clients", nclients); if (!(UDPPacketV = SDLNet_AllocPacketV (nclients, MAX_PACKET_SIZE))) { - DEBUG_LOG ("SDLNet_AllocPacketV: %s", SDLNet_GetError ()); - return -1; + SDL_Log ("SDLNet_AllocPacketV: %s", SDLNet_GetError ()); } if (!(SocketSet = SDLNet_AllocSocketSet (nclients))) { - DEBUG_LOG ("SDLNet_AllocSocketSet: %s", SDLNet_GetError ()); - return -1; + SDL_Log ("SDLNet_AllocSocketSet: %s", SDLNet_GetError ()); } - for (size_t i = 0; i < nclients; i++) + + total = 0; + for (i = 0; i < nclients; i++) { numused = SDLNet_UDP_AddSocket (SocketSet, UDPsocks[i]); if (numused < 0) { - DEBUG_LOG ("SDLNet_AddSocket: %s", SDLNet_GetError ()); - return -1; + SDL_Log ("SDLNet_AddSocket: %s", SDLNet_GetError ()); } + total += numused; } - mProcessPacketCallbackTimerID = SDL_AddTimer (10, Server::ProcessPacketCallback, (void *) this); + if (total != UDPsocks.size ()) + SDL_Log ("Total clients: %d (%ld?)", total, UDPsocks.size ()); + + return Unlock (); +} + + +int +Server::Start (void) +{ + int l; + + if ((l = Lock ()) < 0) + { + DEBUG_LOG ("Lock failed: %s", SDL_GetError ()); + return l; + } + + const int nclients = UDPsocks.size (); + AllocateApproximateBufferSpace (nclients); + + mLuaState = luaL_newstate (); + luaL_openlibs (mLuaState); + + mFetchPacketsCallbackTimerID = SDL_AddTimer (10, Server::FetchPacketsCallback, (void *) this); return Unlock (); } @@ -135,17 +127,19 @@ Server::Start (void) int Server::Stop (void) { - int l; + int i, l; if ((l = Lock ()) < 0) { DEBUG_LOG ("Lock failed"); return l; } - SDL_RemoveTimer (mProcessPacketCallbackTimerID); + SDL_RemoveTimer (mFetchPacketsCallbackTimerID); - const size_t nclients = UDPsocks.size (); - for (size_t i = 0; i < nclients; i++) + lua_close (mLuaState); + + const int nclients = UDPsocks.size (); + for (i = 0; i < nclients; i++) { SDLNet_UDP_DelSocket (SocketSet, UDPsocks[i]); } @@ -162,22 +156,28 @@ Server::Stop (void) } -Uint32 -Server::ProcessPacketCallback (Uint32 interval, void *param) +void +Server::RunLua (const std::string& buf) +{ + common_lua_run (mLuaState, "line", buf.c_str (), buf.length ()); +} + + +Uint32 Server::FetchPacketsCallback (Uint32 interval, void *param) { int numrecv, numready; - size_t i, j; + int i, j; SDL_assert (NULL != param); - Server& server = *(Server *) param; + Server* server = (Server *) param; - if (server.Lock () < 0) + if (server->Lock () < 0) { DEBUG_LOG ("Lock failed"); return 0; } - numready = SDLNet_CheckSockets (server.SocketSet, ~0); + numready = SDLNet_CheckSockets (server->getSocketSet (), 1); if (numready < 0) { DEBUG_LOG ("SDLNet_CheckSockets: %s", SDLNet_GetError ()); @@ -189,24 +189,25 @@ Server::ProcessPacketCallback (Uint32 interval, void *param) } /* check all sockets with SDLNet_SocketReady and handle the active ones. */ - for (i = 0; i < (size_t) numready; i++) + for (i = 0; i < numready; i++) { - if (SDLNet_SocketReady (server.UDPsocks[i])) + if (SDLNet_SocketReady (*server->getUDPsock (i))) { - numrecv = SDLNet_UDP_RecvV (server.UDPsocks[i], &server.UDPPacketV[i]); + UDPpacket* packet = server->getUDPPacketV (i); + numrecv = SDLNet_UDP_RecvV (*server->getUDPsock (i), &packet); if (numrecv < 0) { DEBUG_LOG ("SDLNet_UDP_RecvV: %s", SDLNet_GetError ()); break; } - for (j = 0; j < (size_t) numrecv; j++) + for (j = 0; j < numrecv; j++) { - server.ProcessPacket (server.UDPPacketV[i]); + server->ProcessPacketHelper (packet); } } } - server.Unlock (); + server->Unlock (); return interval; } diff --git a/src/UDP_Write.cpp b/src/UDP_Write.cpp deleted file mode 100644 index d4cc19d..0000000 --- a/src/UDP_Write.cpp +++ /dev/null @@ -1,129 +0,0 @@ -#include "debug.h" -#include "FileIO.h" -#include "Client.h" -#include "util.h" - -#include - -#include -#include -#include - -#include -#include - -/* XXX gross */ -int -Buffer_Write_UDP (UDPsocket udpsock, const int channel, const size_t mtu, const void *buf, const size_t size) -{ - const char *bufPtr; - const char *bufPtrEnd; - int numsent, npackets; - IPaddress *ipaddress; - size_t i, our_nsent, our_mtu; - UDPpacket **packetV; - SDL_assert (mtu > 0); - SDL_assert (size > 0); - numsent = 0; - our_mtu = mtu; - if (size < our_mtu) - our_mtu = size; - npackets = ceil ((double) size / (double) our_mtu); - if (!npackets) - { - DEBUG_LOG ("File_Write_UDP: zero length packet"); - return 0; - } - packetV = SDLNet_AllocPacketV (npackets, our_mtu); - if (!packetV) - { - DEBUG_LOG ("SDLNet_AllocPacketV: %s", SDLNet_GetError ()); - return 0; - } - i = 0; - bufPtr = (const char *) buf; - bufPtrEnd = bufPtr + size; - if (NULL == (ipaddress = SDLNet_UDP_GetPeerAddress (udpsock, channel))) - { - DEBUG_LOG ("SDLNet_UDP_GetPeerAddress: %s", SDLNet_GetError ()); - return 0; - } - DEBUG_LOG ("Sending %ld bytes to %s ch%d", size, HostAddress (ipaddress), channel); - size_t nsent = size; - while (i < (size_t) npackets && bufPtr < bufPtrEnd) - { - our_nsent = nsent; - if (our_nsent > our_mtu) - our_nsent = our_mtu; - packetV[i]->channel = channel; - packetV[i]->address = *ipaddress; - SDL_memset (packetV[i]->data, 0, our_mtu); - SDL_memcpy (packetV[i]->data, bufPtr, our_nsent); - packetV[i]->len = our_nsent; - bufPtr += our_mtu; - nsent -= our_mtu; - i++; - } - numsent = SDLNet_UDP_SendV (udpsock, packetV, npackets); - if (!numsent) - { - SDL_Log ("SDLNet_UDP_SendV (%d): %s", npackets, SDLNet_GetError ()); - } - SDLNet_FreePacketV (packetV); - return numsent; -} - - -int -File_Write_UDP (UDPsocket udpsock, const int channel, const char *path, const size_t mtu) -{ - int numsent; - Sint64 size; - numsent = 0; - try - { - FileIO f (path, "r"); - size = f.Size (); - std::vector b (size + 1); - f.Read (b.data (), size); - numsent = Buffer_Write_UDP (udpsock, channel, mtu, b.data (), b.size ()); - } - catch (int err) - { - SDL_Log ("File_Write_UDP: %s", strerror (errno)); - } - - return numsent; -} - - -int -SendBuffer_UDP (const char *host, const Uint16 port, const int channel, const size_t mtu, const void *buf, const size_t size) -{ - int numsent; - UDPsocket udpsock; - numsent = 0; - Client client (host, port, channel); - if (NULL != (udpsock = client.First ())) - { - numsent = Buffer_Write_UDP (udpsock, channel, mtu, buf, size); - client.UDP_CloseAll (); - } - return numsent; -} - - -int -SendFile_UDP (const char *host, const Uint16 port, const int channel, const size_t mtu, const char *path) -{ - int numsent; - UDPsocket udpsock; - numsent = 0; - Client client (host, port, channel); - if (NULL != (udpsock = client.First ())) - { - numsent = File_Write_UDP (udpsock, channel, path, mtu); - client.UDP_CloseAll (); - } - return numsent; -} diff --git a/src/camera.cpp b/src/camera.cpp index 65ad0a4..c9e6487 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -24,21 +24,23 @@ lerp (const glm::vec3 x, const glm::vec3 y, const float t) Camera::Camera (const glm::vec3 position, const glm::vec3 up, const float yaw, const float pitch, const float roll) +: Position (position) +, Front (glm::vec3 (0.0, 0.0, -1.0f)) +, WorldUp (up) +, Right (glm::vec3 (0.0f)) +, Up (glm::vec3 (0.0f)) +, Angles (glm::vec3 (yaw, pitch, roll)) +, Direction (glm::vec3 (0.0f)) +, ViewDirection (glm::vec3 (0.0f)) +, MovementSpeed (DEFAULT_CAMERA_SPEED) +, MouseSensitivity (DEFAULT_CAMERA_SENSITIVITY) +, JoystickSensitivity (DEFAULT_CAMERA_JOYSENSITIVITY) +, DecelerationSpeed (DEFAULT_CAMERA_DECELERATIONSPEED) +, ViewDecelerationSpeed (DEFAULT_CAMERA_MOUSEDECELERATIONSPEED) +, Zoom (DEFAULT_CAMERA_ZOOM) +, zNear (DEFAULT_CAMERA_ZNEAR) +, zFar (DEFAULT_CAMERA_ZFAR) { - Front = glm::vec3 (0.0f, 0.0f, -1.0f); - WorldUp = up; - MovementSpeed = DEFAULT_CAMERA_SPEED; - MouseSensitivity = DEFAULT_CAMERA_SENSITIVITY; - Zoom = DEFAULT_CAMERA_ZOOM; - DecelerationSpeed = DEFAULT_CAMERA_DECELERATIONSPEED; - ViewDecelerationSpeed = DEFAULT_CAMERA_MOUSEDECELERATIONSPEED; - JoystickSensitivity = DEFAULT_CAMERA_JOYSENSITIVITY; - Position = position; - Angles = glm::vec3 (yaw, pitch, roll); - Direction = glm::vec3 (0); - ViewDirection = glm::vec2 (0); - zNear = 0.1f; - zFar = 1000.0f; updateCameraVectors (); } @@ -54,8 +56,8 @@ Camera::updateCameraVectors (void) /** * Calculate the new Front vector */ - Front = glm::normalize (glm::vec3 - ( cos (glm::radians (Angles.x)) * cos (glm::radians (Angles.y)) + Front = glm::normalize (glm::vec3 ( + cos (glm::radians (Angles.x)) * cos (glm::radians (Angles.y)) , sin (glm::radians (Angles.y)) , sin (glm::radians (Angles.x)) * cos (glm::radians (Angles.y)))); // std::cout << glm::to_string (roll_mat) << std::endl; @@ -91,8 +93,7 @@ glm::mat4 Camera::GetViewMatrix (const bool constrainPitch) */ updateCameraVectors (); Direction = lerp (Direction, glm::vec3 (0.0f), DecelerationSpeed); - ViewDirection = - lerp (ViewDirection, glm::vec2 (0.0f), ViewDecelerationSpeed); + ViewDirection = lerp (ViewDirection, glm::vec3 (0.0f), ViewDecelerationSpeed); // std::cout << glm::to_string (Position) << std::endl; return glm::lookAt (Position, Position + Front, Up); } diff --git a/src/client_main.cpp b/src/client_main.cpp index 89f20ba..b3f7a63 100644 --- a/src/client_main.cpp +++ b/src/client_main.cpp @@ -1,5 +1,4 @@ #include "camera.h" -#include "Client.h" #include "cube.h" #include "debug.h" #include "glCheckErrors.h" @@ -8,8 +7,8 @@ #include "quad.h" #include "shader.h" #include "signal_common.h" -#include "UDP_Write.h" #include "unused.h" +#include "UDPbase.h" #include #include @@ -71,17 +70,19 @@ struct Client_State int Window_Width; double ShaderTimeDividend; + bool AnalogInputEnabled; bool ImGuiEnabled; - bool ShaderPlaying; + bool ImpulseInputEnabled; bool InputCaptureMouse; bool InputFirstMouse; bool InputRelativeMouseMode; + bool RenderShaderPlaying; bool RenderShowQuad; }; -static std::shared_ptr cube; -static std::shared_ptr quad; -static std::shared_ptr client; +static std::unique_ptr cube; +static std::unique_ptr quad; +static std::unique_ptr client; static Camera camera; static ShaderProgram shader; @@ -96,7 +97,7 @@ main (int argc, char **argv) my_Init (argc, argv); - shader = ShaderProgram ("../handmade-x/glsl/camera.v.glsl", "", "./glsl/new.f.glsl"); + shader = ShaderProgram ("./glsl/camera.v.glsl", "", "./glsl/new.f.glsl"); if (!shader.ID) { SDL_Log ("Unable to load shader."); @@ -104,17 +105,26 @@ main (int argc, char **argv) } camera = Camera (); - cube = std::make_shared (1); - quad = std::make_shared (1); + values.iResolution.x = state.Window_Width; + values.iResolution.y = state.Window_Height; + values.iResolution.z = 1.0; + + cube = std::make_unique (1); + quad = std::make_unique (1); state.mtu = 1450; state.quit = 0; - client = std::make_shared (state.host, state.port, state.channel); - if (NULL == (state.udpsock = client->First ())) + client = std::make_unique (state.host, state.port); + if (NULL == (state.udpsock = client->Open (0))) { SDL_Log ("Unable to open client port"); goto _out; } + if (-1 == (state.channel = client->Bind (state.udpsock, -1))) + { + SDL_Log ("Unable to bind client port"); + goto _out; + } while (!state.quit) { @@ -137,18 +147,13 @@ main (int argc, char **argv) } my_AnalogInput (); - my_UpdateValues (); - projection = glm::perspective (glm::radians (camera.Zoom), (float) values.iResolution.x / (float) values.iResolution.y, camera.zNear, camera.zFar); view = camera.GetViewMatrix (); model = glm::mat4 (1.0f); - shader.Use (); - shader.Int ("iFrame", values.iFrame); - shader.Float ("iTime", values.iTime); - shader.Float ("iTimeDelta", values.iTimeDelta); - shader.Vec3 ("iResolution", values.iResolution); + my_UpdateValues (); + shader.Use (); shader.Mat4 ("Projection", projection); shader.Mat4 ("View", view); shader.Mat4 ("Model", model); @@ -158,7 +163,7 @@ main (int argc, char **argv) } _out: - client->UDP_CloseAll (); + client->Close (state.udpsock); SDL_GL_DeleteContext (state.GLContext); SDL_DestroyWindow (state.Window); common_SDL_Quit (); @@ -180,10 +185,17 @@ my_Init (int argc, char** argv) common_GL_Init (state.Window, &state.GLContext, 1); SDL_GetWindowSize (state.Window, &state.Window_Width, &state.Window_Height); - state.ShaderPlaying = true; - state.ShaderTimeDividend = 1000; - state.InputRelativeMouseMode = false; + state.AnalogInputEnabled = true; + state.ImpulseInputEnabled = true; + + state.ImGuiEnabled = false; state.InputCaptureMouse = false; + state.InputFirstMouse = true; + state.InputRelativeMouseMode = false; + state.RenderShaderPlaying = true; + state.RenderShowQuad = true; + + state.ShaderTimeDividend = 1000; } @@ -191,14 +203,22 @@ static void my_UpdateValues (void) { values.iFrame++; - if (state.ShaderPlaying) + + if (state.RenderShaderPlaying) { values.iTime += ((double) state.diff / (double) state.ShaderTimeDividend); } + values.iTimeDelta = ((double) state.diff / (double) 1000); values.iResolution.x = state.Window_Width; values.iResolution.y = state.Window_Height; values.iResolution.z = 1.0; + + shader.Use (); + shader.Int ("iFrame", values.iFrame); + shader.Float ("iTime", values.iTime); + shader.Float ("iTimeDelta", values.iTimeDelta); + shader.Vec3 ("iResolution", values.iResolution); } @@ -209,7 +229,7 @@ my_Render (void) glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (state.RenderShowQuad) { - // glEnable (GL_DEPTH_TEST); + glEnable (GL_DEPTH_TEST); cube->Draw (); } else @@ -298,6 +318,9 @@ my_AnalogInput (void) const float dt = 0.016; (void) state; + if (!state.AnalogInputEnabled) + return SDL_FALSE; + camera.ProcessKeyboard (kbd[SDL_SCANCODE_W] ? Camera::Movement::FORWARD : Camera::Movement::NONE, dt); camera.ProcessKeyboard (kbd[SDL_SCANCODE_S] ? Camera::Movement::BACKWARD : Camera::Movement::NONE, dt); camera.ProcessKeyboard (kbd[SDL_SCANCODE_A] ? Camera::Movement::LEFT : Camera::Movement::NONE, dt); @@ -320,6 +343,32 @@ my_Input_Key (SDL_Event * event) SDL_assert (NULL != event); down = event->type == SDL_KEYDOWN; quit = SDL_FALSE; + if (!state.ImpulseInputEnabled) + { + switch (event->key.keysym.sym) + { + case SDLK_i: + state.ImpulseInputEnabled = true; + break; + case SDLK_ESCAPE: + quit = SDL_TRUE; + break; + case SDLK_F11: + { + if (down) + { + state.InputFirstMouse = true; + state.InputCaptureMouse = true; + state.InputRelativeMouseMode = true; + common_SDL_ToggleFullscreen (SDL_GetWindowFromID (event->key.windowID)); + } + } + break; + default: + break; + } + return SDL_FALSE; + } switch (event->key.keysym.sym) { case SDLK_ESCAPE: @@ -336,7 +385,6 @@ my_Input_Key (SDL_Event * event) } } break; - /* case SDLK_m: { if (down) @@ -359,7 +407,6 @@ my_Input_Key (SDL_Event * event) state.RenderShowQuad = !state.RenderShowQuad; } break; - */ default: { if (event->key.keysym.scancode != SDL_GetScancodeFromKey (event->key.keysym.sym)) @@ -367,7 +414,7 @@ my_Input_Key (SDL_Event * event) DEBUG_LOG ("Physical %s key acting as %s key", SDL_GetScancodeName (event->key.keysym.scancode), SDL_GetKeyName (event->key.keysym.sym)); } // SDL_Log ("%d %d %ld", state.channel, state.mtu, sizeof (SDL_Event)); - Buffer_Write_UDP (state.udpsock, state.channel, state.mtu, (const void*)event, sizeof (SDL_Event)); + // Buffer_Write_UDP (state.udpsock, state.channel, state.mtu, (const void*)event, sizeof (SDL_Event)); } } return quit; diff --git a/src/cube.cpp b/src/cube.cpp index 6f006cc..ac43d38 100644 --- a/src/cube.cpp +++ b/src/cube.cpp @@ -1,67 +1,68 @@ #include "cube.h" -Cube::Cube (const GLsizei size) -: Object (size) +Cube::Cube (const GLsizei size): +Object (size) { - const float vertices[] = { - // positions // normals // texture coords - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + const float vertices[] = + { + // positions // normals // texture coords + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, - -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, - -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, - -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, - -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, + -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, }; glBindVertexArray (VAO); - glBindBuffer (GL_ARRAY_BUFFER, VBO); - glBufferData (GL_ARRAY_BUFFER, sizeof vertices, vertices, GL_STATIC_DRAW); + glBindBuffer (GL_ARRAY_BUFFER, VBO); + glBufferData (GL_ARRAY_BUFFER, sizeof vertices, vertices, GL_STATIC_DRAW); - glBindVertexArray (VAO); - glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); - glEnableVertexAttribArray (0); + glBindVertexArray (VAO); + glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof (float), (void *) 0); + glEnableVertexAttribArray (0); - // glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); - // glEnableVertexAttribArray (1); + // glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof (float), (void*)(3 * sizeof (float))); + // glEnableVertexAttribArray (1); - glVertexAttribPointer (1, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); - glEnableVertexAttribArray (1); + glVertexAttribPointer (1, 2, GL_FLOAT, GL_FALSE, 8 * sizeof (float), (void *) (6 * sizeof (float))); + glEnableVertexAttribArray (1); } diff --git a/src/lib_SDL_common.cpp b/src/lib_SDL_common.cpp index b5e2b9b..90e8036 100644 --- a/src/lib_SDL_common.cpp +++ b/src/lib_SDL_common.cpp @@ -1,6 +1,7 @@ #include "debug.h" -#include "unused.h" #include "lib_SDL_common.h" +#include "unused.h" +#include "signal_common.h" #include /* exit */ @@ -9,13 +10,29 @@ #define DEFAULT_WINDOW_HEIGHT 600 static void +my_SDL_Linked_Version (const char* lib, const SDL_version* compile_version, const SDL_version* link_version) +{ + const char* msg = "%8s with %9s version: %d.%d.%d"; + SDL_assert (NULL != lib); + SDL_assert (NULL != compile_version); + SDL_assert (NULL != link_version); + SDL_Log (msg, "compiled", lib, compile_version->major, compile_version->minor, compile_version->patch); + SDL_Log (msg, "linked", lib, link_version->major, link_version->minor, link_version->patch); +} + +static void my_SDLNet_Init (void) { + SDL_version compile_version; + const SDL_version* link_version; if (SDLNet_Init () == -1) { SDL_Log ("SDLNet_Init: %s", SDLNet_GetError ()); exit (EXIT_FAILURE); } + link_version = SDLNet_Linked_Version (); + SDL_NET_VERSION (&compile_version); + my_SDL_Linked_Version ("SDL_Net", &compile_version, link_version); } @@ -23,6 +40,8 @@ static void my_IMG_Init (int flags) { int initted; + SDL_version compile_version; + const SDL_version* link_version; initted = IMG_Init (flags); if ((initted & flags) != flags) { @@ -30,18 +49,26 @@ my_IMG_Init (int flags) exit (EXIT_FAILURE); } SDL_assert ((initted & flags) == flags); + link_version = IMG_Linked_Version (); + SDL_IMAGE_VERSION (&compile_version); + my_SDL_Linked_Version ("SDL_image", &compile_version, link_version); } static void my_TTF_Init (void) { + const SDL_version* link_version; + SDL_version compile_version; if (TTF_Init () == -1) { SDL_Log ("TTF_Init: %s", TTF_GetError ()); exit (EXIT_FAILURE); } SDL_assert (1 == TTF_WasInit ()); + link_version = TTF_Linked_Version (); + SDL_TTF_VERSION (&compile_version); + my_SDL_Linked_Version ("SDL_TTF", &compile_version, link_version); } @@ -49,6 +76,8 @@ static void my_Mix_Init (int flags) { int initted; + SDL_version compile_version; + const SDL_version* link_version; initted = Mix_Init (flags); if ((initted & flags) != flags) { @@ -56,11 +85,14 @@ my_Mix_Init (int flags) exit (EXIT_FAILURE); } SDL_assert ((initted & flags) == flags); + link_version = Mix_Linked_Version (); + SDL_MIXER_VERSION (&compile_version); + my_SDL_Linked_Version ("SDL_mixer", &compile_version, link_version); } static SDL_AssertState -my_SDL_AssertionHandler(const SDL_AssertData* data, void* userdata) +my_SDL_AssertionHandler (const SDL_AssertData* data, void* userdata) { UNUSED (data); UNUSED (userdata); @@ -71,7 +103,7 @@ my_SDL_AssertionHandler(const SDL_AssertData* data, void* userdata) static void my_SDL_Assert_Init (void) { - SDL_SetAssertionHandler(my_SDL_AssertionHandler, NULL); + SDL_SetAssertionHandler (my_SDL_AssertionHandler, NULL); } @@ -79,6 +111,9 @@ void common_SDL_Init (void) { Uint32 Flags; + + common_Signal_Init (); + Flags = SDL_INIT_EVERYTHING; if (SDL_Init (Flags) < 0) { @@ -106,18 +141,20 @@ common_SDL_Quit (void) void -common_SDL_CreateWindow (SDL_Window ** wind) +common_SDL_CreateWindow (SDL_Window** wind) { Uint32 Flags; SDL_assert (NULL != wind); Flags = SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL; - *wind = SDL_CreateWindow (DEFAULT_WINDOW_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT, Flags); + *wind = + SDL_CreateWindow (DEFAULT_WINDOW_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, DEFAULT_WINDOW_WIDTH, + DEFAULT_WINDOW_HEIGHT, Flags); SDL_assert (NULL != *wind); } int -common_SDL_ToggleFullscreen (SDL_Window * window) +common_SDL_ToggleFullscreen (SDL_Window* window) { Uint32 Flags = SDL_GetWindowFlags (window); if (Flags & SDL_WINDOW_FULLSCREEN_DESKTOP) @@ -133,10 +170,10 @@ common_SDL_ToggleFullscreen (SDL_Window * window) } -SDL_Surface * +SDL_Surface* common_SDL_LoadSurfacePath (const std::string& path) { - SDL_Surface *image; + SDL_Surface* image; if (!(image = IMG_Load (path.c_str ()))) { DEBUG_LOG ("IMG_Load: %s", IMG_GetError ()); diff --git a/src/lib_lua_common.cpp b/src/lib_lua_common.cpp index efb3e69..0e54f62 100644 --- a/src/lib_lua_common.cpp +++ b/src/lib_lua_common.cpp @@ -1,4 +1,5 @@ #include "lib_lua_common.h" +#include "util.h" #include #include @@ -8,7 +9,6 @@ static int l_map (lua_State*); static int l_split (lua_State*); static void call_va (lua_State*, const char*, const char*, ...); -static void error (lua_State*, const char*, ...); int common_lua_run (lua_State* L, const char* name, const char* buff, const size_t buff_len) @@ -55,14 +55,13 @@ common_lua_stack_dump (lua_State* L) static void -error (lua_State* L, const char* fmt, ...) +Lua_error (lua_State* L, const char* fmt, ...) { va_list argp; va_start (argp, fmt); - vfprintf (stderr, fmt, argp); + error (fmt, argp); va_end (argp); lua_close (L); - exit (EXIT_FAILURE); } @@ -70,15 +69,15 @@ static void load (const char* filename, int* width, int* height) { lua_State* L = luaL_newstate (); - luaL_openlibs (L); + luaL_openlibs (L); if (luaL_loadfile (L, filename) || lua_pcall (L, 0, 0, 0)) - error (L, "cannot run configuration file: %s", lua_tostring (L, -1)); + Lua_error (L, "cannot run configuration file: %s", lua_tostring (L, -1)); lua_getglobal (L, "width"); lua_getglobal (L, "height"); if (!lua_isnumber (L, -2)) - error (L, "`width' should be a number\n"); + Lua_error (L, "`width' should be a number\n"); if (!lua_isnumber (L, -1)) - error (L, "`height' should be a number\n"); + Lua_error (L, "`height' should be a number\n"); *width = (int) lua_tonumber (L, -2); *height = (int) lua_tonumber (L, -1); lua_close (L); @@ -110,7 +109,7 @@ call_va (lua_State* L, const char* func, const char* sig, ...) case '>': goto endwhile; default: - error (L, "invalid option (%c)", *(sig - 1)); + Lua_error (L, "invalid option (%c)", *(sig - 1)); } narg++; luaL_checkstack (L, 1, "too many arguments"); @@ -120,7 +119,7 @@ call_va (lua_State* L, const char* func, const char* sig, ...) nres = strlen (sig); /* number of expected results */ /* do the call */ if (lua_pcall (L, narg, nres, 0) != 0) - error (L, "error running function `%s': %s", func, lua_tostring (L, -1)); + Lua_error (L, "error running function `%s': %s", func, lua_tostring (L, -1)); /* retrieve results */ nres = -nres; /* stack index of first result */ while (*sig) @@ -129,21 +128,21 @@ call_va (lua_State* L, const char* func, const char* sig, ...) { case 'd': /* double result */ if (!lua_isnumber (L, nres)) - error (L, "wrong result type"); + Lua_error (L, "wrong result type"); *va_arg (vl, double *) = lua_tonumber (L, nres); break; case 'i': /* int result */ if (!lua_isnumber (L, nres)) - error (L, "wrong result type"); + Lua_error (L, "wrong result type"); *va_arg (vl, int *) = (int) lua_tonumber (L, nres); break; case 's': /* string result */ if (!lua_isstring (L, nres)) - error (L, "wrong result type"); + Lua_error (L, "wrong result type"); *va_arg (vl, const char **) = lua_tostring (L, nres); break; default: - error (L, "invalid option (%c)", *(sig - 1)); + Lua_error (L, "invalid option (%c)", *(sig - 1)); } nres++; } diff --git a/src/server_main.cpp b/src/server_main.cpp index 94ff552..db1c8db 100644 --- a/src/server_main.cpp +++ b/src/server_main.cpp @@ -1,46 +1,61 @@ #include "debug.h" #include "lib_SDL_common.h" /* SDL* */ -#include "Server.h" #include "signal_common.h" #include "unused.h" #include "events_common.h" #include "trim.h" #include "lib_lua_common.h" #include "util.h" +#include "Server.h" +#include +#include +#include +#include #include #include /* exit */ #include /* getopt */ #include /* getopt */ +static bool done = false; +static const char* host = NULL; +static Uint16 port = 6666; +static const char* prompt_str = "> "; + +static std::unique_ptr server; + static bool my_SDL_UserEvent (SDL_Event *); +static int my_StdinThread(void*); static void my_Usage (const char *); static void my_GetOpt (int, char **); static void my_ProcessPacket (UDPpacket *); - -static const char* host = NULL; -static Uint16 port = 6666; +static bool my_StdinThread_Helper (const std::string&); +static void my_ShowPrompt (void); int main (int argc, char **argv) { - bool done; SDL_Event ev; - Server server; my_GetOpt (argc, argv); common_Signal_Init (); common_SDL_Init (); - server = Server (host, port); - if (server.Start () < 0) + server = std::make_unique (host, port); + + if (server->Start () < 0) { SDL_Log ("Couldn't start server!"); exit (EXIT_FAILURE); } done = false; + SDL_Thread* stdin_loop = SDL_CreateThread(my_StdinThread, "my_StdinThread", (void*)NULL); + if (NULL == stdin_loop) { + error ("SDL_CreateThread failed: %s\n", SDL_GetError()); + } + while (!done) { SDL_Delay (1); @@ -62,8 +77,9 @@ main (int argc, char **argv) } } - server.UDP_CloseAll (); - server.Stop (); + server->Stop (); + + SDL_WaitThread (stdin_loop, NULL); common_SDL_Quit (); @@ -101,7 +117,6 @@ my_ProcessPacket (UDPpacket* packet) { char c; size_t len; - char hoststring[128]; SDL_Event event; if (!packet) @@ -118,17 +133,14 @@ my_ProcessPacket (UDPpacket* packet) if (!((event.type == SDL_KEYDOWN) || (event.type == SDL_KEYUP))) { - SDL_Log ("UDP_DumpPacket:"); - UDP_DumpPacket (packet); + util_UDP_DumpPacket (packet); return; } std::string str = std::string (SDL_GetKeyName (event.key.keysym.sym)); bool down = (event.type == SDL_KEYDOWN); - HostAddress (&packet->address); - - // SDL_Log ("%d \"%s\"", str.length(), str.c_str ()); + // SDL_Log ("%d \"%s\"", str.length (), str.c_str ()); /* XXX ultra gross */ if (down) { @@ -137,14 +149,11 @@ my_ProcessPacket (UDPpacket* packet) if (str == "Return") { server_data.push_back ('\0'); - lua_State* L = luaL_newstate (); - luaL_openlibs (L); std::string buf = std::string ((const char*)server_data.data ()); printf ("\n => "); fflush (stdout); - common_lua_run (L, "line", buf.c_str (), buf.length ()); + server->RunLua (buf); fflush (stdout); - lua_close (L); server_data.clear (); } else if (str == "Left Shift") @@ -164,7 +173,7 @@ my_ProcessPacket (UDPpacket* packet) size = 0; server_data.resize (size); printf ("\x08\e[0K"); - fflush(stdout); + fflush (stdout); } } else @@ -246,3 +255,48 @@ my_GetOpt (int argc, char **argv) } } } + + +static void my_ShowPrompt (void) +{ + printf ("\n%s", prompt_str); + fflush (stdout); +} + +static bool my_StdinThread_Helper (const std::string& buf) +{ + util_HexDump (buf.c_str (), buf.length ()); + if (buf == "quit") + { + return true; + } + SDL_Delay (100); + puts (buf.c_str ()); + return false; +} + +static int my_StdinThread(void* param) +{ + std::string buf; + UNUSED (param); + while (!done) + { + my_ShowPrompt (); + try { + while (!done && getline (std::cin, buf)) + { + buf = trim (buf); + if ((done = my_StdinThread_Helper (buf))) + { + break; + } + my_ShowPrompt (); + } + } + catch (std::ifstream::failure& e) { + done = true; + } + } + + return 0; +} diff --git a/src/shader.cpp b/src/shader.cpp index 7c1cbb9..c595228 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -19,47 +19,10 @@ ShaderProgram::ShaderProgram (void) ShaderProgram::ShaderProgram (const std::string& vertexPath, const std::string& geometryPath, const std::string& fragmentPath) { - GLuint vertex, geometry, fragment; - - ID = glCreateProgram (); - if (ID) + GLuint id = Compile3ShaderBuffers (vertexPath, geometryPath, fragmentPath); + if (id) { - vertex = CompileShaderPath (vertexPath, GL_VERTEX_SHADER); - - geometry = 0; - if (!geometryPath.empty ()) - geometry = CompileShaderPath (geometryPath, GL_GEOMETRY_SHADER); - - FileIO f1 (DEFAULT_FRAGMENT_HEADER, "r"); - FileIO f2 (fragmentPath, "r"); - std::string buf = f1.ReadToString () + "\n" + f2.ReadToString (); - fragment = CompileShaderBuffer (buf.c_str (), GL_FRAGMENT_SHADER); - - if (vertex) - glAttachShader (ID, vertex); - if (geometry) - glAttachShader (ID, geometry); - if (fragment) - glAttachShader (ID, fragment); - - glLinkProgram (ID); - - if (!my_checkCompileSuccess (ID, GL_PROGRAM)) - { - throw "glLinkProgram error"; - ID = 0; - } - - glDeleteShader (vertex); - glDeleteShader (geometry); - glDeleteShader (fragment); - - RefreshUniformLocations (); - } - else - { - ID = 0; - throw "ShaderProgram error"; + ID = id; } } @@ -173,7 +136,7 @@ GLuint ShaderProgram::CompileShaderPath (const std::string& path, const GLenum t if (buf.empty ()) return 0; - return CompileShaderBuffer (buf.c_str (), type); + return CompileShaderBuffer (buf, type); } @@ -200,6 +163,52 @@ GLuint ShaderProgram::CompileShaderBuffer (const std::string& buf, const GLenum } +GLuint ShaderProgram::Compile3ShaderBuffers (const std::string& vertexPath, const std::string& geometryPath, const std::string& fragmentPath) +{ + GLuint vertex, geometry, fragment, id; + + id = glCreateProgram (); + if (!id) + return 0; + + vertex = CompileShaderPath (vertexPath, GL_VERTEX_SHADER); + + geometry = 0; + if (!geometryPath.empty ()) + geometry = CompileShaderPath (geometryPath, GL_GEOMETRY_SHADER); + + FileIO f1 (DEFAULT_FRAGMENT_HEADER, "r"); + FileIO f2 (fragmentPath, "r"); + std::string buf = f1.ReadToString () + "\n" + f2.ReadToString (); + fragment = CompileShaderBuffer (buf, GL_FRAGMENT_SHADER); + + if (vertex) + glAttachShader (id, vertex); + if (geometry) + glAttachShader (id, geometry); + if (fragment) + glAttachShader (id, fragment); + + glLinkProgram (id); + + if (!my_checkCompileSuccess (id, GL_PROGRAM)) + { + throw "glLinkProgram error"; + id = 0; + } + else + { + RefreshUniformLocations (); + } + + glDeleteShader (vertex); + glDeleteShader (geometry); + glDeleteShader (fragment); + + return id; +} + + GLint ShaderProgram::my_checkCompileSuccess (const GLuint id, const GLenum type) { @@ -218,7 +227,7 @@ ShaderProgram::my_checkCompileSuccess (const GLuint id, const GLenum type) goto HANDLE_SHADER; case GL_FRAGMENT_SHADER: typeName = "GL_FRAGMENT_SHADER"; -HANDLE_SHADER: + HANDLE_SHADER: glGetShaderiv (id, GL_COMPILE_STATUS,&success); if (GL_FALSE == success) glGetShaderiv (id, GL_INFO_LOG_LENGTH,&infoLogLength); diff --git a/src/signal_common.cpp b/src/signal_common.cpp index 4e112e9..c64f80b 100644 --- a/src/signal_common.cpp +++ b/src/signal_common.cpp @@ -1,5 +1,3 @@ -#define _POSIX_C_SOURCE - #include "signal_common.h" /* conflict with signal.h probably */ #include "unused.h" @@ -13,17 +11,20 @@ /* #include */ /* sigjmp_buf env; */ +static int signal_requested = 0; + static void my_Signal_Handler (int sig, siginfo_t* si, void* uap) { SDL_Event QUIT_EVENT = {SDL_QUIT}; - UNUSED (sig); UNUSED (uap); UNUSED (si); - SDL_PushEvent (&QUIT_EVENT); - exit (EXIT_FAILURE); + if (signal_requested++ > 0) + { + exit (EXIT_FAILURE); + } /* siglongjmp (env, sig); */ } @@ -35,7 +36,6 @@ common_Signal_Init (void) sa.sa_sigaction = my_Signal_Handler; sigemptyset (&sa.sa_mask); sa.sa_flags = 0; - if (sigaction (SIGINT, &sa, NULL) == -1) { fputs ("Failed to setup SIGINT handler\n", stderr); diff --git a/src/util.cpp b/src/util.cpp index 22698e4..52d0596 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,14 +1,26 @@ #include "util.h" -#include - -#include /* printf */ -#include /* uint8_t */ #include /* round */ -#include /* inet_ntop */ +#include /* va_list */ +#include /* uint8_t */ +#include /* printf */ +#include /* exit */ + +void +error (const char* fmt, ...) +{ + va_list argp; + va_start (argp, fmt); + vfprintf (stderr, fmt, argp); + va_end (argp); + fputc ('\n', stderr); + fflush (stderr); + exit (EXIT_FAILURE); +} + int -IsProbablyAscii (const void *buf, const size_t len) +util_IsProbablyAscii (const void* buf, const size_t len) { const uint8_t* bufPtr; const uint8_t* bufPtrEnd; @@ -26,7 +38,7 @@ IsProbablyAscii (const void *buf, const size_t len) void -HexDump (const void *buf, const size_t len) +util_HexDump (const void* buf, const size_t len) { const uint8_t* bufPtr; const uint8_t* bufPtrEnd; @@ -50,32 +62,8 @@ HexDump (const void *buf, const size_t len) } -std::string -HostAddress (IPaddress* ipaddress) -{ - char hostaddress[128]; - char hoststring[256]; - - SDL_assert (NULL != ipaddress); - SDL_zero (hostaddress); - SDL_zero (hoststring); - - if (ipaddress->host) - { - inet_ntop (AF_INET, &ipaddress->host, hostaddress, 128); - snprintf (hoststring, (sizeof hoststring) - 1, "%s:%d", hostaddress, SDLNet_Read16 (&ipaddress->port)); - } - else - { - snprintf (hoststring, (sizeof hoststring) - 1, "0.0.0.0:%d", SDLNet_Read16 (&ipaddress->port)); - } - - return std::string (hoststring); -} - - void -UDP_DumpPacket (UDPpacket* packet) +util_UDP_DumpPacket (UDPpacket* packet) { const char* buf; @@ -84,19 +72,18 @@ UDP_DumpPacket (UDPpacket* packet) buf = (const char*)packet->data; + SDL_Log ("address: %s", SDLNet_ResolveIP (&packet->address)); SDL_Log ("channel: %d", packet->channel); SDL_Log ("len : %d", packet->len); SDL_Log ("maxlen : %d", packet->maxlen); SDL_Log ("status : %d", packet->status); - SDL_Log ("address: %s", HostAddress (&packet->address).c_str ()); - if (packet->len) { - if (IsProbablyAscii (buf, packet->len)) + if (util_IsProbablyAscii (buf, packet->len)) SDL_Log ("data:\n%s", buf); else - HexDump (buf, packet->len); + util_HexDump (buf, packet->len); } else { @@ -105,3 +92,21 @@ UDP_DumpPacket (UDPpacket* packet) //DEBUG_LOG ("%d bytes from %s:%d:\n%s", packet->len, hoststring, ntohs (packet->address.port), str.c_str ()); } + + +/* + * You can get the number of packets in a sorta hacky way if your packet is set up correctly. + * + * UDPpacket** packetV = SDLNet_AllocPacketV (1, n); + * UDP_ApproximatePacketVSize (packetV[0]); + * + * It relies on the maxlen field being set to the total length of the + * data, with the len field being set to the MTU. + */ +int +util_UDP_ApproximatePacketVSize (UDPpacket* src) +{ + SDL_assert (NULL != src); + SDL_assert (src->len > 0); + return (int)ceil ((double) src->maxlen / (double) src->len); +} diff --git a/test/test_Client b/test/test_Client deleted file mode 100755 index 4a9020b25e38e05521f05ab6773dacea19d30273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373808 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

%d!OXyFr?}Yvw8yI5vFR`%D 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 diff --git a/test/test_Client.cpp b/test/test_Client.cpp deleted file mode 100644 index 0138b27..0000000 --- a/test/test_Client.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "debug.h" -#include "Client.h" -#include "UDP_Write.h" - -#include - -int -main (int argc, char **argv) -{ - int numsent; - const char *host = "localhost"; - const Uint16 port = 6666; - const int channel = 1; - const size_t mtu = 1450; - Client c; - UDPsocket udpsock; - c = Client (host, port, channel); - if (!(udpsock = c.First ())) - { - SDL_Log ("Client error"); - return 1; - } - - std::string buf = "Hello, world!\n"; - numsent = Buffer_Write_UDP (udpsock, channel, mtu, buf.c_str (), buf.length ()); - - SDL_Log ("%d", numsent); - c.UDP_CloseAll (); - - return 0; - -#if 0 - IPaddress ipaddress; - UDPsocket udpsock; - UDPpacket *packet; - udpsock = SDLNet_UDP_Open (0); - if (SDLNet_ResolveHost (&ipaddress, host, port) < 0) - { - DEBUG_LOG ("SDLNet_ResolveHost: %s", SDLNet_GetError ()); - return 0; - } - if (SDLNet_UDP_Bind (udpsock, channel, &ipaddress) < 0) - { - DEBUG_LOG ("SDLNet_UDP_Bind: %s", SDLNet_GetError ()); - return 0; - } - - packet = SDLNet_AllocPacket (1024); - if (packet) - { - packet->len = sprintf ((char*)packet->data, "Hello World!"); - packet->address = ipaddress; - numsent = SDLNet_UDP_Send (udpsock, packet->channel, packet); - if (!numsent) - { - DEBUG_LOG ("SDLNet_UDP_Send: %s\n", SDLNet_GetError ()); - } - } - - SDLNet_UDP_Unbind (udpsock, channel); - SDLNet_UDP_Close (udpsock); - udpsock = NULL; -#endif -} diff --git a/test/test_FileIO.cpp b/test/test_FileIO.cpp index 0dc82eb..b924f91 100644 --- a/test/test_FileIO.cpp +++ b/test/test_FileIO.cpp @@ -8,9 +8,6 @@ #include /* errno */ #include /* strerror */ - - - int main (int argc, char **argv) { diff --git a/test/test_File_Write_UDP.cpp b/test/test_File_Write_UDP.cpp deleted file mode 100644 index 0b521c7..0000000 --- a/test/test_File_Write_UDP.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "FileIO.h" -#include "UDP_Write.h" - -#include - -#include -#include -#include -#include -#include - -#include - -static void usage (const char* argv0) -{ - fprintf (stderr, "Usage: %s [-f path] [-h] [-p port] [-s server]\n", argv0); -} - -int -main (int argc, char** argv) -{ - int opt; - int numsent; - int mtu; - int channel; - const char* path; - const char* server; - Uint16 port; - - path = NULL; - server = "localhost"; - port = 6666; - channel = 1; - mtu = 1450; - numsent = 0; - - while ((opt = getopt (argc, argv, "hs:p:f:")) != -1) - { - switch (opt) - { - case 'h': - usage (argv[0]); - exit (EXIT_FAILURE); - break; - case 's': - server = optarg; - if (!strcmp (server, "NULL")) - server = NULL; - break; - case 'p': - port = strtol (optarg, NULL, 0); - break; - case 'f': - path = optarg; - break; - default: - break; - } - } - -#if 0 - if (optind < argc) { - printf("non-option ARGV-elements: "); - while (optind < argc) - printf("%s ", argv[optind++]); - printf("\n"); - } -#endif - - if ((optind < argc) && (argv[optind][0] == '-')) - { - const size_t size = 8192; - std::vector buf (size); - std::fill (buf.begin(), buf.end(), 0); - size_t nread = fread (buf.data (), sizeof (char), size - 1, stdin); - numsent = SendBuffer_UDP (server, port, channel, mtu, buf.data (), nread); - } - else - { - if (path) - { - numsent = SendFile_UDP (server, port, channel, mtu, path); - } - } - - SDL_Log ("%d", numsent); - - return 0; -} diff --git a/test/test_Object.cpp b/test/test_Object.cpp deleted file mode 100644 index 4df666f..0000000 --- a/test/test_Object.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "lib_SDL_common.h" -#include "lib_GL_common.h" - -#include "object.h" -#include "cube.h" -#include "quad.h" - -#include - -int main(void) -{ - int Window_Height; - int Window_Width; - SDL_GLContext GLContext; - SDL_Window *Window; - - common_SDL_Init (); - common_SDL_CreateWindow (&Window); - common_GL_Init (Window, &GLContext, 1); - SDL_GetWindowSize (Window, &Window_Width, &Window_Height); - - try { - SDL_Log ("Object o;"); - Object o; - SDL_Log ("Cube c;"); - Cube c; - SDL_Log ("Quad q;"); - Quad q; - } - catch (int e) - { - printf ("%d\n", e); - } - - try { - SDL_Log ("Object (1);"); - Object o = Object (1); - SDL_Log ("Cube (1);"); - Cube c = Cube (1); - SDL_Log ("Quad (1);"); - Quad q = Quad (1); - } - catch (int e) - { - printf ("%d\n", e); - } - - try { - SDL_Log ("Object o;"); - Object o; - SDL_Log ("Cube c;"); - Cube c; - SDL_Log ("Quad q;"); - Quad q; - SDL_Log ("Object (1);"); - o = Object (1); - SDL_Log ("Cube (1);"); - c = Cube (1); - SDL_Log ("Quad (1);"); - q = Quad (1); - } - catch (int e) - { - printf ("%d\n", e); - } - - SDL_GL_DeleteContext (GLContext); - SDL_DestroyWindow (Window); - common_SDL_Quit (); -} diff --git a/test/test_UDP_DumpPacket.cpp b/test/test_UDP_DumpPacket.cpp deleted file mode 100644 index 5401681..0000000 --- a/test/test_UDP_DumpPacket.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "util.h" - -#include -#include - -int -main (int argc, char **argv) -{ - int channel; - const size_t size = strlen (argv[0]); - UDPpacket *packet; - UDPsocket udpsock; - - if (!(packet = SDLNet_AllocPacket (size))) - { - SDL_Log ("SDLNet_AllocPacket: %s", SDLNet_GetError ()); - return 1; - } - -#if 0 - /* TODO Something with the channel. Keep track of it client side? */ - channel = SDLNet_UDP_Bind (udpsock, -1, address); - if (channel == -1) - { - SDL_Log ("SDLNet_UDP_Bind: %s", SDLNet_GetError ()); - return 1; - } -#endif - packet->channel = -1; - - packet->len = snprintf ((char *) packet->data, size - 1, "%s", argv[0]); - - UDP_DumpPacket (packet); - return 0; -}