From 6583134ef288ec5237e47c65741b94e85d468f12 Mon Sep 17 00:00:00 2001 From: Robert MacGregor Date: Sat, 13 Nov 2021 20:22:49 -0500 Subject: [PATCH 1/5] * Adjustment: Initial work on moving x86Unix platform code into a more common POSIX platform. --- Engine/source/platformMac/macMain.mm | 8 +- Engine/source/platformMac/macMemory.mm | 73 -- .../POSIXCPUInfo.cpp} | 4 + .../POSIXConsole.cpp} | 4 +- .../POSIXGL.client.cpp} | 0 .../POSIXMain.cpp} | 7 +- .../POSIXMath.cpp} | 5 + .../POSIXMemory.cpp} | 0 .../POSIXProcessControl.cpp} | 9 +- .../POSIXState.h} | 15 +- .../POSIXStdConsole.h} | 0 .../POSIXStrings.cpp} | 0 .../POSIXTime.cpp} | 4 +- .../POSIXUtils.cpp} | 2 +- .../POSIXUtils.h} | 0 .../X11Font.client.cpp} | 0 .../x86UNIXFont.h => platformX11/X11Font.h} | 0 Engine/source/platformX86UNIX/gl_types.h | 983 ------------------ Engine/source/platformX86UNIX/platformAL.h | 162 --- .../source/platformX86UNIX/threads/mutex.cpp | 76 -- .../platformX86UNIX/threads/semaphore.cpp | 90 -- .../source/platformX86UNIX/threads/thread.cpp | 159 --- .../source/platformX86UNIX/x86UNIXAsmBlit.cpp | 63 -- .../platformX86UNIX/x86UNIXDlibrary.cpp | 83 -- .../platformX86UNIX/x86UNIXInput.client.cpp | 608 ----------- .../platformX86UNIX/x86UNIXInputManager.h | 190 ---- .../x86UNIXMessageBox.client.cpp | 507 --------- .../platformX86UNIX/x86UNIXMessageBox.h | 122 --- Engine/source/platformX86UNIX/x86UNIXNet.cpp | 924 ---------------- .../x86UNIXOGLVideo.client.cpp | 508 --------- .../source/platformX86UNIX/x86UNIXOGLVideo.h | 58 -- .../platformX86UNIX/x86UNIXOpenAL.client.cpp | 285 ----- .../platformX86UNIX/x86UNIXPlatform.cpp | 31 - .../source/platformX86UNIX/x86UNIXRedbook.cpp | 269 ----- 34 files changed, 33 insertions(+), 5216 deletions(-) delete mode 100644 Engine/source/platformMac/macMemory.mm rename Engine/source/{platformX86UNIX/x86UNIXCPUInfo.cpp => platformPOSIX/POSIXCPUInfo.cpp} (98%) rename Engine/source/{platformX86UNIX/x86UNIXConsole.cpp => platformPOSIX/POSIXConsole.cpp} (99%) rename Engine/source/{platformX86UNIX/x86UNIXGL.client.cpp => platformPOSIX/POSIXGL.client.cpp} (100%) rename Engine/source/{platformX86UNIX/x86UNIXMain.cpp => platformPOSIX/POSIXMain.cpp} (96%) rename Engine/source/{platformX86UNIX/x86UNIXMath.cpp => platformPOSIX/POSIXMath.cpp} (98%) rename Engine/source/{platformX86UNIX/x86UNIXMemory.cpp => platformPOSIX/POSIXMemory.cpp} (100%) rename Engine/source/{platformX86UNIX/x86UNIXProcessControl.cpp => platformPOSIX/POSIXProcessControl.cpp} (97%) rename Engine/source/{platformX86UNIX/x86UNIXState.h => platformPOSIX/POSIXState.h} (95%) rename Engine/source/{platformX86UNIX/x86UNIXStdConsole.h => platformPOSIX/POSIXStdConsole.h} (100%) rename Engine/source/{platformX86UNIX/x86UNIXStrings.cpp => platformPOSIX/POSIXStrings.cpp} (100%) rename Engine/source/{platformX86UNIX/x86UNIXTime.cpp => platformPOSIX/POSIXTime.cpp} (99%) rename Engine/source/{platformX86UNIX/x86UNIXUtils.cpp => platformPOSIX/POSIXUtils.cpp} (99%) rename Engine/source/{platformX86UNIX/x86UNIXUtils.h => platformPOSIX/POSIXUtils.h} (100%) rename Engine/source/{platformX86UNIX/x86UNIXFont.client.cpp => platformX11/X11Font.client.cpp} (100%) rename Engine/source/{platformX86UNIX/x86UNIXFont.h => platformX11/X11Font.h} (100%) delete mode 100644 Engine/source/platformX86UNIX/gl_types.h delete mode 100644 Engine/source/platformX86UNIX/platformAL.h delete mode 100644 Engine/source/platformX86UNIX/threads/mutex.cpp delete mode 100644 Engine/source/platformX86UNIX/threads/semaphore.cpp delete mode 100644 Engine/source/platformX86UNIX/threads/thread.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXAsmBlit.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXDlibrary.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXInput.client.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXInputManager.h delete mode 100644 Engine/source/platformX86UNIX/x86UNIXMessageBox.client.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXMessageBox.h delete mode 100644 Engine/source/platformX86UNIX/x86UNIXNet.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXOGLVideo.client.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXOGLVideo.h delete mode 100644 Engine/source/platformX86UNIX/x86UNIXOpenAL.client.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXPlatform.cpp delete mode 100644 Engine/source/platformX86UNIX/x86UNIXRedbook.cpp diff --git a/Engine/source/platformMac/macMain.mm b/Engine/source/platformMac/macMain.mm index b7d8d1478..19fc2b0e2 100644 --- a/Engine/source/platformMac/macMain.mm +++ b/Engine/source/platformMac/macMain.mm @@ -23,14 +23,18 @@ #import "app/mainLoop.h" #import "platform/platformInput.h" #import "console/console.h" +#import "platformPOSIX/POSIXStdConsole.h" +#import "platformPOSIX/POSIXState.h" extern void InitWindowingSystem(); //------------------------------------------------------------------------------ void Platform::init() { - - Con::printf("Initializing platform..."); + StdConsole::create(); + stdConsole->enable(true); + + Con::printf("Initializing platform..."); // Set the platform variable for the scripts Con::setVariable( "$platform", "MacOSX" ); diff --git a/Engine/source/platformMac/macMemory.mm b/Engine/source/platformMac/macMemory.mm deleted file mode 100644 index fccf28d46..000000000 --- a/Engine/source/platformMac/macMemory.mm +++ /dev/null @@ -1,73 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2013 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#import "platform/platform.h" -#import -#import -#import - -//-------------------------------------- -void* dRealMalloc(dsize_t in_size) -{ - return malloc(in_size); -} - - -//-------------------------------------- -void dRealFree(void* in_pFree) -{ - free(in_pFree); -} - -void *dMalloc_aligned(dsize_t in_size, int alignment) -{ - return _mm_malloc(in_size, alignment); -} - -void dFree_aligned(void* p) -{ - return _mm_free(p); -} - -void* dMemcpy(void *dst, const void *src, dsize_t size) -{ - return memcpy(dst,src,size); -} - - -//-------------------------------------- -void* dMemmove(void *dst, const void *src, dsize_t size) -{ - return memmove(dst,src,size); -} - -//-------------------------------------- -void* dMemset(void *dst, int c, dsize_t size) -{ - return memset(dst,c,size); -} - -//-------------------------------------- -int dMemcmp(const void *ptr1, const void *ptr2, dsize_t len) -{ - return(memcmp(ptr1, ptr2, len)); -} diff --git a/Engine/source/platformX86UNIX/x86UNIXCPUInfo.cpp b/Engine/source/platformPOSIX/POSIXCPUInfo.cpp similarity index 98% rename from Engine/source/platformX86UNIX/x86UNIXCPUInfo.cpp rename to Engine/source/platformPOSIX/POSIXCPUInfo.cpp index b3bbd32bb..33b79425e 100644 --- a/Engine/source/platformX86UNIX/x86UNIXCPUInfo.cpp +++ b/Engine/source/platformPOSIX/POSIXCPUInfo.cpp @@ -20,6 +20,8 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef __APPLE__ + #include "platform/platform.h" #include "platformX86UNIX/platformX86UNIX.h" #include "console/console.h" @@ -45,3 +47,5 @@ namespace CPUInfo return CONFIG_SingleCoreHTDisabled; } }; // namespace CPUInfo + +#endif \ No newline at end of file diff --git a/Engine/source/platformX86UNIX/x86UNIXConsole.cpp b/Engine/source/platformPOSIX/POSIXConsole.cpp similarity index 99% rename from Engine/source/platformX86UNIX/x86UNIXConsole.cpp rename to Engine/source/platformPOSIX/POSIXConsole.cpp index 85828b202..5e9f810ec 100644 --- a/Engine/source/platformX86UNIX/x86UNIXConsole.cpp +++ b/Engine/source/platformPOSIX/POSIXConsole.cpp @@ -21,8 +21,8 @@ //----------------------------------------------------------------------------- #include "platformX86UNIX/platformX86UNIX.h" -#include "platformX86UNIX/x86UNIXStdConsole.h" -#include "platformX86UNIX/x86UNIXUtils.h" +#include "platformPOSIX/POSIXStdConsole.h" +#include "platformPOSIX/POSIXUtils.h" #include "platform/input/event.h" #include "platform/platform.h" #include "core/util/rawData.h" diff --git a/Engine/source/platformX86UNIX/x86UNIXGL.client.cpp b/Engine/source/platformPOSIX/POSIXGL.client.cpp similarity index 100% rename from Engine/source/platformX86UNIX/x86UNIXGL.client.cpp rename to Engine/source/platformPOSIX/POSIXGL.client.cpp diff --git a/Engine/source/platformX86UNIX/x86UNIXMain.cpp b/Engine/source/platformPOSIX/POSIXMain.cpp similarity index 96% rename from Engine/source/platformX86UNIX/x86UNIXMain.cpp rename to Engine/source/platformPOSIX/POSIXMain.cpp index 1c98ed4e2..dda611967 100644 --- a/Engine/source/platformX86UNIX/x86UNIXMain.cpp +++ b/Engine/source/platformPOSIX/POSIXMain.cpp @@ -20,13 +20,15 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef __APPLE__ + #include "platform/platform.h" #include "platform/platformInput.h" #include "console/console.h" #include "platformX86UNIX/platformX86UNIX.h" -#include "platformX86UNIX/x86UNIXStdConsole.h" -#include "platformX86UNIX/x86UNIXState.h" +#include "platformPOSIX/POSIXStdConsole.h" +#include "platformPOSIX/POSIXState.h" extern void InitWindowingSystem(); @@ -102,3 +104,4 @@ int main(int argc, const char **argv) return TorqueMain(argc, argv); } #endif +#endif \ No newline at end of file diff --git a/Engine/source/platformX86UNIX/x86UNIXMath.cpp b/Engine/source/platformPOSIX/POSIXMath.cpp similarity index 98% rename from Engine/source/platformX86UNIX/x86UNIXMath.cpp rename to Engine/source/platformPOSIX/POSIXMath.cpp index ada90c5f5..ef1f089a4 100644 --- a/Engine/source/platformX86UNIX/x86UNIXMath.cpp +++ b/Engine/source/platformPOSIX/POSIXMath.cpp @@ -20,6 +20,8 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef __APPLE__ + #include "platform/platform.h" #include "console/console.h" #include "math/mMath.h" @@ -97,8 +99,10 @@ void Math::init(U32 properties) Con::printf(" Installing Standard C extensions"); mInstallLibrary_C(); +#if defined(TORQUE_CPU_X32) || defined(TORQUE_CPU_X64) Con::printf(" Installing Assembly extensions"); mInstallLibrary_ASM(); +#endif if (properties & CPU_PROP_FPU) { @@ -174,4 +178,5 @@ void Platform::setMathControlStateKnown() } #endif +#endif diff --git a/Engine/source/platformX86UNIX/x86UNIXMemory.cpp b/Engine/source/platformPOSIX/POSIXMemory.cpp similarity index 100% rename from Engine/source/platformX86UNIX/x86UNIXMemory.cpp rename to Engine/source/platformPOSIX/POSIXMemory.cpp diff --git a/Engine/source/platformX86UNIX/x86UNIXProcessControl.cpp b/Engine/source/platformPOSIX/POSIXProcessControl.cpp similarity index 97% rename from Engine/source/platformX86UNIX/x86UNIXProcessControl.cpp rename to Engine/source/platformPOSIX/POSIXProcessControl.cpp index db7d0bdb7..0d8725d0b 100644 --- a/Engine/source/platformX86UNIX/x86UNIXProcessControl.cpp +++ b/Engine/source/platformPOSIX/POSIXProcessControl.cpp @@ -20,9 +20,11 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef __APPLE__ + #include "platformX86UNIX/platformX86UNIX.h" -#include "platformX86UNIX/x86UNIXState.h" -#include "platformX86UNIX/x86UNIXStdConsole.h" +#include "platformPOSIX/POSIXState.h" +#include "platformPOSIX/POSIXStdConsole.h" #include "platform/platformInput.h" #include "windowManager/platformWindow.h" #include "windowManager/platformWindowMgr.h" @@ -130,7 +132,7 @@ void ProcessControlInit() // we're not interested in the exit status of child processes, so this // prevents zombies from accumulating. -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__APPLE__) signal(SIGCHLD, SIG_IGN); #else signal(SIGCLD, SIG_IGN); @@ -232,3 +234,4 @@ void Platform::restartInstance() */ exit(0); } +#endif \ No newline at end of file diff --git a/Engine/source/platformX86UNIX/x86UNIXState.h b/Engine/source/platformPOSIX/POSIXState.h similarity index 95% rename from Engine/source/platformX86UNIX/x86UNIXState.h rename to Engine/source/platformPOSIX/POSIXState.h index 4036f029e..7d35667bc 100644 --- a/Engine/source/platformX86UNIX/x86UNIXState.h +++ b/Engine/source/platformPOSIX/POSIXState.h @@ -25,13 +25,9 @@ //#include "platformX86UNIX/platformGL.h" #include "core/strings/stringFunctions.h" -#ifndef TORQUE_DEDICATED -#include // for Display, Window and other X mojo -#else #define Display int #define Window int #define Screen int -#endif #include // for basename @@ -225,11 +221,6 @@ class DisplayPtrManager private: Display* openDisplay() { -#ifndef TORQUE_DEDICATED - mDisplay = XOpenDisplay(NULL); - if (mDisplay != NULL) - mOpenedDisplay = true; -#endif return mDisplay; } @@ -237,11 +228,7 @@ class DisplayPtrManager { if (mOpenedDisplay) { -#ifndef TORQUE_DEDICATED - XCloseDisplay(mDisplay); - mDisplay = NULL; - mOpenedDisplay = false; -#endif + } } public: diff --git a/Engine/source/platformX86UNIX/x86UNIXStdConsole.h b/Engine/source/platformPOSIX/POSIXStdConsole.h similarity index 100% rename from Engine/source/platformX86UNIX/x86UNIXStdConsole.h rename to Engine/source/platformPOSIX/POSIXStdConsole.h diff --git a/Engine/source/platformX86UNIX/x86UNIXStrings.cpp b/Engine/source/platformPOSIX/POSIXStrings.cpp similarity index 100% rename from Engine/source/platformX86UNIX/x86UNIXStrings.cpp rename to Engine/source/platformPOSIX/POSIXStrings.cpp diff --git a/Engine/source/platformX86UNIX/x86UNIXTime.cpp b/Engine/source/platformPOSIX/POSIXTime.cpp similarity index 99% rename from Engine/source/platformX86UNIX/x86UNIXTime.cpp rename to Engine/source/platformPOSIX/POSIXTime.cpp index ec3e73642..15d733389 100644 --- a/Engine/source/platformX86UNIX/x86UNIXTime.cpp +++ b/Engine/source/platformPOSIX/POSIXTime.cpp @@ -20,6 +20,8 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#ifndef __APPLE__ + #include "platformX86UNIX/platformX86UNIX.h" #include "platform/platformTimer.h" #include "time.h" @@ -158,4 +160,4 @@ void Platform::sleep(U32 ms) // note: this will overflow if you want to sleep for more than 49 days. just so ye know. usleep( ms * 1000 ); } - +#endif diff --git a/Engine/source/platformX86UNIX/x86UNIXUtils.cpp b/Engine/source/platformPOSIX/POSIXUtils.cpp similarity index 99% rename from Engine/source/platformX86UNIX/x86UNIXUtils.cpp rename to Engine/source/platformPOSIX/POSIXUtils.cpp index a7b0eafa7..b87d92c49 100644 --- a/Engine/source/platformX86UNIX/x86UNIXUtils.cpp +++ b/Engine/source/platformPOSIX/POSIXUtils.cpp @@ -32,7 +32,7 @@ #include #include "platformX86UNIX/platformX86UNIX.h" -#include "platformX86UNIX/x86UNIXUtils.h" +#include "platformPOSIX/POSIXUtils.h" UnixUtils *UUtils = NULL; UnixUtils utils; diff --git a/Engine/source/platformX86UNIX/x86UNIXUtils.h b/Engine/source/platformPOSIX/POSIXUtils.h similarity index 100% rename from Engine/source/platformX86UNIX/x86UNIXUtils.h rename to Engine/source/platformPOSIX/POSIXUtils.h diff --git a/Engine/source/platformX86UNIX/x86UNIXFont.client.cpp b/Engine/source/platformX11/X11Font.client.cpp similarity index 100% rename from Engine/source/platformX86UNIX/x86UNIXFont.client.cpp rename to Engine/source/platformX11/X11Font.client.cpp diff --git a/Engine/source/platformX86UNIX/x86UNIXFont.h b/Engine/source/platformX11/X11Font.h similarity index 100% rename from Engine/source/platformX86UNIX/x86UNIXFont.h rename to Engine/source/platformX11/X11Font.h diff --git a/Engine/source/platformX86UNIX/gl_types.h b/Engine/source/platformX86UNIX/gl_types.h deleted file mode 100644 index c74570814..000000000 --- a/Engine/source/platformX86UNIX/gl_types.h +++ /dev/null @@ -1,983 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#ifndef _X86UNIX_GL_TYPES_H_ -#define _X86UNIX_GL_TYPES_H_ - -// added by JMQ: -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF - -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 - -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#define GL_CLAMP_TO_EDGE_EXT 0x812F - -#define GL_V12MTVFMT_EXT 0x8702 -#define GL_V12MTNVFMT_EXT 0x8703 -#define GL_V12FTVFMT_EXT 0x8704 -#define GL_V12FMTVFMT_EXT 0x8705 - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE3_RGB_EXT 0x8583 -#define GL_SOURCE4_RGB_EXT 0x8584 -#define GL_SOURCE5_RGB_EXT 0x8585 -#define GL_SOURCE6_RGB_EXT 0x8586 -#define GL_SOURCE7_RGB_EXT 0x8587 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_SOURCE3_ALPHA_EXT 0x858B -#define GL_SOURCE4_ALPHA_EXT 0x858C -#define GL_SOURCE5_ALPHA_EXT 0x858D -#define GL_SOURCE6_ALPHA_EXT 0x858E -#define GL_SOURCE7_ALPHA_EXT 0x858F -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND3_RGB_EXT 0x8593 -#define GL_OPERAND4_RGB_EXT 0x8594 -#define GL_OPERAND5_RGB_EXT 0x8595 -#define GL_OPERAND6_RGB_EXT 0x8596 -#define GL_OPERAND7_RGB_EXT 0x8597 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#define GL_OPERAND3_ALPHA_EXT 0x859B -#define GL_OPERAND4_ALPHA_EXT 0x859C -#define GL_OPERAND5_ALPHA_EXT 0x859D -#define GL_OPERAND6_ALPHA_EXT 0x859E -#define GL_OPERAND7_ALPHA_EXT 0x859F -#endif - -/* - * Mesa 3-D graphics library - * Version: 3.4 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - - -#define GL_VERSION_1_1 1 -#define GL_VERSION_1_2 1 - -/* - * - * Datatypes - * - */ -#ifdef CENTERLINE_CLPP -#define signed -#endif -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef void GLvoid; -typedef signed char GLbyte; /* 1-byte signed */ -typedef short GLshort; /* 2-byte signed */ -typedef int GLint; /* 4-byte signed */ -typedef unsigned char GLubyte; /* 1-byte unsigned */ -typedef unsigned short GLushort; /* 2-byte unsigned */ -typedef unsigned int GLuint; /* 4-byte unsigned */ -typedef int GLsizei; /* 4-byte signed */ -typedef float GLfloat; /* single precision float */ -typedef float GLclampf; /* single precision float in [0,1] */ -typedef double GLdouble; /* double precision float */ -typedef double GLclampd; /* double precision float in [0,1] */ - - - -/* - * - * Constants - * - */ - -/* Boolean values */ -#define GL_FALSE 0x0 -#define GL_TRUE 0x1 - -/* Data types */ -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_DOUBLE 0x140A -#define GL_2_BYTES 0x1407 -#define GL_3_BYTES 0x1408 -#define GL_4_BYTES 0x1409 - -/* Primitives */ -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_QUAD_STRIP 0x0008 -#define GL_POLYGON 0x0009 - -/* Vertex Arrays */ -#define GL_VERTEX_ARRAY 0x8074 -#define GL_NORMAL_ARRAY 0x8075 -#define GL_COLOR_ARRAY 0x8076 -#define GL_INDEX_ARRAY 0x8077 -#define GL_TEXTURE_COORD_ARRAY 0x8078 -#define GL_EDGE_FLAG_ARRAY 0x8079 -#define GL_VERTEX_ARRAY_SIZE 0x807A -#define GL_VERTEX_ARRAY_TYPE 0x807B -#define GL_VERTEX_ARRAY_STRIDE 0x807C -#define GL_NORMAL_ARRAY_TYPE 0x807E -#define GL_NORMAL_ARRAY_STRIDE 0x807F -#define GL_COLOR_ARRAY_SIZE 0x8081 -#define GL_COLOR_ARRAY_TYPE 0x8082 -#define GL_COLOR_ARRAY_STRIDE 0x8083 -#define GL_INDEX_ARRAY_TYPE 0x8085 -#define GL_INDEX_ARRAY_STRIDE 0x8086 -#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A -#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C -#define GL_VERTEX_ARRAY_POINTER 0x808E -#define GL_NORMAL_ARRAY_POINTER 0x808F -#define GL_COLOR_ARRAY_POINTER 0x8090 -#define GL_INDEX_ARRAY_POINTER 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 -#define GL_V2F 0x2A20 -#define GL_V3F 0x2A21 -#define GL_C4UB_V2F 0x2A22 -#define GL_C4UB_V3F 0x2A23 -#define GL_C3F_V3F 0x2A24 -#define GL_N3F_V3F 0x2A25 -#define GL_C4F_N3F_V3F 0x2A26 -#define GL_T2F_V3F 0x2A27 -#define GL_T4F_V4F 0x2A28 -#define GL_T2F_C4UB_V3F 0x2A29 -#define GL_T2F_C3F_V3F 0x2A2A -#define GL_T2F_N3F_V3F 0x2A2B -#define GL_T2F_C4F_N3F_V3F 0x2A2C -#define GL_T4F_C4F_N3F_V4F 0x2A2D - -/* Matrix Mode */ -#define GL_MATRIX_MODE 0x0BA0 -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 - -/* Points */ -#define GL_POINT_SMOOTH 0x0B10 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_POINT_SIZE_RANGE 0x0B12 - -/* Lines */ -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_STIPPLE 0x0B24 -#define GL_LINE_STIPPLE_PATTERN 0x0B25 -#define GL_LINE_STIPPLE_REPEAT 0x0B26 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_LINE_WIDTH_RANGE 0x0B22 - -/* Polygons */ -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_STIPPLE 0x0B42 -#define GL_EDGE_FLAG 0x0B43 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 - -/* Display Lists */ -#define GL_COMPILE 0x1300 -#define GL_COMPILE_AND_EXECUTE 0x1301 -#define GL_LIST_BASE 0x0B32 -#define GL_LIST_INDEX 0x0B33 -#define GL_LIST_MODE 0x0B30 - -/* Depth buffer */ -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_BITS 0x0D56 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_COMPONENT 0x1902 - -/* Lighting */ -#define GL_LIGHTING 0x0B50 -#define GL_LIGHT0 0x4000 -#define GL_LIGHT1 0x4001 -#define GL_LIGHT2 0x4002 -#define GL_LIGHT3 0x4003 -#define GL_LIGHT4 0x4004 -#define GL_LIGHT5 0x4005 -#define GL_LIGHT6 0x4006 -#define GL_LIGHT7 0x4007 -#define GL_SPOT_EXPONENT 0x1205 -#define GL_SPOT_CUTOFF 0x1206 -#define GL_CONSTANT_ATTENUATION 0x1207 -#define GL_LINEAR_ATTENUATION 0x1208 -#define GL_QUADRATIC_ATTENUATION 0x1209 -#define GL_AMBIENT 0x1200 -#define GL_DIFFUSE 0x1201 -#define GL_SPECULAR 0x1202 -#define GL_SHININESS 0x1601 -#define GL_EMISSION 0x1600 -#define GL_POSITION 0x1203 -#define GL_SPOT_DIRECTION 0x1204 -#define GL_AMBIENT_AND_DIFFUSE 0x1602 -#define GL_COLOR_INDEXES 0x1603 -#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 -#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 -#define GL_LIGHT_MODEL_AMBIENT 0x0B53 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_SHADE_MODEL 0x0B54 -#define GL_FLAT 0x1D00 -#define GL_SMOOTH 0x1D01 -#define GL_COLOR_MATERIAL 0x0B57 -#define GL_COLOR_MATERIAL_FACE 0x0B55 -#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 -#define GL_NORMALIZE 0x0BA1 - -/* User clipping planes */ -#define GL_CLIP_PLANE0 0x3000 -#define GL_CLIP_PLANE1 0x3001 -#define GL_CLIP_PLANE2 0x3002 -#define GL_CLIP_PLANE3 0x3003 -#define GL_CLIP_PLANE4 0x3004 -#define GL_CLIP_PLANE5 0x3005 - -/* Accumulation buffer */ -#define GL_ACCUM_RED_BITS 0x0D58 -#define GL_ACCUM_GREEN_BITS 0x0D59 -#define GL_ACCUM_BLUE_BITS 0x0D5A -#define GL_ACCUM_ALPHA_BITS 0x0D5B -#define GL_ACCUM_CLEAR_VALUE 0x0B80 -#define GL_ACCUM 0x0100 -#define GL_ADD 0x0104 -#define GL_LOAD 0x0101 -#define GL_MULT 0x0103 -#define GL_RETURN 0x0102 - -/* Alpha testing */ -#define GL_ALPHA_TEST 0x0BC0 -#define GL_ALPHA_TEST_REF 0x0BC2 -#define GL_ALPHA_TEST_FUNC 0x0BC1 - -/* Blending */ -#define GL_BLEND 0x0BE2 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND_DST 0x0BE0 -#define GL_ZERO 0x0 -#define GL_ONE 0x1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 - -/* Render Mode */ -#define GL_FEEDBACK 0x1C01 -#define GL_RENDER 0x1C00 -#define GL_SELECT 0x1C02 - -/* Feedback */ -#define GL_2D 0x0600 -#define GL_3D 0x0601 -#define GL_3D_COLOR 0x0602 -#define GL_3D_COLOR_TEXTURE 0x0603 -#define GL_4D_COLOR_TEXTURE 0x0604 -#define GL_POINT_TOKEN 0x0701 -#define GL_LINE_TOKEN 0x0702 -#define GL_LINE_RESET_TOKEN 0x0707 -#define GL_POLYGON_TOKEN 0x0703 -#define GL_BITMAP_TOKEN 0x0704 -#define GL_DRAW_PIXEL_TOKEN 0x0705 -#define GL_COPY_PIXEL_TOKEN 0x0706 -#define GL_PASS_THROUGH_TOKEN 0x0700 -#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 -#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 -#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 - -/* Selection */ -#define GL_SELECTION_BUFFER_POINTER 0x0DF3 -#define GL_SELECTION_BUFFER_SIZE 0x0DF4 - -/* Fog */ -#define GL_FOG 0x0B60 -#define GL_FOG_MODE 0x0B65 -#define GL_FOG_DENSITY 0x0B62 -#define GL_FOG_COLOR 0x0B66 -#define GL_FOG_INDEX 0x0B61 -#define GL_FOG_START 0x0B63 -#define GL_FOG_END 0x0B64 -#define GL_LINEAR 0x2601 -#define GL_EXP 0x0800 -#define GL_EXP2 0x0801 - -/* Logic Ops */ -#define GL_LOGIC_OP 0x0BF1 -#define GL_INDEX_LOGIC_OP 0x0BF1 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_CLEAR 0x1500 -#define GL_SET 0x150F -#define GL_COPY 0x1503 -#define GL_COPY_INVERTED 0x150C -#define GL_NOOP 0x1505 -#define GL_INVERT 0x150A -#define GL_AND 0x1501 -#define GL_NAND 0x150E -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_XOR 0x1506 -#define GL_EQUIV 0x1509 -#define GL_AND_REVERSE 0x1502 -#define GL_AND_INVERTED 0x1504 -#define GL_OR_REVERSE 0x150B -#define GL_OR_INVERTED 0x150D - -/* Stencil */ -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STENCIL_BITS 0x0D57 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_INDEX 0x1901 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 - -/* Buffers, Pixel Drawing/Reading */ -#define GL_NONE 0x0 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -/*GL_FRONT 0x0404 */ -/*GL_BACK 0x0405 */ -/*GL_FRONT_AND_BACK 0x0408 */ -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_AUX0 0x0409 -#define GL_AUX1 0x040A -#define GL_AUX2 0x040B -#define GL_AUX3 0x040C -#define GL_COLOR_INDEX 0x1900 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_ALPHA_BITS 0x0D55 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_INDEX_BITS 0x0D51 -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_AUX_BUFFERS 0x0C00 -#define GL_READ_BUFFER 0x0C02 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_BITMAP 0x1A00 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_DITHER 0x0BD0 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 - -/* Implementation limits */ -#define GL_MAX_LIST_NESTING 0x0B31 -#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_NAME_STACK_DEPTH 0x0D37 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_EVAL_ORDER 0x0D30 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B - -/* Gets */ -#define GL_ATTRIB_STACK_DEPTH 0x0BB0 -#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_CURRENT_INDEX 0x0B01 -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_RASTER_COLOR 0x0B04 -#define GL_CURRENT_RASTER_DISTANCE 0x0B09 -#define GL_CURRENT_RASTER_INDEX 0x0B05 -#define GL_CURRENT_RASTER_POSITION 0x0B07 -#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 -#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_INDEX_CLEAR_VALUE 0x0C20 -#define GL_INDEX_MODE 0x0C30 -#define GL_INDEX_WRITEMASK 0x0C21 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_NAME_STACK_DEPTH 0x0D70 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_RENDER_MODE 0x0C40 -#define GL_RGBA_MODE 0x0C31 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_VIEWPORT 0x0BA2 - -/* Evaluators */ -#define GL_AUTO_NORMAL 0x0D80 -#define GL_MAP1_COLOR_4 0x0D90 -#define GL_MAP1_GRID_DOMAIN 0x0DD0 -#define GL_MAP1_GRID_SEGMENTS 0x0DD1 -#define GL_MAP1_INDEX 0x0D91 -#define GL_MAP1_NORMAL 0x0D92 -#define GL_MAP1_TEXTURE_COORD_1 0x0D93 -#define GL_MAP1_TEXTURE_COORD_2 0x0D94 -#define GL_MAP1_TEXTURE_COORD_3 0x0D95 -#define GL_MAP1_TEXTURE_COORD_4 0x0D96 -#define GL_MAP1_VERTEX_3 0x0D97 -#define GL_MAP1_VERTEX_4 0x0D98 -#define GL_MAP2_COLOR_4 0x0DB0 -#define GL_MAP2_GRID_DOMAIN 0x0DD2 -#define GL_MAP2_GRID_SEGMENTS 0x0DD3 -#define GL_MAP2_INDEX 0x0DB1 -#define GL_MAP2_NORMAL 0x0DB2 -#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 -#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 -#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 -#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 -#define GL_MAP2_VERTEX_3 0x0DB7 -#define GL_MAP2_VERTEX_4 0x0DB8 -#define GL_COEFF 0x0A00 -#define GL_DOMAIN 0x0A02 -#define GL_ORDER 0x0A01 - -/* Hints */ -#define GL_FOG_HINT 0x0C54 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 -#define GL_POINT_SMOOTH_HINT 0x0C51 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 - -/* Scissor box */ -#define GL_SCISSOR_TEST 0x0C11 -#define GL_SCISSOR_BOX 0x0C10 - -/* Pixel Mode / Transfer */ -#define GL_MAP_COLOR 0x0D10 -#define GL_MAP_STENCIL 0x0D11 -#define GL_INDEX_SHIFT 0x0D12 -#define GL_INDEX_OFFSET 0x0D13 -#define GL_RED_SCALE 0x0D14 -#define GL_RED_BIAS 0x0D15 -#define GL_GREEN_SCALE 0x0D18 -#define GL_GREEN_BIAS 0x0D19 -#define GL_BLUE_SCALE 0x0D1A -#define GL_BLUE_BIAS 0x0D1B -#define GL_ALPHA_SCALE 0x0D1C -#define GL_ALPHA_BIAS 0x0D1D -#define GL_DEPTH_SCALE 0x0D1E -#define GL_DEPTH_BIAS 0x0D1F -#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 -#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 -#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 -#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 -#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 -#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 -#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 -#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 -#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 -#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 -#define GL_PIXEL_MAP_S_TO_S 0x0C71 -#define GL_PIXEL_MAP_I_TO_I 0x0C70 -#define GL_PIXEL_MAP_I_TO_R 0x0C72 -#define GL_PIXEL_MAP_I_TO_G 0x0C73 -#define GL_PIXEL_MAP_I_TO_B 0x0C74 -#define GL_PIXEL_MAP_I_TO_A 0x0C75 -#define GL_PIXEL_MAP_R_TO_R 0x0C76 -#define GL_PIXEL_MAP_G_TO_G 0x0C77 -#define GL_PIXEL_MAP_B_TO_B 0x0C78 -#define GL_PIXEL_MAP_A_TO_A 0x0C79 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_ZOOM_X 0x0D16 -#define GL_ZOOM_Y 0x0D17 - -/* Texture mapping */ -#define GL_TEXTURE_ENV 0x2300 -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_ENV_COLOR 0x2201 -#define GL_TEXTURE_GEN_S 0x0C60 -#define GL_TEXTURE_GEN_T 0x0C61 -#define GL_TEXTURE_GEN_MODE 0x2500 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_BORDER 0x1005 -#define GL_TEXTURE_COMPONENTS 0x1003 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE 0x8061 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_OBJECT_LINEAR 0x2401 -#define GL_OBJECT_PLANE 0x2501 -#define GL_EYE_LINEAR 0x2400 -#define GL_EYE_PLANE 0x2502 -#define GL_SPHERE_MAP 0x2402 -#define GL_DECAL 0x2101 -#define GL_MODULATE 0x2100 -#define GL_NEAREST 0x2600 -#define GL_REPEAT 0x2901 -#define GL_CLAMP 0x2900 -#define GL_S 0x2000 -#define GL_T 0x2001 -#define GL_R 0x2002 -#define GL_Q 0x2003 -#define GL_TEXTURE_GEN_R 0x0C62 -#define GL_TEXTURE_GEN_Q 0x0C63 - -/* GL 1.1 texturing */ -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_TEXTURE_PRIORITY 0x8066 -#define GL_TEXTURE_RESIDENT 0x8067 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 - -/* GL 1.2 texturing */ -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_TEXTURE_BINDING_3D 0x806A - -/* Internal texture formats (GL 1.1) */ -#define GL_ALPHA4 0x803B -#define GL_ALPHA8 0x803C -#define GL_ALPHA12 0x803D -#define GL_ALPHA16 0x803E -#define GL_LUMINANCE4 0x803F -#define GL_LUMINANCE8 0x8040 -#define GL_LUMINANCE12 0x8041 -#define GL_LUMINANCE16 0x8042 -#define GL_LUMINANCE4_ALPHA4 0x8043 -#define GL_LUMINANCE6_ALPHA2 0x8044 -#define GL_LUMINANCE8_ALPHA8 0x8045 -#define GL_LUMINANCE12_ALPHA4 0x8046 -#define GL_LUMINANCE12_ALPHA12 0x8047 -#define GL_LUMINANCE16_ALPHA16 0x8048 -#define GL_INTENSITY 0x8049 -#define GL_INTENSITY4 0x804A -#define GL_INTENSITY8 0x804B -#define GL_INTENSITY12 0x804C -#define GL_INTENSITY16 0x804D -#define GL_R3_G3_B2 0x2A10 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B - -/* Utility */ -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 - -/* Errors */ -#define GL_NO_ERROR 0x0 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 - - -/* OpenGL 1.2 */ -#define GL_RESCALE_NORMAL 0x803A -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E - - - -/* - * OpenGL 1.2 imaging subset (NOT IMPLEMENTED BY MESA) - */ -/* GL_EXT_color_table */ -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -/* GL_EXT_convolution and GL_HP_convolution_border_modes */ -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -/* GL_SGI_color_matrix */ -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -/* GL_EXT_histogram */ -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -/* GL_EXT_blend_color, GL_EXT_blend_minmax */ -#define GL_BLEND_EQUATION 0x8009 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_BLEND_COLOR 0x8005 - - -/* glPush/PopAttrib bits */ -#define GL_CURRENT_BIT 0x00000001 -#define GL_POINT_BIT 0x00000002 -#define GL_LINE_BIT 0x00000004 -#define GL_POLYGON_BIT 0x00000008 -#define GL_POLYGON_STIPPLE_BIT 0x00000010 -#define GL_PIXEL_MODE_BIT 0x00000020 -#define GL_LIGHTING_BIT 0x00000040 -#define GL_FOG_BIT 0x00000080 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_ACCUM_BUFFER_BIT 0x00000200 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_VIEWPORT_BIT 0x00000800 -#define GL_TRANSFORM_BIT 0x00001000 -#define GL_ENABLE_BIT 0x00002000 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_HINT_BIT 0x00008000 -#define GL_EVAL_BIT 0x00010000 -#define GL_LIST_BIT 0x00020000 -#define GL_TEXTURE_BIT 0x00040000 -#define GL_SCISSOR_BIT 0x00080000 -#define GL_ALL_ATTRIB_BITS 0x000FFFFF - - -#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 -#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 -#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF - -/* - * GL_ARB_multitexture (ARB extension 1 and OpenGL 1.2.1) - */ -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 - -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_SUBTRACT 0x84E7 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF - - - - - -#endif // #ifndef _X86UNIX_GL_TYPES_H_ diff --git a/Engine/source/platformX86UNIX/platformAL.h b/Engine/source/platformX86UNIX/platformAL.h deleted file mode 100644 index 8bb7bed85..000000000 --- a/Engine/source/platformX86UNIX/platformAL.h +++ /dev/null @@ -1,162 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#ifndef _PLATFORMAL_H_ -#define _PLATFORMAL_H_ - -#ifndef _PLATFORM_H_ -#include "platform/platform.h" -#endif -#define AL_NO_PROTOTYPES -#include -#include -#include - -// extra enums for win32/miles implementation -enum { - // error values - AL_CONTEXT_ALREADY_INSTANTIATED = 0xbaadf00d, - AL_ENVIRONMENT_ALREADY_INSTANTIATED, - AL_UNSUPPORTED, - AL_INVALID_BUFFER, - AL_ERROR, - - // context extention - ALC_PROVIDER, - ALC_PROVIDER_COUNT, - ALC_PROVIDER_NAME, - ALC_SPEAKER, - ALC_SPEAKER_COUNT, - ALC_SPEAKER_NAME, - ALC_BUFFER_DYNAMIC_MEMORY_SIZE, - ALC_BUFFER_DYNAMIC_MEMORY_USAGE, - ALC_BUFFER_DYNAMIC_COUNT, - ALC_BUFFER_MEMORY_USAGE, - ALC_BUFFER_COUNT, - ALC_BUFFER_LATENCY, - - // misc 3d params - AL_MIN_DISTANCE, - AL_MAX_DISTANCE, - AL_CONE_OUTER_GAIN, - - // relative with pos(0,0,0) won't work for ambient sounds with miles - AL_SOURCE_AMBIENT, - AL_PAN, - - // other extensions - AL_BUFFER_KEEP_RESIDENT, - AL_FORMAT_WAVE_EXT, - - // Environment extensions: - AL_ENV_EFFECT_VOLUME_EXT, - AL_ENV_FLAGS_EXT, - AL_ENV_DAMPING_EXT, - AL_ENV_ENVIRONMENT_SIZE_EXT, - AL_ENV_ROOM_VOLUME_EXT, -}; - -enum { - // sample level environment: - AL_ENV_SAMPLE_REVERB_MIX_EXT = 0, - AL_ENV_SAMPLE_DIRECT_EXT, - AL_ENV_SAMPLE_DIRECT_HF_EXT, - AL_ENV_SAMPLE_ROOM_EXT, - AL_ENV_SAMPLE_ROOM_HF_EXT, - AL_ENV_SAMPLE_OBSTRUCTION_EXT, - AL_ENV_SAMPLE_OBSTRUCTION_LF_RATIO_EXT, - AL_ENV_SAMPLE_OCCLUSION_EXT, - AL_ENV_SAMPLE_OCCLUSION_LF_RATIO_EXT, - AL_ENV_SAMPLE_OCCLUSION_ROOM_RATIO_EXT, - AL_ENV_SAMPLE_ROOM_ROLLOFF_EXT, - AL_ENV_SAMPLE_AIR_ABSORPTION_EXT, - AL_ENV_SAMPLE_OUTSIDE_VOLUME_HF_EXT, - AL_ENV_SAMPLE_FLAGS_EXT, - - AL_ENV_SAMPLE_COUNT, -}; - -// room types: same as miles/eax -enum { - AL_ENVIRONMENT_GENERIC = 0, - AL_ENVIRONMENT_PADDEDCELL, - AL_ENVIRONMENT_ROOM, - AL_ENVIRONMENT_BATHROOM, - AL_ENVIRONMENT_LIVINGROOM, - AL_ENVIRONMENT_STONEROOM, - AL_ENVIRONMENT_AUDITORIUM, - AL_ENVIRONMENT_CONCERTHALL, - AL_ENVIRONMENT_CAVE, - AL_ENVIRONMENT_ARENA, - AL_ENVIRONMENT_HANGAR, - AL_ENVIRONMENT_CARPETEDHALLWAY, - AL_ENVIRONMENT_HALLWAY, - AL_ENVIRONMENT_STONECORRIDOR, - AL_ENVIRONMENT_ALLEY, - AL_ENVIRONMENT_FOREST, - AL_ENVIRONMENT_CITY, - AL_ENVIRONMENT_MOUNTAINS, - AL_ENVIRONMENT_QUARRY, - AL_ENVIRONMENT_PLAIN, - AL_ENVIRONMENT_PARKINGLOT, - AL_ENVIRONMENT_SEWERPIPE, - AL_ENVIRONMENT_UNDERWATER, - AL_ENVIRONMENT_DRUGGED, - AL_ENVIRONMENT_DIZZY, - AL_ENVIRONMENT_PSYCHOTIC, - - AL_ENVIRONMENT_COUNT -}; - -// declare OpenAL functions -#define AL_EXTENSION(ext_name) extern bool gDoesSupport_##ext_name; -#define AL_FUNCTION(fn_return,fn_name,fn_args) extern fn_return (FN_CDECL *fn_name)fn_args; -#define AL_EXT_FUNCTION(ext_name,fn_return,fn_name,fn_args) extern fn_return (FN_CDECL *fn_name)fn_args; -#ifndef _OPENALFN_H_ -#include -#endif - -namespace Audio -{ - -bool libraryInit(const char *library); -void libraryInitExtensions(); -void libraryShutdown(); - -inline bool doesSupportIASIG() -{ - return gDoesSupport_AL_EXT_IASIG; -} - -inline bool doesSupportDynamix() -{ - return gDoesSupport_AL_EXT_DYNAMIX; -} - -// helpers -F32 DBToLinear(F32 value); -F32 linearToDB(F32 value); - -} // end namespace Audio - - -#endif // _H_PLATFORMAL_ diff --git a/Engine/source/platformX86UNIX/threads/mutex.cpp b/Engine/source/platformX86UNIX/threads/mutex.cpp deleted file mode 100644 index c3d5acfe9..000000000 --- a/Engine/source/platformX86UNIX/threads/mutex.cpp +++ /dev/null @@ -1,76 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include "console/console.h" -#include "platformX86UNIX/platformX86UNIX.h" -#include "platform/threads/mutex.h" -#include "core/util/safeDelete.h" - -#include -#include -#include -#include -#include - -struct PlatformMutexData -{ - pthread_mutex_t mutex; -}; - -Mutex::Mutex() -{ - mData = new PlatformMutexData; - pthread_mutexattr_t attr; - - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE); - - pthread_mutex_init(&mData->mutex, &attr); -} - -Mutex::~Mutex() -{ - AssertFatal(mData, "Mutex::destroyMutex: invalid mutex"); - pthread_mutex_destroy(&mData->mutex); - SAFE_DELETE(mData); -} - -bool Mutex::lock(bool block) -{ - if(mData == NULL) - return false; - if(block) - { - return pthread_mutex_lock(&mData->mutex) == 0; - } - else - { - return pthread_mutex_trylock(&mData->mutex) == 0; - } -} - -void Mutex::unlock() -{ - if(mData == NULL) - return; - pthread_mutex_unlock(&mData->mutex); -} diff --git a/Engine/source/platformX86UNIX/threads/semaphore.cpp b/Engine/source/platformX86UNIX/threads/semaphore.cpp deleted file mode 100644 index 6c994af4d..000000000 --- a/Engine/source/platformX86UNIX/threads/semaphore.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include "platformX86UNIX/platformX86UNIX.h" -#include "platform/threads/semaphore.h" -// Instead of that mess that was here before, lets use the SDL lib to deal -// with the semaphores. - -#include -#include - -struct PlatformSemaphore -{ - SDL_sem *semaphore; - - PlatformSemaphore(S32 initialCount) - { - semaphore = SDL_CreateSemaphore(initialCount); - AssertFatal(semaphore, "PlatformSemaphore constructor - Failed to create SDL Semaphore."); - } - - ~PlatformSemaphore() - { - SDL_DestroySemaphore(semaphore); - } -}; - -Semaphore::Semaphore(S32 initialCount) -{ - mData = new PlatformSemaphore(initialCount); -} - -Semaphore::~Semaphore() -{ - AssertFatal(mData, "Semaphore destructor - Invalid semaphore."); - delete mData; -} - -bool Semaphore::acquire(bool block, S32 timeoutMS) -{ - AssertFatal(mData && mData->semaphore, "Semaphore::acquire - Invalid semaphore."); - if (block) - { - // Semaphore acquiring is different from the MacOS/Win realization because SDL_SemWaitTimeout() with "infinite" timeout can be too heavy on some platforms. - // (see "man SDL_SemWaitTimeout(3)" for more info) - // "man" states to avoid the use of SDL_SemWaitTimeout at all, but at current stage this looks like a valid and working solution, so keeping it this way. - // [bank / Feb-2010] - if (timeoutMS == -1) - { - if (SDL_SemWait(mData->semaphore) < 0) - AssertFatal(false, "Semaphore::acquie - Wait failed."); - } - else - { - if (SDL_SemWaitTimeout(mData->semaphore, timeoutMS) < 0) - AssertFatal(false, "Semaphore::acquie - Wait with timeout failed."); - } - return (true); - } - else - { - int res = SDL_SemTryWait(mData->semaphore); - return (res == 0); - } -} - -void Semaphore::release() -{ - AssertFatal(mData, "Semaphore::releaseSemaphore - Invalid semaphore."); - SDL_SemPost(mData->semaphore); -} diff --git a/Engine/source/platformX86UNIX/threads/thread.cpp b/Engine/source/platformX86UNIX/threads/thread.cpp deleted file mode 100644 index 74e184c91..000000000 --- a/Engine/source/platformX86UNIX/threads/thread.cpp +++ /dev/null @@ -1,159 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include -#include "platform/threads/thread.h" -#include "platform/threads/semaphore.h" -#include "platform/threads/mutex.h" -#include - -class PlatformThreadData -{ -public: - ThreadRunFunction mRunFunc; - void* mRunArg; - Thread* mThread; - Semaphore mGateway; // default count is 1 - pthread_t mThreadID; - bool mDead; -}; - -ThreadManager::MainThreadId ThreadManager::smMainThreadId; - -//----------------------------------------------------------------------------- -// Function: ThreadRunHandler -// Summary: Calls Thread::run() with the thread's specified run argument. -// Neccesary because Thread::run() is provided as a non-threaded -// way to execute the thread's run function. So we have to keep -// track of the thread's lock here. -static void *ThreadRunHandler(void * arg) -{ - PlatformThreadData *mData = reinterpret_cast(arg); - Thread *thread = mData->mThread; - - // mThreadID is filled in twice, once here and once in pthread_create(). - // We fill in mThreadID here as well as in pthread_create() because addThread() - // can execute before pthread_create() returns and sets mThreadID. - // The value from pthread_create() and pthread_self() are guaranteed to be equivalent (but not identical) - mData->mThreadID = pthread_self(); - - ThreadManager::addThread(thread); - thread->run(mData->mRunArg); - ThreadManager::removeThread(thread); - - bool autoDelete = thread->autoDelete; - - mData->mThreadID = 0; - mData->mDead = true; - mData->mGateway.release(); - - if( autoDelete ) - delete thread; - - // return value for pthread lib's benefit - return NULL; - // the end of this function is where the created pthread will die. -} - -//----------------------------------------------------------------------------- -Thread::Thread(ThreadRunFunction func, void* arg, bool start_thread, bool autodelete) -{ - AssertFatal( !start_thread, "Thread::Thread() - auto-starting threads from ctor has been disallowed since the run() method is virtual" ); - - mData = new PlatformThreadData; - mData->mRunFunc = func; - mData->mRunArg = arg; - mData->mThread = this; - mData->mThreadID = 0; - mData->mDead = false; - autoDelete = autodelete; -} - -Thread::~Thread() -{ - stop(); - if( isAlive() ) - join(); - - delete mData; -} - -void Thread::start( void* arg ) -{ - // cause start to block out other pthreads from using this Thread, - // at least until ThreadRunHandler exits. - mData->mGateway.acquire(); - - // reset the shouldStop flag, so we'll know when someone asks us to stop. - shouldStop = false; - - mData->mDead = false; - - if( !mData->mRunArg ) - mData->mRunArg = arg; - - pthread_create(&mData->mThreadID, NULL, ThreadRunHandler, mData); -} - -bool Thread::join() -{ - // not using pthread_join here because pthread_join cannot deal - // with multiple simultaneous calls. - - mData->mGateway.acquire(); - AssertFatal( !isAlive(), "Thread::join() - thread not dead after join()" ); - mData->mGateway.release(); - - return true; -} - -void Thread::run(void* arg) -{ - if(mData->mRunFunc) - mData->mRunFunc(arg); -} - -bool Thread::isAlive() -{ - return ( !mData->mDead ); -} - -dsize_t Thread::getId() -{ - return (dsize_t)mData->mThreadID; -} - -void Thread::_setName( const char* ) -{ - // Not supported. Wading through endless lists of Thread-1, Thread-2, Thread-3, ... trying to find - // that one thread you are looking for is just so much fun. -} - -dsize_t ThreadManager::getCurrentThreadId() -{ - return (dsize_t)pthread_self(); -} - -bool ThreadManager::compare(dsize_t threadId_1, dsize_t threadId_2) -{ - return pthread_equal((pthread_t)threadId_1, (pthread_t)threadId_2); -} diff --git a/Engine/source/platformX86UNIX/x86UNIXAsmBlit.cpp b/Engine/source/platformX86UNIX/x86UNIXAsmBlit.cpp deleted file mode 100644 index be3dad3b6..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXAsmBlit.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include "math/mMath.h" -#include "gfx/bitmap/bitmapUtils.h" - -//-------------------------------------------------------------------------- -void bitmapExtrude5551_asm(const void *srcMip, void *mip, U32 height, U32 width) -{ - const U16 *src = (const U16 *) srcMip; - U16 *dst = (U16 *) mip; - U32 stride = width << 1; - - for(U32 y = 0; y < height; y++) - { - for(U32 x = 0; x < width; x++) - { - U32 a = src[0]; - U32 b = src[1]; - U32 c = src[stride]; - U32 d = src[stride+1]; - dst[x] = ((((a >> 11) + (b >> 11) + (c >> 11) + (d >> 11)) >> 2) << 11) | - ((( ((a >> 6) & 0x1f) + ((b >> 6) & 0x1f) + ((c >> 6) & 0x1f) + ((d >> 6) & 0x1F) ) >> 2) << 6) | - ((( ((a >> 1) & 0x1F) + ((b >> 1) & 0x1F) + ((c >> 1) & 0x1f) + ((d >> 1) & 0x1f)) >> 2) << 1); - src += 2; - } - src += stride; - dst += width; - } -} - -//-------------------------------------------------------------------------- -void PlatformBlitInit() -{ - bitmapExtrude5551 = bitmapExtrude5551_asm; - bitmapExtrudeRGB = bitmapExtrudeRGB_c; - - if (Platform::SystemInfo.processor.properties & CPU_PROP_MMX) - { - // JMQ: haven't bothered porting mmx bitmap funcs because they don't - // seem to offer a big performance boost right now. - } -} - diff --git a/Engine/source/platformX86UNIX/x86UNIXDlibrary.cpp b/Engine/source/platformX86UNIX/x86UNIXDlibrary.cpp deleted file mode 100644 index fae1564a2..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXDlibrary.cpp +++ /dev/null @@ -1,83 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include "platform/types.h" -#include "platform/platformDlibrary.h" - -#include - -class x86UNIXDLibrary: public DLibrary -{ - void* mLibHandle; -public: - x86UNIXDLibrary(); - virtual ~x86UNIXDLibrary(); - - bool open(const char* file); - void close(); - virtual void *bind(const char *name); -}; - -x86UNIXDLibrary::x86UNIXDLibrary() -{ - mLibHandle = 0; -} - -x86UNIXDLibrary::~x86UNIXDLibrary() -{ - close(); -} - -bool x86UNIXDLibrary::open(const char* file) -{ - mLibHandle = dlopen(file, RTLD_LAZY); - if( !mLibHandle ) - return false; - - return true; -} - -void x86UNIXDLibrary::close() -{ - if( mLibHandle ) - { - dlclose(mLibHandle); - mLibHandle = 0; - } -} - -void* x86UNIXDLibrary::bind(const char *name) -{ - return mLibHandle ? dlsym(mLibHandle, name) : 0; -} - -DLibraryRef OsLoadLibrary(const char* file) -{ - x86UNIXDLibrary* library = new x86UNIXDLibrary(); - if (!library->open(file)) - { - delete library; - library = 0; - } - return library; -} - diff --git a/Engine/source/platformX86UNIX/x86UNIXInput.client.cpp b/Engine/source/platformX86UNIX/x86UNIXInput.client.cpp deleted file mode 100644 index 2776601a7..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXInput.client.cpp +++ /dev/null @@ -1,608 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- -#ifndef TORQUE_SDL -#include "platformX86UNIX/platformX86UNIX.h" -#include "platform/platformInput.h" -#include "platform/platformVideo.h" -#include "platform/event.h" -#include "platform/gameInterface.h" -#include "console/console.h" -#include "platformX86UNIX/x86UNIXState.h" -#include "platformX86UNIX/x86UNIXInputManager.h" - -#include -#include -#include - -#include - -#ifdef LOG_INPUT -#include -#include -#include -#include - -extern int x86UNIXOpen(const char *path, int oflag); -extern int x86UNIXClose(int fd); -extern ssize_t x86UNIXWrite(int fd, const void *buf, size_t nbytes); -#endif - -class XClipboard -{ - private: - Atom mClipboardProperty; - Atom mClipboard; - Atom mPrimary; - bool mInitialized; - U8 *mXData; - char *mTData; - S32 mTDataSize; - - void init(); - void freeXData(); - void freeTData(); - void checkTDataSize(S32 requestedSize); - public: - XClipboard(); - ~XClipboard(); - - bool setClipboard(const char *text); - const char* getClipboard(); - void handleSelectionRequest(XSelectionRequestEvent& request); -}; - -// Static class variables: -InputManager* Input::smManager; - -// smActive is not maintained under unix. Use Input::isActive() -// instead -bool Input::smActive = false; - -// unix platform state -extern x86UNIXPlatformState * x86UNIXState; - -extern AsciiData AsciiTable[NUM_KEYS]; - -static XClipboard xclipboard; - -#ifdef LOG_INPUT -S32 gInputLog = -1; -#endif - -//------------------------------------------------------------------------------ -void Input::init() -{ - Con::printf( "Input Init:" ); - - destroy(); - -#ifdef LOG_INPUT - struct tm* newTime; - time_t aclock; - time( &aclock ); - newTime = localtime( &aclock ); - asctime( newTime ); - - gInputLog = x86UNIXOpen("input.log", O_WRONLY | O_CREAT); - log("Input log opened at %s\n", asctime( newTime ) ); - log("Operating System:\n" ); - log(" %s", UUtils->getOSName()); - log("\n"); -#endif - - smActive = false; - smManager = NULL; - - UInputManager *uInputManager = new UInputManager; - if ( !uInputManager->enable() ) - { - Con::errorf( " Failed to enable Input Manager." ); - delete uInputManager; - return; - } - - uInputManager->init(); - - smManager = uInputManager; - - Con::printf(" Input initialized"); - Con::printf(" "); -} - -//------------------------------------------------------------------------------ -ConsoleFunction( isJoystickDetected, bool, 1, 1, "isJoystickDetected()" ) -{ - argc; argv; - UInputManager* manager = dynamic_cast(Input::getManager()); - if (manager) - return manager->joystickDetected(); - else - return false; -} - -//------------------------------------------------------------------------------ -ConsoleFunction( getJoystickAxes, const char*, 2, 2, "getJoystickAxes( instance )" ) -{ - argc; argv; - UInputManager* manager = dynamic_cast(Input::getManager()); - if (manager) - return manager->getJoystickAxesString(dAtoi(argv[1])); - else - return ""; -} - -//------------------------------------------------------------------------------ -U16 Input::getKeyCode( U16 asciiCode ) -{ - U16 keyCode = 0; - U16 i; - - // This is done three times so the lowerkey will always - // be found first. Some foreign keyboards have duplicate - // chars on some keys. - for ( i = KEY_FIRST; i < NUM_KEYS && !keyCode; i++ ) - { - if ( AsciiTable[i].lower.ascii == asciiCode ) - { - keyCode = i; - break; - }; - } - - for ( i = KEY_FIRST; i < NUM_KEYS && !keyCode; i++ ) - { - if ( AsciiTable[i].upper.ascii == asciiCode ) - { - keyCode = i; - break; - }; - } - - for ( i = KEY_FIRST; i < NUM_KEYS && !keyCode; i++ ) - { - if ( AsciiTable[i].goofy.ascii == asciiCode ) - { - keyCode = i; - break; - }; - } - - return( keyCode ); -} - -//----------------------------------------------------------------------------- -// -// This function gets the standard ASCII code corresponding to our key code -// and the existing modifier key state. -// -//----------------------------------------------------------------------------- -U16 Input::getAscii( U16 keyCode, KEY_STATE keyState ) -{ - if ( keyCode >= NUM_KEYS ) - return 0; - - switch ( keyState ) - { - case STATE_LOWER: - return AsciiTable[keyCode].lower.ascii; - case STATE_UPPER: - return AsciiTable[keyCode].upper.ascii; - case STATE_GOOFY: - return AsciiTable[keyCode].goofy.ascii; - default: - return(0); - - } -} - -//------------------------------------------------------------------------------ -void Input::destroy() -{ -#ifdef LOG_INPUT - if ( gInputLog != -1 ) - { - log( "*** CLOSING LOG ***\n" ); - x86UNIXClose(gInputLog); - gInputLog = -1; - } -#endif - - if ( smManager && smManager->isEnabled() ) - { - smManager->disable(); - delete smManager; - smManager = NULL; - } -} - -//------------------------------------------------------------------------------ -bool Input::enable() -{ - if ( smManager && !smManager->isEnabled() ) - return( smManager->enable() ); - - return( false ); -} - -//------------------------------------------------------------------------------ -void Input::disable() -{ - if ( smManager && smManager->isEnabled() ) - smManager->disable(); -} - -//------------------------------------------------------------------------------ -void Input::activate() -{ - if ( smManager && smManager->isEnabled() && !isActive()) - { -#ifdef LOG_INPUT - Input::log( "Activating Input...\n" ); -#endif - UInputManager* uInputManager = dynamic_cast( smManager ); - if ( uInputManager ) - uInputManager->activate(); - } -} - -//------------------------------------------------------------------------------ -void Input::deactivate() -{ - if ( smManager && smManager->isEnabled() && isActive() ) - { -#ifdef LOG_INPUT - Input::log( "Deactivating Input...\n" ); -#endif - UInputManager* uInputManager = dynamic_cast( smManager ); - if ( uInputManager ) - uInputManager->deactivate(); - } -} - -//------------------------------------------------------------------------------ -void Input::reactivate() -{ - Input::deactivate(); - Input::activate(); -} - -//------------------------------------------------------------------------------ -bool Input::isEnabled() -{ - if ( smManager ) - return smManager->isEnabled(); - return false; -} - -//------------------------------------------------------------------------------ -bool Input::isActive() -{ - UInputManager* uInputManager = dynamic_cast( smManager ); - if ( uInputManager ) - return uInputManager->isActive(); - return false; -} - -//------------------------------------------------------------------------------ -void Input::process() -{ - if ( smManager ) - smManager->process(); -} - -//------------------------------------------------------------------------------ -InputManager* Input::getManager() -{ - return smManager; -} - -#ifdef LOG_INPUT -//------------------------------------------------------------------------------ -void Input::log( const char* format, ... ) -{ - if ( gInputLog == -1) - return; - - va_list argptr; - va_start( argptr, format ); - - const int BufSize = 4096; - char buffer[BufSize]; - dVsprintf( buffer, BufSize, format, argptr ); - x86UNIXWrite(gInputLog, buffer, dStrlen( buffer )); - va_end( argptr ); -} - -ConsoleFunction( inputLog, void, 2, 2, "inputLog( string )" ) -{ - argc; - Input::log( "%s\n", (const char*)argv[1] ); -} -#endif // LOG_INPUT - -//------------------------------------------------------------------------------ -void NotifySelectionEvent(XEvent& event) -{ - // somebody sent us a select event - if (event.type == SelectionRequest) - xclipboard.handleSelectionRequest(event.xselectionrequest); -} - -//------------------------------------------------------------------------------ -const char* Platform::getClipboard() -{ - return xclipboard.getClipboard(); -} - -//------------------------------------------------------------------------------ -bool Platform::setClipboard(const char *text) -{ - return xclipboard.setClipboard(text); -} - -//----------------------------------------------------------------------------- -// XClipboard members -XClipboard::XClipboard() -{ - mInitialized = false; - mXData = 0; - mTData = 0; - mTDataSize = 0; -} - -//------------------------------------------------------------------------------ -XClipboard::~XClipboard() -{ - freeXData(); - freeTData(); -} - -//------------------------------------------------------------------------------ -void XClipboard::init() -{ - DisplayPtrManager xdisplay; - Display* display = xdisplay.getDisplayPointer(); - - mClipboardProperty = XInternAtom(display, - "TORQUE_CLIPBOARD_ATOM", False); - mClipboard = XInternAtom(display, "CLIPBOARD", - False); - mPrimary = XA_PRIMARY; //XInternAtom(display, "PRIMARY", False); - mXData = NULL; - mTData = NULL; - mTDataSize = 0; - - mInitialized = true; -} - -//------------------------------------------------------------------------------ -inline void XClipboard::freeXData() -{ - if (mXData != NULL) - { - XFree(mXData); - mXData = NULL; - } -} - -//------------------------------------------------------------------------------ -inline void XClipboard::freeTData() -{ - if (mTData != NULL) - { - dRealFree(mTData); - mTData = NULL; - mTDataSize = 0; - } -} - -// -// JMQ: As you might expect, X clipboard usage is bizarre. I -// found this document to be useful. -// -// http://www.freedesktop.org/standards/clipboards.txt -// -// JMQ: later note: programming the X clipboard is not just -// bizarre, it SUCKS. No wonder so many apps have -// clipboard problems. -// -//------------------------------------------------------------------------------ -const char* XClipboard::getClipboard() -{ - DisplayPtrManager xdisplay; - Display* display = xdisplay.getDisplayPointer(); - - if (!mInitialized) - init(); - - // find the owner of the clipboard - Atom targetSelection = mClipboard; - Window clipOwner = XGetSelectionOwner(display, - targetSelection); - if (clipOwner == None) - { - // It seems like KDE/QT reads the clipboard but doesn't set it. - // This is a bug, that supposedly will be fixed in QT3. - // I tried working around this by using - // PRIMARY instead of CLIPBOARD, but this has some nonintuitive - // side effects. So, no pasting from KDE apps for now. - //targetSelection = mPrimary; - //clipOwner = XGetSelectionOwner(display, targetSelection); - } - - if (clipOwner == None) - // oh well - return ""; - - // request that the owner convert the selection to a string - XConvertSelection(display, targetSelection, - XA_STRING, mClipboardProperty, x86UNIXState->getWindow(), CurrentTime); - - // flush the output buffer to make sure the selection request event gets - // sent now - XFlush(display); - - XEvent xevent; - - // if our window is the current owner, (e.g. copy from one part of - // torque and paste to another), then we just sent an event to our - // window that won't get processed until we get back to the event - // loop in x86Unixwindow. So look for selection request events in - // the event queue immediately and handle them. - while (XCheckTypedWindowEvent(display, - x86UNIXState->getWindow(), SelectionRequest, &xevent)) - handleSelectionRequest(xevent.xselectionrequest); - - // poll for the SelectionNotify event for 5 seconds. in most cases - // we should get the event very quickly - U32 startTime = Platform::getRealMilliseconds(); - bool timeOut = false; - while (!XCheckTypedWindowEvent(display, - x86UNIXState->getWindow(), SelectionNotify, &xevent) && - !timeOut) - { - // we'll be spinning here, but who cares - if ((Platform::getRealMilliseconds() - startTime) > 5000) - timeOut = true; - } - - if (timeOut) - { - Con::warnf(ConsoleLogEntry::General, - "XClipboard: waited too long for owner to convert selection"); - return ""; - } - - if (xevent.xselection.property == None) - return ""; - - // free the X data from a previous get - freeXData(); - - // grab the string data from the property - Atom actual_type; - int actual_format; - unsigned long bytes_after; - unsigned long nitems; - // query the property length the 250000 is "the length in 32-bit - // multiples of the data to be retrieved". so we support up to a - // million bytes of returned data. - int numToRetrieve = 250000; - int status = XGetWindowProperty(display, - x86UNIXState->getWindow(), - mClipboardProperty, 0, numToRetrieve, True, XA_STRING, - &actual_type, &actual_format, &nitems, &bytes_after, &mXData); - - // we should have returned OK, with string type, 8bit data, - // and > 0 items. - if ((status != Success) || (actual_type != XA_STRING) || - (actual_format != 8) || (nitems == 0)) - return ""; - - // if there is data left in the clipboard, warn about it - if (bytes_after > 0) - Con::warnf(ConsoleLogEntry::General, - "XClipboard: some data was not retrieved"); - - return reinterpret_cast(mXData); -} - -//------------------------------------------------------------------------------ -void XClipboard::checkTDataSize(S32 requestedSize) -{ - if (mTDataSize < requestedSize) - { - freeTData(); - mTData = static_cast(dRealMalloc(sizeof(char) * requestedSize)); - AssertFatal(mTData, "unable to allocate clipboard buffer data!"); - mTDataSize = requestedSize; - } -} - -//------------------------------------------------------------------------------ -bool XClipboard::setClipboard(const char *text) -{ - DisplayPtrManager xdisplay; - Display* display = xdisplay.getDisplayPointer(); - - if (!mInitialized) - init(); - - // get the length of the text - S32 len = dStrlen(text) + 1; - - // reallocate the storage buffer if necessary - checkTDataSize(len); - - // copy the data into the storage buffer - dStrcpy(mTData, text, mTDataSize); - - // tell X that we own the clipboard. (we'll get events - // if an app tries to paste) - XSetSelectionOwner(display, mClipboard, - x86UNIXState->getWindow(), CurrentTime); - - return true; -} - -//------------------------------------------------------------------------------ -void XClipboard::handleSelectionRequest(XSelectionRequestEvent& request) -{ - DisplayPtrManager xdisplay; - Display* display = xdisplay.getDisplayPointer(); - - // init our response - XSelectionEvent notify; - - notify.type = SelectionNotify; - notify.display = display; - notify.requestor = request.requestor; - notify.selection = request.selection; - notify.target = XA_STRING; - notify.property = None; - notify.time = CurrentTime; - - // make sure the owner is our window, and that the - // requestor wants the clipboard - if (request.owner == x86UNIXState->getWindow() && - request.selection == mClipboard) - { - notify.property = request.property; - // check to see if they did not set the property - if (notify.property == None) - notify.property = mClipboardProperty; - - // get the length of the data in the clipboard - S32 length = dStrlen(mTData); - // set the property on the requestor window - XChangeProperty(display, request.requestor, - notify.property, XA_STRING, - 8, PropModeReplace, reinterpret_cast(mTData), - length); - } - XSendEvent(display, notify.requestor, False, 0, - reinterpret_cast(¬ify)); - - // flush the output buffer to send the event now - XFlush(display); -} -#endif diff --git a/Engine/source/platformX86UNIX/x86UNIXInputManager.h b/Engine/source/platformX86UNIX/x86UNIXInputManager.h deleted file mode 100644 index 1df78c9a5..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXInputManager.h +++ /dev/null @@ -1,190 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#ifndef _X86UNIXINPUTMANAGER_H_ -#define _X86UNIXINPUTMANAGER_H_ - -#include "core/util/tVector.h" -#include "platform/platformInput.h" -#include "platformX86UNIX/platformX86UNIX.h" - -#include - -#define NUM_KEYS ( KEY_OEM_102 + 1 ) -#define KEY_FIRST KEY_ESCAPE - -struct AsciiData -{ - struct KeyData - { - U16 ascii; - bool isDeadChar; - }; - - KeyData upper; - KeyData lower; - KeyData goofy; -}; - -struct _SDL_Joystick; - -struct JoystickAxisInfo -{ - S32 type; - S32 minValue; - S32 maxValue; -}; - -//------------------------------------------------------------------------------ -class JoystickInputDevice : public InputDevice -{ - public: - JoystickInputDevice(U8 deviceID); - ~JoystickInputDevice(); - - bool activate(); - bool deactivate(); - bool isActive() { return( mActive ); } - - U8 getDeviceType() { return( JoystickDeviceType ); } - U8 getDeviceID() { return( mDeviceID ); } - const char* getName(); - const char* getJoystickAxesString(); - - void loadJoystickInfo(); - void loadAxisInfo(); - JoystickAxisInfo& getAxisInfo(int axisNum) { return mAxisList[axisNum]; } - - bool process(); - void reset(); - - private: - bool mActive; - U8 mDeviceID; - SDL_Joystick* mStick; - Vector mAxisList; - Vector mButtonState; - Vector mHatState; - - S32 mNumAxes; - S32 mNumButtons; - S32 mNumHats; - S32 mNumBalls; -}; - -//------------------------------------------------------------------------------ -class UInputManager : public InputManager -{ - friend bool JoystickInputDevice::process(); // for joystick event funcs - friend void JoystickInputDevice::reset(); - - public: - UInputManager(); - - void init(); - bool enable(); - void disable(); - void activate(); - void deactivate(); - void setWindowLocked(bool locked); - bool isActive() { return( mActive ); } - - void onDeleteNotify( SimObject* object ); - bool onAdd(); - void onRemove(); - - void process(); - - bool enableKeyboard(); - void disableKeyboard(); - bool isKeyboardEnabled() { return( mKeyboardEnabled ); } - bool activateKeyboard(); - void deactivateKeyboard(); - bool isKeyboardActive() { return( mKeyboardActive ); } - - bool enableMouse(); - void disableMouse(); - bool isMouseEnabled() { return( mMouseEnabled ); } - bool activateMouse(); - void deactivateMouse(); - bool isMouseActive() { return( mMouseActive ); } - - bool enableJoystick(); - void disableJoystick(); - bool isJoystickEnabled() { return( mJoystickEnabled ); } - bool activateJoystick(); - void deactivateJoystick(); - bool isJoystickActive() { return( mJoystickActive ); } - - void setLocking(bool enabled); - bool getLocking() { return mLocking; } - - const char* getJoystickAxesString( U32 deviceID ); - bool joystickDetected() { return mJoystickList.size() > 0; } - private: - typedef SimGroup Parent; - // the following vector is just for quick access during event processing. - // it does not manage the cleanup of the JoystickInputDevice objects - Vector mJoystickList; - - bool mKeyboardEnabled; - bool mMouseEnabled; - bool mJoystickEnabled; - - bool mKeyboardActive; - bool mMouseActive; - bool mJoystickActive; - - bool mActive; - - // Device state variables - S32 mModifierKeys; - bool mKeyboardState[256]; - bool mMouseButtonState[3]; - - // last mousex and y are maintained when window is unlocked - S32 mLastMouseX; - S32 mLastMouseY; - - void initJoystick(); - - void resetKeyboardState(); - void resetMouseState(); - void resetInputState(); - - void lockInput(); - void unlockInput(); - bool mLocking; - - void joyHatEvent(U8 deviceID, U8 hatNum, - U8 prevHatState, U8 currHatState); - void joyButtonEvent(U8 deviceID, U8 buttonNum, bool pressed); - void joyButtonEvent(const SDL_Event& event); - void joyAxisEvent(const SDL_Event& event); - void joyAxisEvent(U8 deviceID, U8 axisNum, S16 axisValue); - void mouseButtonEvent(const SDL_Event& event); - void mouseMotionEvent(const SDL_Event& event); - void keyEvent(const SDL_Event& event); - bool processKeyEvent(InputEventInfo &event); -}; - -#endif // _H_X86UNIXINPUTMANAGER_ diff --git a/Engine/source/platformX86UNIX/x86UNIXMessageBox.client.cpp b/Engine/source/platformX86UNIX/x86UNIXMessageBox.client.cpp deleted file mode 100644 index 05d2b17ff..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXMessageBox.client.cpp +++ /dev/null @@ -1,507 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include -#include -#include - -#include -#include -#include - -#include "platformX86UNIX/x86UNIXMessageBox.h" - -#define MessageBox_MaxWinWidth 800 -#define MessageBox_MaxWinHeight 600 -#define MessageBox_MinWinWidth 450 - -#define MessageBox_ButtonBoxWidth 60 -#define MessageBox_ButtonBoxHeight 22 -#define MessageBox_ButtonSpacer 20 -#define MessageBox_ButtonVMargin 10 -#define MessageBox_ButtonHMargin 10 - -#define MessageBox_LineSpacer 2 -#define MessageBox_LineVMargin 10 -#define MessageBox_LineHMargin 10 - -XMessageBoxButton::XMessageBoxButton() -{ - strcpy(mLabel, ""); - mClickVal = -1; - mLabelWidth = mX = mY = mWidth = mHeight = mMouseX = mMouseX = -1; - mMouseDown = false; -} - -XMessageBoxButton::XMessageBoxButton(const char* label, int clickVal) -{ - strncpy(mLabel, label, LabelSize); - mClickVal = clickVal; - mLabelWidth = mX = mY = mWidth = mHeight = mMouseX = mMouseX = -1; - mMouseDown = false; -} - -XMessageBox::XMessageBox(Display* display) -{ - mMessage = ""; - mFS = NULL; - mDisplay = display; -} - -XMessageBox::~XMessageBox() -{ - clearMessageLines(); - if (mDisplay != NULL) - { - mDisplay = NULL; - } -} - -int XMessageBox::alertOK(const char *windowTitle, const char *message) -{ - mMessage = message; - mTitle = windowTitle; - mButtons.clear(); - mButtons.push_back(XMessageBoxButton("OK", OK)); - return show(); -} - -int XMessageBox::alertOKCancel(const char *windowTitle, const char *message) -{ - mMessage = message; - mTitle = windowTitle; - mButtons.clear(); - mButtons.push_back(XMessageBoxButton("OK", OK)); - mButtons.push_back(XMessageBoxButton("Cancel", Cancel)); - return show(); -} - -int XMessageBox::alertRetryCancel(const char *windowTitle, const char *message) -{ - mMessage = message; - mTitle = windowTitle; - mButtons.clear(); - mButtons.push_back(XMessageBoxButton("Retry", Retry)); - mButtons.push_back(XMessageBoxButton("Cancel", Cancel)); - return show(); -} - -int XMessageBox::alertAssert(const char *windowTitle, const char *message) -{ - mMessage = message; - mTitle = windowTitle; - mButtons.clear(); - mButtons.push_back(XMessageBoxButton("Exit", OK)); - mButtons.push_back(XMessageBoxButton("Ignore", Cancel)); - mButtons.push_back(XMessageBoxButton("Ignore All", IgnoreAll)); - mButtons.push_back(XMessageBoxButton("Debug", Retry)); - return show(); -} - -void XMessageBox::repaint() -{ - int white = WhitePixel(mDisplay, DefaultScreen(mDisplay)); - int black = BlackPixel(mDisplay, DefaultScreen(mDisplay)); - - int x = 0; - int y = 0; - - // line V margin - y = y + MessageBox_LineVMargin * 2; - - // line H margin - x = MessageBox_LineHMargin; - - XSetForeground(mDisplay, mGC, black); - for (unsigned int i = 0; i < mMessageLines.size(); ++i) - { - XDrawString(mDisplay, mWin, mGC, x, y, mMessageLines[i], - strlen(mMessageLines[i])); - if (i < (mMessageLines.size() - 1)) - y = y + MessageBox_LineSpacer + mFontHeight; - } - XFlush(mDisplay); - - // line V margin - y = y + MessageBox_LineVMargin; - - int maxButWidth = MessageBox_ButtonBoxWidth; - int maxButHeight = MessageBox_ButtonBoxHeight; - - // compute size of text labels on buttons - int fgColor, bgColor; - - int fontDirection, fontAscent, fontDescent; - Vector::iterator iter; - for (iter = mButtons.begin(); iter != mButtons.end(); ++iter) - { - XCharStruct strInfo; - XTextExtents(mFS, iter->getLabel(), strlen(iter->getLabel()), - &fontDirection, &fontAscent, &fontDescent, - &strInfo); -// if (maxButWidth < strInfo.width) -// maxButWidth = strInfo.width; -// if (maxButHeight < (strInfo.ascent + strInfo.descent)) -// maxButHeight = (strInfo.ascent + strInfo.descent); - iter->setLabelWidth(strInfo.width); - } - int buttonBoxWidth = maxButWidth; - int buttonBoxHeight = maxButHeight; - - // draw buttons - // button V margin - y = y + MessageBox_ButtonVMargin; - - // center the buttons - x = MessageBox_ButtonHMargin + (mMBWidth - getButtonLineWidth()) / 2; - - for (iter = mButtons.begin(); iter != mButtons.end(); ++iter) - { - if (iter->drawReverse()) - { - fgColor = white; - bgColor = black; - } - else - { - fgColor = black; - bgColor = white; - } - - XSetForeground(mDisplay, mGC, bgColor); - XFillRectangle(mDisplay, mWin, mGC, x, y, - buttonBoxWidth, buttonBoxHeight); - XSetForeground(mDisplay, mGC, fgColor); - XDrawRectangle(mDisplay, mWin, mGC, x, y, - buttonBoxWidth, buttonBoxHeight); - XDrawString(mDisplay, mWin, mGC, - x + ((buttonBoxWidth - iter->getLabelWidth()) / 2), - y + mFontAscent + ((buttonBoxHeight - mFontAscent) / 2), - iter->getLabel(), - strlen(iter->getLabel())); - iter->setButtonRect(x, y, buttonBoxWidth, buttonBoxHeight); - x = x + buttonBoxWidth + MessageBox_ButtonSpacer; - } -} - -template -static inline Type max(Type v1, Type v2) -{ - if (v1 <= v2) - return v2; - else - return v1; -} - -template -static inline Type min(Type v1, Type v2) -{ - if (v1 > v2) - return v2; - else - return v1; -} - -void XMessageBox::clearMessageLines() -{ - Vector::iterator iter; - for (iter = mMessageLines.begin(); iter != mMessageLines.end(); ++iter) - delete [] *iter; - mMessageLines.clear(); -} - -void XMessageBox::splitMessage() -{ - clearMessageLines(); - if (mMessage == NULL || strlen(mMessage)==0) - // JMQTODO: what to do with empty strings? - return; - - // need to break message up in to lines, and store lines in - // mMessageLines - - int numChars = strlen(mMessage); - const int ScratchBufSize = 2048; - char scratchBuf[ScratchBufSize]; - memset(scratchBuf, 0, ScratchBufSize); - - int fontDirection, fontAscent, fontDescent; - XCharStruct strInfo; - - char *curChar = const_cast(mMessage); - char *endChar; - char *curWrapped = scratchBuf; - int curWidth = 0; - int maxWidth = mMaxWindowWidth - (MessageBox_LineHMargin); - - while ( // while pointers are in range... - (curChar - mMessage) < numChars && - (curWrapped - scratchBuf) < ScratchBufSize) - { - // look for next space in remaining string - endChar = index(curChar, ' '); - if (endChar == NULL) - endChar = index(curChar, '\0'); - - if (endChar != NULL) - // increment one char past the space to include it - endChar++; - else - // otherwise, set the endchar to one char ahead - endChar = curChar + 1; - - // compute length of substr - int len = endChar - curChar; - XTextExtents(mFS, curChar, len, - &fontDirection, &fontAscent, &fontDescent, - &strInfo); - // if its too big, time to add a new line... - if ((curWidth + strInfo.width) > maxWidth) - { - // create a new block for the line and add it - *curWrapped = '\0'; - int len = strlen(scratchBuf); - char* line = new char[len+1]; - strncpy(line, scratchBuf, len+1); // +1 gets the null char - mMessageLines.push_back(line); - - // reset curWrapped to the beginning of the scratch buffer - curWrapped = scratchBuf; - curWidth = 0; - } - // copy the current string into curWrapped if we have enough room - int bytesRemaining = - ScratchBufSize - (curWrapped - scratchBuf); - if (bytesRemaining >= len) - strncpy(curWrapped, curChar, len); - - curWrapped += len; - curWidth += strInfo.width; - curChar = endChar; - } - - // make a final line out of any leftover stuff in the scratch buffer - if (curWrapped != scratchBuf) - { - *curWrapped = '\0'; - int len = strlen(scratchBuf); - char* line = new char[len+1]; - strncpy(line, scratchBuf, len+1); // +1 gets the null char - mMessageLines.push_back(line); - } -} - -int XMessageBox::loadFont() -{ - // load the font - mFS = XLoadQueryFont(mDisplay, - "-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*"); - - if (mFS == NULL) - mFS = XLoadQueryFont(mDisplay, "fixed"); - - if (mFS == NULL) - return -1; - - // dummy call to XTextExtents to get the font specs - XCharStruct strInfo; - - XTextExtents(mFS, "foo", 1, - &mFontDirection, &mFontAscent, &mFontDescent, - &strInfo); - - mFontHeight = mFontAscent + mFontDescent; - return 0; -} - -int XMessageBox::getButtonLineWidth() -{ - return mButtons.size() * MessageBox_ButtonBoxWidth + - (mButtons.size() - 1) * MessageBox_ButtonSpacer + - MessageBox_ButtonHMargin * 2; -} - -void XMessageBox::setDimensions() -{ - mMBWidth = MessageBox_MaxWinWidth; - mMBHeight = MessageBox_MaxWinHeight; - - // determine width of button line - int buttonWidth = getButtonLineWidth(); - - // if there is only one line, the desired width is the greater of the - // line width and the buttonWidth, otherwise the lineWidth is the - // max possible width which we already set. - if (mMessageLines.size() == 1) - { - XCharStruct strInfo; - int fontDirection, fontAscent, fontDescent; - - XTextExtents(mFS, mMessageLines[0], strlen(mMessageLines[0]), - &fontDirection, &fontAscent, &fontDescent, - &strInfo); - - mMBWidth = max(MessageBox_LineHMargin * 2 + strInfo.width, - buttonWidth); - mMBWidth = max(mMBWidth, MessageBox_MinWinWidth); - } - - // determine the height of the button line - int buttonHeight = MessageBox_ButtonBoxHeight + - MessageBox_ButtonVMargin * 2; - - int lineHeight = mFontHeight * mMessageLines.size() + - (mMessageLines.size() - 1) * MessageBox_LineSpacer + - MessageBox_LineVMargin * 2; - - mMBHeight = buttonHeight + lineHeight; -} - -int XMessageBox::show() -{ - if (mDisplay == NULL) - return -1; - - int retVal = 0; - retVal = loadFont(); - if (retVal < 0) - return retVal; - - // set the maximum window dimensions - mScreenWidth = DisplayWidth(mDisplay, DefaultScreen(mDisplay)); - mScreenHeight = DisplayHeight(mDisplay, DefaultScreen(mDisplay)); - mMaxWindowWidth = min(mScreenWidth, MessageBox_MaxWinWidth); - mMaxWindowHeight = min(mScreenHeight, MessageBox_MaxWinHeight); - - // split the message into a vector of lines - splitMessage(); - - // set the dialog dimensions - setDimensions(); - - mWin = XCreateSimpleWindow( - mDisplay, - DefaultRootWindow(mDisplay), - (mScreenWidth - mMBWidth) / 2, (mScreenHeight - mMBHeight) / 2, - mMBWidth, mMBHeight, - 1, - BlackPixel(mDisplay, DefaultScreen(mDisplay)), - WhitePixel(mDisplay, DefaultScreen(mDisplay))); - - mGC = XCreateGC(mDisplay, mWin, 0, 0); - - XSetFont(mDisplay, mGC, mFS->fid); - - // set input mask - XSelectInput(mDisplay, mWin, - ExposureMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask); - - // set wm protocols in case they hit X - Atom wm_delete_window = - XInternAtom(mDisplay, "WM_DELETE_WINDOW", False); - Atom wm_protocols = - XInternAtom(mDisplay, "WM_PROTOCOLS", False); - XSetWMProtocols (mDisplay, mWin, &wm_delete_window, 1); - // set pop up dialog hint - XSetTransientForHint(mDisplay, mWin, mWin); - - // set title - XTextProperty wtitle; - wtitle.value = (unsigned char *)mTitle; - wtitle.encoding = XA_STRING; - wtitle.format = 8; - wtitle.nitems = strlen(mTitle); - XSetWMName(mDisplay, mWin, &wtitle); - - // show window - XMapRaised(mDisplay, mWin); - // move it in case some bozo window manager repositioned it - XMoveWindow(mDisplay, mWin, - (mScreenWidth - mMBWidth) / 2, (mScreenHeight - mMBHeight) / 2); - // raise it to top - XRaiseWindow(mDisplay, mWin); - - XMessageBoxButton* clickedButton = NULL; - XEvent event; - Vector::iterator iter; - bool done = false; - while (!done) - { - XNextEvent(mDisplay, &event); - switch (event.type) - { - case Expose: - repaint(); - break; - case MotionNotify: - for (iter = mButtons.begin(); iter != mButtons.end(); ++iter) - iter->setMouseCoordinates(event.xmotion.x, event.xmotion.y); - break; - case ButtonPress: - for (iter = mButtons.begin(); iter != mButtons.end(); ++iter) - { - if (iter->pointInRect(event.xbutton.x, event.xbutton.y)) - { - iter->setMouseDown(true); - iter->setMouseCoordinates(event.xbutton.x, event.xbutton.y); - break; - } - } - break; - case ButtonRelease: - for (iter = mButtons.begin(); iter != mButtons.end(); ++iter) - { - if (iter->pointInRect(event.xbutton.x, event.xbutton.y) && - iter->isMouseDown()) - { - // we got a winner! - clickedButton = iter; - done = true; - break; - } - } - if (clickedButton == NULL) - { - // user released outside a button. clear the button states - for (iter = mButtons.begin(); iter != mButtons.end(); ++iter) - iter->setMouseDown(false); - } - break; - case ClientMessage: - if (event.xclient.message_type == wm_protocols && - event.xclient.data.l[0] == static_cast(wm_delete_window)) - done = true; - break; - } - repaint(); - } - - XUnmapWindow(mDisplay, mWin); - XDestroyWindow(mDisplay, mWin); - XFreeGC(mDisplay, mGC); - XFreeFont(mDisplay, mFS); - - if (clickedButton != NULL) - return clickedButton->getClickVal(); - else - return -1; -} diff --git a/Engine/source/platformX86UNIX/x86UNIXMessageBox.h b/Engine/source/platformX86UNIX/x86UNIXMessageBox.h deleted file mode 100644 index 3d9a7e5d4..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXMessageBox.h +++ /dev/null @@ -1,122 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#ifndef _X86UNIXMESSAGEBOX_H_ -#define _X86UNIXMESSAGEBOX_H_ - -#include -#include "core/util/tVector.h" - -class XMessageBoxButton -{ - public: - XMessageBoxButton(); - XMessageBoxButton(const char* label, int clickVal); - - const char *getLabel() { return static_cast(mLabel); } - int getClickVal() { return mClickVal; } - - int getLabelWidth() { return mLabelWidth; } - void setLabelWidth(int width) { mLabelWidth = width; } - - void setButtonRect(int x, int y, int width, int height) - { - mX = x; - mY = y; - mWidth = width; - mHeight = height; - } - void setMouseCoordinates(int x, int y) - { - mMouseX = x; - mMouseY = y; - } - - bool drawReverse() - { - return mMouseDown && pointInRect(mMouseX, mMouseY); - } - - bool pointInRect(int x, int y) - { - if (x >= mX && x <= (mX+mWidth) && - y >= mY && y <= (mY+mHeight)) - return true; - return false; - } - - void setMouseDown(bool mouseDown) { mMouseDown = mouseDown; } - bool isMouseDown() { return mMouseDown; } - - private: - static const int LabelSize = 100; - char mLabel[LabelSize]; - int mClickVal; - int mLabelWidth; - int mX, mY, mWidth, mHeight; - int mMouseX, mMouseY; - bool mMouseDown; -}; - -class XMessageBox -{ - public: - static const int OK = 1; - static const int Cancel = 2; - static const int Retry = 3; - static const int IgnoreAll = 4; - - XMessageBox(Display* display); - ~XMessageBox(); - - int alertOK(const char *windowTitle, const char *message); - int alertOKCancel(const char *windowTitle, const char *message); - int alertRetryCancel(const char *windowTitle, const char *message); - int alertAssert(const char *windowTitle, const char *message); - private: - int show(); - void repaint(); - void splitMessage(); - void clearMessageLines(); - int loadFont(); - void setDimensions(); - int getButtonLineWidth(); - - const char* mMessage; - const char* mTitle; - Vector mButtons; - Vector mMessageLines; - - Display* mDisplay; - GC mGC; - Window mWin; - XFontStruct* mFS; - int mFontHeight; - int mFontAscent; - int mFontDescent; - int mFontDirection; - - int mScreenWidth, mScreenHeight, mMaxWindowWidth, mMaxWindowHeight; - int mMBWidth, mMBHeight; -}; - -#endif // #define _X86UNIXMESSAGEBOX_H_ diff --git a/Engine/source/platformX86UNIX/x86UNIXNet.cpp b/Engine/source/platformX86UNIX/x86UNIXNet.cpp deleted file mode 100644 index 2cfb81521..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXNet.cpp +++ /dev/null @@ -1,924 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- -#if 0 - -#include "platformX86UNIX/platformX86UNIX.h" -#include "platform/platform.h" -#include "platform/event.h" -#include "platform/platformNetAsync.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -/* for PROTO_IPX */ -#if defined(__linux__) -#include -#include /* ioctl() */ -#include -#elif defined(__OpenBSD__) || defined(__FreeBSD__) -#include /* ioctl() */ -#include -#endif - -#include -#include - -#include "console/console.h" -#include "platform/gameInterface.h" -#include "core/fileStream.h" -#include "core/tVector.h" - -static Net::Error getLastError(); -static S32 defaultPort = 28000; -static S32 netPort = 0; -static int ipxSocket = InvalidSocket; -static int udpSocket = InvalidSocket; - -// local enum for socket states for polled sockets -enum SocketState -{ - InvalidState, - Connected, - ConnectionPending, - Listening, - NameLookupRequired -}; - -// the Socket structure helps us keep track of the -// above states -struct Socket -{ - Socket() - { - fd = InvalidSocket; - state = InvalidState; - remoteAddr[0] = 0; - remotePort = -1; - } - - NetSocket fd; - S32 state; - char remoteAddr[256]; - S32 remotePort; -}; - -// list of polled sockets -static Vector gPolledSockets; - -static Socket* addPolledSocket(NetSocket& fd, S32 state, - char* remoteAddr = NULL, S32 port = -1) -{ - Socket* sock = new Socket(); - sock->fd = fd; - sock->state = state; - if (remoteAddr) - dStrcpy(sock->remoteAddr, remoteAddr, 256); - if (port != -1) - sock->remotePort = port; - gPolledSockets.push_back(sock); - return sock; -} - -enum { - MaxConnections = 1024, -}; - -S32 Poll(NetSocket fd, S32 eventMask, S32 timeoutMs) -{ - pollfd pfd; - S32 retVal; - pfd.fd = fd; - pfd.events = eventMask; - - retVal = poll(&pfd, 1, timeoutMs); - return retVal; - if (retVal <= 0) - return retVal; - else - return pfd.revents; -} - -bool Net::init() -{ - NetAsync::startAsync(); - return(true); -} - -void Net::shutdown() -{ - while (gPolledSockets.size() > 0) - closeConnectTo(gPolledSockets[0]->fd); - - closePort(); - NetAsync::stopAsync(); -} - -static void netToIPSocketAddress(const NetAddress *address, struct sockaddr_in *sockAddr) -{ - dMemset(sockAddr, 0, sizeof(struct sockaddr_in)); - sockAddr->sin_family = AF_INET; - sockAddr->sin_port = htons(address->port); - char tAddr[20]; - dSprintf(tAddr, 20, "%d.%d.%d.%d\n", address->netNum[0], address->netNum[1], address->netNum[2], address->netNum[3]); -//fprintf(stdout,"netToIPSocketAddress(): %s\n",tAddr);fflush(NULL); - sockAddr->sin_addr.s_addr = inet_addr(tAddr); -// sockAddr->sin_addr.s_addr = address->netNum[0]; // hopefully this will work. -} - -static void IPSocketToNetAddress(const struct sockaddr_in *sockAddr, NetAddress *address) -{ - address->type = NetAddress::IPAddress; - address->port = htons(sockAddr->sin_port); - char *tAddr; - tAddr = inet_ntoa(sockAddr->sin_addr); -//fprintf(stdout,"IPSocketToNetAddress(): %s\n",tAddr);fflush(NULL); - U8 nets[4]; - nets[0] = atoi(strtok(tAddr, ".")); - nets[1] = atoi(strtok(NULL, ".")); - nets[2] = atoi(strtok(NULL, ".")); - nets[3] = atoi(strtok(NULL, ".")); -//fprintf(stdout,"0 = %d, 1 = %d, 2 = %d, 3 = %d\n", nets[0], nets[1], nets[2], nets[3]); - address->netNum[0] = nets[0]; - address->netNum[1] = nets[1]; - address->netNum[2] = nets[2]; - address->netNum[3] = nets[3]; -} - -static void netToIPXSocketAddress(const NetAddress *address, sockaddr_ipx *sockAddr) -{ -#if !defined(__FreeBSD__) - dMemset(sockAddr, 0, sizeof(sockaddr_ipx)); - sockAddr->sipx_family = AF_INET; - sockAddr->sipx_port = htons(address->port); - sockAddr->sipx_network = address->netNum[0]; - sockAddr->sipx_node[0] = address->nodeNum[0]; - sockAddr->sipx_node[1] = address->nodeNum[1]; - sockAddr->sipx_node[2] = address->nodeNum[2]; - sockAddr->sipx_node[3] = address->nodeNum[3]; - sockAddr->sipx_node[4] = address->nodeNum[4]; - sockAddr->sipx_node[5] = address->nodeNum[5]; -#endif -} - -static void IPXSocketToNetAddress(const sockaddr_ipx *sockAddr, NetAddress *address) -{ -#if !defined(__FreeBSD__) - address->type = NetAddress::IPXAddress; - address->port = htons(sockAddr->sipx_port); - address->netNum[0] = sockAddr->sipx_network; - address->nodeNum[0] = sockAddr->sipx_node[0]; - address->nodeNum[1] = sockAddr->sipx_node[1]; - address->nodeNum[2] = sockAddr->sipx_node[2]; - address->nodeNum[3] = sockAddr->sipx_node[3]; - address->nodeNum[4] = sockAddr->sipx_node[4]; - address->nodeNum[5] = sockAddr->sipx_node[5]; -#endif -} - -NetSocket Net::openListenPort(U16 port) -{ - if(Game->isJournalReading()) - { - U32 ret; - Game->journalRead(&ret); - return NetSocket(ret); - } - NetSocket sock = openSocket(); - if (sock == InvalidSocket) - { - Con::errorf("Unable to open listen socket: %s", strerror(errno)); - return InvalidSocket; - } - - if (bind(sock, port) != NoError) - { - Con::errorf("Unable to bind port %d: %s", port, strerror(errno)); - ::close(sock); - return InvalidSocket; - } - if (listen(sock, 4) != NoError) - { - Con::errorf("Unable to listen on port %d: %s", port, strerror(errno)); - ::close(sock); - return InvalidSocket; - } - - setBlocking(sock, false); - addPolledSocket(sock, Listening); - if (Game->isJournalWriting()) - Game->journalWrite(U32(sock)); - return sock; -} - -NetSocket Net::openConnectTo(const char *addressString) -{ - if(!dStrnicmp(addressString, "ipx:", 4)) - return InvalidSocket; - if(!dStrnicmp(addressString, "ip:", 3)) - addressString += 3; // eat off the ip: - char remoteAddr[256]; - dStrcpy(remoteAddr, addressString, 256); - - char *portString = dStrchr(remoteAddr, ':'); - - U16 port; - if(portString) - { - *portString++ = 0; - port = htons(dAtoi(portString)); - } - else - port = htons(defaultPort); - - if(!dStricmp(remoteAddr, "broadcast")) - return InvalidSocket; - - if(Game->isJournalReading()) - { - U32 ret; - Game->journalRead(&ret); - return NetSocket(ret); - } - NetSocket sock = openSocket(); - setBlocking(sock, false); - - sockaddr_in ipAddr; - dMemset(&ipAddr, 0, sizeof(ipAddr)); - - if (inet_aton(remoteAddr, &ipAddr.sin_addr) != 0) - { - ipAddr.sin_port = port; - ipAddr.sin_family = AF_INET; - if(::connect(sock, (struct sockaddr *)&ipAddr, sizeof(ipAddr)) == -1 && - errno != EINPROGRESS) - { - Con::errorf("Error connecting %s: %s", - addressString, strerror(errno)); - ::close(sock); - sock = InvalidSocket; - } - if(sock != InvalidSocket) { - // add this socket to our list of polled sockets - addPolledSocket(sock, ConnectionPending); - } - } - else - { - // need to do an asynchronous name lookup. first, add the socket - // to the polled list - addPolledSocket(sock, NameLookupRequired, remoteAddr, port); - // queue the lookup - gNetAsync.queueLookup(remoteAddr, sock); - } - if(Game->isJournalWriting()) - Game->journalWrite(U32(sock)); - return sock; -} - -void Net::closeConnectTo(NetSocket sock) -{ - if(Game->isJournalReading()) - return; - - // if this socket is in the list of polled sockets, remove it - for (int i = 0; i < gPolledSockets.size(); ++i) - if (gPolledSockets[i]->fd == sock) - { - delete gPolledSockets[i]; - gPolledSockets.erase(i); - break; - } - - closeSocket(sock); -} - -Net::Error Net::sendtoSocket(NetSocket socket, const U8 *buffer, int bufferSize) -{ - if(Game->isJournalReading()) - { - U32 e; - Game->journalRead(&e); - - return (Net::Error) e; - } - Net::Error e = send(socket, buffer, bufferSize); - if(Game->isJournalWriting()) - Game->journalWrite(U32(e)); - return e; -} - -bool Net::openPort(S32 port) -{ - if(udpSocket != InvalidSocket) - close(udpSocket); - if(ipxSocket != InvalidSocket) - close(ipxSocket); - - udpSocket = socket(AF_INET, SOCK_DGRAM, 0); - ipxSocket = socket(AF_IPX, SOCK_DGRAM, 0); - - if(udpSocket != InvalidSocket) - { - Net::Error error; - error = bind(udpSocket, port); - if(error == NoError) - error = setBufferSize(udpSocket, 32768); - if(error == NoError) - error = setBroadcast(udpSocket, true); - if(error == NoError) - error = setBlocking(udpSocket, false); - if(error == NoError) - Con::printf("UDP initialized on port %d", port); - else - { - close(udpSocket); - udpSocket = InvalidSocket; - Con::printf("Unable to initialize UDP - error %d", error); - } - } - if(ipxSocket != InvalidSocket) - { - Net::Error error = NoError; - sockaddr_ipx ipxAddress; - memset((char *)&ipxAddress, 0, sizeof(ipxAddress)); - ipxAddress.sipx_family = AF_IPX; - ipxAddress.sipx_port = htons(port); - S32 err = ::bind(ipxSocket, (struct sockaddr *)&ipxAddress, sizeof(ipxAddress)); - if(err) - error = getLastError(); - if(error == NoError) - error = setBufferSize(ipxSocket, 32768); - if(error == NoError) - error = setBroadcast(ipxSocket, true); - if(error == NoError) - error = setBlocking(ipxSocket, false); - if(error == NoError) - Con::printf("IPX initialized on port %d", port); - else - { - close(ipxSocket); - ipxSocket = InvalidSocket; - Con::printf("Unable to initialize IPX - error %d", error); - } - } - netPort = port; - return ipxSocket != InvalidSocket || udpSocket != InvalidSocket; -} - -void Net::closePort() -{ - if(ipxSocket != InvalidSocket) - close(ipxSocket); - if(udpSocket != InvalidSocket) - close(udpSocket); -} - -Net::Error Net::sendto(const NetAddress *address, const U8 *buffer, S32 bufferSize) -{ - if(Game->isJournalReading()) - return NoError; - - if(address->type == NetAddress::IPXAddress) - { - sockaddr_ipx ipxAddr; - netToIPXSocketAddress(address, &ipxAddr); - if(::sendto(ipxSocket, (const char*)buffer, bufferSize, 0, - (sockaddr *) &ipxAddr, sizeof(sockaddr_ipx)) == -1) - return getLastError(); - else - return NoError; - } - else - { - sockaddr_in ipAddr; - netToIPSocketAddress(address, &ipAddr); - if(::sendto(udpSocket, (const char*)buffer, bufferSize, 0, - (sockaddr *) &ipAddr, sizeof(sockaddr_in)) == -1) - return getLastError(); - else - return NoError; - } -} - -void Net::process() -{ - sockaddr sa; - - PacketReceiveEvent receiveEvent; - for(;;) - { - U32 addrLen = sizeof(sa); - S32 bytesRead = -1; - if(udpSocket != InvalidSocket) - bytesRead = recvfrom(udpSocket, (char *) receiveEvent.data, MaxPacketDataSize, 0, &sa, &addrLen); - if(bytesRead == -1 && ipxSocket != InvalidSocket) - { - addrLen = sizeof(sa); - bytesRead = recvfrom(ipxSocket, (char *) receiveEvent.data, MaxPacketDataSize, 0, &sa, &addrLen); - } - - if(bytesRead == -1) - break; - - if(sa.sa_family == AF_INET) - IPSocketToNetAddress((sockaddr_in *) &sa, &receiveEvent.sourceAddress); - else if(sa.sa_family == AF_IPX) - IPXSocketToNetAddress((sockaddr_ipx *) &sa, &receiveEvent.sourceAddress); - else - continue; - - NetAddress &na = receiveEvent.sourceAddress; - if(na.type == NetAddress::IPAddress && - na.netNum[0] == 127 && - na.netNum[1] == 0 && - na.netNum[2] == 0 && - na.netNum[3] == 1 && - na.port == netPort) - continue; - if(bytesRead <= 0) - continue; - receiveEvent.size = PacketReceiveEventHeaderSize + bytesRead; - Game->postEvent(receiveEvent); - } - - // process the polled sockets. This blob of code performs functions - // similar to WinsockProc in winNet.cc - - if (gPolledSockets.size() == 0) - return; - - static ConnectedNotifyEvent notifyEvent; - static ConnectedAcceptEvent acceptEvent; - static ConnectedReceiveEvent cReceiveEvent; - - S32 optval; - socklen_t optlen = sizeof(S32); - S32 bytesRead; - Net::Error err; - bool removeSock = false; - Socket *currentSock = NULL; - sockaddr_in ipAddr; - NetSocket incoming = InvalidSocket; - char out_h_addr[1024]; - int out_h_length = 0; - - for (S32 i = 0; i < gPolledSockets.size(); - /* no increment, this is done at end of loop body */) - { - removeSock = false; - currentSock = gPolledSockets[i]; - switch (currentSock->state) - { - case InvalidState: - Con::errorf("Error, InvalidState socket in polled sockets list"); - break; - case ConnectionPending: - notifyEvent.tag = currentSock->fd; - // see if it is now connected - if (getsockopt(currentSock->fd, SOL_SOCKET, SO_ERROR, - &optval, &optlen) == -1) - { - Con::errorf("Error getting socket options: %s", strerror(errno)); - notifyEvent.state = ConnectedNotifyEvent::ConnectFailed; - Game->postEvent(notifyEvent); - removeSock = true; - } - else - { - if (optval == EINPROGRESS) - // still connecting... - break; - - if (optval == 0) - { - // connected - notifyEvent.state = ConnectedNotifyEvent::Connected; - Game->postEvent(notifyEvent); - currentSock->state = Connected; - } - else - { - // some kind of error - Con::errorf("Error connecting: %s", strerror(errno)); - notifyEvent.state = ConnectedNotifyEvent::ConnectFailed; - Game->postEvent(notifyEvent); - removeSock = true; - } - } - break; - case Connected: - bytesRead = 0; - // try to get some data - err = Net::recv(currentSock->fd, cReceiveEvent.data, - MaxPacketDataSize, &bytesRead); - if(err == Net::NoError) - { - if (bytesRead > 0) - { - // got some data, post it - cReceiveEvent.tag = currentSock->fd; - cReceiveEvent.size = ConnectedReceiveEventHeaderSize + - bytesRead; - Game->postEvent(cReceiveEvent); - } - else - { - // zero bytes read means EOF - if (bytesRead < 0) - // ack! this shouldn't happen - Con::errorf("Unexpected error on socket: %s", - strerror(errno)); - - notifyEvent.tag = currentSock->fd; - notifyEvent.state = ConnectedNotifyEvent::Disconnected; - Game->postEvent(notifyEvent); - removeSock = true; - } - } - else if (err != Net::NoError && err != Net::WouldBlock) - { - Con::errorf("Error reading from socket: %s", strerror(errno)); - notifyEvent.tag = currentSock->fd; - notifyEvent.state = ConnectedNotifyEvent::Disconnected; - Game->postEvent(notifyEvent); - removeSock = true; - } - break; - case NameLookupRequired: - // is the lookup complete? - if (!gNetAsync.checkLookup( - currentSock->fd, out_h_addr, &out_h_length, - sizeof(out_h_addr))) - break; - - notifyEvent.tag = currentSock->fd; - if (out_h_length == -1) - { - Con::errorf("DNS lookup failed: %s", currentSock->remoteAddr); - notifyEvent.state = ConnectedNotifyEvent::DNSFailed; - removeSock = true; - } - else - { - // try to connect - dMemcpy(&(ipAddr.sin_addr.s_addr), out_h_addr, out_h_length); - ipAddr.sin_port = currentSock->remotePort; - ipAddr.sin_family = AF_INET; - if(::connect(currentSock->fd, (struct sockaddr *)&ipAddr, - sizeof(ipAddr)) == -1) - { - if (errno == EINPROGRESS) - { - notifyEvent.state = ConnectedNotifyEvent::DNSResolved; - currentSock->state = ConnectionPending; - } - else - { - Con::errorf("Error connecting to %s: %s", - currentSock->remoteAddr, strerror(errno)); - notifyEvent.state = ConnectedNotifyEvent::ConnectFailed; - removeSock = true; - } - } - else - { - notifyEvent.state = ConnectedNotifyEvent::Connected; - currentSock->state = Connected; - } - } - Game->postEvent(notifyEvent); - break; - case Listening: - incoming = - Net::accept(currentSock->fd, &acceptEvent.address); - if(incoming != InvalidSocket) - { - acceptEvent.portTag = currentSock->fd; - acceptEvent.connectionTag = incoming; - setBlocking(incoming, false); - addPolledSocket(incoming, Connected); - Game->postEvent(acceptEvent); - } - break; - } - - // only increment index if we're not removing the connection, since - // the removal will shift the indices down by one - if (removeSock) - closeConnectTo(currentSock->fd); - else - i++; - } -} - -NetSocket Net::openSocket() -{ - int retSocket; - retSocket = socket(AF_INET, SOCK_STREAM, 0); - - if(retSocket == InvalidSocket) - return InvalidSocket; - else - return retSocket; -} - -Net::Error Net::closeSocket(NetSocket socket) -{ - if(socket != InvalidSocket) - { - if(!close(socket)) - return NoError; - else - return getLastError(); - } - else - return NotASocket; -} - -Net::Error Net::connect(NetSocket socket, const NetAddress *address) -{ - if(address->type != NetAddress::IPAddress) - return WrongProtocolType; - sockaddr_in socketAddress; - netToIPSocketAddress(address, &socketAddress); - if(!::connect(socket, (sockaddr *) &socketAddress, sizeof(socketAddress))) - return NoError; - return getLastError(); -} - -Net::Error Net::listen(NetSocket socket, S32 backlog) -{ - if(!::listen(socket, backlog)) - return NoError; - return getLastError(); -} - -NetSocket Net::accept(NetSocket acceptSocket, NetAddress *remoteAddress) -{ - sockaddr_in socketAddress; - U32 addrLen = sizeof(socketAddress); - - int retVal = ::accept(acceptSocket, (sockaddr *) &socketAddress, &addrLen); - if(retVal != InvalidSocket) - { - IPSocketToNetAddress(&socketAddress, remoteAddress); - return retVal; - } - return InvalidSocket; -} - -Net::Error Net::bind(NetSocket socket, U16 port) -{ - S32 error; - - sockaddr_in socketAddress; - dMemset((char *)&socketAddress, 0, sizeof(socketAddress)); - socketAddress.sin_family = AF_INET; - // It's entirely possible that there are two NIC cards. - // We let the user specify which one the server runs on. - - // thanks to [TPG]P1aGu3 for the name - const char* serverIP = Con::getVariable( "Pref::Net::BindAddress" ); - // serverIP is guaranteed to be non-0. - AssertFatal( serverIP, "serverIP is NULL!" ); - - if( serverIP[0] != '\0' ) { - // we're not empty - socketAddress.sin_addr.s_addr = inet_addr( serverIP ); - - if( socketAddress.sin_addr.s_addr != INADDR_NONE ) { - Con::printf( "Binding server port to %s", serverIP ); - } else { - Con::warnf( ConsoleLogEntry::General, - "inet_addr() failed for %s while binding!", - serverIP ); - socketAddress.sin_addr.s_addr = INADDR_ANY; - } - - } else { - Con::printf( "Binding server port to default IP" ); - socketAddress.sin_addr.s_addr = INADDR_ANY; - } - - socketAddress.sin_port = htons(port); - error = ::bind(socket, (sockaddr *) &socketAddress, sizeof(socketAddress)); - - if(!error) - return NoError; - return getLastError(); -} - -Net::Error Net::setBufferSize(NetSocket socket, S32 bufferSize) -{ - S32 error; - error = setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (char *) &bufferSize, sizeof(bufferSize)); - if(!error) - error = setsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char *) &bufferSize, sizeof(bufferSize)); - if(!error) - return NoError; - return getLastError(); -} - -Net::Error Net::setBroadcast(NetSocket socket, bool broadcast) -{ - S32 bc = broadcast; - S32 error = setsockopt(socket, SOL_SOCKET, SO_BROADCAST, (char*)&bc, sizeof(bc)); - if(!error) - return NoError; - return getLastError(); -} - -Net::Error Net::setBlocking(NetSocket socket, bool blockingIO) -{ - int notblock = !blockingIO; - S32 error = ioctl(socket, FIONBIO, ¬block); - if(!error) - return NoError; - return getLastError(); -} - -Net::Error Net::send(NetSocket socket, const U8 *buffer, S32 bufferSize) -{ - // Poll for write status. this blocks. should really - // do this in a separate thread or set it up so that the data can - // get queued and sent later - // JMQTODO - Poll(socket, POLLOUT, 10000); - - S32 error = ::send(socket, (const char*)buffer, bufferSize, 0); - if(error != -1) - return NoError; - - return getLastError(); -} - -Net::Error Net::recv(NetSocket socket, U8 *buffer, S32 bufferSize, S32 *bytesRead) -{ - *bytesRead = ::recv(socket, (char*)buffer, bufferSize, 0); - if(*bytesRead == -1) - return getLastError(); - return NoError; -} - -bool Net::compareAddresses(const NetAddress *a1, const NetAddress *a2) -{ - if((a1->type != a2->type) || - (*((U32 *)a1->netNum) != *((U32 *)a2->netNum)) || - (a1->port != a2->port)) - return false; - - if(a1->type == NetAddress::IPAddress) - return true; - for(S32 i = 0; i < 6; i++) - if(a1->nodeNum[i] != a2->nodeNum[i]) - return false; - return true; -} - -bool Net::stringToAddress(const char *addressString, NetAddress *address) -{ - if(dStrnicmp(addressString, "ipx:", 4)) - { - // assume IP if it doesn't have ipx: at the front. - - if(!dStrnicmp(addressString, "ip:", 3)) - addressString += 3; // eat off the ip: - - sockaddr_in ipAddr; - char remoteAddr[256]; - if(strlen(addressString) > 255) - return false; - - dStrcpy(remoteAddr, addressString, 256); - - char *portString = dStrchr(remoteAddr, ':'); - if(portString) - *portString++ = '\0'; - - struct hostent *hp; - if(!dStricmp(remoteAddr, "broadcast")) - ipAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); - else - { - if (inet_aton(remoteAddr,&ipAddr.sin_addr) == 0) // error - { - if((hp = gethostbyname(remoteAddr)) == 0) - return false; - else - memcpy(&ipAddr.sin_addr.s_addr, hp->h_addr, sizeof(in_addr)); - } - } - if(portString) - ipAddr.sin_port = htons(dAtoi(portString)); - else - ipAddr.sin_port = htons(defaultPort); - ipAddr.sin_family = AF_INET; - IPSocketToNetAddress(&ipAddr, address); - return true; - } - else - { - S32 i; - S32 port; - - address->type = NetAddress::IPXAddress; - for(i = 0; i < 6; i++) - address->nodeNum[i] = 0xFF; - - // it's an IPX string - addressString += 4; - if(!dStricmp(addressString, "broadcast")) - { - address->port = defaultPort; - return true; - } - else if(sscanf(addressString, "broadcast:%d", &port) == 1) - { - address->port = port; - return true; - } - else - { - S32 nodeNum[6]; - S32 netNum[4]; - S32 count = dSscanf(addressString, "%2x%2x%2x%2x:%2x%2x%2x%2x%2x%2x:%d", - &netNum[0], &netNum[1], &netNum[2], &netNum[3], - &nodeNum[0], &nodeNum[1], &nodeNum[2], &nodeNum[3], &nodeNum[4], &nodeNum[5], - &port); - - if(count == 10) - { - port = defaultPort; - count++; - } - if(count != 11) - return false; - - for(i = 0; i < 6; i++) - address->nodeNum[i] = nodeNum[i]; - for(i = 0; i < 4; i++) - address->netNum[i] = netNum[i]; - address->port = port; - return true; - } - } -} - -void Net::addressToString(const NetAddress *address, char addressString[256]) -{ - if(address->type == NetAddress::IPAddress) - { - sockaddr_in ipAddr; - netToIPSocketAddress(address, &ipAddr); - - if(ipAddr.sin_addr.s_addr == htonl(INADDR_BROADCAST)) - dSprintf(addressString, 256, "IP:Broadcast:%d", ntohs(ipAddr.sin_port)); - else - dSprintf(addressString, 256, "IP:%s:%d", inet_ntoa(ipAddr.sin_addr), - ntohs(ipAddr.sin_port)); -// dSprintf(addressString, 256, "IP:%d:%d", ipAddr.sin_addr.s_addr, -// ntohs(ipAddr.sin_port)); - } - else - { - return; - dSprintf(addressString, 256, "IPX:%.2X%.2X%.2X%.2X:%.2X%.2X%.2X%.2X%.2X%.2X:%d", - address->netNum[0], address->netNum[1], address->netNum[2], address->netNum[3], - address->nodeNum[0], address->nodeNum[1], address->nodeNum[2], address->nodeNum[3], address->nodeNum[4], address->nodeNum[5], - address->port); - } -} - -Net::Error getLastError() -{ - if (errno == EAGAIN) - return Net::WouldBlock; - return Net::UnknownError; -} - -#endif diff --git a/Engine/source/platformX86UNIX/x86UNIXOGLVideo.client.cpp b/Engine/source/platformX86UNIX/x86UNIXOGLVideo.client.cpp deleted file mode 100644 index 9db3236c5..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXOGLVideo.client.cpp +++ /dev/null @@ -1,508 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- -#if 0 -#include "console/console.h" -#include "platform/event.h" -#include "platform/gameInterface.h" - -#include "platformX86UNIX/platformX86UNIX.h" -#include "platformX86UNIX/platformGL.h" -#include "platformX86UNIX/x86UNIXOGLVideo.h" -#include "platformX86UNIX/x86UNIXState.h" - -#include -#include -#include - -//------------------------------------------------------------------------------ -bool InitOpenGL() -{ - DisplayDevice::init(); - - // Get the video settings from the prefs: - const char* resString = Con::getVariable( "$pref::Video::resolution" ); - dsize_t tempBufLen = dStrlen(resString) + 1; - char* tempBuf = new char[tempBufLen]; - dStrcpy( tempBuf, resString, tempBufLen ); - char* temp = dStrtok( tempBuf, " x\0" ); - U32 width = ( temp ? dAtoi( temp ) : 800 ); - temp = dStrtok( NULL, " x\0" ); - U32 height = ( temp ? dAtoi( temp ) : 600 ); - temp = dStrtok( NULL, "\0" ); - U32 bpp = ( temp ? dAtoi( temp ) : 16 ); - delete [] tempBuf; - - bool fullScreen = Con::getBoolVariable( "$pref::Video::fullScreen" ); - - // the only supported video device in unix is OpenGL - if ( !Video::setDevice( "OpenGL", width, height, bpp, fullScreen ) ) - { - Con::errorf("Unable to create default OpenGL mode: %d %d %d %d", - width, height, bpp, fullScreen); - - // if we can't create the default, attempt to create a "safe" window - if ( !Video::setDevice( "OpenGL", 640, 480, 16, true ) ) - { - DisplayErrorAlert("Could not find a compatible OpenGL display " \ - "resolution. Please check your driver configuration."); - return false; - } - } - - return true; -} - -//------------------------------------------------------------------------------ -bool OpenGLDevice::smCanSwitchBitDepth = false; - -//------------------------------------------------------------------------------ -OpenGLDevice::OpenGLDevice() -{ - initDevice(); -} - -//------------------------------------------------------------------------------ -OpenGLDevice::~OpenGLDevice() -{ -} - -//------------------------------------------------------------------------------ -void OpenGLDevice::addResolution(S32 width, S32 height, bool check) -{ - Point2I desktopSize = x86UNIXState->getDesktopSize(); - U32 desktopBpp = x86UNIXState->getDesktopBpp(); - - // don't allow any resolution under this size - if (width < 640 || height < 480) - return; - - if (check) - { - // don't allow resolutions that exceed the current desktop size - if (width > desktopSize.x || height > desktopSize.y) - return; - } - - if (smCanSwitchBitDepth) - { - // add both 16 and 32 bit resolutions - mResolutionList.push_back(Resolution(width, height, 16)); - mResolutionList.push_back(Resolution(width, height, 32)); - } - else - { - // add just the desktop resolution - mResolutionList.push_back(Resolution(width, height, desktopBpp)); - } -} - -//------------------------------------------------------------------------------ -void OpenGLDevice::initDevice() -{ - mDeviceName = "OpenGL"; - mFullScreenOnly = false; -} - -//------------------------------------------------------------------------------ -void OpenGLDevice::loadResolutions() -{ - mResolutionList.clear(); - - // X cannot switch bit depths on the fly. In case this feature is - // implemented someday, calling this function will let you take - // advantage of it - if (Con::getBoolVariable("$pref::Unix::CanSwitchBitDepth")) - smCanSwitchBitDepth = true; - - // add some default resolutions - addResolution(640, 480); - addResolution(800, 600); - addResolution(1024, 768); - addResolution(1152, 864); - addResolution(1280, 1024); - addResolution(1600, 1200); - - // specifying full screen should give us the resolutions that the - // X server allows - SDL_Rect** modes = SDL_ListModes(NULL, SDL_FULLSCREEN); - if (modes && - (modes != (SDL_Rect **)-1)) - { - for (int i = 0; modes[i] != NULL; ++i) - { - // do we already have this mode? - bool found = false; - for (Vector::iterator iter = mResolutionList.begin(); - iter != mResolutionList.end(); - ++iter) - { - if (iter->w == modes[i]->w && iter->h == modes[i]->h) - { - found = true; - break; - } - } - if (!found) - // don't check these resolutions because they should be OK - // (and checking might drop resolutions that are higher than the - // current desktop bpp) - addResolution(modes[i]->w, modes[i]->h, false); - } - } -} - -//------------------------------------------------------------------------------ -bool OpenGLDevice::activate( U32 width, U32 height, U32 bpp, bool fullScreen ) -{ - if (!setScreenMode(width, height, bpp, fullScreen)) - { - Con::printf("Unable to set screen mode."); - return false; - } - - // Output some driver info to the console - const char* vendorString = (const char*) glGetString( GL_VENDOR ); - const char* rendererString = (const char*) glGetString( GL_RENDERER ); - const char* versionString = (const char*) glGetString( GL_VERSION ); - Con::printf( "OpenGL driver information:" ); - if ( vendorString ) - Con::printf( " Vendor: %s", vendorString ); - if ( rendererString ) - Con::printf( " Renderer: %s", rendererString ); - if ( versionString ) - Con::printf( " Version: %s", versionString ); - - GL_EXT_Init(); - - Con::setVariable( "$pref::Video::displayDevice", mDeviceName ); - - // Do this here because we now know about the extensions: - if ( gGLState.suppSwapInterval ) - setVerticalSync( - !Con::getBoolVariable( "$pref::Video::disableVerticalSync" ) ); - Con::setBoolVariable("$pref::OpenGL::allowTexGen", true); - - return true; -} - - -//------------------------------------------------------------------------------ -void OpenGLDevice::shutdown() -{ - // Shutdown is deferred to Platform::shutdown() -} - -//------------------------------------------------------------------------------ -static void PrintGLAttributes() -{ - int doubleBuf; - int bufferSize, depthSize, stencilSize; - int red, green, blue, alpha; - int aRed, aGreen, aBlue, aAlpha; - - SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &doubleBuf); - SDL_GL_GetAttribute(SDL_GL_BUFFER_SIZE, &bufferSize); - SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &depthSize); - SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &stencilSize); - SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &red); - SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &green); - SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &blue); - SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &alpha); - SDL_GL_GetAttribute(SDL_GL_ACCUM_RED_SIZE, &aRed); - SDL_GL_GetAttribute(SDL_GL_ACCUM_GREEN_SIZE, &aGreen); - SDL_GL_GetAttribute(SDL_GL_ACCUM_BLUE_SIZE, &aBlue); - SDL_GL_GetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, &aAlpha); - - Con::printf("OpenGL Attributes:"); - Con::printf(" DoubleBuffer: %d", doubleBuf); - Con::printf(" BufferSize: %d, DepthSize: %d, StencilSize: %d", - bufferSize, depthSize, stencilSize); - Con::printf(" Red: %d, Green: %d, Blue: %d, Alpha: %d", - red, green, blue, alpha); - Con::printf(" Accum Red: %d, Green: %d, Blue: %d, Alpha: %d", - aRed, aGreen, aBlue, aAlpha); -} - -//------------------------------------------------------------------------------ -bool OpenGLDevice::setScreenMode( U32 width, U32 height, U32 bpp, - bool fullScreen, bool forceIt, bool repaint ) -{ - // load resolutions, this is done lazily so that we can check the setting - // of smCanSwitchBitDepth, which may be overridden by console - if (mResolutionList.size()==0) - loadResolutions(); - - if (mResolutionList.size()==0) - { - Con::printf("No resolutions available!"); - return false; - } - - if (bpp == 0) - { - // bpp comes in as "0" when it is set to "Default" - bpp = x86UNIXState->getDesktopBpp(); - } - - if (height == 0 || width == 0) - { - // paranoia check. set it to the default to prevent crashing - width = 800; - height = 600; - } - - U32 desktopDepth = x86UNIXState->getDesktopBpp(); - // if we can't switch bit depths and the requested bpp is not equal to - // the desktop bpp, set bpp to the desktop bpp - if (!smCanSwitchBitDepth && - bpp != desktopDepth) - { - bpp = desktopDepth; - } - - bool IsInList = false; - - Resolution NewResolution( width, height, bpp ); - - // See if the desired resolution is in the list - if ( mResolutionList.size() ) - { - for ( int i = 0; i < mResolutionList.size(); i++ ) - { - if ( width == mResolutionList[i].w - && height == mResolutionList[i].h - && bpp == mResolutionList[i].bpp ) - { - IsInList = true; - break; - } - } - - if ( !IsInList ) - { - Con::printf( "Selected resolution not available: %d %d %d", - width, height, bpp); - return false; - } - } - else - { - AssertFatal( false, "No resolution list found!!" ); - } - - // Here if we found a matching resolution in the list - - bool needResurrect = false; - if (x86UNIXState->windowCreated()) - { - Con::printf( "Killing the texture manager..." ); - Game->textureKill(); - needResurrect = true; - } - - // Set the desired GL Attributes - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); -// JMQ: NVIDIA 2802+ doesn't like this setting for stencil size -// SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); - SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 0); - SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 0); - SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 0); - SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 0); -// SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); -// SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); -// SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6); -// SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); - - U32 flags = SDL_OPENGL; - if (fullScreen) - flags |= SDL_FULLSCREEN; - - Con::printf( "Setting screen mode to %dx%dx%d (%s)...", width, height, - bpp, ( fullScreen ? "fs" : "w" ) ); - - // set the new video mode - if (SDL_SetVideoMode(width, height, bpp, flags) == NULL) - { - Con::printf("Unable to set SDL Video Mode: %s", SDL_GetError()); - return false; - } - - PrintGLAttributes(); - - // clear screen here to prevent buffer garbage from being displayed when - // video mode is switched - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - if ( needResurrect ) - { - // Reload the textures: - Con::printf( "Resurrecting the texture manager..." ); - Game->textureResurrect(); - } - - if ( gGLState.suppSwapInterval ) - setVerticalSync( !Con::getBoolVariable( "$pref::Video::disableVerticalSync" ) ); - - // reset the window in platform state - SDL_SysWMinfo sysinfo; - SDL_VERSION(&sysinfo.version); - if (SDL_GetWMInfo(&sysinfo) == 0) - { - Con::printf("Unable to set SDL Video Mode: %s", SDL_GetError()); - return false; - } - x86UNIXState->setWindow(sysinfo.info.x11.window); - - // set various other parameters - x86UNIXState->setWindowCreated(true); - smCurrentRes = NewResolution; - Platform::setWindowSize ( width, height ); - smIsFullScreen = fullScreen; - Con::setBoolVariable( "$pref::Video::fullScreen", smIsFullScreen ); - char tempBuf[15]; - dSprintf( tempBuf, sizeof( tempBuf ), "%d %d %d", - smCurrentRes.w, smCurrentRes.h, smCurrentRes.bpp ); - Con::setVariable( "$pref::Video::resolution", tempBuf ); - - // post a TORQUE_SETVIDEOMODE user event - SDL_Event event; - event.type = SDL_USEREVENT; - event.user.code = TORQUE_SETVIDEOMODE; - event.user.data1 = NULL; - event.user.data2 = NULL; - SDL_PushEvent(&event); - - // reset the caption - SDL_WM_SetCaption(x86UNIXState->getWindowName(), NULL); - - // repaint - if ( repaint ) - Con::evaluate( "resetCanvas();" ); - - return true; -} - -//------------------------------------------------------------------------------ -void OpenGLDevice::swapBuffers() -{ - SDL_GL_SwapBuffers(); -} - -//------------------------------------------------------------------------------ -const char* OpenGLDevice::getDriverInfo() -{ - const char* vendorString = (const char*) glGetString( GL_VENDOR ); - const char* rendererString = (const char*) glGetString( GL_RENDERER ); - const char* versionString = (const char*) glGetString( GL_VERSION ); - const char* extensionsString = (const char*) glGetString( GL_EXTENSIONS ); - - U32 bufferLen = ( vendorString ? dStrlen( vendorString ) : 0 ) - + ( rendererString ? dStrlen( rendererString ) : 0 ) - + ( versionString ? dStrlen( versionString ) : 0 ) - + ( extensionsString ? dStrlen( extensionsString ) : 0 ) - + 4; - - char* returnString = Con::getReturnBuffer( bufferLen ); - dSprintf( returnString, bufferLen, "%s\t%s\t%s\t%s", - ( vendorString ? vendorString : "" ), - ( rendererString ? rendererString : "" ), - ( versionString ? versionString : "" ), - ( extensionsString ? extensionsString : "" ) ); - - return( returnString ); -} - -//------------------------------------------------------------------------------ -bool OpenGLDevice::getGammaCorrection(F32 &g) -{ - U16 redtable[256]; - U16 greentable[256]; - U16 bluetable[256]; - - if (SDL_GetGammaRamp(redtable, greentable, bluetable) == -1) - { - Con::warnf("getGammaCorrection error: %s", SDL_GetError()); - return false; - } - - F32 csum = 0.0; - U32 ccount = 0; - - for (U16 i = 0; i < 256; ++i) - { - if (i != 0 && redtable[i] != 0 && redtable[i] != 65535) - { - F64 b = (F64) i/256.0; - F64 a = (F64) redtable[i]/65535.0; - F32 c = (F32) (mLog(a)/mLog(b)); - - csum += c; - ++ccount; - } - } - g = csum/ccount; - - return true; -} - -//------------------------------------------------------------------------------ -bool OpenGLDevice::setGammaCorrection(F32 g) -{ - U16 redtable[256]; - U16 greentable[256]; - U16 bluetable[256]; - - for (U16 i = 0; i < 256; ++i) - redtable[i] = static_cast(mPow((F32) i/256.0f, g) * 65535.0f); - dMemcpy(greentable,redtable,256*sizeof(U16)); - dMemcpy(bluetable,redtable,256*sizeof(U16)); - - S32 ok = SDL_SetGammaRamp(redtable, greentable, bluetable); - if (ok == -1) - Con::warnf("Error setting gamma correction: %s", SDL_GetError()); - - return ok != -1; -} - -//------------------------------------------------------------------------------ -bool OpenGLDevice::setVerticalSync( bool on ) -{ - Con::printf("WARNING: OpenGLDevice::setVerticalSync is unimplemented %s %d\n", __FILE__, __LINE__); - return false; -#if 0 - if ( !gGLState.suppSwapInterval ) - return( false ); - - return( qwglSwapIntervalEXT( on ? 1 : 0 ) ); -#endif -} - -//------------------------------------------------------------------------------ -DisplayDevice* OpenGLDevice::create() -{ - return new OpenGLDevice(); -} - -#endif // 0 \ No newline at end of file diff --git a/Engine/source/platformX86UNIX/x86UNIXOGLVideo.h b/Engine/source/platformX86UNIX/x86UNIXOGLVideo.h deleted file mode 100644 index 63eb5c050..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXOGLVideo.h +++ /dev/null @@ -1,58 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#ifndef _X86UNIXOGLVIDEO_H_ -#define _X86UNIXOGLVIDEO_H_ - -#ifndef _PLATFORMVIDEO_H_ -#include "platform/platformVideo.h" -#endif - -class OpenGLDevice : public DisplayDevice -{ - static bool smCanSwitchBitDepth; - - bool mRestoreGamma; - U16 mOriginalRamp[256*3]; - - void addResolution(S32 width, S32 height, bool check=true); - - public: - OpenGLDevice(); - virtual ~OpenGLDevice(); - - void initDevice(); - bool activate( U32 width, U32 height, U32 bpp, bool fullScreen ); - void shutdown(); - void destroy(); - bool setScreenMode( U32 width, U32 height, U32 bpp, bool fullScreen, bool forceIt = false, bool repaint = true ); - void swapBuffers(); - const char* getDriverInfo(); - bool getGammaCorrection(F32 &g); - bool setGammaCorrection(F32 g); - bool setVerticalSync( bool on ); - void loadResolutions(); - - static DisplayDevice* create(); -}; - -#endif // _H_X86UNIXOGLVIDEO diff --git a/Engine/source/platformX86UNIX/x86UNIXOpenAL.client.cpp b/Engine/source/platformX86UNIX/x86UNIXOpenAL.client.cpp deleted file mode 100644 index 8e0c021ac..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXOpenAL.client.cpp +++ /dev/null @@ -1,285 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- -#if 0 -#include "platformX86UNIX/platformX86UNIX.h" -#include "console/console.h" - -#include - -#include -#include -#define INITGUID -#include - - -// Define the OpenAL and Extension Stub functions -#define AL_FUNCTION(fn_return, fn_name, fn_args, fn_value) fn_return stub_##fn_name fn_args{ fn_value } -#include -#include -#include -#undef AL_FUNCTION - - -// Declare the OpenAL and Extension Function pointers -// And initialize them to the stub functions -#define AL_FUNCTION(fn_return,fn_name,fn_args, fn_value) fn_return (*fn_name)fn_args = stub_##fn_name; -#include -#include -#include -#undef AL_FUNCTION - -// Declarations for the "emulated" functions (al functions that don't -// exist in the loki openal implementation) -ALboolean emu_alGetBoolean(ALenum param); -ALint emu_alGetInteger(ALenum param); -ALfloat emu_alGetFloat(ALenum param); -ALdouble emu_alGetDouble(ALenum param); -void emu_alListeneri( ALenum param, ALint value ); -void emu_alGetListener3f(ALenum pname,ALfloat *v1,ALfloat *v2,ALfloat *v3); -ALCdevice* emu_alcGetContextsDevice(ALCcontext *context); - -static void *dlHandle = NULL; -static char* dlError = "no error"; - -/*! Get an "emulated" function address and bind it to the function pointer -*/ -static bool bindEmulatedFunction(void *&fnAddress, const char *name) -{ - fnAddress = NULL; - - if (dStrcmp(name, "alGetBoolean")==0) - fnAddress = (void*)&emu_alGetBoolean; - else if (dStrcmp(name, "alGetInteger")==0) - fnAddress = (void*)&emu_alGetInteger; - else if (dStrcmp(name, "alGetFloat")==0) - fnAddress = (void*)&emu_alGetFloat; - else if (dStrcmp(name, "alGetDouble")==0) - fnAddress = (void*)&emu_alGetDouble; - else if (dStrcmp(name, "alListeneri")==0) - fnAddress = (void*)&emu_alListeneri; - else if (dStrcmp(name, "alGetListener3f")==0) - fnAddress = (void*)&emu_alGetListener3f; - else if (dStrcmp(name, "alcGetContextsDevice")==0) - fnAddress = (void*)&emu_alcGetContextsDevice; - - return fnAddress != NULL; -} - -/*! Get a function address from the OpenAL DLL and bind it to the -* function pointer -*/ -static bool bindFunction( void *&fnAddress, const char *name ) -{ - fnAddress = dlsym(dlHandle, name); - if( !fnAddress ) - if (bindEmulatedFunction(fnAddress, name)) - Con::warnf(ConsoleLogEntry::General, " Missing OpenAL function '%s', using emulated function", name); - else - Con::errorf(ConsoleLogEntry::General, " Missing OpenAL function '%s'", name); - return (fnAddress != NULL); -} - -/*! Get a function address for an OpenAL extension function and bind it -* to it's function pointer -*/ -static bool bindExtensionFunction( void *&fnAddress, const char *name ) -{ - fnAddress = alGetProcAddress( (ALubyte*)name ); - if( !fnAddress ) - Con::errorf(ConsoleLogEntry::General, " Missing OpenAL Extension function '%s'", name); - return (fnAddress != NULL); -} - -/*! Bind the functions in the OpenAL DLL to the al interface functions -*/ -static bool bindOpenALFunctions() -{ - bool result = true; - #define AL_FUNCTION(fn_return, fn_name, fn_args, fn_value) result &= bindFunction( *(void**)&fn_name, #fn_name); - #include - #include - #undef AL_FUNCTION - return result; -} - -/*! Bind the stub functions to the al interface functions -*/ -static void unbindOpenALFunctions() -{ - #define AL_FUNCTION(fn_return, fn_name, fn_args, fn_value) fn_name = stub_##fn_name; - #include - #include - #include - #undef AL_FUNCTION -} - -/*! Bind the EAX Extension functions to the EAX interface functions -*/ -static bool bindEAXFunctions() -{ - bool result = true; - #define AL_FUNCTION(fn_return, fn_name, fn_args, fn_value) result &= bindExtensionFunction( *(void**)&fn_name, #fn_name); - #include - #undef AL_FUNCTION - return result; -} - -// Definitions for the emulated functions -ALboolean emu_alGetBoolean(ALenum param) -{ - ALboolean alboolean; - alGetBooleanv(param, &alboolean); - return alboolean; -} - -ALint emu_alGetInteger(ALenum param) -{ - ALint alint; - alGetIntegerv(param, &alint); - return alint; -} - -ALfloat emu_alGetFloat(ALenum param) -{ - ALfloat alfloat; - alGetFloatv(param, &alfloat); - return alfloat; -} - -ALdouble emu_alGetDouble(ALenum param) -{ - ALdouble aldouble; - alGetDoublev(param, &aldouble); - return aldouble; -} - -void emu_alGetListener3f(ALenum pname,ALfloat *v0,ALfloat *v1,ALfloat *v2) -{ - ALfloat ptArray[10]; - ptArray[0] = *v0; - ptArray[1] = *v1; - ptArray[2] = *v2; - alGetListenerfv(pname, ptArray); - *v0 = ptArray[0]; - *v1 = ptArray[1]; - *v2 = ptArray[2]; -} - -void emu_alListeneri( ALenum param, ALint value ) -{ - alListenerf(param, static_cast(value)); -} - -ALCdevice* emu_alcGetContextsDevice(ALCcontext *context) -{ - // this function isn't emulated - AssertFatal(false, "alcGetContextsDevice is not available"); - return NULL; -} - -namespace Audio -{ - -/*! Shutdown and Unload the OpenAL DLL -*/ -void OpenALDLLShutdown() -{ - if (dlHandle != NULL) - { - dlclose(dlHandle); - // FreeBSD didn't like that const dlerror() was returning. - if ((dlError = (char *)dlerror()) != NULL) - Con::errorf(ConsoleLogEntry::General, " Error unloading OpenAL Library: %s", dlError); - } - dlHandle = NULL; - - unbindOpenALFunctions(); -} - -/*! Dynamically Loads the OpenAL DLL if present and binds all the functions. -* If there is no DLL or an unexpected error occurs binding functions the -* stub functions are automatically bound. -*/ -bool OpenALDLLInit() -{ - OpenALDLLShutdown(); - - const char* libName = "libopenal.so"; - - // these are relative to the current working directory - const char* searchPath[] = { - "lib", - "tplib", // superceeded by "lib", here for backass compatibility - "", // i.e.: current working directory - NULL // this must be last - }; - - char openalPath[4096]; - for (int i = 0; searchPath[i] != NULL; ++i) - { - dSprintf(openalPath, sizeof(openalPath), "%s/%s/%s", - Platform::getWorkingDirectory(), - searchPath[i], - libName); - - Con::printf(" Searching for OpenAl at location : %s", openalPath); - dlHandle = dlopen(openalPath, RTLD_NOW); - if (dlHandle != NULL) - { - // found it - Con::printf(" Loading OpenAL: %s", openalPath); - break; - } - } - - if (dlHandle == NULL) - { - // couldn't find it in our searchPath, try the system path - dlHandle = dlopen(libName, RTLD_NOW); - if (dlHandle != NULL) - Con::printf(" Loading OpenAL from system (dlopen) path"); - } - - if (dlHandle != NULL) - { - // if the DLL loaded bind the OpenAL function pointers - if(bindOpenALFunctions()) - { - // if EAX is available bind it's function pointers - if (alIsExtensionPresent((ALubyte*)"EAX" )) - bindEAXFunctions(); - return(true); - } - - // an error occured, shutdown - OpenALDLLShutdown(); - } - else - { - Con::errorf(ConsoleLogEntry::General, " Error loading OpenAL Library: %s", dlerror()); - } - return(false); -} - -} // end namespace Audio - -#endif //0 \ No newline at end of file diff --git a/Engine/source/platformX86UNIX/x86UNIXPlatform.cpp b/Engine/source/platformX86UNIX/x86UNIXPlatform.cpp deleted file mode 100644 index 4d72a7bbd..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXPlatform.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "platform/platform.h" -#ifndef TORQUE_SDL -bool Platform::openWebBrowser(const char* webAddress) -{ - String startingURL(webAddress); - String filteredURL; - - U32 length = startingURL.length(); - for(U32 i = 0; i < length; i++) - { - filteredURL = filteredURL + '\\' + startingURL[i]; - } - - String runCommand = "URL=" + filteredURL + "; xdg-open $URL > /dev/null 2> /dev/null"; - - S32 statusCode; - statusCode = system(runCommand.c_str()); - - if(statusCode == 0) - { - return true; - } - - return false; -} -#endif -#ifdef TORQUE_DEDICATED -// XA: New class for the unix unicode font -class PlatformFont; -PlatformFont *createPlatformFont(const char *name, dsize_t size, U32 charset /* = TGE_ANSI_CHARSET */) { return NULL; } -#endif diff --git a/Engine/source/platformX86UNIX/x86UNIXRedbook.cpp b/Engine/source/platformX86UNIX/x86UNIXRedbook.cpp deleted file mode 100644 index d24902230..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXRedbook.cpp +++ /dev/null @@ -1,269 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include "console/console.h" -#include "platformX86UNIX/platformX86UNIX.h" -#include "platform/platformRedBook.h" -#include "core/strings/stringFunctions.h" - -#if defined(__linux__) -#include -#include -#include -#include -#endif - -#include - -class SDL_CD; // TODO SDL remove - -class UnixRedBookDevice : public RedBookDevice -{ -#if !defined(__FreeBSD__) - private: - S32 mDeviceId; - SDL_CD *mCD; - cdrom_volctrl mOriginalVolume; - bool mVolumeInitialized; -#endif - bool mPlaying; - - void openVolume(); - void closeVolume(); - void setLastError(const char *); - - public: - UnixRedBookDevice(); - ~UnixRedBookDevice(); - - bool open(); - bool close(); - bool play(U32); - bool stop(); - bool getTrackCount(U32 *); - bool getVolume(F32 *); - bool setVolume(F32); - - bool isPlaying() { return mPlaying; } - bool updateStatus(); - void setDeviceInfo(S32 deviceId, const char *deviceName); -}; - -//------------------------------------------------------------------------------- -// Class: UnixRedBookDevice -//------------------------------------------------------------------------------- -UnixRedBookDevice::UnixRedBookDevice() -{ -#if !defined(__FreeBSD__) - mVolumeInitialized = false; - mDeviceId = -1; - mDeviceName = NULL; - mCD = NULL; - mPlaying = false; -#endif // !defined(__FreeBSD__) -} - -//------------------------------------------------------------------------------ -UnixRedBookDevice::~UnixRedBookDevice() -{ -#if !defined(__FreeBSD__) - close(); -#endif // !defined(__FreeBSD__) -} - -//------------------------------------------------------------------------------ -bool UnixRedBookDevice::updateStatus() -{ - return false; // TODO LINUX -} - -//------------------------------------------------------------------------------ -void UnixRedBookDevice::setDeviceInfo(S32 deviceId, const char *deviceName) -{ -#if !defined(__FreeBSD__) - mDeviceId = deviceId; - dsize_t deviceNameLen = dStrlen(deviceName) + 1; - mDeviceName = new char[deviceNameLen]; - dStrcpy(mDeviceName, deviceName, deviceNameLen); -#endif // !defined(__FreeBSD__) -} - -//------------------------------------------------------------------------------ -bool UnixRedBookDevice::open() -{ - return false; // TODO LINUX -} - -//------------------------------------------------------------------------------ -bool UnixRedBookDevice::close() -{ - return false; // TODO LINUX -} - -//------------------------------------------------------------------------------ -bool UnixRedBookDevice::play(U32 track) -{ - return false; // TODO LINUX -} - -//------------------------------------------------------------------------------ -bool UnixRedBookDevice::stop() -{ - return false; // TODO LINUX -} - -//------------------------------------------------------------------------------ -bool UnixRedBookDevice::getTrackCount(U32 * numTracks) -{ - return false; // TODO LINUX -} - -template -static inline Type max(Type v1, Type v2) -{ -#if !defined(__FreeBSD__) - if (v1 <= v2) - return v2; - else - return v1; -#endif // !defined(__FreeBSD__) -} -//------------------------------------------------------------------------------ -bool UnixRedBookDevice::getVolume(F32 * volume) -{ -#if !defined(__FreeBSD__) - if(!mAcquired) - { - setLastError("Device has not been acquired"); - return(false); - } - - if(!mVolumeInitialized) - { - setLastError("Volume failed to initialize"); - return(false); - } - -#if defined(__linux__) - AssertFatal(0, "SDL CD not implemented"); - return true; -#else - return(false); -#endif -#endif // !defined(__FreeBSD__) -} - -//------------------------------------------------------------------------------ -bool UnixRedBookDevice::setVolume(F32 volume) -{ -#if !defined(__FreeBSD__) - if(!mAcquired) - { - setLastError("Device has not been acquired"); - return(false); - } - - if(!mVolumeInitialized) - { - setLastError("Volume failed to initialize"); - return(false); - } - -#if defined(__linux__) - AssertFatal(0, "SDL CD not implemented"); - return true; -#else - return(false); -#endif -#endif // !defined(__FreeBSD__) -} - -//------------------------------------------------------------------------------ -void UnixRedBookDevice::openVolume() -{ -#if !defined(__FreeBSD__) -// Its unforunate that we have to do it this way, but SDL does not currently -// support setting CD audio volume -#if defined(__linux__) - AssertFatal(0, "SDL CD not implemented"); -#else - setLastError("Volume failed to initialize"); -#endif -#endif // !defined(__FreeBSD__) -} - -void UnixRedBookDevice::closeVolume() -{ -#if !defined(__FreeBSD__) - if(!mVolumeInitialized) - return; - -#if defined(__linux__) - AssertFatal(0, "SDL CD not implemented"); -#endif - - mVolumeInitialized = false; -#endif // !defined(__FreeBSD__) -} - -//------------------------------------------------------------------------------ -void UnixRedBookDevice::setLastError(const char * error) -{ -#if !defined(__FreeBSD__) - RedBook::setLastError(error); -#endif // !defined(__FreeBSD__) -} - -//------------------------------------------------------------------------------ -void InstallRedBookDevices() -{ - -} - -//------------------------------------------------------------------------------ -void PollRedbookDevices() -{ -#if !defined(__FreeBSD__) - UnixRedBookDevice *device = dynamic_cast(RedBook::getCurrentDevice()); - - if (device == NULL || !device->isPlaying()) - return; - - static const U32 PollDelay = 1000; - - static U32 lastPollTime = 0; - U32 curTime = Platform::getVirtualMilliseconds(); - - if (lastPollTime != 0 && - (curTime - lastPollTime) < PollDelay) - return; - - lastPollTime = curTime; - - if (device->isPlaying()) - { - device->updateStatus(); - if (!device->isPlaying()) - RedBook::handleCallback(RedBook::PlayFinished); - } -#endif // !defined(__FreeBSD__) -} From a24149ba3b0783d59e6fd95c46ddb101c75d87da Mon Sep 17 00:00:00 2001 From: Robert MacGregor Date: Sun, 14 Nov 2021 14:05:16 -0500 Subject: [PATCH 2/5] * Adjustment: Tweak the include paths for platformPOSIX.h. --- Engine/source/platformPOSIX/POSIXConsole.cpp | 2 +- Engine/source/platformPOSIX/POSIXFileio.cpp | 1263 ++++++++++++++++- Engine/source/platformPOSIX/POSIXMemory.cpp | 2 +- Engine/source/platformPOSIX/POSIXState.h | 2 +- Engine/source/platformPOSIX/POSIXStrings.cpp | 2 +- Engine/source/platformPOSIX/POSIXUtils.cpp | 2 +- .../platformPOSIX.h} | 4 +- .../source/platformX86UNIX/x86UNIXFileio.cpp | 1261 ---------------- 8 files changed, 1264 insertions(+), 1274 deletions(-) rename Engine/source/{platformX86UNIX/platformX86UNIX.h => platformPOSIX/platformPOSIX.h} (97%) delete mode 100644 Engine/source/platformX86UNIX/x86UNIXFileio.cpp diff --git a/Engine/source/platformPOSIX/POSIXConsole.cpp b/Engine/source/platformPOSIX/POSIXConsole.cpp index 5e9f810ec..28ed43be8 100644 --- a/Engine/source/platformPOSIX/POSIXConsole.cpp +++ b/Engine/source/platformPOSIX/POSIXConsole.cpp @@ -20,7 +20,7 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" #include "platformPOSIX/POSIXStdConsole.h" #include "platformPOSIX/POSIXUtils.h" #include "platform/input/event.h" diff --git a/Engine/source/platformPOSIX/POSIXFileio.cpp b/Engine/source/platformPOSIX/POSIXFileio.cpp index 8bdcea7b5..a9e6a7046 100644 --- a/Engine/source/platformPOSIX/POSIXFileio.cpp +++ b/Engine/source/platformPOSIX/POSIXFileio.cpp @@ -1,3 +1,62 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2012 GarageGames, LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +//----------------------------------------------------------------------------- + +/* JMQ: + + Here's the scoop on unix file IO. The windows platform makes some + assumptions about fileio: 1) the file system is case-insensitive, and + 2) the platform can write to the directory in which + the game is running. Both of these are usually false on linux. So, to + compensate, we "route" created files and directories to the user's home + directory (see GetPrefPath()). When a file is to be accessed, the code + looks in the home directory first. If the file is not found there and the + open mode is read only, the code will look in the game installation + directory. Files are never created or modified in the game directory. + + For case-sensitivity, the MungePath code will test whether a given path + specified by the engine exists. If not, it will use the ResolvePathCaseInsensitive function + which will try to determine if an actual filesystem path matches the + specified path case insensitive. If one is found, the actual path + transparently (we hope) replaces the one requested by the engine. + + The preference directory is global to all torque executables with the same + name. You should make sure you keep it clean if you build from multiple + torque development trees. +*/ + +#if defined(__FreeBSD__) +#include +#endif +#include + +/* these are for reading directors, getting stats, etc. */ +#include +#include +#include +#include +#include +#include +#include + #include "core/fileio.h" #include "core/util/tVector.h" #include "core/stringTable.h" @@ -7,10 +66,6 @@ #include "cinterface/c_controlInterface.h" #include "core/volume.h" -/* these are for reading directors, getting stats, etc. */ -#include -#include - const int MaxPath = PATH_MAX; //------------------------------------------------------------------------------ @@ -87,4 +142,1202 @@ bool ResolvePathCaseInsensitive(char* pathName, S32 pathNameSize, bool requiredA dStrncpy(pathName, tempBuf, pathNameSize); return foundMatch; -} \ No newline at end of file +} + +#ifndef __APPLE__ + +// evil hack to get around insane X windows #define-happy header files +#ifdef Status +#undef Status +#endif + +#include "platformX86UNIX/platformX86UNIX.h" + +extern int x86UNIXOpen(const char *path, int oflag); +extern int x86UNIXClose(int fd); +extern ssize_t x86UNIXRead(int fd, void *buf, size_t nbytes); +extern ssize_t x86UNIXWrite(int fd, const void *buf, size_t nbytes); +extern bool ResolvePathCaseInsensitive(char* pathName, S32 pathNameSize, bool requiredAbsolute); + +const int MaxPath = PATH_MAX; + +namespace +{ + const char sTempDir[] = "/tmp/"; + + static char sBinPathName[MaxPath] = ""; + static char *sBinName = sBinPathName; + bool sUseRedirect = true; +} + +StringTableEntry osGetTemporaryDirectory() +{ + return StringTable->insert(sTempDir); +} + +// Various handy utility functions: +//------------------------------------------------------------------------------ +// find all \ in a path and convert them in place to / +static void ForwardSlash(char *str) +{ + while(*str) + { + if(*str == '\\') + *str = '/'; + str++; + } +} + +//------------------------------------------------------------------------------ +// copy a file from src to dest +static bool CopyFile(const char* src, const char* dest) +{ + S32 srcFd = x86UNIXOpen(src, O_RDONLY); + S32 destFd = x86UNIXOpen(dest, O_WRONLY | O_CREAT | O_TRUNC); + bool error = false; + + if (srcFd != -1 && destFd != -1) + { + const int BufSize = 8192; + char buf[BufSize]; + S32 bytesRead = 0; + while ((bytesRead = x86UNIXRead(srcFd, buf, BufSize)) > 0) + { + // write data + if (x86UNIXWrite(destFd, buf, bytesRead) == -1) + { + error = true; + break; + } + } + + if (bytesRead == -1) + error = true; + } + + if (srcFd != -1) + x86UNIXClose(srcFd); + if (destFd != -1) + x86UNIXClose(destFd); + + if (error) + { + Con::errorf("Error copying file: %s, %s", src, dest); + remove(dest); + } + return error; +} + +bool dPathCopy(const char *fromName, const char *toName, bool nooverwrite) +{ + return CopyFile(fromName,toName); +} + +//----------------------------------------------------------------------------- +static char sgPrefDir[MaxPath]; +static bool sgPrefDirInitialized = false; + +// get the "pref dir", which is where game output files are stored. the pref +// dir is ~/PREF_DIR_ROOT/PREF_DIR_GAME_NAME +static const char* GetPrefDir() +{ + if (sgPrefDirInitialized) + return sgPrefDir; + + if (sUseRedirect) + { + const char *home = getenv("HOME"); + AssertFatal(home, "HOME environment variable must be set"); + + dSprintf(sgPrefDir, MaxPath, "%s/%s/%s", + home, PREF_DIR_ROOT, PREF_DIR_GAME_NAME); + } + else + { + getcwd(sgPrefDir, MaxPath); + } + + sgPrefDirInitialized = true; + return sgPrefDir; +} + +//----------------------------------------------------------------------------- +// Returns true if the pathname exists, false otherwise. If isFile is true, +// the pathname is assumed to be a file path, and only the directory part +// will be examined (everything before last /) +bool DirExists(char* pathname, bool isFile) +{ + static char testpath[20000]; + dStrncpy(testpath, pathname, sizeof(testpath)); + if (isFile) + { + // find the last / and make it into null + char* lastSlash = dStrrchr(testpath, '/'); + if (lastSlash != NULL) + *lastSlash = 0; + } + return Platform::isDirectory(testpath); +} + +//----------------------------------------------------------------------------- +// Munge the specified path. +static void MungePath(char* dest, S32 destSize, + const char* src, const char* absolutePrefix) +{ + char tempBuf[MaxPath]; + dStrncpy(dest, src, MaxPath); + + // translate all \ to / + ForwardSlash(dest); + + // if it is relative, make it absolute with the absolutePrefix + if (dest[0] != '/') + { + AssertFatal(absolutePrefix, "Absolute Prefix must not be NULL"); + + dSprintf(tempBuf, MaxPath, "%s/%s", + absolutePrefix, dest); + + // copy the result back into dest + dStrncpy(dest, tempBuf, destSize); + } + + // if the path exists, we're done + struct stat filestat; + if (stat(dest, &filestat) != -1) + return; + + // otherwise munge the case of the path + ResolvePathCaseInsensitive(dest, destSize, true); +} + +//----------------------------------------------------------------------------- +enum +{ + TOUCH, + DELETE +}; + +//----------------------------------------------------------------------------- +// perform a modification on the specified file. allowed modifications are +// specified in the enum above. +bool ModifyFile(const char * name, S32 modType) +{ + if(!name || (dStrlen(name) >= MaxPath) || dStrstr(name, "../") != NULL) + return(false); + + // if its absolute skip it + if (name[0]=='/' || name[0]=='\\') + return(false); + + // only modify files in home directory + char prefPathName[MaxPath]; + MungePath(prefPathName, MaxPath, name, GetPrefDir()); + + if (modType == TOUCH) + return(utime(prefPathName, 0) != -1); + else if (modType == DELETE) + return (remove(prefPathName) == 0); + else + AssertFatal(false, "Unknown File Mod type"); + return false; +} + +//----------------------------------------------------------------------------- +static bool RecurseDumpPath(const char *path, const char* relativePath, const char *pattern, Vector &fileVector, S32 currentDepth = 0, S32 recurseDepth = -1) +{ + char search[1024]; + + dSprintf(search, sizeof(search), "%s", path, pattern); + + DIR *directory = opendir(search); + + if (directory == NULL) + return false; + + struct dirent *fEntry; + fEntry = readdir(directory); // read the first "file" in the directory + + if (fEntry == NULL) + { + closedir(directory); + return false; + } + + do + { + char filename[BUFSIZ+1]; + struct stat fStat; + + dSprintf(filename, sizeof(filename), "%s/%s", search, fEntry->d_name); // "construct" the file name + stat(filename, &fStat); // get the file stats + + if ( (fStat.st_mode & S_IFMT) == S_IFDIR ) + { + // Directory + // skip . and .. directories + if (dStrcmp(fEntry->d_name, ".") == 0 || dStrcmp(fEntry->d_name, "..") == 0) + continue; + + // skip excluded directories + if( Platform::isExcludedDirectory(fEntry->d_name)) + continue; + + + char child[MaxPath]; + dSprintf(child, sizeof(child), "%s/%s", path, fEntry->d_name); + char* childRelative = NULL; + char childRelativeBuf[MaxPath]; + if (relativePath) + { + dSprintf(childRelativeBuf, sizeof(childRelativeBuf), "%s/%s", + relativePath, fEntry->d_name); + childRelative = childRelativeBuf; + } + if (currentDepth < recurseDepth || recurseDepth == -1 ) + RecurseDumpPath(child, childRelative, pattern, fileVector, currentDepth+1, recurseDepth); + } + else + { + // File + + // add it to the list + fileVector.increment(); + Platform::FileInfo& rInfo = fileVector.last(); + + if (relativePath) + rInfo.pFullPath = StringTable->insert(relativePath); + else + rInfo.pFullPath = StringTable->insert(path); + rInfo.pFileName = StringTable->insert(fEntry->d_name); + rInfo.fileSize = fStat.st_size; + //dPrintf("Adding file: %s/%s\n", rInfo.pFullPath, rInfo.pFileName); + } + + } while( (fEntry = readdir(directory)) != NULL ); + + closedir(directory); + return true; +} + +//----------------------------------------------------------------------------- +bool dFileDelete(const char * name) +{ + return ModifyFile(name, DELETE); +} + +//----------------------------------------------------------------------------- +bool dFileTouch(const char * name) +{ + return ModifyFile(name, TOUCH); +} + +bool dFileRename(const char *oldName, const char *newName) +{ + AssertFatal( oldName != NULL && newName != NULL, "dFileRename - NULL file name" ); + + // only modify files in home directory + TempAlloc oldPrefPathName(MaxPath); + TempAlloc newPrefPathName(MaxPath); + MungePath(oldPrefPathName, MaxPath, oldName, GetPrefDir()); + MungePath(newPrefPathName, MaxPath, newName, GetPrefDir()); + + return rename(oldPrefPathName, newPrefPathName) == 0; +} + +//----------------------------------------------------------------------------- +// Constructors & Destructor +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// After construction, the currentStatus will be Closed and the capabilities +// will be 0. +//----------------------------------------------------------------------------- +File::File() + : currentStatus(Closed), capability(0) +{ + // AssertFatal(sizeof(int) == sizeof(void *), "File::File: cannot cast void* to int"); + + handle = (void *)NULL; +} + +//----------------------------------------------------------------------------- +// insert a copy constructor here... (currently disabled) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Destructor +//----------------------------------------------------------------------------- +File::~File() +{ + close(); + handle = (void *)NULL; +} + +//----------------------------------------------------------------------------- +// Open a file in the mode specified by openMode (Read, Write, or ReadWrite). +// Truncate the file if the mode is either Write or ReadWrite and truncate is +// true. +// +// Sets capability appropriate to the openMode. +// Returns the currentStatus of the file. +//----------------------------------------------------------------------------- +File::FileStatus File::open(const char *filename, const AccessMode openMode) +{ + AssertFatal(NULL != filename, "File::open: NULL filename"); + AssertWarn(NULL == handle, "File::open: handle already valid"); + + // Close the file if it was already open... + if (Closed != currentStatus) + close(); + + char prefPathName[MaxPath]; + char gamePathName[MaxPath]; + char cwd[MaxPath]; + getcwd(cwd, MaxPath); + MungePath(prefPathName, MaxPath, filename, GetPrefDir()); + MungePath(gamePathName, MaxPath, filename, cwd); + + int oflag; + struct stat filestat; + handle = (void *)dRealMalloc(sizeof(int)); + + switch (openMode) + { + case Read: + oflag = O_RDONLY; + break; + case Write: + oflag = O_WRONLY | O_CREAT | O_TRUNC; + break; + case ReadWrite: + oflag = O_RDWR | O_CREAT; + // if the file does not exist copy it before reading/writing + if (stat(prefPathName, &filestat) == -1) + bool ret = CopyFile(gamePathName, prefPathName); + break; + case WriteAppend: + oflag = O_WRONLY | O_CREAT | O_APPEND; + // if the file does not exist copy it before appending + if (stat(prefPathName, &filestat) == -1) + bool ret = CopyFile(gamePathName, prefPathName); + break; + default: + AssertFatal(false, "File::open: bad access mode"); // impossible + } + + // if we are writing, make sure output path exists + if (openMode == Write || openMode == ReadWrite || openMode == WriteAppend) + Platform::createPath(prefPathName); + + int fd = -1; + fd = x86UNIXOpen(prefPathName, oflag); + if (fd == -1 && openMode == Read) + // for read only files we can use the gamePathName + fd = x86UNIXOpen(gamePathName, oflag); + + dMemcpy(handle, &fd, sizeof(int)); + +#ifdef DEBUG + // fprintf(stdout,"fd = %d, handle = %d\n", fd, *((int *)handle)); +#endif + + if (*((int *)handle) == -1) + { + // handle not created successfully + Con::errorf("Can't open file: %s", filename); + return setStatus(); + } + else + { + // successfully created file, so set the file capabilities... + switch (openMode) + { + case Read: + capability = U32(FileRead); + break; + case Write: + case WriteAppend: + capability = U32(FileWrite); + break; + case ReadWrite: + capability = U32(FileRead) | + U32(FileWrite); + break; + default: + AssertFatal(false, "File::open: bad access mode"); + } + return currentStatus = Ok; // success! + } +} + +//----------------------------------------------------------------------------- +// Get the current position of the file pointer. +//----------------------------------------------------------------------------- +U32 File::getPosition() const +{ + AssertFatal(Closed != currentStatus, "File::getPosition: file closed"); + AssertFatal(NULL != handle, "File::getPosition: invalid file handle"); + +#ifdef DEBUG + // fprintf(stdout, "handle = %d\n",*((int *)handle));fflush(stdout); +#endif + return (U32) lseek(*((int *)handle), 0, SEEK_CUR); +} + +//----------------------------------------------------------------------------- +// Set the position of the file pointer. +// Absolute and relative positioning is supported via the absolutePos +// parameter. +// +// If positioning absolutely, position MUST be positive - an IOError results if +// position is negative. +// Position can be negative if positioning relatively, however positioning +// before the start of the file is an IOError. +// +// Returns the currentStatus of the file. +//----------------------------------------------------------------------------- +File::FileStatus File::setPosition(S32 position, bool absolutePos) +{ + AssertFatal(Closed != currentStatus, "File::setPosition: file closed"); + AssertFatal(NULL != handle, "File::setPosition: invalid file handle"); + + if (Ok != currentStatus && EOS != currentStatus) + return currentStatus; + + U32 finalPos = 0; + + if (absolutePos) + { + AssertFatal(0 <= position, "File::setPosition: negative absolute position"); + + // position beyond EOS is OK + finalPos = lseek(*((int *)handle), position, SEEK_SET); + } + else + { + AssertFatal((getPosition() >= (U32)abs(position) && 0 > position) || 0 <= position, "File::setPosition: negative relative position"); + + // position beyond EOS is OK + finalPos = lseek(*((int *)handle), position, SEEK_CUR); + } + + if (0xffffffff == finalPos) + return setStatus(); // unsuccessful + else if (finalPos >= getSize()) + return currentStatus = EOS; // success, at end of file + else + return currentStatus = Ok; // success! +} + +//----------------------------------------------------------------------------- +// Get the size of the file in bytes. +// It is an error to query the file size for a Closed file, or for one with an +// error status. +//----------------------------------------------------------------------------- +U32 File::getSize() const +{ + AssertWarn(Closed != currentStatus, "File::getSize: file closed"); + AssertFatal(NULL != handle, "File::getSize: invalid file handle"); + + if (Ok == currentStatus || EOS == currentStatus) + { + long currentOffset = getPosition(); // keep track of our current position + long fileSize; + lseek(*((int *)handle), 0, SEEK_END); // seek to the end of the file + fileSize = getPosition(); // get the file size + lseek(*((int *)handle), currentOffset, SEEK_SET); // seek back to our old offset + return fileSize; // success! + } + else + return 0; // unsuccessful +} + +//----------------------------------------------------------------------------- +// Flush the file. +// It is an error to flush a read-only file. +// Returns the currentStatus of the file. +//----------------------------------------------------------------------------- +File::FileStatus File::flush() +{ + AssertFatal(Closed != currentStatus, "File::flush: file closed"); + AssertFatal(NULL != handle, "File::flush: invalid file handle"); + AssertFatal(true == hasCapability(FileWrite), "File::flush: cannot flush a read-only file"); + + if (fsync(*((int *)handle)) == 0) + return currentStatus = Ok; // success! + else + return setStatus(); // unsuccessful +} + +//----------------------------------------------------------------------------- +// Close the File. +// +// Returns the currentStatus +//----------------------------------------------------------------------------- +File::FileStatus File::close() +{ + // if the handle is non-NULL, close it if necessary and free it + if (NULL != handle) + { + // make a local copy of the handle value and + // free the handle + int handleVal = *((int *)handle); + dRealFree(handle); + handle = (void *)NULL; + + // close the handle if it is valid + if (handleVal != -1 && x86UNIXClose(handleVal) != 0) + return setStatus(); // unsuccessful + } + // Set the status to closed + return currentStatus = Closed; +} + +//----------------------------------------------------------------------------- +// Self-explanatory. +//----------------------------------------------------------------------------- +File::FileStatus File::getStatus() const +{ + return currentStatus; +} + +//----------------------------------------------------------------------------- +// Sets and returns the currentStatus when an error has been encountered. +//----------------------------------------------------------------------------- +File::FileStatus File::setStatus() +{ + Con::printf("File IO error: %s", strerror(errno)); + return currentStatus = IOError; +} + +//----------------------------------------------------------------------------- +// Sets and returns the currentStatus to status. +//----------------------------------------------------------------------------- +File::FileStatus File::setStatus(File::FileStatus status) +{ + return currentStatus = status; +} + +//----------------------------------------------------------------------------- +// Read from a file. +// The number of bytes to read is passed in size, the data is returned in src. +// The number of bytes read is available in bytesRead if a non-Null pointer is +// provided. +//----------------------------------------------------------------------------- +File::FileStatus File::read(U32 size, char *dst, U32 *bytesRead) +{ +#ifdef DEBUG + // fprintf(stdout,"reading %d bytes\n",size);fflush(stdout); +#endif + AssertFatal(Closed != currentStatus, "File::read: file closed"); + AssertFatal(NULL != handle, "File::read: invalid file handle"); + AssertFatal(NULL != dst, "File::read: NULL destination pointer"); + AssertFatal(true == hasCapability(FileRead), "File::read: file lacks capability"); + AssertWarn(0 != size, "File::read: size of zero"); + + /* show stats for this file */ +#ifdef DEBUG + //struct stat st; + //fstat(*((int *)handle), &st); + //fprintf(stdout,"file size = %d\n", st.st_size); +#endif + /****************************/ + + if (Ok != currentStatus || 0 == size) + return currentStatus; + else + { + long lastBytes; + long *bytes = (NULL == bytesRead) ? &lastBytes : (long *)bytesRead; + if ( (*((U32 *)bytes) = x86UNIXRead(*((int *)handle), dst, size)) == -1) + { +#ifdef DEBUG + // fprintf(stdout,"unsuccessful: %d\n", *((U32 *)bytes));fflush(stdout); +#endif + return setStatus(); // unsuccessful + } else { + // dst[*((U32 *)bytes)] = '\0'; + if (*((U32 *)bytes) != size || *((U32 *)bytes) == 0) { +#ifdef DEBUG + // fprintf(stdout,"end of stream: %d\n", *((U32 *)bytes));fflush(stdout); +#endif + return currentStatus = EOS; // end of stream + } + } + } + // dst[*bytesRead] = '\0'; +#ifdef DEBUG + //fprintf(stdout, "We read:\n"); + //fprintf(stdout, "====================================================\n"); + //fprintf(stdout, "%s\n",dst); + //fprintf(stdout, "====================================================\n"); + //fprintf(stdout,"read ok: %d\n", *bytesRead);fflush(stdout); +#endif + return currentStatus = Ok; // successfully read size bytes +} + +//----------------------------------------------------------------------------- +// Write to a file. +// The number of bytes to write is passed in size, the data is passed in src. +// The number of bytes written is available in bytesWritten if a non-Null +// pointer is provided. +//----------------------------------------------------------------------------- +File::FileStatus File::write(U32 size, const char *src, U32 *bytesWritten) +{ + // JMQ: despite the U32 parameters, the maximum filesize supported by this + // function is probably the max value of S32, due to the unix syscall + // api. + AssertFatal(Closed != currentStatus, "File::write: file closed"); + AssertFatal(NULL != handle, "File::write: invalid file handle"); + AssertFatal(NULL != src, "File::write: NULL source pointer"); + AssertFatal(true == hasCapability(FileWrite), "File::write: file lacks capability"); + AssertWarn(0 != size, "File::write: size of zero"); + + if ((Ok != currentStatus && EOS != currentStatus) || 0 == size) + return currentStatus; + else + { + S32 numWritten = x86UNIXWrite(*((int *)handle), src, size); + if (numWritten < 0) + return setStatus(); + + if (bytesWritten) + *bytesWritten = static_cast(numWritten); + return currentStatus = Ok; + } +} + +//----------------------------------------------------------------------------- +// Self-explanatory. JMQ: No explanation needed. Move along. These aren't +// the droids you're looking for. +//----------------------------------------------------------------------------- +bool File::hasCapability(Capability cap) const +{ + return (0 != (U32(cap) & capability)); +} + +//----------------------------------------------------------------------------- +S32 Platform::compareFileTimes(const FileTime &a, const FileTime &b) +{ + if(a > b) + return 1; + if(a < b) + return -1; + return 0; +} + +//----------------------------------------------------------------------------- +static bool GetFileTimes(const char *filePath, FileTime *createTime, FileTime *modifyTime) +{ + struct stat fStat; + + if (stat(filePath, &fStat) == -1) + return false; + + if(createTime) + { + // no where does SysV/BSD UNIX keep a record of a file's + // creation time. instead of creation time I'll just use + // changed time for now. + *createTime = fStat.st_ctime; + } + if(modifyTime) + { + *modifyTime = fStat.st_mtime; + } + + return true; +} + +//----------------------------------------------------------------------------- +bool Platform::getFileTimes(const char *filePath, FileTime *createTime, FileTime *modifyTime) +{ + char pathName[MaxPath]; + + // if it starts with cwd, we need to strip that off so that we can look for + // the file in the pref dir + char cwd[MaxPath]; + getcwd(cwd, MaxPath); + if (dStrstr(filePath, cwd) == filePath) + filePath = filePath + dStrlen(cwd) + 1; + + // if its relative, first look in the pref dir + if (filePath[0] != '/' && filePath[0] != '\\') + { + MungePath(pathName, MaxPath, filePath, GetPrefDir()); + if (GetFileTimes(pathName, createTime, modifyTime)) + return true; + } + + // here if the path is absolute or not in the pref dir + MungePath(pathName, MaxPath, filePath, cwd); + return GetFileTimes(pathName, createTime, modifyTime); +} + +//----------------------------------------------------------------------------- +bool Platform::createPath(const char *file) +{ + char pathbuf[MaxPath]; + const char *dir; + pathbuf[0] = 0; + U32 pathLen = 0; + + // all paths should be created in home directory + char prefPathName[MaxPath]; + MungePath(prefPathName, MaxPath, file, GetPrefDir()); + file = prefPathName; + + // does the directory exist already? + if (DirExists(prefPathName, true)) // true means that the path is a filepath + return true; + + while((dir = dStrchr(file, '/')) != NULL) + { + dStrncpy(pathbuf + pathLen, file, dir - file); + pathbuf[pathLen + dir-file] = 0; + bool ret = mkdir(pathbuf, 0700); + pathLen += dir - file; + pathbuf[pathLen++] = '/'; + file = dir + 1; + } + return true; +} + +// JMQ: Platform:cdFileExists in unimplemented +//------------------------------------------------------------------------------ +// bool Platform::cdFileExists(const char *filePath, const char *volumeName, +// S32 serialNum) +// { +// } + +//----------------------------------------------------------------------------- +bool Platform::dumpPath(const char *path, Vector &fileVector, int depth) +{ + const char* pattern = "*"; + + // if it is not absolute, dump the pref dir first + if (path[0] != '/' && path[0] != '\\') + { + char prefPathName[MaxPath]; + MungePath(prefPathName, MaxPath, path, GetPrefDir()); + RecurseDumpPath(prefPathName, path, pattern, fileVector, 0, depth); + } + + // munge the requested path and dump it + char mungedPath[MaxPath]; + char cwd[MaxPath]; + getcwd(cwd, MaxPath); + MungePath(mungedPath, MaxPath, path, cwd); + return RecurseDumpPath(mungedPath, path, pattern, fileVector, 0, depth); +} + +//----------------------------------------------------------------------------- +StringTableEntry Platform::getCurrentDirectory() +{ + char cwd_buf[2048]; + getcwd(cwd_buf, 2047); + return StringTable->insert(cwd_buf); +} + +//----------------------------------------------------------------------------- +bool Platform::setCurrentDirectory(StringTableEntry newDir) +{ + if (Platform::getWebDeployment()) + return true; + + TempAlloc< UTF8 > buf( dStrlen( newDir ) + 2 ); + + dStrcpy( buf, newDir, buf.size ); + + ForwardSlash( buf ); + return chdir( buf ) == 0; +} + +//----------------------------------------------------------------------------- +const char *Platform::getUserDataDirectory() +{ + return StringTable->insert( GetPrefDir() ); +} + +//----------------------------------------------------------------------------- +StringTableEntry Platform::getUserHomeDirectory() +{ + char *home = getenv( "HOME" ); + return StringTable->insert( home ); +} + +StringTableEntry Platform::getExecutablePath() +{ + if( !sBinPathName[0] ) + { + const char *cpath; + if( (cpath = torque_getexecutablepath()) ) + { + dStrncpy(sBinPathName, cpath, sizeof(sBinPathName)); + chdir(sBinPathName); + } + else + { + getcwd(sBinPathName, sizeof(sBinPathName)-1); + } + } + + return StringTable->insert(sBinPathName); +} + +//----------------------------------------------------------------------------- +bool Platform::isFile(const char *pFilePath) +{ + if (!pFilePath || !*pFilePath) + return false; + // Get file info + struct stat fStat; + if (stat(pFilePath, &fStat) < 0) + { + // Since file does not exist on disk see if it exists in a zip file loaded + return Torque::FS::IsFile(pFilePath); + } + + // if the file is a "regular file" then true + if ( (fStat.st_mode & S_IFMT) == S_IFREG) + return true; + // must be some other file (directory, device, etc.) + return false; +} + +//----------------------------------------------------------------------------- +S32 Platform::getFileSize(const char *pFilePath) +{ + if (!pFilePath || !*pFilePath) + return -1; + // Get the file info + struct stat fStat; + if (stat(pFilePath, &fStat) < 0) + return -1; + // if the file is a "regular file" then return the size + if ( (fStat.st_mode & S_IFMT) == S_IFREG) + return fStat.st_size; + // Must be something else or we can't read the file. + return -1; +} + +//----------------------------------------------------------------------------- +bool Platform::isDirectory(const char *pDirPath) +{ + if (!pDirPath || !*pDirPath) + return false; + + // Get file info + struct stat fStat; + if (stat(pDirPath, &fStat) < 0) + return false; + + // if the file is a Directory then true + if ( (fStat.st_mode & S_IFMT) == S_IFDIR) + return true; + + return false; +} + +//----------------------------------------------------------------------------- +bool Platform::isSubDirectory(const char *pParent, const char *pDir) +{ + if (!pParent || !*pDir) + return false; + + // this is somewhat of a brute force method but we need to be 100% sure + // that the user cannot enter things like ../dir or /dir etc,... + DIR *directory; + + directory = opendir(pParent); + if (directory == NULL) + return false; + + struct dirent *fEntry; + fEntry = readdir(directory); + if ( fEntry == NULL ) + { + closedir(directory); + return false; + } + + do + { + char dirBuf[MaxPath]; + struct stat fStat; + + dSprintf(dirBuf, sizeof(dirBuf), "%s/%s", pParent, fEntry->d_name); + if (stat(dirBuf, &fStat) < 0) + continue; + // if it is a directory... + if ( (fStat.st_mode & S_IFMT) == S_IFDIR) + { + // and the names match + if (dStrcmp(pDir, fEntry->d_name ) == 0) + { + // then we have a real sub directory + closedir(directory); + return true; + } + } + } while( (fEntry = readdir(directory)) != NULL ); + + closedir(directory); + return false; +} + +//----------------------------------------------------------------------------- + + +// This is untested -- BJG + +bool Platform::fileTimeToString(FileTime * time, char * string, U32 strLen) +{ + if(!time || !string) + return(false); + + dSprintf(string, strLen, "%ld", *time); + return(true); +} + +bool Platform::stringToFileTime(const char * string, FileTime * time) +{ + if(!time || !string) + return(false); + + *time = dAtoi(string); + + return(true); +} + +bool Platform::hasSubDirectory(const char *pPath) +{ + if (!pPath) + return false; + + struct dirent *d; + DIR *dip; + dip = opendir(pPath); + if (dip == NULL) + return false; + + while ((d = readdir(dip))) + { + bool isDir = false; + if (d->d_type == DT_UNKNOWN) + { + char child [1024]; + if ((pPath[dStrlen(pPath) - 1] == '/')) + dSprintf(child, 1024, "%s%s", pPath, d->d_name); + else + dSprintf(child, 1024, "%s/%s", pPath, d->d_name); + isDir = Platform::isDirectory (child); + } + else if (d->d_type & DT_DIR) + isDir = true; + if( isDir ) + { + // Skip the . and .. directories + if (dStrcmp(d->d_name, ".") == 0 ||dStrcmp(d->d_name, "..") == 0) + continue; + if (Platform::isExcludedDirectory(d->d_name)) + continue; + Platform::clearExcludedDirectories(); + closedir(dip); + return true; + } + } + closedir(dip); + Platform::clearExcludedDirectories(); + return false; +} + +bool Platform::fileDelete(const char * name) +{ + return ModifyFile(name, DELETE); +} + +static bool recurseDumpDirectories(const char *basePath, const char *subPath, Vector &directoryVector, S32 currentDepth, S32 recurseDepth, bool noBasePath) +{ + char Path[1024]; + DIR *dip; + struct dirent *d; + + dsize_t trLen = basePath ? dStrlen(basePath) : 0; + dsize_t subtrLen = subPath ? dStrlen(subPath) : 0; + char trail = trLen > 0 ? basePath[trLen - 1] : '\0'; + char subTrail = subtrLen > 0 ? subPath[subtrLen - 1] : '\0'; + char subLead = subtrLen > 0 ? subPath[0] : '\0'; + + if (trail == '/') + { + if (subPath && (dStrncmp(subPath, "", 1) != 0)) + { + if (subTrail == '/') + dSprintf(Path, 1024, "%s%s", basePath, subPath); + else + dSprintf(Path, 1024, "%s%s/", basePath, subPath); + } + else + dSprintf(Path, 1024, "%s", basePath); + } + else + { + if (subPath && (dStrncmp(subPath, "", 1) != 0)) + { + if (subTrail == '/') + dSprintf(Path, 1024, "%s%s", basePath, subPath); + else + dSprintf(Path, 1024, "%s%s/", basePath, subPath); + } + else + dSprintf(Path, 1024, "%s/", basePath); + } + + dip = opendir(Path); + if (dip == NULL) + return false; + + ////////////////////////////////////////////////////////////////////////// + // add path to our return list ( provided it is valid ) + ////////////////////////////////////////////////////////////////////////// + if (!Platform::isExcludedDirectory(subPath)) + { + if (noBasePath) + { + // We have a path and it's not an empty string or an excluded directory + if ( (subPath && (dStrncmp (subPath, "", 1) != 0)) ) + directoryVector.push_back(StringTable->insert(subPath)); + } + else + { + if ( (subPath && (dStrncmp(subPath, "", 1) != 0)) ) + { + char szPath[1024]; + dMemset(szPath, 0, 1024); + if (trail == '/') + { + if ((basePath[dStrlen(basePath) - 1]) != '/') + dSprintf(szPath, 1024, "%s%s", basePath, &subPath[1]); + else + dSprintf(szPath, 1024, "%s%s", basePath, subPath); + } + else + { + if ((basePath[dStrlen(basePath) - 1]) != '/') + dSprintf(szPath, 1024, "%s%s", basePath, subPath); + else + dSprintf(szPath, 1024, "%s/%s", basePath, subPath); + } + + directoryVector.push_back(StringTable->insert(szPath)); + } + else + directoryVector.push_back(StringTable->insert(basePath)); + } + } + ////////////////////////////////////////////////////////////////////////// + // Iterate through and grab valid directories + ////////////////////////////////////////////////////////////////////////// + + while ((d = readdir(dip))) + { + bool isDir; + isDir = false; + if (d->d_type == DT_UNKNOWN) + { + char child [1024]; + if (Path[dStrlen(Path) - 1] == '/') + dSprintf(child, 1024, "%s%s", Path, d->d_name); + else + dSprintf(child, 1024, "%s/%s", Path, d->d_name); + isDir = Platform::isDirectory (child); + } + else if (d->d_type & DT_DIR) + isDir = true; + + if ( isDir ) + { + if (dStrcmp(d->d_name, ".") == 0 || + dStrcmp(d->d_name, "..") == 0) + continue; + if (Platform::isExcludedDirectory(d->d_name)) + continue; + if ( (subPath && (dStrncmp(subPath, "", 1) != 0)) ) + { + char child[1024]; + if ((subPath[dStrlen(subPath) - 1] == '/')) + dSprintf(child, 1024, "%s%s", subPath, d->d_name); + else + dSprintf(child, 1024, "%s/%s", subPath, d->d_name); + if (currentDepth < recurseDepth || recurseDepth == -1 ) + recurseDumpDirectories(basePath, child, directoryVector, + currentDepth + 1, recurseDepth, + noBasePath); + } + else + { + char child[1024]; + if ( (basePath[dStrlen(basePath) - 1]) == '/') + dStrcpy (child, d->d_name, 1024); + else + dSprintf(child, 1024, "/%s", d->d_name); + if (currentDepth < recurseDepth || recurseDepth == -1) + recurseDumpDirectories(basePath, child, directoryVector, + currentDepth + 1, recurseDepth, + noBasePath); + } + } + } + closedir(dip); + return true; +} + +bool Platform::dumpDirectories(const char *path, Vector &directoryVector, S32 depth, bool noBasePath) +{ +#ifdef TORQUE_POSIX_PATH_CASE_INSENSITIVE + dsize_t pathLength = dStrlen(path); + char* caseSensitivePath = new char[pathLength + 1]; + + // Load path into temporary buffer + dMemcpy(caseSensitivePath, path, pathLength); + caseSensitivePath[pathLength] = 0x00; + ResolvePathCaseInsensitive(caseSensitivePath, pathLength, false); +#else + const char* caseSensitivePath = path; +#endif + + bool retVal = recurseDumpDirectories(caseSensitivePath, "", directoryVector, -1, depth, noBasePath); + clearExcludedDirectories(); + +#ifdef TORQUE_POSIX_PATH_CASE_INSENSITIVE + delete[] caseSensitivePath; +#endif + return retVal; +} + +StringTableEntry Platform::getExecutableName() +{ + return StringTable->insert(sBinName); +} + +extern "C" +{ +void setExePathName(const char* exePathName) +{ + if (exePathName == NULL) + sBinPathName[0] = '\0'; + else + dStrncpy(sBinPathName, exePathName, sizeof(sBinPathName)); + + // set the base exe name field + char *binName = dStrrchr(sBinPathName, '/'); + if( !binName ) + binName = sBinPathName; + else + *binName++ = '\0'; + sBinName = binName; +} +} +#endif \ No newline at end of file diff --git a/Engine/source/platformPOSIX/POSIXMemory.cpp b/Engine/source/platformPOSIX/POSIXMemory.cpp index ad08a313f..32b92c52c 100644 --- a/Engine/source/platformPOSIX/POSIXMemory.cpp +++ b/Engine/source/platformPOSIX/POSIXMemory.cpp @@ -20,7 +20,7 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" #include #include diff --git a/Engine/source/platformPOSIX/POSIXState.h b/Engine/source/platformPOSIX/POSIXState.h index 7d35667bc..dec62b2ee 100644 --- a/Engine/source/platformPOSIX/POSIXState.h +++ b/Engine/source/platformPOSIX/POSIXState.h @@ -21,7 +21,7 @@ //----------------------------------------------------------------------------- #include "math/mPoint2.h" -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" //#include "platformX86UNIX/platformGL.h" #include "core/strings/stringFunctions.h" diff --git a/Engine/source/platformPOSIX/POSIXStrings.cpp b/Engine/source/platformPOSIX/POSIXStrings.cpp index f531409d9..f4b69c16b 100644 --- a/Engine/source/platformPOSIX/POSIXStrings.cpp +++ b/Engine/source/platformPOSIX/POSIXStrings.cpp @@ -20,7 +20,7 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" #include "core/strings/stringFunctions.h" #include #include diff --git a/Engine/source/platformPOSIX/POSIXUtils.cpp b/Engine/source/platformPOSIX/POSIXUtils.cpp index b87d92c49..fc5c416ff 100644 --- a/Engine/source/platformPOSIX/POSIXUtils.cpp +++ b/Engine/source/platformPOSIX/POSIXUtils.cpp @@ -31,7 +31,7 @@ #include #include -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" #include "platformPOSIX/POSIXUtils.h" UnixUtils *UUtils = NULL; diff --git a/Engine/source/platformX86UNIX/platformX86UNIX.h b/Engine/source/platformPOSIX/platformPOSIX.h similarity index 97% rename from Engine/source/platformX86UNIX/platformX86UNIX.h rename to Engine/source/platformPOSIX/platformPOSIX.h index 19481dd31..0f4d7828b 100644 --- a/Engine/source/platformX86UNIX/platformX86UNIX.h +++ b/Engine/source/platformPOSIX/platformPOSIX.h @@ -20,8 +20,7 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- -#ifndef _PLATFORMX86UNIX_H_ -#define _PLATFORMX86UNIX_H_ +#pragma once #ifndef _PLATFORM_H_ #include "platform/platform.h" @@ -66,4 +65,3 @@ extern "C" // x86UNIX doesn't have a way to automatically get the executable file name void setExePathName(const char* exePathName); } -#endif diff --git a/Engine/source/platformX86UNIX/x86UNIXFileio.cpp b/Engine/source/platformX86UNIX/x86UNIXFileio.cpp deleted file mode 100644 index d702d6417..000000000 --- a/Engine/source/platformX86UNIX/x86UNIXFileio.cpp +++ /dev/null @@ -1,1261 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - - /* JMQ: - - Here's the scoop on unix file IO. The windows platform makes some - assumptions about fileio: 1) the file system is case-insensitive, and - 2) the platform can write to the directory in which - the game is running. Both of these are usually false on linux. So, to - compensate, we "route" created files and directories to the user's home - directory (see GetPrefPath()). When a file is to be accessed, the code - looks in the home directory first. If the file is not found there and the - open mode is read only, the code will look in the game installation - directory. Files are never created or modified in the game directory. - - For case-sensitivity, the MungePath code will test whether a given path - specified by the engine exists. If not, it will use the ResolvePathCaseInsensitive function - which will try to determine if an actual filesystem path matches the - specified path case insensitive. If one is found, the actual path - transparently (we hope) replaces the one requested by the engine. - - The preference directory is global to all torque executables with the same - name. You should make sure you keep it clean if you build from multiple - torque development trees. - */ - - // evil hack to get around insane X windows #define-happy header files - #ifdef Status - #undef Status - #endif - - #include "platformX86UNIX/platformX86UNIX.h" - #include "core/fileio.h" - #include "core/util/tVector.h" - #include "core/stringTable.h" - #include "console/console.h" - #include "core/strings/stringFunctions.h" - #include "util/tempAlloc.h" - #include "cinterface/c_controlInterface.h" - #include "core/volume.h" - - #if defined(__FreeBSD__) - #include - #endif - #include - - /* these are for reading directors, getting stats, etc. */ - #include - #include - #include - #include - #include - #include - #include - - extern int x86UNIXOpen(const char *path, int oflag); - extern int x86UNIXClose(int fd); - extern ssize_t x86UNIXRead(int fd, void *buf, size_t nbytes); - extern ssize_t x86UNIXWrite(int fd, const void *buf, size_t nbytes); - extern bool ResolvePathCaseInsensitive(char* pathName, S32 pathNameSize, bool requiredAbsolute); - - const int MaxPath = PATH_MAX; - - namespace - { - const char sTempDir[] = "/tmp/"; - - static char sBinPathName[MaxPath] = ""; - static char *sBinName = sBinPathName; - bool sUseRedirect = true; - } - - StringTableEntry osGetTemporaryDirectory() - { - return StringTable->insert(sTempDir); - } - - // Various handy utility functions: - //------------------------------------------------------------------------------ - // find all \ in a path and convert them in place to / - static void ForwardSlash(char *str) - { - while(*str) - { - if(*str == '\\') - *str = '/'; - str++; - } - } - - //------------------------------------------------------------------------------ - // copy a file from src to dest - static bool CopyFile(const char* src, const char* dest) - { - S32 srcFd = x86UNIXOpen(src, O_RDONLY); - S32 destFd = x86UNIXOpen(dest, O_WRONLY | O_CREAT | O_TRUNC); - bool error = false; - - if (srcFd != -1 && destFd != -1) - { - const int BufSize = 8192; - char buf[BufSize]; - S32 bytesRead = 0; - while ((bytesRead = x86UNIXRead(srcFd, buf, BufSize)) > 0) - { - // write data - if (x86UNIXWrite(destFd, buf, bytesRead) == -1) - { - error = true; - break; - } - } - - if (bytesRead == -1) - error = true; - } - - if (srcFd != -1) - x86UNIXClose(srcFd); - if (destFd != -1) - x86UNIXClose(destFd); - - if (error) - { - Con::errorf("Error copying file: %s, %s", src, dest); - remove(dest); - } - return error; - } - -bool dPathCopy(const char *fromName, const char *toName, bool nooverwrite) -{ - return CopyFile(fromName,toName); -} - - //----------------------------------------------------------------------------- - static char sgPrefDir[MaxPath]; - static bool sgPrefDirInitialized = false; - - // get the "pref dir", which is where game output files are stored. the pref - // dir is ~/PREF_DIR_ROOT/PREF_DIR_GAME_NAME - static const char* GetPrefDir() - { - if (sgPrefDirInitialized) - return sgPrefDir; - - if (sUseRedirect) - { - const char *home = getenv("HOME"); - AssertFatal(home, "HOME environment variable must be set"); - - dSprintf(sgPrefDir, MaxPath, "%s/%s/%s", - home, PREF_DIR_ROOT, PREF_DIR_GAME_NAME); - } - else - { - getcwd(sgPrefDir, MaxPath); - } - - sgPrefDirInitialized = true; - return sgPrefDir; - } - - //----------------------------------------------------------------------------- - // Returns true if the pathname exists, false otherwise. If isFile is true, - // the pathname is assumed to be a file path, and only the directory part - // will be examined (everything before last /) - bool DirExists(char* pathname, bool isFile) - { - static char testpath[20000]; - dStrncpy(testpath, pathname, sizeof(testpath)); - if (isFile) - { - // find the last / and make it into null - char* lastSlash = dStrrchr(testpath, '/'); - if (lastSlash != NULL) - *lastSlash = 0; - } - return Platform::isDirectory(testpath); - } - - //----------------------------------------------------------------------------- - // Munge the specified path. - static void MungePath(char* dest, S32 destSize, - const char* src, const char* absolutePrefix) - { - char tempBuf[MaxPath]; - dStrncpy(dest, src, MaxPath); - - // translate all \ to / - ForwardSlash(dest); - - // if it is relative, make it absolute with the absolutePrefix - if (dest[0] != '/') - { - AssertFatal(absolutePrefix, "Absolute Prefix must not be NULL"); - - dSprintf(tempBuf, MaxPath, "%s/%s", - absolutePrefix, dest); - - // copy the result back into dest - dStrncpy(dest, tempBuf, destSize); - } - - // if the path exists, we're done - struct stat filestat; - if (stat(dest, &filestat) != -1) - return; - - // otherwise munge the case of the path - ResolvePathCaseInsensitive(dest, destSize, true); - } - - //----------------------------------------------------------------------------- - enum - { - TOUCH, - DELETE - }; - - //----------------------------------------------------------------------------- - // perform a modification on the specified file. allowed modifications are - // specified in the enum above. - bool ModifyFile(const char * name, S32 modType) - { - if(!name || (dStrlen(name) >= MaxPath) || dStrstr(name, "../") != NULL) - return(false); - - // if its absolute skip it - if (name[0]=='/' || name[0]=='\\') - return(false); - - // only modify files in home directory - char prefPathName[MaxPath]; - MungePath(prefPathName, MaxPath, name, GetPrefDir()); - - if (modType == TOUCH) - return(utime(prefPathName, 0) != -1); - else if (modType == DELETE) - return (remove(prefPathName) == 0); - else - AssertFatal(false, "Unknown File Mod type"); - return false; - } - - //----------------------------------------------------------------------------- - static bool RecurseDumpPath(const char *path, const char* relativePath, const char *pattern, Vector &fileVector, S32 currentDepth = 0, S32 recurseDepth = -1) - { - char search[1024]; - - dSprintf(search, sizeof(search), "%s", path, pattern); - - DIR *directory = opendir(search); - - if (directory == NULL) - return false; - - struct dirent *fEntry; - fEntry = readdir(directory); // read the first "file" in the directory - - if (fEntry == NULL) - { - closedir(directory); - return false; - } - - do - { - char filename[BUFSIZ+1]; - struct stat fStat; - - dSprintf(filename, sizeof(filename), "%s/%s", search, fEntry->d_name); // "construct" the file name - stat(filename, &fStat); // get the file stats - - if ( (fStat.st_mode & S_IFMT) == S_IFDIR ) - { - // Directory - // skip . and .. directories - if (dStrcmp(fEntry->d_name, ".") == 0 || dStrcmp(fEntry->d_name, "..") == 0) - continue; - - // skip excluded directories - if( Platform::isExcludedDirectory(fEntry->d_name)) - continue; - - - char child[MaxPath]; - dSprintf(child, sizeof(child), "%s/%s", path, fEntry->d_name); - char* childRelative = NULL; - char childRelativeBuf[MaxPath]; - if (relativePath) - { - dSprintf(childRelativeBuf, sizeof(childRelativeBuf), "%s/%s", - relativePath, fEntry->d_name); - childRelative = childRelativeBuf; - } - if (currentDepth < recurseDepth || recurseDepth == -1 ) - RecurseDumpPath(child, childRelative, pattern, fileVector, currentDepth+1, recurseDepth); - } - else - { - // File - - // add it to the list - fileVector.increment(); - Platform::FileInfo& rInfo = fileVector.last(); - - if (relativePath) - rInfo.pFullPath = StringTable->insert(relativePath); - else - rInfo.pFullPath = StringTable->insert(path); - rInfo.pFileName = StringTable->insert(fEntry->d_name); - rInfo.fileSize = fStat.st_size; - //dPrintf("Adding file: %s/%s\n", rInfo.pFullPath, rInfo.pFileName); - } - - } while( (fEntry = readdir(directory)) != NULL ); - - closedir(directory); - return true; - } - - //----------------------------------------------------------------------------- - bool dFileDelete(const char * name) - { - return ModifyFile(name, DELETE); - } - - //----------------------------------------------------------------------------- - bool dFileTouch(const char * name) - { - return ModifyFile(name, TOUCH); - } - - bool dFileRename(const char *oldName, const char *newName) - { - AssertFatal( oldName != NULL && newName != NULL, "dFileRename - NULL file name" ); - - // only modify files in home directory - TempAlloc oldPrefPathName(MaxPath); - TempAlloc newPrefPathName(MaxPath); - MungePath(oldPrefPathName, MaxPath, oldName, GetPrefDir()); - MungePath(newPrefPathName, MaxPath, newName, GetPrefDir()); - - return rename(oldPrefPathName, newPrefPathName) == 0; - } - - //----------------------------------------------------------------------------- - // Constructors & Destructor - //----------------------------------------------------------------------------- - - //----------------------------------------------------------------------------- - // After construction, the currentStatus will be Closed and the capabilities - // will be 0. - //----------------------------------------------------------------------------- - File::File() - : currentStatus(Closed), capability(0) - { - // AssertFatal(sizeof(int) == sizeof(void *), "File::File: cannot cast void* to int"); - - handle = (void *)NULL; - } - - //----------------------------------------------------------------------------- - // insert a copy constructor here... (currently disabled) - //----------------------------------------------------------------------------- - - //----------------------------------------------------------------------------- - // Destructor - //----------------------------------------------------------------------------- - File::~File() - { - close(); - handle = (void *)NULL; - } - - //----------------------------------------------------------------------------- - // Open a file in the mode specified by openMode (Read, Write, or ReadWrite). - // Truncate the file if the mode is either Write or ReadWrite and truncate is - // true. - // - // Sets capability appropriate to the openMode. - // Returns the currentStatus of the file. - //----------------------------------------------------------------------------- - File::FileStatus File::open(const char *filename, const AccessMode openMode) - { - AssertFatal(NULL != filename, "File::open: NULL filename"); - AssertWarn(NULL == handle, "File::open: handle already valid"); - - // Close the file if it was already open... - if (Closed != currentStatus) - close(); - - char prefPathName[MaxPath]; - char gamePathName[MaxPath]; - char cwd[MaxPath]; - getcwd(cwd, MaxPath); - MungePath(prefPathName, MaxPath, filename, GetPrefDir()); - MungePath(gamePathName, MaxPath, filename, cwd); - - int oflag; - struct stat filestat; - handle = (void *)dRealMalloc(sizeof(int)); - - switch (openMode) - { - case Read: - oflag = O_RDONLY; - break; - case Write: - oflag = O_WRONLY | O_CREAT | O_TRUNC; - break; - case ReadWrite: - oflag = O_RDWR | O_CREAT; - // if the file does not exist copy it before reading/writing - if (stat(prefPathName, &filestat) == -1) - bool ret = CopyFile(gamePathName, prefPathName); - break; - case WriteAppend: - oflag = O_WRONLY | O_CREAT | O_APPEND; - // if the file does not exist copy it before appending - if (stat(prefPathName, &filestat) == -1) - bool ret = CopyFile(gamePathName, prefPathName); - break; - default: - AssertFatal(false, "File::open: bad access mode"); // impossible - } - - // if we are writing, make sure output path exists - if (openMode == Write || openMode == ReadWrite || openMode == WriteAppend) - Platform::createPath(prefPathName); - - int fd = -1; - fd = x86UNIXOpen(prefPathName, oflag); - if (fd == -1 && openMode == Read) - // for read only files we can use the gamePathName - fd = x86UNIXOpen(gamePathName, oflag); - - dMemcpy(handle, &fd, sizeof(int)); - - #ifdef DEBUG - // fprintf(stdout,"fd = %d, handle = %d\n", fd, *((int *)handle)); - #endif - - if (*((int *)handle) == -1) - { - // handle not created successfully - Con::errorf("Can't open file: %s", filename); - return setStatus(); - } - else - { - // successfully created file, so set the file capabilities... - switch (openMode) - { - case Read: - capability = U32(FileRead); - break; - case Write: - case WriteAppend: - capability = U32(FileWrite); - break; - case ReadWrite: - capability = U32(FileRead) | - U32(FileWrite); - break; - default: - AssertFatal(false, "File::open: bad access mode"); - } - return currentStatus = Ok; // success! - } - } - - //----------------------------------------------------------------------------- - // Get the current position of the file pointer. - //----------------------------------------------------------------------------- - U32 File::getPosition() const - { - AssertFatal(Closed != currentStatus, "File::getPosition: file closed"); - AssertFatal(NULL != handle, "File::getPosition: invalid file handle"); - - #ifdef DEBUG - // fprintf(stdout, "handle = %d\n",*((int *)handle));fflush(stdout); - #endif - return (U32) lseek(*((int *)handle), 0, SEEK_CUR); - } - - //----------------------------------------------------------------------------- - // Set the position of the file pointer. - // Absolute and relative positioning is supported via the absolutePos - // parameter. - // - // If positioning absolutely, position MUST be positive - an IOError results if - // position is negative. - // Position can be negative if positioning relatively, however positioning - // before the start of the file is an IOError. - // - // Returns the currentStatus of the file. - //----------------------------------------------------------------------------- - File::FileStatus File::setPosition(S32 position, bool absolutePos) - { - AssertFatal(Closed != currentStatus, "File::setPosition: file closed"); - AssertFatal(NULL != handle, "File::setPosition: invalid file handle"); - - if (Ok != currentStatus && EOS != currentStatus) - return currentStatus; - - U32 finalPos = 0; - - if (absolutePos) - { - AssertFatal(0 <= position, "File::setPosition: negative absolute position"); - - // position beyond EOS is OK - finalPos = lseek(*((int *)handle), position, SEEK_SET); - } - else - { - AssertFatal((getPosition() >= (U32)abs(position) && 0 > position) || 0 <= position, "File::setPosition: negative relative position"); - - // position beyond EOS is OK - finalPos = lseek(*((int *)handle), position, SEEK_CUR); - } - - if (0xffffffff == finalPos) - return setStatus(); // unsuccessful - else if (finalPos >= getSize()) - return currentStatus = EOS; // success, at end of file - else - return currentStatus = Ok; // success! - } - - //----------------------------------------------------------------------------- - // Get the size of the file in bytes. - // It is an error to query the file size for a Closed file, or for one with an - // error status. - //----------------------------------------------------------------------------- - U32 File::getSize() const - { - AssertWarn(Closed != currentStatus, "File::getSize: file closed"); - AssertFatal(NULL != handle, "File::getSize: invalid file handle"); - - if (Ok == currentStatus || EOS == currentStatus) - { - long currentOffset = getPosition(); // keep track of our current position - long fileSize; - lseek(*((int *)handle), 0, SEEK_END); // seek to the end of the file - fileSize = getPosition(); // get the file size - lseek(*((int *)handle), currentOffset, SEEK_SET); // seek back to our old offset - return fileSize; // success! - } - else - return 0; // unsuccessful - } - - //----------------------------------------------------------------------------- - // Flush the file. - // It is an error to flush a read-only file. - // Returns the currentStatus of the file. - //----------------------------------------------------------------------------- - File::FileStatus File::flush() - { - AssertFatal(Closed != currentStatus, "File::flush: file closed"); - AssertFatal(NULL != handle, "File::flush: invalid file handle"); - AssertFatal(true == hasCapability(FileWrite), "File::flush: cannot flush a read-only file"); - - if (fsync(*((int *)handle)) == 0) - return currentStatus = Ok; // success! - else - return setStatus(); // unsuccessful - } - - //----------------------------------------------------------------------------- - // Close the File. - // - // Returns the currentStatus - //----------------------------------------------------------------------------- - File::FileStatus File::close() - { - // if the handle is non-NULL, close it if necessary and free it - if (NULL != handle) - { - // make a local copy of the handle value and - // free the handle - int handleVal = *((int *)handle); - dRealFree(handle); - handle = (void *)NULL; - - // close the handle if it is valid - if (handleVal != -1 && x86UNIXClose(handleVal) != 0) - return setStatus(); // unsuccessful - } - // Set the status to closed - return currentStatus = Closed; - } - - //----------------------------------------------------------------------------- - // Self-explanatory. - //----------------------------------------------------------------------------- - File::FileStatus File::getStatus() const - { - return currentStatus; - } - - //----------------------------------------------------------------------------- - // Sets and returns the currentStatus when an error has been encountered. - //----------------------------------------------------------------------------- - File::FileStatus File::setStatus() - { - Con::printf("File IO error: %s", strerror(errno)); - return currentStatus = IOError; - } - - //----------------------------------------------------------------------------- - // Sets and returns the currentStatus to status. - //----------------------------------------------------------------------------- - File::FileStatus File::setStatus(File::FileStatus status) - { - return currentStatus = status; - } - - //----------------------------------------------------------------------------- - // Read from a file. - // The number of bytes to read is passed in size, the data is returned in src. - // The number of bytes read is available in bytesRead if a non-Null pointer is - // provided. - //----------------------------------------------------------------------------- - File::FileStatus File::read(U32 size, char *dst, U32 *bytesRead) - { - #ifdef DEBUG - // fprintf(stdout,"reading %d bytes\n",size);fflush(stdout); - #endif - AssertFatal(Closed != currentStatus, "File::read: file closed"); - AssertFatal(NULL != handle, "File::read: invalid file handle"); - AssertFatal(NULL != dst, "File::read: NULL destination pointer"); - AssertFatal(true == hasCapability(FileRead), "File::read: file lacks capability"); - AssertWarn(0 != size, "File::read: size of zero"); - - /* show stats for this file */ - #ifdef DEBUG - //struct stat st; - //fstat(*((int *)handle), &st); - //fprintf(stdout,"file size = %d\n", st.st_size); - #endif - /****************************/ - - if (Ok != currentStatus || 0 == size) - return currentStatus; - else - { - long lastBytes; - long *bytes = (NULL == bytesRead) ? &lastBytes : (long *)bytesRead; - if ( (*((U32 *)bytes) = x86UNIXRead(*((int *)handle), dst, size)) == -1) - { - #ifdef DEBUG - // fprintf(stdout,"unsuccessful: %d\n", *((U32 *)bytes));fflush(stdout); - #endif - return setStatus(); // unsuccessful - } else { - // dst[*((U32 *)bytes)] = '\0'; - if (*((U32 *)bytes) != size || *((U32 *)bytes) == 0) { - #ifdef DEBUG - // fprintf(stdout,"end of stream: %d\n", *((U32 *)bytes));fflush(stdout); - #endif - return currentStatus = EOS; // end of stream - } - } - } - // dst[*bytesRead] = '\0'; - #ifdef DEBUG - //fprintf(stdout, "We read:\n"); - //fprintf(stdout, "====================================================\n"); - //fprintf(stdout, "%s\n",dst); - //fprintf(stdout, "====================================================\n"); - //fprintf(stdout,"read ok: %d\n", *bytesRead);fflush(stdout); - #endif - return currentStatus = Ok; // successfully read size bytes - } - - //----------------------------------------------------------------------------- - // Write to a file. - // The number of bytes to write is passed in size, the data is passed in src. - // The number of bytes written is available in bytesWritten if a non-Null - // pointer is provided. - //----------------------------------------------------------------------------- - File::FileStatus File::write(U32 size, const char *src, U32 *bytesWritten) - { - // JMQ: despite the U32 parameters, the maximum filesize supported by this - // function is probably the max value of S32, due to the unix syscall - // api. - AssertFatal(Closed != currentStatus, "File::write: file closed"); - AssertFatal(NULL != handle, "File::write: invalid file handle"); - AssertFatal(NULL != src, "File::write: NULL source pointer"); - AssertFatal(true == hasCapability(FileWrite), "File::write: file lacks capability"); - AssertWarn(0 != size, "File::write: size of zero"); - - if ((Ok != currentStatus && EOS != currentStatus) || 0 == size) - return currentStatus; - else - { - S32 numWritten = x86UNIXWrite(*((int *)handle), src, size); - if (numWritten < 0) - return setStatus(); - - if (bytesWritten) - *bytesWritten = static_cast(numWritten); - return currentStatus = Ok; - } - } - - //----------------------------------------------------------------------------- - // Self-explanatory. JMQ: No explanation needed. Move along. These aren't - // the droids you're looking for. - //----------------------------------------------------------------------------- - bool File::hasCapability(Capability cap) const - { - return (0 != (U32(cap) & capability)); - } - - //----------------------------------------------------------------------------- - S32 Platform::compareFileTimes(const FileTime &a, const FileTime &b) - { - if(a > b) - return 1; - if(a < b) - return -1; - return 0; - } - - //----------------------------------------------------------------------------- - static bool GetFileTimes(const char *filePath, FileTime *createTime, FileTime *modifyTime) - { - struct stat fStat; - - if (stat(filePath, &fStat) == -1) - return false; - - if(createTime) - { - // no where does SysV/BSD UNIX keep a record of a file's - // creation time. instead of creation time I'll just use - // changed time for now. - *createTime = fStat.st_ctime; - } - if(modifyTime) - { - *modifyTime = fStat.st_mtime; - } - - return true; - } - - //----------------------------------------------------------------------------- - bool Platform::getFileTimes(const char *filePath, FileTime *createTime, FileTime *modifyTime) - { - char pathName[MaxPath]; - - // if it starts with cwd, we need to strip that off so that we can look for - // the file in the pref dir - char cwd[MaxPath]; - getcwd(cwd, MaxPath); - if (dStrstr(filePath, cwd) == filePath) - filePath = filePath + dStrlen(cwd) + 1; - - // if its relative, first look in the pref dir - if (filePath[0] != '/' && filePath[0] != '\\') - { - MungePath(pathName, MaxPath, filePath, GetPrefDir()); - if (GetFileTimes(pathName, createTime, modifyTime)) - return true; - } - - // here if the path is absolute or not in the pref dir - MungePath(pathName, MaxPath, filePath, cwd); - return GetFileTimes(pathName, createTime, modifyTime); - } - - //----------------------------------------------------------------------------- - bool Platform::createPath(const char *file) - { - char pathbuf[MaxPath]; - const char *dir; - pathbuf[0] = 0; - U32 pathLen = 0; - - // all paths should be created in home directory - char prefPathName[MaxPath]; - MungePath(prefPathName, MaxPath, file, GetPrefDir()); - file = prefPathName; - - // does the directory exist already? - if (DirExists(prefPathName, true)) // true means that the path is a filepath - return true; - - while((dir = dStrchr(file, '/')) != NULL) - { - dStrncpy(pathbuf + pathLen, file, dir - file); - pathbuf[pathLen + dir-file] = 0; - bool ret = mkdir(pathbuf, 0700); - pathLen += dir - file; - pathbuf[pathLen++] = '/'; - file = dir + 1; - } - return true; - } - - // JMQ: Platform:cdFileExists in unimplemented - //------------------------------------------------------------------------------ - // bool Platform::cdFileExists(const char *filePath, const char *volumeName, - // S32 serialNum) - // { - // } - - //----------------------------------------------------------------------------- - bool Platform::dumpPath(const char *path, Vector &fileVector, int depth) - { - const char* pattern = "*"; - - // if it is not absolute, dump the pref dir first - if (path[0] != '/' && path[0] != '\\') - { - char prefPathName[MaxPath]; - MungePath(prefPathName, MaxPath, path, GetPrefDir()); - RecurseDumpPath(prefPathName, path, pattern, fileVector, 0, depth); - } - - // munge the requested path and dump it - char mungedPath[MaxPath]; - char cwd[MaxPath]; - getcwd(cwd, MaxPath); - MungePath(mungedPath, MaxPath, path, cwd); - return RecurseDumpPath(mungedPath, path, pattern, fileVector, 0, depth); - } - - //----------------------------------------------------------------------------- - StringTableEntry Platform::getCurrentDirectory() - { - char cwd_buf[2048]; - getcwd(cwd_buf, 2047); - return StringTable->insert(cwd_buf); - } - - //----------------------------------------------------------------------------- - bool Platform::setCurrentDirectory(StringTableEntry newDir) - { - if (Platform::getWebDeployment()) - return true; - - TempAlloc< UTF8 > buf( dStrlen( newDir ) + 2 ); - - dStrcpy( buf, newDir, buf.size ); - - ForwardSlash( buf ); - return chdir( buf ) == 0; - } - - //----------------------------------------------------------------------------- - const char *Platform::getUserDataDirectory() - { - return StringTable->insert( GetPrefDir() ); - } - - //----------------------------------------------------------------------------- - StringTableEntry Platform::getUserHomeDirectory() - { - char *home = getenv( "HOME" ); - return StringTable->insert( home ); - } - - StringTableEntry Platform::getExecutablePath() -{ - if( !sBinPathName[0] ) - { - const char *cpath; - if( (cpath = torque_getexecutablepath()) ) - { - dStrncpy(sBinPathName, cpath, sizeof(sBinPathName)); - chdir(sBinPathName); - } - else - { - getcwd(sBinPathName, sizeof(sBinPathName)-1); - } - } - - return StringTable->insert(sBinPathName); -} - - //----------------------------------------------------------------------------- - bool Platform::isFile(const char *pFilePath) - { - if (!pFilePath || !*pFilePath) - return false; - // Get file info - struct stat fStat; - if (stat(pFilePath, &fStat) < 0) - { - // Since file does not exist on disk see if it exists in a zip file loaded - return Torque::FS::IsFile(pFilePath); - } - - // if the file is a "regular file" then true - if ( (fStat.st_mode & S_IFMT) == S_IFREG) - return true; - // must be some other file (directory, device, etc.) - return false; - } - - //----------------------------------------------------------------------------- - S32 Platform::getFileSize(const char *pFilePath) - { - if (!pFilePath || !*pFilePath) - return -1; - // Get the file info - struct stat fStat; - if (stat(pFilePath, &fStat) < 0) - return -1; - // if the file is a "regular file" then return the size - if ( (fStat.st_mode & S_IFMT) == S_IFREG) - return fStat.st_size; - // Must be something else or we can't read the file. - return -1; - } - - //----------------------------------------------------------------------------- - bool Platform::isDirectory(const char *pDirPath) - { - if (!pDirPath || !*pDirPath) - return false; - - // Get file info - struct stat fStat; - if (stat(pDirPath, &fStat) < 0) - return false; - - // if the file is a Directory then true - if ( (fStat.st_mode & S_IFMT) == S_IFDIR) - return true; - - return false; - } - - //----------------------------------------------------------------------------- - bool Platform::isSubDirectory(const char *pParent, const char *pDir) - { - if (!pParent || !*pDir) - return false; - - // this is somewhat of a brute force method but we need to be 100% sure - // that the user cannot enter things like ../dir or /dir etc,... - DIR *directory; - - directory = opendir(pParent); - if (directory == NULL) - return false; - - struct dirent *fEntry; - fEntry = readdir(directory); - if ( fEntry == NULL ) - { - closedir(directory); - return false; - } - - do - { - char dirBuf[MaxPath]; - struct stat fStat; - - dSprintf(dirBuf, sizeof(dirBuf), "%s/%s", pParent, fEntry->d_name); - if (stat(dirBuf, &fStat) < 0) - continue; - // if it is a directory... - if ( (fStat.st_mode & S_IFMT) == S_IFDIR) - { - // and the names match - if (dStrcmp(pDir, fEntry->d_name ) == 0) - { - // then we have a real sub directory - closedir(directory); - return true; - } - } - } while( (fEntry = readdir(directory)) != NULL ); - - closedir(directory); - return false; - } - - //----------------------------------------------------------------------------- - - - // This is untested -- BJG - - bool Platform::fileTimeToString(FileTime * time, char * string, U32 strLen) - { - if(!time || !string) - return(false); - - dSprintf(string, strLen, "%ld", *time); - return(true); - } - - bool Platform::stringToFileTime(const char * string, FileTime * time) - { - if(!time || !string) - return(false); - - *time = dAtoi(string); - - return(true); - } - - bool Platform::hasSubDirectory(const char *pPath) - { - if (!pPath) - return false; - - struct dirent *d; - DIR *dip; - dip = opendir(pPath); - if (dip == NULL) - return false; - - while ((d = readdir(dip))) - { - bool isDir = false; - if (d->d_type == DT_UNKNOWN) - { - char child [1024]; - if ((pPath[dStrlen(pPath) - 1] == '/')) - dSprintf(child, 1024, "%s%s", pPath, d->d_name); - else - dSprintf(child, 1024, "%s/%s", pPath, d->d_name); - isDir = Platform::isDirectory (child); - } - else if (d->d_type & DT_DIR) - isDir = true; - if( isDir ) - { - // Skip the . and .. directories - if (dStrcmp(d->d_name, ".") == 0 ||dStrcmp(d->d_name, "..") == 0) - continue; - if (Platform::isExcludedDirectory(d->d_name)) - continue; - Platform::clearExcludedDirectories(); - closedir(dip); - return true; - } - } - closedir(dip); - Platform::clearExcludedDirectories(); - return false; - } - - bool Platform::fileDelete(const char * name) - { - return ModifyFile(name, DELETE); - } - - static bool recurseDumpDirectories(const char *basePath, const char *subPath, Vector &directoryVector, S32 currentDepth, S32 recurseDepth, bool noBasePath) - { - char Path[1024]; - DIR *dip; - struct dirent *d; - - dsize_t trLen = basePath ? dStrlen(basePath) : 0; - dsize_t subtrLen = subPath ? dStrlen(subPath) : 0; - char trail = trLen > 0 ? basePath[trLen - 1] : '\0'; - char subTrail = subtrLen > 0 ? subPath[subtrLen - 1] : '\0'; - char subLead = subtrLen > 0 ? subPath[0] : '\0'; - - if (trail == '/') - { - if (subPath && (dStrncmp(subPath, "", 1) != 0)) - { - if (subTrail == '/') - dSprintf(Path, 1024, "%s%s", basePath, subPath); - else - dSprintf(Path, 1024, "%s%s/", basePath, subPath); - } - else - dSprintf(Path, 1024, "%s", basePath); - } - else - { - if (subPath && (dStrncmp(subPath, "", 1) != 0)) - { - if (subTrail == '/') - dSprintf(Path, 1024, "%s%s", basePath, subPath); - else - dSprintf(Path, 1024, "%s%s/", basePath, subPath); - } - else - dSprintf(Path, 1024, "%s/", basePath); - } - - dip = opendir(Path); - if (dip == NULL) - return false; - - ////////////////////////////////////////////////////////////////////////// - // add path to our return list ( provided it is valid ) - ////////////////////////////////////////////////////////////////////////// - if (!Platform::isExcludedDirectory(subPath)) - { - if (noBasePath) - { - // We have a path and it's not an empty string or an excluded directory - if ( (subPath && (dStrncmp (subPath, "", 1) != 0)) ) - directoryVector.push_back(StringTable->insert(subPath)); - } - else - { - if ( (subPath && (dStrncmp(subPath, "", 1) != 0)) ) - { - char szPath[1024]; - dMemset(szPath, 0, 1024); - if (trail == '/') - { - if ((basePath[dStrlen(basePath) - 1]) != '/') - dSprintf(szPath, 1024, "%s%s", basePath, &subPath[1]); - else - dSprintf(szPath, 1024, "%s%s", basePath, subPath); - } - else - { - if ((basePath[dStrlen(basePath) - 1]) != '/') - dSprintf(szPath, 1024, "%s%s", basePath, subPath); - else - dSprintf(szPath, 1024, "%s/%s", basePath, subPath); - } - - directoryVector.push_back(StringTable->insert(szPath)); - } - else - directoryVector.push_back(StringTable->insert(basePath)); - } - } - ////////////////////////////////////////////////////////////////////////// - // Iterate through and grab valid directories - ////////////////////////////////////////////////////////////////////////// - - while ((d = readdir(dip))) - { - bool isDir; - isDir = false; - if (d->d_type == DT_UNKNOWN) - { - char child [1024]; - if (Path[dStrlen(Path) - 1] == '/') - dSprintf(child, 1024, "%s%s", Path, d->d_name); - else - dSprintf(child, 1024, "%s/%s", Path, d->d_name); - isDir = Platform::isDirectory (child); - } - else if (d->d_type & DT_DIR) - isDir = true; - - if ( isDir ) - { - if (dStrcmp(d->d_name, ".") == 0 || - dStrcmp(d->d_name, "..") == 0) - continue; - if (Platform::isExcludedDirectory(d->d_name)) - continue; - if ( (subPath && (dStrncmp(subPath, "", 1) != 0)) ) - { - char child[1024]; - if ((subPath[dStrlen(subPath) - 1] == '/')) - dSprintf(child, 1024, "%s%s", subPath, d->d_name); - else - dSprintf(child, 1024, "%s/%s", subPath, d->d_name); - if (currentDepth < recurseDepth || recurseDepth == -1 ) - recurseDumpDirectories(basePath, child, directoryVector, - currentDepth + 1, recurseDepth, - noBasePath); - } - else - { - char child[1024]; - if ( (basePath[dStrlen(basePath) - 1]) == '/') - dStrcpy (child, d->d_name, 1024); - else - dSprintf(child, 1024, "/%s", d->d_name); - if (currentDepth < recurseDepth || recurseDepth == -1) - recurseDumpDirectories(basePath, child, directoryVector, - currentDepth + 1, recurseDepth, - noBasePath); - } - } - } - closedir(dip); - return true; - } - - bool Platform::dumpDirectories(const char *path, Vector &directoryVector, S32 depth, bool noBasePath) - { -#ifdef TORQUE_POSIX_PATH_CASE_INSENSITIVE - dsize_t pathLength = dStrlen(path); - char* caseSensitivePath = new char[pathLength + 1]; - - // Load path into temporary buffer - dMemcpy(caseSensitivePath, path, pathLength); - caseSensitivePath[pathLength] = 0x00; - ResolvePathCaseInsensitive(caseSensitivePath, pathLength, false); -#else - const char* caseSensitivePath = path; -#endif - - bool retVal = recurseDumpDirectories(caseSensitivePath, "", directoryVector, -1, depth, noBasePath); - clearExcludedDirectories(); - -#ifdef TORQUE_POSIX_PATH_CASE_INSENSITIVE - delete[] caseSensitivePath; -#endif - return retVal; - } - -StringTableEntry Platform::getExecutableName() -{ - return StringTable->insert(sBinName); -} - -extern "C" -{ - void setExePathName(const char* exePathName) - { - if (exePathName == NULL) - sBinPathName[0] = '\0'; - else - dStrncpy(sBinPathName, exePathName, sizeof(sBinPathName)); - - // set the base exe name field - char *binName = dStrrchr(sBinPathName, '/'); - if( !binName ) - binName = sBinPathName; - else - *binName++ = '\0'; - sBinName = binName; - } -} From 247b12e79549e78e270050a766701ef00e011f78 Mon Sep 17 00:00:00 2001 From: Robert MacGregor Date: Sun, 14 Nov 2021 14:45:42 -0500 Subject: [PATCH 3/5] * BugFix: Correct many include paths and build platformX11 on non-Apple Unix. --- Engine/source/platformPOSIX/POSIXCPUInfo.cpp | 2 +- Engine/source/platformPOSIX/POSIXFileio.cpp | 4 +--- Engine/source/platformPOSIX/POSIXMain.cpp | 2 +- Engine/source/platformPOSIX/POSIXProcessControl.cpp | 2 +- Engine/source/platformPOSIX/POSIXTime.cpp | 2 +- Engine/source/platformX11/X11Font.client.cpp | 4 ++-- Tools/CMake/torque3d.cmake | 10 +++++++--- 7 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Engine/source/platformPOSIX/POSIXCPUInfo.cpp b/Engine/source/platformPOSIX/POSIXCPUInfo.cpp index 33b79425e..279d23f1a 100644 --- a/Engine/source/platformPOSIX/POSIXCPUInfo.cpp +++ b/Engine/source/platformPOSIX/POSIXCPUInfo.cpp @@ -23,7 +23,7 @@ #ifndef __APPLE__ #include "platform/platform.h" -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" #include "console/console.h" #include "core/stringTable.h" #include "core/strings/stringFunctions.h" diff --git a/Engine/source/platformPOSIX/POSIXFileio.cpp b/Engine/source/platformPOSIX/POSIXFileio.cpp index a9e6a7046..c21e427ba 100644 --- a/Engine/source/platformPOSIX/POSIXFileio.cpp +++ b/Engine/source/platformPOSIX/POSIXFileio.cpp @@ -151,7 +151,7 @@ bool ResolvePathCaseInsensitive(char* pathName, S32 pathNameSize, bool requiredA #undef Status #endif -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" extern int x86UNIXOpen(const char *path, int oflag); extern int x86UNIXClose(int fd); @@ -159,8 +159,6 @@ extern ssize_t x86UNIXRead(int fd, void *buf, size_t nbytes); extern ssize_t x86UNIXWrite(int fd, const void *buf, size_t nbytes); extern bool ResolvePathCaseInsensitive(char* pathName, S32 pathNameSize, bool requiredAbsolute); -const int MaxPath = PATH_MAX; - namespace { const char sTempDir[] = "/tmp/"; diff --git a/Engine/source/platformPOSIX/POSIXMain.cpp b/Engine/source/platformPOSIX/POSIXMain.cpp index dda611967..3e873a27b 100644 --- a/Engine/source/platformPOSIX/POSIXMain.cpp +++ b/Engine/source/platformPOSIX/POSIXMain.cpp @@ -26,7 +26,7 @@ #include "platform/platformInput.h" #include "console/console.h" -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" #include "platformPOSIX/POSIXStdConsole.h" #include "platformPOSIX/POSIXState.h" diff --git a/Engine/source/platformPOSIX/POSIXProcessControl.cpp b/Engine/source/platformPOSIX/POSIXProcessControl.cpp index 0d8725d0b..745240dd5 100644 --- a/Engine/source/platformPOSIX/POSIXProcessControl.cpp +++ b/Engine/source/platformPOSIX/POSIXProcessControl.cpp @@ -22,7 +22,7 @@ #ifndef __APPLE__ -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" #include "platformPOSIX/POSIXState.h" #include "platformPOSIX/POSIXStdConsole.h" #include "platform/platformInput.h" diff --git a/Engine/source/platformPOSIX/POSIXTime.cpp b/Engine/source/platformPOSIX/POSIXTime.cpp index 15d733389..2519b479f 100644 --- a/Engine/source/platformPOSIX/POSIXTime.cpp +++ b/Engine/source/platformPOSIX/POSIXTime.cpp @@ -22,7 +22,7 @@ #ifndef __APPLE__ -#include "platformX86UNIX/platformX86UNIX.h" +#include "platformPOSIX/platformPOSIX.h" #include "platform/platformTimer.h" #include "time.h" #include diff --git a/Engine/source/platformX11/X11Font.client.cpp b/Engine/source/platformX11/X11Font.client.cpp index 402392c9a..2cdfbacac 100644 --- a/Engine/source/platformX11/X11Font.client.cpp +++ b/Engine/source/platformX11/X11Font.client.cpp @@ -26,8 +26,8 @@ #include "console/console.h" #include "core/strings/unicode.h" #include "core/stringTable.h" -#include "platformX86UNIX/platformX86UNIX.h" -#include "platformX86UNIX/x86UNIXFont.h" +#include "platformPOSIX/platformPOSIX.h" +#include "platformX11/X11Font.h" // Needed by createFont #include diff --git a/Tools/CMake/torque3d.cmake b/Tools/CMake/torque3d.cmake index eadc2673a..759e64f01 100644 --- a/Tools/CMake/torque3d.cmake +++ b/Tools/CMake/torque3d.cmake @@ -80,7 +80,7 @@ if(WIN32) set(ALSOFT_INSTALL_HRTF_DATA OFF CACHE BOOL "Install HRTF definition files" FORCE) set(ALSOFT_INSTALL_AMBDEC_PRESETS OFF CACHE BOOL "Install AmbDec presets" FORCE) set(ALSOFT_EMBED_HRTF_DATA OFF CACHE BOOL "Embed the HRTF data (increases library footprint)" FORCE) - + add_subdirectory( ${libDir}/openal-soft ${CMAKE_CURRENT_BINARY_DIR}/openal-soft) endif() @@ -241,7 +241,7 @@ if(WIN32) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4018") # warning C4244: 'initializing' : conversion from 'XXX' to 'XXX', possible loss of data set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4244") - if(TORQUE_SFX_DirectX) + if(TORQUE_SFX_DirectX) if( TORQUE_CPU_X64 ) link_directories($ENV{DXSDK_DIR}/Lib/x64) else() @@ -599,11 +599,15 @@ if(APPLE) addPath("${srcDir}/platformPOSIX") endif() +if (UNIX AND NOT APPLE) + addPath("${srcDir}/platformX11") +endif() + if(UNIX AND NOT APPLE) # linux_dedicated if(TORQUE_DEDICATED) addPath("${srcDir}/windowManager/dedicated") - # ${srcDir}/platformX86UNIX/*.client.* files are not needed + # ${srcDir}/UNIX/*.client.* files are not needed # @todo: move to separate file file( GLOB tmp_files ${srcDir}/platformX86UNIX/*.cpp From d1fde1f54bde62d154cbc0a87a7e231890acbe16 Mon Sep 17 00:00:00 2001 From: Robert MacGregor Date: Wed, 17 Nov 2021 21:58:17 -0500 Subject: [PATCH 4/5] * Cleanup: Fully remove the DisplayPtrManager class as it was not actually being used by anything. --- Engine/source/platformPOSIX/POSIXState.h | 94 +----------------------- 1 file changed, 1 insertion(+), 93 deletions(-) diff --git a/Engine/source/platformPOSIX/POSIXState.h b/Engine/source/platformPOSIX/POSIXState.h index dec62b2ee..4aaa2fa43 100644 --- a/Engine/source/platformPOSIX/POSIXState.h +++ b/Engine/source/platformPOSIX/POSIXState.h @@ -33,12 +33,8 @@ typedef void (*LockFunc_t)(void); -class DisplayPtrManager; - class x86UNIXPlatformState { - friend class DisplayPtrManager; - private: Point2I mDesktopSize; Point2I mWindowSize; @@ -170,92 +166,4 @@ class x86UNIXPlatformState } }; -extern x86UNIXPlatformState * x86UNIXState; - -class DisplayPtrManager -{ - // static interface - private: - static bool sgDisplayLocked; - static LockFunc_t sgLockFunc; - static LockFunc_t sgUnlockFunc; - - static bool lockDisplay() - { - if (!sgDisplayLocked && sgLockFunc) - { - sgLockFunc(); - sgDisplayLocked = true; - return true; - } - else - return false; - } - static void unlockDisplay() - { - if (sgDisplayLocked && sgUnlockFunc) - { - sgUnlockFunc(); - sgDisplayLocked = false; - } - } - - //friend Display* x86UNIXPlatformState::getDisplayPointer(); - - public: - static void setDisplayLockFunction(LockFunc_t lockFunc) - { sgLockFunc = lockFunc; } - static void setDisplayUnlockFunction(LockFunc_t unlockFunc) - { sgUnlockFunc = unlockFunc; } - - // nonstatic interface - private: - bool mAcquiredLock; // true if this instance acquired the display lock - // (multiple instances of DisplayPtrManager can coexist, but only - // the first to access the display pointer will be responsible for - // acquiring and releasing the lock) - bool mOpenedDisplay; // true if this instance created a display pointer - // because the one in platform state was null. - Display* mDisplay; - - private: - Display* openDisplay() - { - return mDisplay; - } - - void closeDisplay() - { - if (mOpenedDisplay) - { - - } - } - public: - DisplayPtrManager() - { - mAcquiredLock = false; - mOpenedDisplay = false; - mDisplay = NULL; - } - - ~DisplayPtrManager() - { - if (mAcquiredLock) - { - DisplayPtrManager::unlockDisplay(); - mAcquiredLock = false; - } - closeDisplay(); - } - - Display* getDisplayPointer() - { - Display* display = x86UNIXState->getDisplayPointer(); - if (display == NULL) - return openDisplay(); - - mAcquiredLock = DisplayPtrManager::lockDisplay(); - return display; - } -}; +extern x86UNIXPlatformState * x86UNIXState; \ No newline at end of file From 88cfa4533b77bc5d9e78b382272d7a13bdf978df Mon Sep 17 00:00:00 2001 From: Robert MacGregor Date: Wed, 17 Nov 2021 22:08:08 -0500 Subject: [PATCH 5/5] * Cleanup: Remove a comment referencing the now-removed DisplayPtrManager. --- Engine/source/platformPOSIX/POSIXState.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Engine/source/platformPOSIX/POSIXState.h b/Engine/source/platformPOSIX/POSIXState.h index 4aaa2fa43..381379495 100644 --- a/Engine/source/platformPOSIX/POSIXState.h +++ b/Engine/source/platformPOSIX/POSIXState.h @@ -54,13 +54,7 @@ class x86UNIXPlatformState bool mCDAudioEnabled; bool mDSleep; bool mUseRedirect; - - // Access to the display* needs to be controlled because the SDL event - // loop runs in a separate thread. If you need the display pointer, - // use the DisplayPtrManager class. See the clipboard functions in - // x86unixinput.cc for an example. - //Display *getDisplayPointer() { return mDisplay; } - + public: U32 currentTime;