Merged default into ig_elevaton_port_to_linux
--HG-- branch : ig_elevaton_port_to_linuxhg/feature/sse2
commit
41a475b8f3
@ -0,0 +1,149 @@
|
|||||||
|
IF(DEFINED CMAKE_CROSSCOMPILING)
|
||||||
|
# subsequent toolchain loading is not really needed
|
||||||
|
RETURN()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
# Standard settings
|
||||||
|
SET(CMAKE_SYSTEM_NAME Linux)
|
||||||
|
SET(CMAKE_SYSTEM_VERSION 1) # TODO: determine target Linux version
|
||||||
|
SET(UNIX ON)
|
||||||
|
SET(LINUX ON)
|
||||||
|
SET(ANDROID ON)
|
||||||
|
|
||||||
|
IF(NOT NDK_ROOT)
|
||||||
|
SET(NDK_ROOT $ENV{NDK_ROOT})
|
||||||
|
|
||||||
|
IF(CMAKE_HOST_WIN32)
|
||||||
|
FILE(TO_CMAKE_PATH ${NDK_ROOT} NDK_ROOT)
|
||||||
|
ENDIF(CMAKE_HOST_WIN32)
|
||||||
|
ENDIF(NOT NDK_ROOT)
|
||||||
|
|
||||||
|
IF(NOT TARGET_CPU)
|
||||||
|
SET(TARGET_CPU "armv7")
|
||||||
|
ENDIF(NOT TARGET_CPU)
|
||||||
|
|
||||||
|
IF(TARGET_CPU STREQUAL "armv7")
|
||||||
|
SET(LIBRARY_ARCHITECTURE "armeabi-v7a")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "armv7")
|
||||||
|
SET(TOOLCHAIN_ARCH "arm")
|
||||||
|
SET(TOOLCHAIN_PREFIX "arm-linux-androideabi")
|
||||||
|
SET(TOOLCHAIN_BIN_PREFIX "arm")
|
||||||
|
SET(MINIMUM_NDK_TARGET 4)
|
||||||
|
ELSEIF(TARGET_CPU STREQUAL "armv5")
|
||||||
|
SET(LIBRARY_ARCHITECTURE "armeabi")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "armv5")
|
||||||
|
SET(TOOLCHAIN_ARCH "arm")
|
||||||
|
SET(TOOLCHAIN_PREFIX "arm-linux-androideabi")
|
||||||
|
SET(TOOLCHAIN_BIN_PREFIX "arm")
|
||||||
|
SET(MINIMUM_NDK_TARGET 4)
|
||||||
|
ELSEIF(TARGET_CPU STREQUAL "x86")
|
||||||
|
SET(LIBRARY_ARCHITECTURE "x86")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "x86")
|
||||||
|
SET(TOOLCHAIN_ARCH "x86")
|
||||||
|
SET(TOOLCHAIN_PREFIX "x86")
|
||||||
|
SET(TOOLCHAIN_BIN_PREFIX "i686")
|
||||||
|
SET(MINIMUM_NDK_TARGET 9)
|
||||||
|
ELSEIF(TARGET_CPU STREQUAL "mips")
|
||||||
|
SET(LIBRARY_ARCHITECTURE "mips")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "mips")
|
||||||
|
SET(TOOLCHAIN_ARCH "mips")
|
||||||
|
SET(TOOLCHAIN_PREFIX "mipsel-linux-android")
|
||||||
|
SET(TOOLCHAIN_BIN_PREFIX "mipsel")
|
||||||
|
SET(MINIMUM_NDK_TARGET 9)
|
||||||
|
ENDIF(TARGET_CPU STREQUAL "armv7")
|
||||||
|
|
||||||
|
IF(NOT NDK_TARGET)
|
||||||
|
SET(NDK_TARGET ${MINIMUM_NDK_TARGET})
|
||||||
|
ENDIF(NOT NDK_TARGET)
|
||||||
|
|
||||||
|
FILE(GLOB _TOOLCHAIN_VERSIONS "${NDK_ROOT}/toolchains/${TOOLCHAIN_PREFIX}-*")
|
||||||
|
IF(_TOOLCHAIN_VERSIONS)
|
||||||
|
LIST(SORT _TOOLCHAIN_VERSIONS)
|
||||||
|
LIST(REVERSE _TOOLCHAIN_VERSIONS)
|
||||||
|
FOREACH(_TOOLCHAIN_VERSION ${_TOOLCHAIN_VERSIONS})
|
||||||
|
STRING(REGEX REPLACE ".+${TOOLCHAIN_PREFIX}-([0-9.]+)" "\\1" _TOOLCHAIN_VERSION "${_TOOLCHAIN_VERSION}")
|
||||||
|
IF(_TOOLCHAIN_VERSION MATCHES "^([0-9.]+)$")
|
||||||
|
LIST(APPEND NDK_TOOLCHAIN_VERSIONS ${_TOOLCHAIN_VERSION})
|
||||||
|
ENDIF(_TOOLCHAIN_VERSION MATCHES "^([0-9.]+)$")
|
||||||
|
ENDFOREACH(_TOOLCHAIN_VERSION)
|
||||||
|
ENDIF(_TOOLCHAIN_VERSIONS)
|
||||||
|
|
||||||
|
IF(NOT NDK_TOOLCHAIN_VERSIONS)
|
||||||
|
MESSAGE(FATAL_ERROR "No Android toolchain found in default search path ${NDK_ROOT}/toolchains")
|
||||||
|
ENDIF(NOT NDK_TOOLCHAIN_VERSIONS)
|
||||||
|
|
||||||
|
IF(NDK_TOOLCHAIN_VERSION)
|
||||||
|
LIST(FIND NDK_TOOLCHAIN_VERSIONS "${NDK_TOOLCHAIN_VERSION}" _INDEX)
|
||||||
|
IF(_INDEX EQUAL -1)
|
||||||
|
LIST(GET NDK_TOOLCHAIN_VERSIONS 0 NDK_TOOLCHAIN_VERSION)
|
||||||
|
ENDIF(_INDEX EQUAL -1)
|
||||||
|
ELSE(NDK_TOOLCHAIN_VERSION)
|
||||||
|
LIST(GET NDK_TOOLCHAIN_VERSIONS 0 NDK_TOOLCHAIN_VERSION)
|
||||||
|
ENDIF(NDK_TOOLCHAIN_VERSION)
|
||||||
|
|
||||||
|
MESSAGE(STATUS "Target Android NDK ${NDK_TARGET} and use GCC ${NDK_TOOLCHAIN_VERSION}")
|
||||||
|
|
||||||
|
IF(CMAKE_HOST_WIN32)
|
||||||
|
SET(TOOLCHAIN_HOST "windows")
|
||||||
|
SET(TOOLCHAIN_BIN_SUFFIX ".exe")
|
||||||
|
ELSEIF(CMAKE_HOST_APPLE)
|
||||||
|
SET(TOOLCHAIN_HOST "apple")
|
||||||
|
SET(TOOLCHAIN_BIN_SUFFIX "")
|
||||||
|
ELSEIF(CMAKE_HOST_UNIX)
|
||||||
|
SET(TOOLCHAIN_HOST "linux")
|
||||||
|
SET(TOOLCHAIN_BIN_SUFFIX "")
|
||||||
|
ENDIF(CMAKE_HOST_WIN32)
|
||||||
|
|
||||||
|
SET(TOOLCHAIN_ROOT "${NDK_ROOT}/toolchains/${TOOLCHAIN_PREFIX}-${NDK_TOOLCHAIN_VERSION}/prebuilt/${TOOLCHAIN_HOST}")
|
||||||
|
SET(PLATFORM_ROOT "${NDK_ROOT}/platforms/android-${NDK_TARGET}/arch-${TOOLCHAIN_ARCH}")
|
||||||
|
|
||||||
|
IF(NOT EXISTS "${TOOLCHAIN_ROOT}")
|
||||||
|
FILE(GLOB _TOOLCHAIN_PREFIXES "${TOOLCHAIN_ROOT}*")
|
||||||
|
IF(_TOOLCHAIN_PREFIXES)
|
||||||
|
LIST(GET _TOOLCHAIN_PREFIXES 0 TOOLCHAIN_ROOT)
|
||||||
|
ENDIF(_TOOLCHAIN_PREFIXES)
|
||||||
|
ENDIF(NOT EXISTS "${TOOLCHAIN_ROOT}")
|
||||||
|
|
||||||
|
MESSAGE(STATUS "Found Android toolchain in ${TOOLCHAIN_ROOT}")
|
||||||
|
MESSAGE(STATUS "Found Android platform in ${PLATFORM_ROOT}")
|
||||||
|
|
||||||
|
# include dirs
|
||||||
|
SET(PLATFORM_INCLUDE_DIR "${PLATFORM_ROOT}/usr/include")
|
||||||
|
SET(STL_DIR "${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++")
|
||||||
|
|
||||||
|
IF(EXISTS "${STL_DIR}/${NDK_TOOLCHAIN_VERSION}")
|
||||||
|
# NDK version >= 8b
|
||||||
|
SET(STL_DIR "${STL_DIR}/${NDK_TOOLCHAIN_VERSION}")
|
||||||
|
ENDIF(EXISTS "${STL_DIR}/${NDK_TOOLCHAIN_VERSION}")
|
||||||
|
|
||||||
|
# Determine bin prefix for toolchain
|
||||||
|
FILE(GLOB _TOOLCHAIN_BIN_PREFIXES "${TOOLCHAIN_ROOT}/bin/${TOOLCHAIN_BIN_PREFIX}-*-gcc${TOOLCHAIN_BIN_SUFFIX}")
|
||||||
|
IF(_TOOLCHAIN_BIN_PREFIXES)
|
||||||
|
LIST(GET _TOOLCHAIN_BIN_PREFIXES 0 _TOOLCHAIN_BIN_PREFIX)
|
||||||
|
STRING(REGEX REPLACE "${TOOLCHAIN_ROOT}/bin/([a-z0-9-]+)-gcc${TOOLCHAIN_BIN_SUFFIX}" "\\1" TOOLCHAIN_BIN_PREFIX "${_TOOLCHAIN_BIN_PREFIX}")
|
||||||
|
ENDIF(_TOOLCHAIN_BIN_PREFIXES)
|
||||||
|
|
||||||
|
SET(STL_INCLUDE_DIR "${STL_DIR}/include")
|
||||||
|
SET(STL_LIBRARY_DIR "${STL_DIR}/libs/${LIBRARY_ARCHITECTURE}")
|
||||||
|
SET(STL_INCLUDE_CPU_DIR "${STL_LIBRARY_DIR}/include")
|
||||||
|
SET(STL_LIBRARY "${STL_LIBRARY_DIR}/libgnustl_static.a")
|
||||||
|
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_ROOT} ${PLATFORM_ROOT}/usr ${CMAKE_PREFIX_PATH} ${CMAKE_INSTALL_PREFIX} $ENV{EXTERNAL_ANDROID_PATH} CACHE string "Android find search path root")
|
||||||
|
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${STL_INCLUDE_DIR} ${STL_INCLUDE_CPU_DIR})
|
||||||
|
|
||||||
|
MACRO(SET_TOOLCHAIN_BINARY _NAME _BINARY)
|
||||||
|
SET(${_NAME} ${TOOLCHAIN_ROOT}/bin/${TOOLCHAIN_BIN_PREFIX}-${_BINARY}${TOOLCHAIN_BIN_SUFFIX})
|
||||||
|
ENDMACRO(SET_TOOLCHAIN_BINARY)
|
||||||
|
|
||||||
|
SET_TOOLCHAIN_BINARY(CMAKE_C_COMPILER gcc)
|
||||||
|
SET_TOOLCHAIN_BINARY(CMAKE_CXX_COMPILER g++)
|
||||||
|
|
||||||
|
# Force the compilers to GCC for Android
|
||||||
|
include (CMakeForceCompiler)
|
||||||
|
CMAKE_FORCE_C_COMPILER(${CMAKE_C_COMPILER} GNU)
|
||||||
|
CMAKE_FORCE_CXX_COMPILER(${CMAKE_CXX_COMPILER} GNU)
|
@ -1,38 +0,0 @@
|
|||||||
# - Find DirectInput
|
|
||||||
# Find the DirectSound includes and libraries
|
|
||||||
#
|
|
||||||
# DINPUT_INCLUDE_DIR - where to find dinput.h
|
|
||||||
# DINPUT_LIBRARIES - List of libraries when using DirectInput.
|
|
||||||
# DINPUT_FOUND - True if DirectInput found.
|
|
||||||
|
|
||||||
if(DINPUT_INCLUDE_DIR)
|
|
||||||
# Already in cache, be silent
|
|
||||||
set(DINPUT_FIND_QUIETLY TRUE)
|
|
||||||
endif(DINPUT_INCLUDE_DIR)
|
|
||||||
|
|
||||||
find_path(DINPUT_INCLUDE_DIR dinput.h
|
|
||||||
"$ENV{DXSDK_DIR}"
|
|
||||||
"$ENV{DXSDK_DIR}/Include"
|
|
||||||
)
|
|
||||||
|
|
||||||
find_library(DINPUT_LIBRARY
|
|
||||||
NAMES dinput dinput8
|
|
||||||
PATHS
|
|
||||||
"$ENV{DXSDK_DIR}"
|
|
||||||
"$ENV{DXSDK_DIR}/Lib"
|
|
||||||
"$ENV{DXSDK_DIR}/Lib/x86"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Handle the QUIETLY and REQUIRED arguments and set DINPUT_FOUND to TRUE if
|
|
||||||
# all listed variables are TRUE.
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(DINPUT DEFAULT_MSG
|
|
||||||
DINPUT_INCLUDE_DIR DINPUT_LIBRARY)
|
|
||||||
|
|
||||||
if(DINPUT_FOUND)
|
|
||||||
set(DINPUT_LIBRARIES ${DINPUT_LIBRARY})
|
|
||||||
else(DINPUT_FOUND)
|
|
||||||
set(DINPUT_LIBRARIES)
|
|
||||||
endif(DINPUT_FOUND)
|
|
||||||
|
|
||||||
mark_as_advanced(DINPUT_INCLUDE_DIR DINPUT_LIBRARY)
|
|
@ -0,0 +1,70 @@
|
|||||||
|
# - Locate LibOVR library
|
||||||
|
# This module defines
|
||||||
|
# LIBOVR_LIBRARIES, the libraries to link against
|
||||||
|
# LIBOVR_FOUND, if false, do not try to link to LIBOVR
|
||||||
|
# LIBOVR_INCLUDE_DIR, where to find headers.
|
||||||
|
|
||||||
|
IF(LIBOVR_LIBRARIES AND LIBOVR_INCLUDE_DIR)
|
||||||
|
# in cache already
|
||||||
|
SET(LIBOVR_FIND_QUIETLY TRUE)
|
||||||
|
ENDIF(LIBOVR_LIBRARIES AND LIBOVR_INCLUDE_DIR)
|
||||||
|
|
||||||
|
FIND_PATH(LIBOVR_INCLUDE_DIR
|
||||||
|
OVR.h
|
||||||
|
PATHS
|
||||||
|
$ENV{LIBOVR_DIR}/Include
|
||||||
|
/usr/local/include
|
||||||
|
/usr/include
|
||||||
|
/sw/include
|
||||||
|
/opt/local/include
|
||||||
|
/opt/csw/include
|
||||||
|
/opt/include
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(UNIX)
|
||||||
|
IF(TARGET_X64)
|
||||||
|
SET(LIBOVR_LIBRARY_BUILD_PATH "Lib/Linux/Release/x86_64")
|
||||||
|
ELSE(TARGET_X64)
|
||||||
|
SET(LIBOVR_LIBRARY_BUILD_PATH "Lib/Linux/Release/i386")
|
||||||
|
ENDIF(TARGET_X64)
|
||||||
|
ELSEIF(APPLE)
|
||||||
|
SET(LIBOVR_LIBRARY_BUILD_PATH "Lib/MacOS/Release")
|
||||||
|
ELSEIF(WIN32)
|
||||||
|
IF(TARGET_X64)
|
||||||
|
SET(LIBOVR_LIBRARY_BUILD_PATH "Lib/x64")
|
||||||
|
ELSE(TARGET_X64)
|
||||||
|
SET(LIBOVR_LIBRARY_BUILD_PATH "Lib/Win32")
|
||||||
|
ENDIF(TARGET_X64)
|
||||||
|
ENDIF(UNIX)
|
||||||
|
|
||||||
|
FIND_LIBRARY(LIBOVR_LIBRARY
|
||||||
|
NAMES ovr
|
||||||
|
PATHS
|
||||||
|
$ENV{LIBOVR_DIR}/${LIBOVR_LIBRARY_BUILD_PATH}
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/lib
|
||||||
|
/usr/local/X11R6/lib
|
||||||
|
/usr/X11R6/lib
|
||||||
|
/sw/lib
|
||||||
|
/opt/local/lib
|
||||||
|
/opt/csw/lib
|
||||||
|
/opt/lib
|
||||||
|
/usr/freeware/lib64
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(LIBOVR_LIBRARY AND LIBOVR_INCLUDE_DIR)
|
||||||
|
IF(NOT LIBOVR_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Found LibOVR: ${LIBOVR_LIBRARY}")
|
||||||
|
ENDIF(NOT LIBOVR_FIND_QUIETLY)
|
||||||
|
SET(LIBOVR_FOUND "YES")
|
||||||
|
SET(LIBOVR_DEFINITIONS "-DHAVE_LIBOVR")
|
||||||
|
IF(UNIX)
|
||||||
|
SET(LIBOVR_LIBRARIES ${LIBOVR_LIBRARY} X11 Xinerama udev pthread)
|
||||||
|
ELSE(UNIX)
|
||||||
|
SET(LIBOVR_LIBRARIES ${LIBOVR_LIBRARY})
|
||||||
|
ENDIF(UNIX)
|
||||||
|
ELSE(LIBOVR_LIBRARY AND LIBOVR_INCLUDE_DIR)
|
||||||
|
IF(NOT LIBOVR_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Warning: Unable to find LibOVR!")
|
||||||
|
ENDIF(NOT LIBOVR_FIND_QUIETLY)
|
||||||
|
ENDIF(LIBOVR_LIBRARY AND LIBOVR_INCLUDE_DIR)
|
@ -0,0 +1,32 @@
|
|||||||
|
# - Locate LibVR library
|
||||||
|
# This module defines
|
||||||
|
# LIBVR_LIBRARIES, the libraries to link against
|
||||||
|
# LIBVR_FOUND, if false, do not try to link to LIBVR
|
||||||
|
# LIBVR_INCLUDE_DIR, where to find headers.
|
||||||
|
|
||||||
|
IF(LIBVR_LIBRARIES AND LIBVR_INCLUDE_DIR)
|
||||||
|
# in cache already
|
||||||
|
SET(LIBVR_FIND_QUIETLY TRUE)
|
||||||
|
ENDIF(LIBVR_LIBRARIES AND LIBVR_INCLUDE_DIR)
|
||||||
|
|
||||||
|
FIND_PATH(LIBVR_INCLUDE_DIR hmd.h
|
||||||
|
PATH_SUFFIXES include/LibVR
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(LIBVR_LIBRARY
|
||||||
|
NAMES vr
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
PATHS
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(LIBVR_LIBRARY AND LIBVR_INCLUDE_DIR)
|
||||||
|
IF(NOT LIBVR_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Found LibVR: ${LIBVR_LIBRARY}")
|
||||||
|
ENDIF(NOT LIBVR_FIND_QUIETLY)
|
||||||
|
SET(LIBVR_FOUND "YES")
|
||||||
|
SET(LIBVR_DEFINITIONS "-DHAVE_LIBVR")
|
||||||
|
ELSE(LIBVR_LIBRARY AND LIBVR_INCLUDE_DIR)
|
||||||
|
IF(NOT LIBVR_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Warning: Unable to find LibVR!")
|
||||||
|
ENDIF(NOT LIBVR_FIND_QUIETLY)
|
||||||
|
ENDIF(LIBVR_LIBRARY AND LIBVR_INCLUDE_DIR)
|
@ -0,0 +1,81 @@
|
|||||||
|
# Locate Lua library
|
||||||
|
# This module defines
|
||||||
|
# LUA52_FOUND, if false, do not try to link to Lua
|
||||||
|
# LUA_LIBRARIES
|
||||||
|
# LUA_INCLUDE_DIR, where to find lua.h
|
||||||
|
# LUA_VERSION_STRING, the version of Lua found (since CMake 2.8.8)
|
||||||
|
#
|
||||||
|
# Note that the expected include convention is
|
||||||
|
# #include "lua.h"
|
||||||
|
# and not
|
||||||
|
# #include <lua/lua.h>
|
||||||
|
# This is because, the lua location is not standardized and may exist
|
||||||
|
# in locations other than lua/
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright 2007-2009 Kitware, Inc.
|
||||||
|
#
|
||||||
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
|
# see accompanying file Copyright.txt for details.
|
||||||
|
#
|
||||||
|
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the License for more information.
|
||||||
|
#=============================================================================
|
||||||
|
# (To distribute this file outside of CMake, substitute the full
|
||||||
|
# License text for the above reference.)
|
||||||
|
|
||||||
|
find_path(LUA_INCLUDE_DIR lua.h
|
||||||
|
HINTS
|
||||||
|
ENV LUA_DIR
|
||||||
|
PATH_SUFFIXES include/lua52 include/lua5.2 include/lua-5.2 include/lua include
|
||||||
|
PATHS
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/sw # Fink
|
||||||
|
/opt/local # DarwinPorts
|
||||||
|
/opt/csw # Blastwave
|
||||||
|
/opt
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(LUA_LIBRARY
|
||||||
|
NAMES lua52 lua5.2 lua-5.2 lua
|
||||||
|
HINTS
|
||||||
|
ENV LUA_DIR
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
PATHS
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/sw
|
||||||
|
/opt/local
|
||||||
|
/opt/csw
|
||||||
|
/opt
|
||||||
|
)
|
||||||
|
|
||||||
|
if(LUA_LIBRARY)
|
||||||
|
# include the math library for Unix
|
||||||
|
if(UNIX AND NOT APPLE AND NOT BEOS)
|
||||||
|
find_library(LUA_MATH_LIBRARY m)
|
||||||
|
set( LUA_LIBRARIES "${LUA_LIBRARY};${LUA_MATH_LIBRARY}" CACHE STRING "Lua Libraries")
|
||||||
|
# For Windows and Mac, don't need to explicitly include the math library
|
||||||
|
else()
|
||||||
|
set( LUA_LIBRARIES "${LUA_LIBRARY}" CACHE STRING "Lua Libraries")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/lua.h")
|
||||||
|
file(STRINGS "${LUA_INCLUDE_DIR}/lua.h" lua_version_str REGEX "^#define[ \t]+LUA_RELEASE[ \t]+\"Lua .+\"")
|
||||||
|
|
||||||
|
string(REGEX REPLACE "^#define[ \t]+LUA_RELEASE[ \t]+\"Lua ([^\"]+)\".*" "\\1" LUA_VERSION_STRING "${lua_version_str}")
|
||||||
|
unset(lua_version_str)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
# handle the QUIETLY and REQUIRED arguments and set LUA_FOUND to TRUE if
|
||||||
|
# all listed variables are TRUE
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lua52
|
||||||
|
REQUIRED_VARS LUA_LIBRARIES LUA_INCLUDE_DIR
|
||||||
|
VERSION_VAR LUA_VERSION_STRING)
|
||||||
|
|
||||||
|
mark_as_advanced(LUA_INCLUDE_DIR LUA_LIBRARIES LUA_LIBRARY LUA_MATH_LIBRARY)
|
||||||
|
|
@ -0,0 +1,96 @@
|
|||||||
|
# - Find MS Visual C++
|
||||||
|
#
|
||||||
|
# VC_INCLUDE_DIR - where to find headers
|
||||||
|
# VC_INCLUDE_DIRS - where to find headers
|
||||||
|
# VC_LIBRARY_DIR - where to find libraries
|
||||||
|
# VC_FOUND - True if MSVC found.
|
||||||
|
|
||||||
|
MACRO(DETECT_VC_VERSION_HELPER _ROOT _VERSION)
|
||||||
|
# Software/Wow6432Node/...
|
||||||
|
GET_FILENAME_COMPONENT(VC${_VERSION}_DIR "[${_ROOT}\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7;${_VERSION}]" ABSOLUTE)
|
||||||
|
|
||||||
|
IF(VC${_VERSION}_DIR AND VC${_VERSION}_DIR STREQUAL "/registry")
|
||||||
|
SET(VC${_VERSION}_DIR)
|
||||||
|
GET_FILENAME_COMPONENT(VC${_VERSION}_DIR "[${_ROOT}\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7;${_VERSION}]" ABSOLUTE)
|
||||||
|
IF(VC${_VERSION}_DIR AND NOT VC${_VERSION}_DIR STREQUAL "/registry")
|
||||||
|
SET(VC${_VERSION}_DIR "${VC${_VERSION}_DIR}VC/")
|
||||||
|
ENDIF(VC${_VERSION}_DIR AND NOT VC${_VERSION}_DIR STREQUAL "/registry")
|
||||||
|
ENDIF(VC${_VERSION}_DIR AND VC${_VERSION}_DIR STREQUAL "/registry")
|
||||||
|
|
||||||
|
IF(VC${_VERSION}_DIR AND NOT VC${_VERSION}_DIR STREQUAL "/registry")
|
||||||
|
SET(VC${_VERSION}_FOUND ON)
|
||||||
|
DETECT_EXPRESS_VERSION(${_VERSION})
|
||||||
|
IF(NOT MSVC_FIND_QUIETLY)
|
||||||
|
SET(_VERSION_STR ${_VERSION})
|
||||||
|
IF(MSVC_EXPRESS)
|
||||||
|
SET(_VERSION_STR "${_VERSION_STR} Express")
|
||||||
|
ENDIF(MSVC_EXPRESS)
|
||||||
|
MESSAGE(STATUS "Found Visual C++ ${_VERSION_STR} in ${VC${_VERSION}_DIR}")
|
||||||
|
ENDIF(NOT MSVC_FIND_QUIETLY)
|
||||||
|
ELSEIF(VC${_VERSION}_DIR AND NOT VC${_VERSION}_DIR STREQUAL "/registry")
|
||||||
|
SET(VC${_VERSION}_FOUND OFF)
|
||||||
|
SET(VC${_VERSION}_DIR "")
|
||||||
|
ENDIF(VC${_VERSION}_DIR AND NOT VC${_VERSION}_DIR STREQUAL "/registry")
|
||||||
|
ENDMACRO(DETECT_VC_VERSION_HELPER)
|
||||||
|
|
||||||
|
MACRO(DETECT_VC_VERSION _VERSION)
|
||||||
|
SET(VC${_VERSION}_FOUND OFF)
|
||||||
|
DETECT_VC_VERSION_HELPER("HKEY_CURRENT_USER" ${_VERSION})
|
||||||
|
|
||||||
|
IF(NOT VC${_VERSION}_FOUND)
|
||||||
|
DETECT_VC_VERSION_HELPER("HKEY_LOCAL_MACHINE" ${_VERSION})
|
||||||
|
ENDIF(NOT VC${_VERSION}_FOUND)
|
||||||
|
|
||||||
|
IF(VC${_VERSION}_FOUND)
|
||||||
|
SET(VC_FOUND ON)
|
||||||
|
SET(VC_DIR "${VC${_VERSION}_DIR}")
|
||||||
|
ENDIF(VC${_VERSION}_FOUND)
|
||||||
|
ENDMACRO(DETECT_VC_VERSION)
|
||||||
|
|
||||||
|
MACRO(DETECT_EXPRESS_VERSION _VERSION)
|
||||||
|
GET_FILENAME_COMPONENT(MSVC_EXPRESS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\${_VERSION}\\Setup\\VC;ProductDir]" ABSOLUTE)
|
||||||
|
|
||||||
|
IF(MSVC_EXPRESS AND NOT MSVC_EXPRESS STREQUAL "/registry")
|
||||||
|
SET(MSVC_EXPRESS ON)
|
||||||
|
ENDIF(MSVC_EXPRESS AND NOT MSVC_EXPRESS STREQUAL "/registry")
|
||||||
|
ENDMACRO(DETECT_EXPRESS_VERSION)
|
||||||
|
|
||||||
|
IF(MSVC12)
|
||||||
|
DETECT_VC_VERSION("12.0")
|
||||||
|
|
||||||
|
IF(NOT MSVC12_REDIST_DIR)
|
||||||
|
# If you have VC++ 2013 Express, put x64/Microsoft.VC120.CRT/*.dll in ${EXTERNAL_PATH}/redist
|
||||||
|
SET(MSVC12_REDIST_DIR "${EXTERNAL_PATH}/redist")
|
||||||
|
ENDIF(NOT MSVC11_REDIST_DIR)
|
||||||
|
ELSEIF(MSVC11)
|
||||||
|
DETECT_VC_VERSION("11.0")
|
||||||
|
|
||||||
|
IF(NOT MSVC11_REDIST_DIR)
|
||||||
|
# If you have VC++ 2012 Express, put x64/Microsoft.VC110.CRT/*.dll in ${EXTERNAL_PATH}/redist
|
||||||
|
SET(MSVC11_REDIST_DIR "${EXTERNAL_PATH}/redist")
|
||||||
|
ENDIF(NOT MSVC11_REDIST_DIR)
|
||||||
|
ELSEIF(MSVC10)
|
||||||
|
DETECT_VC_VERSION("10.0")
|
||||||
|
|
||||||
|
IF(NOT MSVC10_REDIST_DIR)
|
||||||
|
# If you have VC++ 2010 Express, put x64/Microsoft.VC100.CRT/*.dll in ${EXTERNAL_PATH}/redist
|
||||||
|
SET(MSVC10_REDIST_DIR "${EXTERNAL_PATH}/redist")
|
||||||
|
ENDIF(NOT MSVC10_REDIST_DIR)
|
||||||
|
ELSEIF(MSVC90)
|
||||||
|
DETECT_VC_VERSION("9.0")
|
||||||
|
ELSEIF(MSVC80)
|
||||||
|
DETECT_VC_VERSION("8.0")
|
||||||
|
ENDIF(MSVC12)
|
||||||
|
|
||||||
|
# If you plan to use VC++ compilers with WINE, set VC_DIR environment variable
|
||||||
|
IF(NOT VC_DIR)
|
||||||
|
SET(VC_DIR $ENV{VC_DIR})
|
||||||
|
ENDIF(NOT VC_DIR)
|
||||||
|
|
||||||
|
IF(NOT VC_DIR)
|
||||||
|
STRING(REGEX REPLACE "/bin/.+" "" VC_DIR ${CMAKE_CXX_COMPILER})
|
||||||
|
ENDIF(NOT VC_DIR)
|
||||||
|
|
||||||
|
SET(VC_INCLUDE_DIR "${VC_DIR}/include")
|
||||||
|
SET(VC_INCLUDE_DIRS ${VC_INCLUDE_DIR})
|
||||||
|
INCLUDE_DIRECTORIES(${VC_INCLUDE_DIR})
|
@ -1,50 +0,0 @@
|
|||||||
# - Locate S3TC library
|
|
||||||
# This module defines
|
|
||||||
# S3TC_LIBRARY, the library to link against
|
|
||||||
# S3TC_FOUND, if false, do not try to link to S3TC
|
|
||||||
# S3TC_INCLUDE_DIR, where to find headers.
|
|
||||||
|
|
||||||
IF(S3TC_LIBRARY AND S3TC_INCLUDE_DIR)
|
|
||||||
# in cache already
|
|
||||||
SET(S3TC_FIND_QUIETLY TRUE)
|
|
||||||
ENDIF(S3TC_LIBRARY AND S3TC_INCLUDE_DIR)
|
|
||||||
|
|
||||||
|
|
||||||
FIND_PATH(S3TC_INCLUDE_DIR
|
|
||||||
s3_intrf.h
|
|
||||||
PATHS
|
|
||||||
$ENV{S3TC_DIR}/include
|
|
||||||
/usr/local/include
|
|
||||||
/usr/include
|
|
||||||
/sw/include
|
|
||||||
/opt/local/include
|
|
||||||
/opt/csw/include
|
|
||||||
/opt/include
|
|
||||||
PATH_SUFFIXES S3TC
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_LIBRARY(S3TC_LIBRARY
|
|
||||||
NAMES s3tc libs3tc
|
|
||||||
PATHS
|
|
||||||
$ENV{S3TC_DIR}/lib
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/lib
|
|
||||||
/usr/local/X11R6/lib
|
|
||||||
/usr/X11R6/lib
|
|
||||||
/sw/lib
|
|
||||||
/opt/local/lib
|
|
||||||
/opt/csw/lib
|
|
||||||
/opt/lib
|
|
||||||
/usr/freeware/lib64
|
|
||||||
)
|
|
||||||
|
|
||||||
IF(S3TC_LIBRARY AND S3TC_INCLUDE_DIR)
|
|
||||||
SET(S3TC_FOUND "YES")
|
|
||||||
IF(NOT S3TC_FIND_QUIETLY)
|
|
||||||
MESSAGE(STATUS "Found S3TC: ${S3TC_LIBRARY}")
|
|
||||||
ENDIF(NOT S3TC_FIND_QUIETLY)
|
|
||||||
ELSE(S3TC_LIBRARY AND S3TC_INCLUDE_DIR)
|
|
||||||
IF(NOT S3TC_FIND_QUIETLY)
|
|
||||||
MESSAGE(STATUS "Warning: Unable to find S3TC!")
|
|
||||||
ENDIF(NOT S3TC_FIND_QUIETLY)
|
|
||||||
ENDIF(S3TC_LIBRARY AND S3TC_INCLUDE_DIR)
|
|
@ -0,0 +1,183 @@
|
|||||||
|
# This file is based off of the Platform/Darwin.cmake and Platform/UnixPaths.cmake
|
||||||
|
# files which are included with CMake 2.8.4
|
||||||
|
# It has been altered for iOS development
|
||||||
|
#
|
||||||
|
# Options:
|
||||||
|
#
|
||||||
|
# IOS_VERSION = last(default) or specific one (4.3, 5.0, 4.1)
|
||||||
|
# This decides if SDKS will be selected from the iPhoneOS.platform or iPhoneSimulator.platform folders
|
||||||
|
# OS - the default, used to build for iPhone and iPad physical devices, which have an arm arch.
|
||||||
|
# SIMULATOR - used to build for the Simulator platforms, which have an x86 arch.
|
||||||
|
#
|
||||||
|
# IOS_PLATFORM = OS (default) or SIMULATOR or ALL
|
||||||
|
# This decides if SDKS will be selected from the iPhoneOS.platform or iPhoneSimulator.platform folders
|
||||||
|
# OS - the default, used to build for iPhone and iPad physical devices, which have an arm arch.
|
||||||
|
# SIMULATOR - used to build for the Simulator platforms, which have an x86 arch.
|
||||||
|
#
|
||||||
|
# CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder
|
||||||
|
# By default this location is automatcially chosen based on the IOS_PLATFORM value above.
|
||||||
|
# If set manually, it will override the default location and force the user of a particular Developer Platform
|
||||||
|
#
|
||||||
|
# CMAKE_IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder
|
||||||
|
# By default this location is automatcially chosen based on the CMAKE_IOS_DEVELOPER_ROOT value.
|
||||||
|
# In this case it will always be the most up-to-date SDK found in the CMAKE_IOS_DEVELOPER_ROOT path.
|
||||||
|
# If set manually, this will force the use of a specific SDK version
|
||||||
|
|
||||||
|
IF(DEFINED CMAKE_CROSSCOMPILING)
|
||||||
|
# subsequent toolchain loading is not really needed
|
||||||
|
RETURN()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
# Standard settings
|
||||||
|
SET(CMAKE_SYSTEM_NAME Darwin)
|
||||||
|
SET(CMAKE_SYSTEM_VERSION 1) # TODO: determine target Darwin version
|
||||||
|
SET(UNIX ON)
|
||||||
|
SET(APPLE ON)
|
||||||
|
SET(IOS ON)
|
||||||
|
|
||||||
|
# Force the compilers to Clang for iOS
|
||||||
|
include (CMakeForceCompiler)
|
||||||
|
CMAKE_FORCE_C_COMPILER (clang Clang)
|
||||||
|
CMAKE_FORCE_CXX_COMPILER (clang++ Clang)
|
||||||
|
|
||||||
|
# Setup iOS platform
|
||||||
|
if (NOT DEFINED IOS_PLATFORM)
|
||||||
|
set (IOS_PLATFORM "OS")
|
||||||
|
endif (NOT DEFINED IOS_PLATFORM)
|
||||||
|
set (IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING "Type of iOS Platform")
|
||||||
|
|
||||||
|
SET(IOS_PLATFORM_LOCATION "iPhoneOS.platform")
|
||||||
|
SET(IOS_SIMULATOR_PLATFORM_LOCATION "iPhoneSimulator.platform")
|
||||||
|
|
||||||
|
# Check the platform selection and setup for developer root
|
||||||
|
if (${IOS_PLATFORM} STREQUAL "OS")
|
||||||
|
# This causes the installers to properly locate the output libraries
|
||||||
|
set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos")
|
||||||
|
elseif (${IOS_PLATFORM} STREQUAL "SIMULATOR")
|
||||||
|
# This causes the installers to properly locate the output libraries
|
||||||
|
set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator")
|
||||||
|
elseif (${IOS_PLATFORM} STREQUAL "ALL")
|
||||||
|
# This causes the installers to properly locate the output libraries
|
||||||
|
set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator;-iphoneos")
|
||||||
|
else (${IOS_PLATFORM} STREQUAL "OS")
|
||||||
|
message (FATAL_ERROR "Unsupported IOS_PLATFORM value selected. Please choose OS or SIMULATOR")
|
||||||
|
endif (${IOS_PLATFORM} STREQUAL "OS")
|
||||||
|
set (CMAKE_XCODE_EFFECTIVE_PLATFORMS ${CMAKE_XCODE_EFFECTIVE_PLATFORMS} CACHE PATH "iOS Platform")
|
||||||
|
|
||||||
|
# Setup iOS developer location unless specified manually with CMAKE_IOS_DEVELOPER_ROOT
|
||||||
|
# Note Xcode 4.3 changed the installation location, choose the most recent one available
|
||||||
|
SET(XCODE_POST_43_ROOT "/Applications/Xcode.app/Contents/Developer/Platforms")
|
||||||
|
SET(XCODE_PRE_43_ROOT "/Developer/Platforms")
|
||||||
|
|
||||||
|
IF(NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT)
|
||||||
|
IF(EXISTS ${XCODE_POST_43_ROOT})
|
||||||
|
SET(CMAKE_XCODE_ROOT ${XCODE_POST_43_ROOT})
|
||||||
|
ELSEIF(EXISTS ${XCODE_PRE_43_ROOT})
|
||||||
|
SET(CMAKE_XCODE_ROOT ${XCODE_PRE_43_ROOT})
|
||||||
|
ENDIF(EXISTS ${XCODE_POST_43_ROOT})
|
||||||
|
IF(EXISTS ${CMAKE_XCODE_ROOT}/${IOS_PLATFORM_LOCATION}/Developer)
|
||||||
|
SET(CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_XCODE_ROOT}/${IOS_PLATFORM_LOCATION}/Developer)
|
||||||
|
ENDIF(EXISTS ${CMAKE_XCODE_ROOT}/${IOS_PLATFORM_LOCATION}/Developer)
|
||||||
|
IF(EXISTS ${CMAKE_XCODE_ROOT}/${IOS_SIMULATOR_PLATFORM_LOCATION}/Developer)
|
||||||
|
SET(CMAKE_IOS_SIMULATOR_DEVELOPER_ROOT ${CMAKE_XCODE_ROOT}/${IOS_SIMULATOR_PLATFORM_LOCATION}/Developer)
|
||||||
|
ENDIF(EXISTS ${CMAKE_XCODE_ROOT}/${IOS_SIMULATOR_PLATFORM_LOCATION}/Developer)
|
||||||
|
ENDIF(NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT)
|
||||||
|
SET(CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT} CACHE PATH "Location of iOS Platform")
|
||||||
|
SET(CMAKE_IOS_SIMULATOR_DEVELOPER_ROOT ${CMAKE_IOS_SIMULATOR_DEVELOPER_ROOT} CACHE PATH "Location of iOS Simulator Platform")
|
||||||
|
|
||||||
|
MACRO(GET_AVAILABLE_SDK_VERSIONS ROOT VERSIONS)
|
||||||
|
FILE(GLOB _CMAKE_IOS_SDKS "${ROOT}/SDKs/iPhoneOS*")
|
||||||
|
IF(_CMAKE_IOS_SDKS)
|
||||||
|
LIST(SORT _CMAKE_IOS_SDKS)
|
||||||
|
LIST(REVERSE _CMAKE_IOS_SDKS)
|
||||||
|
FOREACH(_CMAKE_IOS_SDK ${_CMAKE_IOS_SDKS})
|
||||||
|
STRING(REGEX REPLACE ".+iPhoneOS([0-9.]+)\\.sdk" "\\1" _IOS_SDK "${_CMAKE_IOS_SDK}")
|
||||||
|
LIST(APPEND ${VERSIONS} ${_IOS_SDK})
|
||||||
|
ENDFOREACH(_CMAKE_IOS_SDK)
|
||||||
|
ENDIF(_CMAKE_IOS_SDKS)
|
||||||
|
ENDMACRO(GET_AVAILABLE_SDK_VERSIONS)
|
||||||
|
|
||||||
|
# Find and use the most recent iOS sdk
|
||||||
|
IF(NOT DEFINED CMAKE_IOS_SDK_ROOT)
|
||||||
|
# Search for a specific version of a SDK
|
||||||
|
GET_AVAILABLE_SDK_VERSIONS(${CMAKE_IOS_DEVELOPER_ROOT} IOS_VERSIONS)
|
||||||
|
|
||||||
|
IF(NOT IOS_VERSIONS)
|
||||||
|
MESSAGE(FATAL_ERROR "No iOS SDK's found in default search path ${CMAKE_IOS_DEVELOPER_ROOT}. Manually set CMAKE_IOS_SDK_ROOT or install the iOS SDK.")
|
||||||
|
ENDIF(NOT IOS_VERSIONS)
|
||||||
|
|
||||||
|
IF(IOS_VERSION)
|
||||||
|
LIST(FIND IOS_VERSIONS "${IOS_VERSION}" _INDEX)
|
||||||
|
IF(_INDEX EQUAL -1)
|
||||||
|
LIST(GET IOS_VERSIONS 0 IOS_SDK_VERSION)
|
||||||
|
ELSE(_INDEX EQUAL -1)
|
||||||
|
SET(IOS_SDK_VERSION ${IOS_VERSION})
|
||||||
|
ENDIF(_INDEX EQUAL -1)
|
||||||
|
ELSE(IOS_VERSION)
|
||||||
|
LIST(GET IOS_VERSIONS 0 IOS_VERSION)
|
||||||
|
SET(IOS_SDK_VERSION ${IOS_VERSION})
|
||||||
|
ENDIF(IOS_VERSION)
|
||||||
|
|
||||||
|
MESSAGE(STATUS "Target iOS ${IOS_VERSION} and use SDK ${IOS_SDK_VERSION}")
|
||||||
|
|
||||||
|
SET(CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_DEVELOPER_ROOT}/SDKs/iPhoneOS${IOS_SDK_VERSION}.sdk)
|
||||||
|
SET(CMAKE_IOS_SIMULATOR_SDK_ROOT ${CMAKE_IOS_SIMULATOR_DEVELOPER_ROOT}/SDKs/iPhoneSimulator${IOS_SDK_VERSION}.sdk)
|
||||||
|
endif (NOT DEFINED CMAKE_IOS_SDK_ROOT)
|
||||||
|
|
||||||
|
SET(CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Location of the selected iOS SDK")
|
||||||
|
SET(CMAKE_IOS_SIMULATOR_SDK_ROOT ${CMAKE_IOS_SIMULATOR_SDK_ROOT} CACHE PATH "Location of the selected iOS Simulator SDK")
|
||||||
|
|
||||||
|
SET(IOS_VERSION ${IOS_VERSION} CACHE STRING "iOS target version")
|
||||||
|
|
||||||
|
# Set the sysroot default to the most recent SDK
|
||||||
|
SET(CMAKE_IOS_SYSROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS support")
|
||||||
|
SET(CMAKE_IOS_SIMULATOR_SYSROOT ${CMAKE_IOS_SIMULATOR_SDK_ROOT} CACHE PATH "Sysroot used for iOS Simulator support")
|
||||||
|
|
||||||
|
IF(CMAKE_GENERATOR MATCHES Xcode)
|
||||||
|
SET(ARCHS "$(ARCHS_STANDARD_32_BIT)")
|
||||||
|
IF(${IOS_PLATFORM} STREQUAL "OS")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "armv7")
|
||||||
|
ELSEIF(${IOS_PLATFORM} STREQUAL "SIMULATOR")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "x86")
|
||||||
|
ELSEIF(${IOS_PLATFORM} STREQUAL "ALL")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "armv7")
|
||||||
|
ENDIF(${IOS_PLATFORM} STREQUAL "OS")
|
||||||
|
ELSE(CMAKE_GENERATOR MATCHES Xcode)
|
||||||
|
IF(${IOS_PLATFORM} STREQUAL "OS")
|
||||||
|
SET(ARCHS "armv7")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "armv7")
|
||||||
|
ELSEIF(${IOS_PLATFORM} STREQUAL "SIMULATOR")
|
||||||
|
# iPhone simulator targets i386
|
||||||
|
SET(ARCHS "i386")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "x86")
|
||||||
|
ELSEIF(${IOS_PLATFORM} STREQUAL "ALL")
|
||||||
|
SET(ARCHS "armv7;i386")
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR "armv7")
|
||||||
|
ENDIF(${IOS_PLATFORM} STREQUAL "OS")
|
||||||
|
ENDIF(CMAKE_GENERATOR MATCHES Xcode)
|
||||||
|
|
||||||
|
# set the architecture for iOS - using ARCHS_STANDARD_32_BIT sets armv7,armv7s and appears to be XCode's standard.
|
||||||
|
# The other value that works is ARCHS_UNIVERSAL_IPHONE_OS but that sets armv7 only
|
||||||
|
set (CMAKE_OSX_ARCHITECTURES ${ARCHS} CACHE string "Build architecture for iOS")
|
||||||
|
|
||||||
|
# Set the find root to the iOS developer roots and to user defined paths
|
||||||
|
set (CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} ${CMAKE_INSTALL_PREFIX} $ENV{EXTERNAL_IOS_PATH} CACHE string "iOS find search path root")
|
||||||
|
|
||||||
|
# default to searching for frameworks first
|
||||||
|
set (CMAKE_FIND_FRAMEWORK FIRST)
|
||||||
|
|
||||||
|
# set up the default search directories for frameworks
|
||||||
|
set (CMAKE_SYSTEM_FRAMEWORK_PATH
|
||||||
|
${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks
|
||||||
|
${CMAKE_IOS_SDK_ROOT}/System/Library/PrivateFrameworks
|
||||||
|
${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks
|
||||||
|
)
|
||||||
|
|
||||||
|
# only search the iOS sdks, not the remainder of the host filesystem
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
|
||||||
|
#SET(CMAKE_SYSTEM_INCLUDE_PATH /include /usr/include)
|
||||||
|
#SET(CMAKE_SYSTEM_LIBRARY_PATH /lib /usr/lib)
|
||||||
|
#SET(CMAKE_SYSTEM_PROGRAM_PATH /bin /usr/bin)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,49 @@
|
|||||||
|
/** \file geometry_program.h
|
||||||
|
* Geometry program definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright, 2000, 2001 Nevrax Ltd.
|
||||||
|
*
|
||||||
|
* This file is part of NEVRAX NEL.
|
||||||
|
* NEVRAX NEL is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
|
||||||
|
* NEVRAX NEL is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with NEVRAX NEL; see the file COPYING. If not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
* MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL_GEOMETRY_PROGRAM_H
|
||||||
|
#define NL_GEOMETRY_PROGRAM_H
|
||||||
|
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
#include <nel/misc/smart_ptr.h>
|
||||||
|
#include <nel/3d/program.h>
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
class CGeometryProgram : public IProgram
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Constructor
|
||||||
|
CGeometryProgram();
|
||||||
|
/// Destructor
|
||||||
|
virtual ~CGeometryProgram ();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // NL3D
|
||||||
|
|
||||||
|
|
||||||
|
#endif // NL_GEOMETRY_PROGRAM_H
|
||||||
|
|
||||||
|
/* End of vertex_program.h */
|
@ -0,0 +1,178 @@
|
|||||||
|
/**
|
||||||
|
* \file gpu_program_params.h
|
||||||
|
* \brief CGPUProgramParams
|
||||||
|
* \date 2013-09-07 22:17GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* CGPUProgramParams
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 by authors
|
||||||
|
*
|
||||||
|
* This file is part of NL3D.
|
||||||
|
* NL3D is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with NL3D. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL3D_GPU_PROGRAM_PARAMS_H
|
||||||
|
#define NL3D_GPU_PROGRAM_PARAMS_H
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// NeL includes
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
|
||||||
|
namespace NLMISC {
|
||||||
|
class CVector;
|
||||||
|
class CMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief CGPUProgramParams
|
||||||
|
* \date 2013-09-07 22:17GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* A storage for USERCODE-PROVIDED parameters for GPU programs.
|
||||||
|
* Allows for fast updating and iteration of parameters.
|
||||||
|
* NOTE TO DRIVER IMPLEMENTORS: DO NOT USE FOR STORING COPIES
|
||||||
|
* OF HARDCODED DRIVER MATERIAL PARAMETERS OR DRIVER PARAMETERS!!!
|
||||||
|
* The 4-component alignment that is done in this storage
|
||||||
|
* class is necessary to simplify support for register-based
|
||||||
|
* assembly shaders, which require setting per 4 components.
|
||||||
|
*/
|
||||||
|
class CGPUProgramParams
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum TType { Float, Int, UInt };
|
||||||
|
struct CMeta { uint Index, Size, Count; TType Type; std::string Name; size_t Next, Prev; }; // size is element size, count is nb of elements
|
||||||
|
|
||||||
|
private:
|
||||||
|
union CVec { float F[4]; sint32 I[4]; uint32 UI[4]; };
|
||||||
|
|
||||||
|
public:
|
||||||
|
CGPUProgramParams();
|
||||||
|
virtual ~CGPUProgramParams();
|
||||||
|
|
||||||
|
/// \name User functions
|
||||||
|
// @{
|
||||||
|
// Copy from another params storage
|
||||||
|
void copy(CGPUProgramParams *params);
|
||||||
|
|
||||||
|
// Set by index, available only when the associated program has been compiled
|
||||||
|
void set1f(uint index, float f0);
|
||||||
|
void set2f(uint index, float f0, float f1);
|
||||||
|
void set3f(uint index, float f0, float f1, float f2);
|
||||||
|
void set4f(uint index, float f0, float f1, float f2, float f3);
|
||||||
|
void set1i(uint index, sint32 i0);
|
||||||
|
void set2i(uint index, sint32 i0, sint32 i1);
|
||||||
|
void set3i(uint index, sint32 i0, sint32 i1, sint32 i2);
|
||||||
|
void set4i(uint index, sint32 i0, sint32 i1, sint32 i2, sint32 i3);
|
||||||
|
void set1ui(uint index, uint32 ui0);
|
||||||
|
void set2ui(uint index, uint32 ui0, uint32 ui1);
|
||||||
|
void set3ui(uint index, uint32 ui0, uint32 ui1, uint32 ui2);
|
||||||
|
void set4ui(uint index, uint32 ui0, uint32 ui1, uint32 ui2, uint32 ui3);
|
||||||
|
void set3f(uint index, const NLMISC::CVector& v);
|
||||||
|
void set4f(uint index, const NLMISC::CVector& v, float f3);
|
||||||
|
void set4x4f(uint index, const NLMISC::CMatrix& m);
|
||||||
|
void set4fv(uint index, size_t num, const float *src);
|
||||||
|
void set4iv(uint index, size_t num, const sint32 *src);
|
||||||
|
void set4uiv(uint index, size_t num, const uint32 *src);
|
||||||
|
void unset(uint index);
|
||||||
|
|
||||||
|
// Set by name, it is recommended to use index when repeatedly setting an element
|
||||||
|
void set1f(const std::string &name, float f0);
|
||||||
|
void set2f(const std::string &name, float f0, float f1);
|
||||||
|
void set3f(const std::string &name, float f0, float f1, float f2);
|
||||||
|
void set4f(const std::string &name, float f0, float f1, float f2, float f3);
|
||||||
|
void set1i(const std::string &name, sint32 i0);
|
||||||
|
void set2i(const std::string &name, sint32 i0, sint32 i1);
|
||||||
|
void set3i(const std::string &name, sint32 i0, sint32 i1, sint32 i2);
|
||||||
|
void set4i(const std::string &name, sint32 i0, sint32 i1, sint32 i2, sint32 i3);
|
||||||
|
void set1ui(const std::string &name, uint32 ui0);
|
||||||
|
void set2ui(const std::string &name, uint32 ui0, uint32 ui1);
|
||||||
|
void set3ui(const std::string &name, uint32 ui0, uint32 ui1, uint32 ui2);
|
||||||
|
void set4ui(const std::string &name, uint32 ui0, uint32 ui1, uint32 ui2, uint32 ui3);
|
||||||
|
void set3f(const std::string &name, const NLMISC::CVector& v);
|
||||||
|
void set4f(const std::string &name, const NLMISC::CVector& v, float f3);
|
||||||
|
void set4x4f(const std::string &name, const NLMISC::CMatrix& m);
|
||||||
|
void set4fv(const std::string &name, size_t num, const float *src);
|
||||||
|
void set4iv(const std::string &name, size_t num, const sint32 *src);
|
||||||
|
void set4uiv(const std::string &name, size_t num, const uint32 *src);
|
||||||
|
void unset(const std::string &name);
|
||||||
|
// @}
|
||||||
|
|
||||||
|
// Maps the given name to the given index.
|
||||||
|
// on duplicate entry the data set by name will be prefered, as it can be
|
||||||
|
// assumed to have been set after the data set by index, and the mapping
|
||||||
|
// will usually happen while iterating and finding an element with name
|
||||||
|
// but no known index.
|
||||||
|
// Unknown index will be set to ~0, unknown name will have an empty string.
|
||||||
|
void map(uint index, const std::string &name);
|
||||||
|
|
||||||
|
/// \name Internal
|
||||||
|
// @{
|
||||||
|
/// Allocate specified number of components if necessary (internal use only)
|
||||||
|
size_t allocOffset(uint index, uint size, uint count, TType type);
|
||||||
|
size_t allocOffset(const std::string &name, uint size, uint count, TType type);
|
||||||
|
size_t allocOffset(uint size, uint count, TType type);
|
||||||
|
/// Return offset for specified index
|
||||||
|
size_t getOffset(uint index) const;
|
||||||
|
size_t getOffset(const std::string &name) const;
|
||||||
|
/// Remove by offset
|
||||||
|
void freeOffset(size_t offset);
|
||||||
|
// @}
|
||||||
|
|
||||||
|
/// \name Driver and dev tools
|
||||||
|
// @{
|
||||||
|
// Iteration (returns the offsets for access using getFooByOffset)
|
||||||
|
inline size_t getBegin() const { return m_Meta.size() ? m_First : s_End; }
|
||||||
|
inline size_t getNext(size_t offset) const { return m_Meta[offset].Next; }
|
||||||
|
inline size_t getEnd() const { return s_End; }
|
||||||
|
|
||||||
|
// Data access
|
||||||
|
inline uint getSizeByOffset(size_t offset) const { return m_Meta[offset].Size; } // size of element (4 for float4)
|
||||||
|
inline uint getCountByOffset(size_t offset) const { return m_Meta[offset].Count; } // number of elements (usually 1)
|
||||||
|
inline uint getNbComponentsByOffset(size_t offset) const { return m_Meta[offset].Size * m_Meta[offset].Count; } // nb of components (size * count)
|
||||||
|
inline float *getPtrFByOffset(size_t offset) { return m_Vec[offset].F; }
|
||||||
|
inline sint32 *getPtrIByOffset(size_t offset) { return m_Vec[offset].I; }
|
||||||
|
inline uint32 *getPtrUIByOffset(size_t offset) { return m_Vec[offset].UI; }
|
||||||
|
inline TType getTypeByOffset(size_t offset) const { return m_Meta[offset].Type; }
|
||||||
|
inline uint getIndexByOffset(size_t offset) const { return m_Meta[offset].Index; }
|
||||||
|
const std::string &getNameByOffset(size_t offset) const { return m_Meta[offset].Name; };
|
||||||
|
// @}
|
||||||
|
|
||||||
|
// Utility
|
||||||
|
static inline uint getNbRegistersByComponents(uint nbComponents) { return (nbComponents + 3) >> 2; } // vector register per 4 components
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<CVec> m_Vec;
|
||||||
|
std::vector<CMeta> m_Meta;
|
||||||
|
std::vector<size_t> m_Map; // map from index to offset
|
||||||
|
std::map<std::string, size_t> m_MapName; // map from name to offset
|
||||||
|
size_t m_First;
|
||||||
|
size_t m_Last;
|
||||||
|
static const size_t s_End = -1;
|
||||||
|
|
||||||
|
}; /* class CGPUProgramParams */
|
||||||
|
|
||||||
|
} /* namespace NL3D */
|
||||||
|
|
||||||
|
#endif /* #ifndef NL3D_GPU_PROGRAM_PARAMS_H */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,49 @@
|
|||||||
|
/** \file pixel_program.h
|
||||||
|
* Pixel program definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright, 2000, 2001 Nevrax Ltd.
|
||||||
|
*
|
||||||
|
* This file is part of NEVRAX NEL.
|
||||||
|
* NEVRAX NEL is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
|
||||||
|
* NEVRAX NEL is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with NEVRAX NEL; see the file COPYING. If not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
* MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL_PIXEL_PROGRAM_H
|
||||||
|
#define NL_PIXEL_PROGRAM_H
|
||||||
|
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
#include <nel/misc/smart_ptr.h>
|
||||||
|
#include <nel/3d/program.h>
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
class CPixelProgram : public IProgram
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Constructor
|
||||||
|
CPixelProgram();
|
||||||
|
/// Destructor
|
||||||
|
virtual ~CPixelProgram ();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // NL3D
|
||||||
|
|
||||||
|
|
||||||
|
#endif // NL_PIXEL_PROGRAM_H
|
||||||
|
|
||||||
|
/* End of vertex_program.h */
|
@ -0,0 +1,264 @@
|
|||||||
|
/**
|
||||||
|
* \file program.h
|
||||||
|
* \brief IProgram
|
||||||
|
* \date 2013-09-07 15:00GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* IProgram
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 by authors
|
||||||
|
*
|
||||||
|
* This file is part of NL3D.
|
||||||
|
* NL3D is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with NL3D. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL3D_PROGRAM_H
|
||||||
|
#define NL3D_PROGRAM_H
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
|
||||||
|
// NeL includes
|
||||||
|
#include <nel/misc/smart_ptr.h>
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
// List typedef.
|
||||||
|
class IDriver;
|
||||||
|
class IProgramDrvInfos;
|
||||||
|
typedef std::list<IProgramDrvInfos*> TGPUPrgDrvInfoPtrList;
|
||||||
|
typedef TGPUPrgDrvInfoPtrList::iterator ItGPUPrgDrvInfoPtrList;
|
||||||
|
|
||||||
|
// Class for interaction of vertex program with Driver.
|
||||||
|
// IProgramDrvInfos represent the real data of the GPU program, stored into the driver (eg: just a GLint for opengl).
|
||||||
|
class IProgramDrvInfos : public NLMISC::CRefCount
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
IDriver *_Driver;
|
||||||
|
ItGPUPrgDrvInfoPtrList _DriverIterator;
|
||||||
|
|
||||||
|
public:
|
||||||
|
IProgramDrvInfos (IDriver *drv, ItGPUPrgDrvInfoPtrList it);
|
||||||
|
// The virtual dtor is important.
|
||||||
|
virtual ~IProgramDrvInfos(void);
|
||||||
|
|
||||||
|
virtual uint getUniformIndex(const char *name) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Features exposed by a program. Used to set builtin parameters on user provided shaders.
|
||||||
|
// This is only used for user provided shaders, not for builtin shaders,
|
||||||
|
// as it is a slow method which has to go through all of the options every time.
|
||||||
|
// Builtin shaders should set all flags to 0.
|
||||||
|
// Example:
|
||||||
|
// User shader flags Matrices in the Vertex Program:
|
||||||
|
// -> When rendering with a material, the driver will call setUniformDriver,
|
||||||
|
// which will check if the flag Matrices exists, and if so, it will use
|
||||||
|
// the index cache to find which matrices are needed by the shader,
|
||||||
|
// and set those which are found.
|
||||||
|
// This does not work extremely efficient, but it's the most practical option
|
||||||
|
// for passing builtin parameters onto user provided shaders.
|
||||||
|
// Note: May need additional flags related to scene sorting, etcetera.
|
||||||
|
struct CProgramFeatures
|
||||||
|
{
|
||||||
|
CProgramFeatures() : DriverFlags(0), MaterialFlags(0) { }
|
||||||
|
|
||||||
|
// Driver builtin parameters
|
||||||
|
enum TDriverFlags
|
||||||
|
{
|
||||||
|
// Matrices
|
||||||
|
Matrices = 0x00000001,
|
||||||
|
|
||||||
|
// Fog
|
||||||
|
Fog = 0x00000002,
|
||||||
|
};
|
||||||
|
uint32 DriverFlags;
|
||||||
|
|
||||||
|
enum TMaterialFlags
|
||||||
|
{
|
||||||
|
/// Use the CMaterial texture stages as the textures for a Pixel Program
|
||||||
|
TextureStages = 0x00000001,
|
||||||
|
TextureMatrices = 0x00000002,
|
||||||
|
};
|
||||||
|
// Material builtin parameters
|
||||||
|
uint32 MaterialFlags;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Stucture used to cache the indices of builtin parameters which are used by the drivers
|
||||||
|
// Not used for parameters of specific nl3d programs
|
||||||
|
struct CProgramIndex
|
||||||
|
{
|
||||||
|
enum TName
|
||||||
|
{
|
||||||
|
ModelView,
|
||||||
|
ModelViewInverse,
|
||||||
|
ModelViewTranspose,
|
||||||
|
ModelViewInverseTranspose,
|
||||||
|
|
||||||
|
Projection,
|
||||||
|
ProjectionInverse,
|
||||||
|
ProjectionTranspose,
|
||||||
|
ProjectionInverseTranspose,
|
||||||
|
|
||||||
|
ModelViewProjection,
|
||||||
|
ModelViewProjectionInverse,
|
||||||
|
ModelViewProjectionTranspose,
|
||||||
|
ModelViewProjectionInverseTranspose,
|
||||||
|
|
||||||
|
Fog,
|
||||||
|
|
||||||
|
NUM_UNIFORMS
|
||||||
|
};
|
||||||
|
static const char *Names[NUM_UNIFORMS];
|
||||||
|
uint Indices[NUM_UNIFORMS];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief IProgram
|
||||||
|
* \date 2013-09-07 15:00GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* A generic GPU program
|
||||||
|
*/
|
||||||
|
class IProgram : public NLMISC::CRefCount
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum TProfile
|
||||||
|
{
|
||||||
|
none = 0,
|
||||||
|
|
||||||
|
// types
|
||||||
|
// Vertex Shader = 0x01
|
||||||
|
// Pixel Shader = 0x02
|
||||||
|
// Geometry Shader = 0x03
|
||||||
|
|
||||||
|
// nel - 0x31,type,bitfield
|
||||||
|
nelvp = 0x31010001, // VP supported by CVertexProgramParser, similar to arbvp1, can be translated to vs_1_1
|
||||||
|
|
||||||
|
// direct3d - 0xD9,type,major,minor
|
||||||
|
// vertex programs
|
||||||
|
vs_1_1 = 0xD9010101,
|
||||||
|
vs_2_0 = 0xD9010200,
|
||||||
|
// vs_2_sw = 0xD9010201, // not sure...
|
||||||
|
// vs_2_x = 0xD9010202, // not sure...
|
||||||
|
// vs_3_0 = 0xD9010300, // not supported
|
||||||
|
// pixel programs
|
||||||
|
ps_1_1 = 0xD9020101,
|
||||||
|
ps_1_2 = 0xD9020102,
|
||||||
|
ps_1_3 = 0xD9020103,
|
||||||
|
ps_1_4 = 0xD9020104,
|
||||||
|
ps_2_0 = 0xD9020200,
|
||||||
|
// ps_2_x = 0xD9020201, // not sure...
|
||||||
|
// ps_3_0 = 0xD9020300, // not supported
|
||||||
|
|
||||||
|
// opengl - 0x61,type,bitfield
|
||||||
|
// vertex programs
|
||||||
|
// vp20 = 0x61010001, // NV_vertex_program1_1, outdated
|
||||||
|
arbvp1 = 0x61010002, // ARB_vertex_program
|
||||||
|
vp30 = 0x61010004, // NV_vertex_program2
|
||||||
|
vp40 = 0x61010008, // NV_vertex_program3 + NV_fragment_program3
|
||||||
|
gp4vp = 0x61010010, // NV_gpu_program4
|
||||||
|
gp5vp = 0x61010020, // NV_gpu_program5
|
||||||
|
// pixel programs
|
||||||
|
// fp20 = 0x61020001, // very limited and outdated, unnecessary
|
||||||
|
// fp30 = 0x61020002, // NV_fragment_program, now arbfp1, redundant
|
||||||
|
arbfp1 = 0x61020004, // ARB_fragment_program
|
||||||
|
fp40 = 0x61020008, // NV_fragment_program2, arbfp1 with "OPTION NV_fragment_program2;\n"
|
||||||
|
gp4fp = 0x61020010, // NV_gpu_program4
|
||||||
|
gp5fp = 0x61020020, // NV_gpu_program5
|
||||||
|
// geometry programs
|
||||||
|
gp4gp = 0x61030001, // NV_gpu_program4
|
||||||
|
gp5gp = 0x61030001, // NV_gpu_program5
|
||||||
|
|
||||||
|
// glsl - 0x65,type,version
|
||||||
|
glsl330v = 0x65010330, // GLSL vertex program version 330
|
||||||
|
glsl330f = 0x65020330, // GLSL fragment program version 330
|
||||||
|
glsl330g = 0x65030330, // GLSL geometry program version 330
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CSource : public NLMISC::CRefCount
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::string DisplayName;
|
||||||
|
|
||||||
|
/// Minimal required profile for this GPU program
|
||||||
|
IProgram::TProfile Profile;
|
||||||
|
|
||||||
|
const char *SourcePtr;
|
||||||
|
size_t SourceLen;
|
||||||
|
/// Copy the source code string
|
||||||
|
inline void setSource(const std::string &source) { SourceCopy = source; SourcePtr = &SourceCopy[0]; SourceLen = SourceCopy.size(); }
|
||||||
|
inline void setSource(const char *source) { SourceCopy = source; SourcePtr = &SourceCopy[0]; SourceLen = SourceCopy.size(); }
|
||||||
|
/// Set pointer to source code string without copying the string
|
||||||
|
inline void setSourcePtr(const char *sourcePtr, size_t sourceLen) { SourceCopy.clear(); SourcePtr = sourcePtr; SourceLen = sourceLen; }
|
||||||
|
inline void setSourcePtr(const char *sourcePtr) { SourceCopy.clear(); SourcePtr = sourcePtr; SourceLen = strlen(sourcePtr); }
|
||||||
|
|
||||||
|
/// CVertexProgramInfo/CPixelProgramInfo/... NeL features
|
||||||
|
CProgramFeatures Features;
|
||||||
|
|
||||||
|
/// Map with known parameter indices, used for assembly programs
|
||||||
|
std::map<std::string, uint> ParamIndices;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string SourceCopy;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
IProgram();
|
||||||
|
virtual ~IProgram();
|
||||||
|
|
||||||
|
// Manage the sources, not allowed after compilation.
|
||||||
|
// Add multiple sources using different profiles, the driver will use the first one it supports.
|
||||||
|
inline size_t getSourceNb() const { return m_Sources.size(); };
|
||||||
|
inline CSource *getSource(size_t i) const { return m_Sources[i]; };
|
||||||
|
inline size_t addSource(CSource *source) { nlassert(!m_Source); m_Sources.push_back(source); return (m_Sources.size() - 1); }
|
||||||
|
inline void removeSource(size_t i) { nlassert(!m_Source); m_Sources.erase(m_Sources.begin() + i); }
|
||||||
|
|
||||||
|
// Get the idx of a parameter (ogl: uniform, d3d: constant, etcetera) by name. Invalid name returns ~0
|
||||||
|
inline uint getUniformIndex(const char *name) const { return m_DrvInfo->getUniformIndex(name); };
|
||||||
|
inline uint getUniformIndex(const std::string &name) const { return m_DrvInfo->getUniformIndex(name.c_str()); };
|
||||||
|
inline uint getUniformIndex(CProgramIndex::TName name) const { return m_Index.Indices[name]; }
|
||||||
|
|
||||||
|
// Get feature information of the current program
|
||||||
|
inline CSource *source() const { return m_Source; };
|
||||||
|
inline const CProgramFeatures &features() const { return m_Source->Features; };
|
||||||
|
inline TProfile profile() const { return m_Source->Profile; }
|
||||||
|
|
||||||
|
// Build feature info, called automatically by the driver after compile succeeds
|
||||||
|
void buildInfo(CSource *source);
|
||||||
|
|
||||||
|
// Override this to build additional info in a subclass
|
||||||
|
virtual void buildInfo();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// The progam source
|
||||||
|
std::vector<NLMISC::CSmartPtr<CSource> > m_Sources;
|
||||||
|
|
||||||
|
/// The source used for compilation
|
||||||
|
NLMISC::CSmartPtr<CSource> m_Source;
|
||||||
|
CProgramIndex m_Index;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// The driver information. For the driver implementation only.
|
||||||
|
NLMISC::CRefPtr<IProgramDrvInfos> m_DrvInfo;
|
||||||
|
|
||||||
|
}; /* class IProgram */
|
||||||
|
|
||||||
|
} /* namespace NL3D */
|
||||||
|
|
||||||
|
#endif /* #ifndef NL3D_PROGRAM_H */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -1,99 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef NL_SHADER_H
|
|
||||||
#define NL_SHADER_H
|
|
||||||
|
|
||||||
#include "nel/misc/types_nl.h"
|
|
||||||
#include "nel/misc/smart_ptr.h"
|
|
||||||
#include <list>
|
|
||||||
|
|
||||||
|
|
||||||
namespace NL3D {
|
|
||||||
|
|
||||||
using NLMISC::CRefCount;
|
|
||||||
|
|
||||||
|
|
||||||
class IDriver;
|
|
||||||
|
|
||||||
// List typedef.
|
|
||||||
class IShaderDrvInfos;
|
|
||||||
typedef std::list<IShaderDrvInfos*> TShaderDrvInfoPtrList;
|
|
||||||
typedef TShaderDrvInfoPtrList::iterator ItShaderDrvInfoPtrList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface for shader driver infos.
|
|
||||||
*/
|
|
||||||
class IShaderDrvInfos : public CRefCount
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
IDriver *_Driver;
|
|
||||||
ItShaderDrvInfoPtrList _DriverIterator;
|
|
||||||
|
|
||||||
public:
|
|
||||||
IShaderDrvInfos(IDriver *drv, ItShaderDrvInfoPtrList it) {_Driver= drv; _DriverIterator= it;}
|
|
||||||
// The virtual dtor is important.
|
|
||||||
virtual ~IShaderDrvInfos();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shader resource for the driver. It is just a container for a ".fx" text file.
|
|
||||||
*/
|
|
||||||
/* *** IMPORTANT ********************
|
|
||||||
* *** IF YOU MODIFY THE STRUCTURE OF THIS CLASS, PLEASE INCREMENT IDriver::InterfaceVersion TO INVALIDATE OLD DRIVER DLL
|
|
||||||
* **********************************
|
|
||||||
*/
|
|
||||||
// --------------------------------------------------
|
|
||||||
class CShader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CShader();
|
|
||||||
~CShader();
|
|
||||||
|
|
||||||
// Load a shader file
|
|
||||||
bool loadShaderFile (const char *filename);
|
|
||||||
|
|
||||||
// Set the shader text
|
|
||||||
void setText (const char *text);
|
|
||||||
|
|
||||||
// Get the shader text
|
|
||||||
const char *getText () const { return _Text.c_str(); }
|
|
||||||
|
|
||||||
// Set the shader name
|
|
||||||
void setName (const char *name);
|
|
||||||
|
|
||||||
// Get the shader name
|
|
||||||
const char *getName () const { return _Name.c_str(); }
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Private. For Driver only.
|
|
||||||
bool _ShaderChanged;
|
|
||||||
NLMISC::CRefPtr<IShaderDrvInfos> _DrvInfo;
|
|
||||||
private:
|
|
||||||
// The shader
|
|
||||||
std::string _Text;
|
|
||||||
// The shader name
|
|
||||||
std::string _Name;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // NL3D
|
|
||||||
|
|
||||||
|
|
||||||
#endif // NL_SHADER_H
|
|
||||||
|
|
||||||
/* End of shader.h */
|
|
@ -0,0 +1,134 @@
|
|||||||
|
/**
|
||||||
|
* \file stereo_debugger.h
|
||||||
|
* \brief CStereoDebugger
|
||||||
|
* \date 2013-07-03 20:17GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* CStereoDebugger
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 by authors
|
||||||
|
*
|
||||||
|
* This file is part of NL3D.
|
||||||
|
* NL3D is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with NL3D. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !FINAL_VERSION
|
||||||
|
#ifndef NL3D_STEREO_DEBUGGER_H
|
||||||
|
#define NL3D_STEREO_DEBUGGER_H
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
|
||||||
|
// NeL includes
|
||||||
|
#include <nel/misc/smart_ptr.h>
|
||||||
|
#include <nel/misc/geom_ext.h>
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
#include <nel/3d/stereo_display.h>
|
||||||
|
#include <nel/3d/frustum.h>
|
||||||
|
#include <nel/3d/viewport.h>
|
||||||
|
#include <nel/3d/u_material.h>
|
||||||
|
|
||||||
|
#define NL_STEREO_MAX_USER_CAMERAS 8
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
class ITexture;
|
||||||
|
class CTextureUser;
|
||||||
|
class CPixelProgram;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief CStereoDebugger
|
||||||
|
* \date 2013-07-03 20:17GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* CStereoDebugger
|
||||||
|
*/
|
||||||
|
class CStereoDebugger : public IStereoDisplay
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CStereoDebugger();
|
||||||
|
virtual ~CStereoDebugger();
|
||||||
|
|
||||||
|
|
||||||
|
/// Sets driver and generates necessary render targets
|
||||||
|
virtual void setDriver(NL3D::UDriver *driver);
|
||||||
|
void releaseTextures();
|
||||||
|
void initTextures();
|
||||||
|
void setTextures();
|
||||||
|
void verifyTextures();
|
||||||
|
|
||||||
|
/// Gets the required screen resolution for this device
|
||||||
|
virtual bool getScreenResolution(uint &width, uint &height);
|
||||||
|
/// Set latest camera position etcetera
|
||||||
|
virtual void updateCamera(uint cid, const NL3D::UCamera *camera);
|
||||||
|
/// Get the frustum to use for clipping
|
||||||
|
virtual void getClippingFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
|
||||||
|
/// Is there a next pass
|
||||||
|
virtual bool nextPass();
|
||||||
|
/// Gets the current viewport
|
||||||
|
virtual const NL3D::CViewport &getCurrentViewport() const;
|
||||||
|
/// Gets the current camera frustum
|
||||||
|
virtual const NL3D::CFrustum &getCurrentFrustum(uint cid) const;
|
||||||
|
/// Gets the current camera frustum
|
||||||
|
virtual void getCurrentFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
/// Gets the current camera matrix
|
||||||
|
virtual void getCurrentMatrix(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
|
||||||
|
/// At the start of a new render target
|
||||||
|
virtual bool wantClear();
|
||||||
|
/// The 3D scene
|
||||||
|
virtual bool wantScene();
|
||||||
|
/// Interface within the 3D scene
|
||||||
|
virtual bool wantInterface3D();
|
||||||
|
/// 2D Interface
|
||||||
|
virtual bool wantInterface2D();
|
||||||
|
|
||||||
|
/// Returns true if a new render target was set, always fase if not using render targets
|
||||||
|
virtual bool beginRenderTarget();
|
||||||
|
/// Returns true if a render target was fully drawn, always false if not using render targets
|
||||||
|
virtual bool endRenderTarget();
|
||||||
|
|
||||||
|
|
||||||
|
static void listDevices(std::vector<CStereoDeviceInfo> &devicesOut);
|
||||||
|
|
||||||
|
private:
|
||||||
|
UDriver *m_Driver;
|
||||||
|
|
||||||
|
int m_Stage;
|
||||||
|
int m_SubStage;
|
||||||
|
|
||||||
|
CViewport m_LeftViewport;
|
||||||
|
CViewport m_RightViewport;
|
||||||
|
CFrustum m_Frustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
CMatrix m_CameraMatrix[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
|
||||||
|
NLMISC::CSmartPtr<NL3D::ITexture> m_LeftTex;
|
||||||
|
NL3D::CTextureUser *m_LeftTexU;
|
||||||
|
NLMISC::CSmartPtr<NL3D::ITexture> m_RightTex;
|
||||||
|
NL3D::CTextureUser *m_RightTexU;
|
||||||
|
NL3D::UMaterial m_Mat;
|
||||||
|
NLMISC::CQuadUV m_QuadUV;
|
||||||
|
CPixelProgram *m_PixelProgram;
|
||||||
|
|
||||||
|
}; /* class CStereoDebugger */
|
||||||
|
|
||||||
|
} /* namespace NL3D */
|
||||||
|
|
||||||
|
#endif /* #ifndef NL3D_STEREO_DEBUGGER_H */
|
||||||
|
#endif /* #if !FINAL_VERSION */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,141 @@
|
|||||||
|
/**
|
||||||
|
* \file stereo_display.h
|
||||||
|
* \brief IStereoDisplay
|
||||||
|
* \date 2013-06-27 16:29GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* IStereoDisplay
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 by authors
|
||||||
|
*
|
||||||
|
* This file is part of NL3D.
|
||||||
|
* NL3D is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with NL3D. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL3D_STEREO_DISPLAY_H
|
||||||
|
#define NL3D_STEREO_DISPLAY_H
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
|
||||||
|
// NeL includes
|
||||||
|
#include <nel/misc/smart_ptr.h>
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
class UCamera;
|
||||||
|
class CViewport;
|
||||||
|
class CFrustum;
|
||||||
|
class IStereoDisplay;
|
||||||
|
class UTexture;
|
||||||
|
class UDriver;
|
||||||
|
|
||||||
|
class IStereoDeviceFactory : public NLMISC::CRefCount
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IStereoDeviceFactory() { }
|
||||||
|
virtual ~IStereoDeviceFactory() { }
|
||||||
|
virtual IStereoDisplay *createDevice() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CStereoDeviceInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum TStereoDeviceClass
|
||||||
|
{
|
||||||
|
StereoDisplay,
|
||||||
|
StereoHMD,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum TStereoDeviceLibrary
|
||||||
|
{
|
||||||
|
NeL3D,
|
||||||
|
OVR,
|
||||||
|
LibVR,
|
||||||
|
OpenHMD,
|
||||||
|
};
|
||||||
|
|
||||||
|
NLMISC::CSmartPtr<IStereoDeviceFactory> Factory;
|
||||||
|
|
||||||
|
TStereoDeviceLibrary Library;
|
||||||
|
TStereoDeviceClass Class;
|
||||||
|
std::string Manufacturer;
|
||||||
|
std::string ProductName;
|
||||||
|
std::string Serial; // A unique device identifier
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief IStereoDisplay
|
||||||
|
* \date 2013-06-27 16:29GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* IStereoDisplay
|
||||||
|
*/
|
||||||
|
class IStereoDisplay
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IStereoDisplay();
|
||||||
|
virtual ~IStereoDisplay();
|
||||||
|
|
||||||
|
/// Sets driver and generates necessary render targets
|
||||||
|
virtual void setDriver(NL3D::UDriver *driver) = 0;
|
||||||
|
|
||||||
|
/// Gets the required screen resolution for this device
|
||||||
|
virtual bool getScreenResolution(uint &width, uint &height) = 0;
|
||||||
|
/// Set latest camera position etcetera
|
||||||
|
virtual void updateCamera(uint cid, const NL3D::UCamera *camera) = 0;
|
||||||
|
/// Get the frustum to use for clipping
|
||||||
|
virtual void getClippingFrustum(uint cid, NL3D::UCamera *camera) const = 0;
|
||||||
|
|
||||||
|
/// Is there a next pass
|
||||||
|
virtual bool nextPass() = 0;
|
||||||
|
/// Gets the current viewport
|
||||||
|
virtual const NL3D::CViewport &getCurrentViewport() const = 0;
|
||||||
|
/// Gets the current camera frustum
|
||||||
|
virtual const NL3D::CFrustum &getCurrentFrustum(uint cid) const = 0;
|
||||||
|
/// Gets the current camera frustum
|
||||||
|
virtual void getCurrentFrustum(uint cid, NL3D::UCamera *camera) const = 0;
|
||||||
|
/// Gets the current camera matrix
|
||||||
|
virtual void getCurrentMatrix(uint cid, NL3D::UCamera *camera) const = 0;
|
||||||
|
|
||||||
|
/// At the start of a new render target
|
||||||
|
virtual bool wantClear() = 0;
|
||||||
|
/// The 3D scene
|
||||||
|
virtual bool wantScene() = 0;
|
||||||
|
/// Interface within the 3D scene
|
||||||
|
virtual bool wantInterface3D() = 0;
|
||||||
|
/// 2D Interface
|
||||||
|
virtual bool wantInterface2D() = 0;
|
||||||
|
|
||||||
|
/// Returns true if a new render target was set, always fase if not using render targets
|
||||||
|
virtual bool beginRenderTarget() = 0;
|
||||||
|
/// Returns true if a render target was fully drawn, always false if not using render targets
|
||||||
|
virtual bool endRenderTarget() = 0;
|
||||||
|
|
||||||
|
static const char *getLibraryName(CStereoDeviceInfo::TStereoDeviceLibrary library);
|
||||||
|
static void listDevices(std::vector<CStereoDeviceInfo> &devicesOut);
|
||||||
|
static IStereoDisplay *createDevice(const CStereoDeviceInfo &deviceInfo);
|
||||||
|
static void releaseUnusedLibraries();
|
||||||
|
static void releaseAllLibraries();
|
||||||
|
|
||||||
|
}; /* class IStereoDisplay */
|
||||||
|
|
||||||
|
} /* namespace NL3D */
|
||||||
|
|
||||||
|
#endif /* #ifndef NL3D_STEREO_DISPLAY_H */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,73 @@
|
|||||||
|
/**
|
||||||
|
* \file stereo_hmd.h
|
||||||
|
* \brief IStereoHMD
|
||||||
|
* \date 2013-06-27 16:30GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* IStereoHMD
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 by authors
|
||||||
|
*
|
||||||
|
* This file is part of NL3D.
|
||||||
|
* NL3D is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with NL3D. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL3D_STEREO_HMD_H
|
||||||
|
#define NL3D_STEREO_HMD_H
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
|
||||||
|
// NeL includes
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
#include <nel/3d/stereo_display.h>
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief IStereoHMD
|
||||||
|
* \date 2013-06-27 16:30GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* IStereoHMD
|
||||||
|
*/
|
||||||
|
class IStereoHMD : public IStereoDisplay
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IStereoHMD();
|
||||||
|
virtual ~IStereoHMD();
|
||||||
|
|
||||||
|
/// Get the HMD orientation
|
||||||
|
virtual NLMISC::CQuat getOrientation() const = 0;
|
||||||
|
|
||||||
|
/// Get GUI center (1 = width, 1 = height, 0 = center)
|
||||||
|
virtual void getInterface2DShift(uint cid, float &x, float &y, float distance) const = 0;
|
||||||
|
|
||||||
|
/// Set the head model, eye position relative to orientation point
|
||||||
|
virtual void setEyePosition(const NLMISC::CVector &v) = 0;
|
||||||
|
/// Get the head model, eye position relative to orientation point
|
||||||
|
virtual const NLMISC::CVector &getEyePosition() const = 0;
|
||||||
|
|
||||||
|
/// Set the scale of the game in units per meter
|
||||||
|
virtual void setScale(float s) = 0;
|
||||||
|
|
||||||
|
}; /* class IStereoHMD */
|
||||||
|
|
||||||
|
} /* namespace NL3D */
|
||||||
|
|
||||||
|
#endif /* #ifndef NL3D_STEREO_HMD_H */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,160 @@
|
|||||||
|
/**
|
||||||
|
* \file stereo_libvr.h
|
||||||
|
* \brief CStereoLibVR
|
||||||
|
* \date 2013-08-19 19:17MT
|
||||||
|
* \author Thibaut Girka (ThibG)
|
||||||
|
* CStereoLibVR
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 by authors
|
||||||
|
*
|
||||||
|
* This file is part of NL3D.
|
||||||
|
* NL3D is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with NL3D. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL3D_STEREO_LIBVR_H
|
||||||
|
#define NL3D_STEREO_LIBVR_H
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBVR
|
||||||
|
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
|
||||||
|
// NeL includes
|
||||||
|
#include <nel/misc/smart_ptr.h>
|
||||||
|
#include <nel/misc/geom_ext.h>
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
#include <nel/3d/stereo_hmd.h>
|
||||||
|
#include <nel/3d/frustum.h>
|
||||||
|
#include <nel/3d/viewport.h>
|
||||||
|
#include <nel/3d/u_material.h>
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
class ITexture;
|
||||||
|
class CTextureUser;
|
||||||
|
class CStereoLibVRDevicePtr;
|
||||||
|
class CStereoLibVRDeviceHandle;
|
||||||
|
class CPixelProgram;
|
||||||
|
|
||||||
|
#define NL_STEREO_MAX_USER_CAMERAS 8
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief CStereoOVR
|
||||||
|
* \date 2013-06-25 22:22GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* CStereoOVR
|
||||||
|
*/
|
||||||
|
class CStereoLibVR : public IStereoHMD
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CStereoLibVR(const CStereoLibVRDeviceHandle *handle);
|
||||||
|
virtual ~CStereoLibVR();
|
||||||
|
|
||||||
|
/// Sets driver and generates necessary render targets
|
||||||
|
virtual void setDriver(NL3D::UDriver *driver);
|
||||||
|
|
||||||
|
/// Gets the required screen resolution for this device
|
||||||
|
virtual bool getScreenResolution(uint &width, uint &height);
|
||||||
|
/// Set latest camera position etcetera
|
||||||
|
virtual void updateCamera(uint cid, const NL3D::UCamera *camera);
|
||||||
|
/// Get the frustum to use for clipping
|
||||||
|
virtual void getClippingFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
|
||||||
|
/// Is there a next pass
|
||||||
|
virtual bool nextPass();
|
||||||
|
/// Gets the current viewport
|
||||||
|
virtual const NL3D::CViewport &getCurrentViewport() const;
|
||||||
|
/// Gets the current camera frustum
|
||||||
|
virtual const NL3D::CFrustum &getCurrentFrustum(uint cid) const;
|
||||||
|
/// Gets the current camera frustum
|
||||||
|
virtual void getCurrentFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
/// Gets the current camera matrix
|
||||||
|
virtual void getCurrentMatrix(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
|
||||||
|
/// At the start of a new render target
|
||||||
|
virtual bool wantClear();
|
||||||
|
/// The 3D scene
|
||||||
|
virtual bool wantScene();
|
||||||
|
/// Interface within the 3D scene
|
||||||
|
virtual bool wantInterface3D();
|
||||||
|
/// 2D Interface
|
||||||
|
virtual bool wantInterface2D();
|
||||||
|
|
||||||
|
/// Returns true if a new render target was set, always fase if not using render targets
|
||||||
|
virtual bool beginRenderTarget();
|
||||||
|
/// Returns true if a render target was fully drawn, always false if not using render targets
|
||||||
|
virtual bool endRenderTarget();
|
||||||
|
|
||||||
|
|
||||||
|
/// Get the HMD orientation
|
||||||
|
virtual NLMISC::CQuat getOrientation() const;
|
||||||
|
|
||||||
|
/// Get GUI center (1 = width, 1 = height, 0 = center)
|
||||||
|
virtual void getInterface2DShift(uint cid, float &x, float &y, float distance) const;
|
||||||
|
|
||||||
|
/// Set the head model, eye position relative to orientation point
|
||||||
|
virtual void setEyePosition(const NLMISC::CVector &v);
|
||||||
|
/// Get the head model, eye position relative to orientation point
|
||||||
|
virtual const NLMISC::CVector &getEyePosition() const;
|
||||||
|
|
||||||
|
/// Set the scale of the game in units per meter
|
||||||
|
virtual void setScale(float s);
|
||||||
|
|
||||||
|
|
||||||
|
static void listDevices(std::vector<CStereoDeviceInfo> &devicesOut);
|
||||||
|
static bool isLibraryInUse();
|
||||||
|
static void releaseLibrary();
|
||||||
|
|
||||||
|
|
||||||
|
/// Calculates internal camera information based on the reference camera
|
||||||
|
void initCamera(uint cid, const NL3D::UCamera *camera);
|
||||||
|
/// Checks if the device used by this class was actually created
|
||||||
|
bool isDeviceCreated();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CStereoLibVRDevicePtr *m_DevicePtr;
|
||||||
|
int m_Stage;
|
||||||
|
int m_SubStage;
|
||||||
|
CViewport m_LeftViewport;
|
||||||
|
CViewport m_RightViewport;
|
||||||
|
CFrustum m_ClippingFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
CFrustum m_LeftFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
CFrustum m_RightFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
CMatrix m_CameraMatrix[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
mutable bool m_OrientationCached;
|
||||||
|
mutable NLMISC::CQuat m_OrientationCache;
|
||||||
|
UDriver *m_Driver;
|
||||||
|
NLMISC::CSmartPtr<NL3D::ITexture> m_BarrelTex;
|
||||||
|
NL3D::CTextureUser *m_BarrelTexU;
|
||||||
|
NL3D::UMaterial m_BarrelMat;
|
||||||
|
NLMISC::CQuadUV m_BarrelQuadLeft;
|
||||||
|
NLMISC::CQuadUV m_BarrelQuadRight;
|
||||||
|
CPixelProgram *m_PixelProgram;
|
||||||
|
NLMISC::CVector m_EyePosition;
|
||||||
|
float m_Scale;
|
||||||
|
|
||||||
|
}; /* class CStereoLibVR */
|
||||||
|
|
||||||
|
} /* namespace NL3D */
|
||||||
|
|
||||||
|
#endif /* HAVE_LIBVR */
|
||||||
|
|
||||||
|
#endif /* #ifndef NL3D_STEREO_LIBVR_H */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,176 @@
|
|||||||
|
/**
|
||||||
|
* \file stereo_ovr.h
|
||||||
|
* \brief CStereoOVR
|
||||||
|
* \date 2013-06-25 22:22GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* CStereoOVR
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 by authors
|
||||||
|
*
|
||||||
|
* This file is part of NL3D.
|
||||||
|
* NL3D is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with NL3D. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Linking this library statically or dynamically with other modules
|
||||||
|
* is making a combined work based on this library. Thus, the terms
|
||||||
|
* and conditions of the GNU General Public License cover the whole
|
||||||
|
* combination.
|
||||||
|
*
|
||||||
|
* As a special exception, the copyright holders of this library give
|
||||||
|
* you permission to link this library with the Oculus SDK to produce
|
||||||
|
* an executable, regardless of the license terms of the Oculus SDK,
|
||||||
|
* and distribute linked combinations including the two, provided that
|
||||||
|
* you also meet the terms and conditions of the license of the Oculus
|
||||||
|
* SDK. You must obey the GNU General Public License in all respects
|
||||||
|
* for all of the code used other than the Oculus SDK. If you modify
|
||||||
|
* this file, you may extend this exception to your version of the
|
||||||
|
* file, but you are not obligated to do so. If you do not wish to do
|
||||||
|
* so, delete this exception statement from your version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL3D_STEREO_OVR_H
|
||||||
|
#define NL3D_STEREO_OVR_H
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBOVR
|
||||||
|
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
|
||||||
|
// NeL includes
|
||||||
|
#include <nel/misc/smart_ptr.h>
|
||||||
|
#include <nel/misc/geom_ext.h>
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
#include <nel/3d/stereo_hmd.h>
|
||||||
|
#include <nel/3d/frustum.h>
|
||||||
|
#include <nel/3d/viewport.h>
|
||||||
|
#include <nel/3d/u_material.h>
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
class ITexture;
|
||||||
|
class CTextureUser;
|
||||||
|
class CStereoOVRDevicePtr;
|
||||||
|
class CStereoOVRDeviceHandle;
|
||||||
|
class CPixelProgramOVR;
|
||||||
|
|
||||||
|
#define NL_STEREO_MAX_USER_CAMERAS 8
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief CStereoOVR
|
||||||
|
* \date 2013-06-25 22:22GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* CStereoOVR
|
||||||
|
*/
|
||||||
|
class CStereoOVR : public IStereoHMD
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CStereoOVR(const CStereoOVRDeviceHandle *handle);
|
||||||
|
virtual ~CStereoOVR();
|
||||||
|
|
||||||
|
/// Sets driver and generates necessary render targets
|
||||||
|
virtual void setDriver(NL3D::UDriver *driver);
|
||||||
|
|
||||||
|
/// Gets the required screen resolution for this device
|
||||||
|
virtual bool getScreenResolution(uint &width, uint &height);
|
||||||
|
/// Set latest camera position etcetera
|
||||||
|
virtual void updateCamera(uint cid, const NL3D::UCamera *camera);
|
||||||
|
/// Get the frustum to use for clipping
|
||||||
|
virtual void getClippingFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
|
||||||
|
/// Is there a next pass
|
||||||
|
virtual bool nextPass();
|
||||||
|
/// Gets the current viewport
|
||||||
|
virtual const NL3D::CViewport &getCurrentViewport() const;
|
||||||
|
/// Gets the current camera frustum
|
||||||
|
virtual const NL3D::CFrustum &getCurrentFrustum(uint cid) const;
|
||||||
|
/// Gets the current camera frustum
|
||||||
|
virtual void getCurrentFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
/// Gets the current camera matrix
|
||||||
|
virtual void getCurrentMatrix(uint cid, NL3D::UCamera *camera) const;
|
||||||
|
|
||||||
|
/// At the start of a new render target
|
||||||
|
virtual bool wantClear();
|
||||||
|
/// The 3D scene
|
||||||
|
virtual bool wantScene();
|
||||||
|
/// Interface within the 3D scene
|
||||||
|
virtual bool wantInterface3D();
|
||||||
|
/// 2D Interface
|
||||||
|
virtual bool wantInterface2D();
|
||||||
|
|
||||||
|
/// Returns true if a new render target was set, always fase if not using render targets
|
||||||
|
virtual bool beginRenderTarget();
|
||||||
|
/// Returns true if a render target was fully drawn, always false if not using render targets
|
||||||
|
virtual bool endRenderTarget();
|
||||||
|
|
||||||
|
|
||||||
|
/// Get the HMD orientation
|
||||||
|
virtual NLMISC::CQuat getOrientation() const;
|
||||||
|
|
||||||
|
/// Get GUI center (1 = width, 1 = height, 0 = center)
|
||||||
|
virtual void getInterface2DShift(uint cid, float &x, float &y, float distance) const;
|
||||||
|
|
||||||
|
/// Set the head model, eye position relative to orientation point
|
||||||
|
virtual void setEyePosition(const NLMISC::CVector &v);
|
||||||
|
/// Get the head model, eye position relative to orientation point
|
||||||
|
virtual const NLMISC::CVector &getEyePosition() const;
|
||||||
|
|
||||||
|
/// Set the scale of the game in units per meter
|
||||||
|
virtual void setScale(float s);
|
||||||
|
|
||||||
|
|
||||||
|
static void listDevices(std::vector<CStereoDeviceInfo> &devicesOut);
|
||||||
|
static bool isLibraryInUse();
|
||||||
|
static void releaseLibrary();
|
||||||
|
|
||||||
|
|
||||||
|
/// Calculates internal camera information based on the reference camera
|
||||||
|
void initCamera(uint cid, const NL3D::UCamera *camera);
|
||||||
|
/// Checks if the device used by this class was actually created
|
||||||
|
bool isDeviceCreated();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CStereoOVRDevicePtr *m_DevicePtr;
|
||||||
|
int m_Stage;
|
||||||
|
int m_SubStage;
|
||||||
|
CViewport m_LeftViewport;
|
||||||
|
CViewport m_RightViewport;
|
||||||
|
CFrustum m_ClippingFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
CFrustum m_LeftFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
CFrustum m_RightFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
CMatrix m_CameraMatrix[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
mutable bool m_OrientationCached;
|
||||||
|
mutable NLMISC::CQuat m_OrientationCache;
|
||||||
|
UDriver *m_Driver;
|
||||||
|
NLMISC::CSmartPtr<NL3D::ITexture> m_BarrelTex;
|
||||||
|
NL3D::CTextureUser *m_BarrelTexU;
|
||||||
|
NL3D::UMaterial m_BarrelMat;
|
||||||
|
NLMISC::CQuadUV m_BarrelQuadLeft;
|
||||||
|
NLMISC::CQuadUV m_BarrelQuadRight;
|
||||||
|
NLMISC::CRefPtr<CPixelProgramOVR> m_PixelProgram;
|
||||||
|
NLMISC::CVector m_EyePosition;
|
||||||
|
float m_Scale;
|
||||||
|
|
||||||
|
}; /* class CStereoOVR */
|
||||||
|
|
||||||
|
} /* namespace NL3D */
|
||||||
|
|
||||||
|
#endif /* HAVE_LIBOVR */
|
||||||
|
|
||||||
|
#endif /* #ifndef NL3D_STEREO_OVR_H */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,153 @@
|
|||||||
|
/** \file driver_direct3d_pixel_program.cpp
|
||||||
|
* Direct 3d driver implementation
|
||||||
|
*
|
||||||
|
* $Id: driver_direct3d_pixel_program.cpp,v 1.1.2.4 2007/07/09 15:26:35 legallo Exp $
|
||||||
|
*
|
||||||
|
* \todo manage better the init/release system (if a throw occurs in the init, we must release correctly the driver)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright, 2000 Nevrax Ltd.
|
||||||
|
*
|
||||||
|
* This file is part of NEVRAX NEL.
|
||||||
|
* NEVRAX NEL is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
|
||||||
|
* NEVRAX NEL is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with NEVRAX NEL; see the file COPYING. If not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
* MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stddirect3d.h"
|
||||||
|
|
||||||
|
#include "driver_direct3d.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
namespace NL3D
|
||||||
|
{
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
CPixelProgramDrvInfosD3D::CPixelProgramDrvInfosD3D(IDriver *drv, ItGPUPrgDrvInfoPtrList it) : IProgramDrvInfos (drv, it)
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CPixelProgramDrvInfosD3D_CPixelProgamDrvInfosD3D)
|
||||||
|
Shader = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
CPixelProgramDrvInfosD3D::~CPixelProgramDrvInfosD3D()
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CPixelProgramDrvInfosD3D_CPixelProgramDrvInfosD3DDtor)
|
||||||
|
if (Shader)
|
||||||
|
Shader->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
bool CDriverD3D::supportPixelProgram (CPixelProgram::TProfile profile) const
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CDriverD3D_supportPixelProgram_profile)
|
||||||
|
return ((profile & 0xFFFF0000) == 0xD9020000)
|
||||||
|
&& (_PixelProgramVersion >= (uint16)(profile & 0x0000FFFF));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
bool CDriverD3D::compilePixelProgram(CPixelProgram *program)
|
||||||
|
{
|
||||||
|
// Program setuped ?
|
||||||
|
if (program->m_DrvInfo==NULL)
|
||||||
|
{
|
||||||
|
// Find a supported pixel program profile
|
||||||
|
IProgram::CSource *source = NULL;
|
||||||
|
for (uint i = 0; i < program->getSourceNb(); ++i)
|
||||||
|
{
|
||||||
|
if (supportPixelProgram(program->getSource(i)->Profile))
|
||||||
|
{
|
||||||
|
source = program->getSource(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!source)
|
||||||
|
{
|
||||||
|
nlwarning("No supported source profile for pixel program");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_GPUPrgDrvInfos.push_front (NULL);
|
||||||
|
ItGPUPrgDrvInfoPtrList itPix = _GPUPrgDrvInfos.begin();
|
||||||
|
CPixelProgramDrvInfosD3D *drvInfo;
|
||||||
|
*itPix = drvInfo = new CPixelProgramDrvInfosD3D(this, itPix);
|
||||||
|
|
||||||
|
// Create a driver info structure
|
||||||
|
program->m_DrvInfo = *itPix;
|
||||||
|
|
||||||
|
LPD3DXBUFFER pShader;
|
||||||
|
LPD3DXBUFFER pErrorMsgs;
|
||||||
|
if (D3DXAssembleShader(source->SourcePtr, source->SourceLen, NULL, NULL, 0, &pShader, &pErrorMsgs) == D3D_OK)
|
||||||
|
{
|
||||||
|
if (_DeviceInterface->CreatePixelShader((DWORD*)pShader->GetBufferPointer(), &(getPixelProgramD3D(*program)->Shader)) != D3D_OK)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning ("Can't assemble pixel program:");
|
||||||
|
nlwarning ((const char*)pErrorMsgs->GetBufferPointer());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set parameters for assembly programs
|
||||||
|
drvInfo->ParamIndices = source->ParamIndices;
|
||||||
|
|
||||||
|
// Build the feature info
|
||||||
|
program->buildInfo(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
bool CDriverD3D::activePixelProgram(CPixelProgram *program)
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CDriverD3D_activePixelProgram )
|
||||||
|
if (_DisableHardwarePixelProgram)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Set the pixel program
|
||||||
|
if (program)
|
||||||
|
{
|
||||||
|
if (!CDriverD3D::compilePixelProgram(program)) return false;
|
||||||
|
|
||||||
|
CPixelProgramDrvInfosD3D *info = static_cast<CPixelProgramDrvInfosD3D *>((IProgramDrvInfos*)program->m_DrvInfo);
|
||||||
|
_PixelProgramUser = program;
|
||||||
|
setPixelShader(info->Shader);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setPixelShader(NULL);
|
||||||
|
_PixelProgramUser = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
void CDriverD3D::disableHardwarePixelProgram()
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CDriverD3D_disableHardwarePixelProgram)
|
||||||
|
_DisableHardwarePixelProgram = true;
|
||||||
|
_PixelProgram = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // NL3D
|
@ -0,0 +1,242 @@
|
|||||||
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "stddirect3d.h"
|
||||||
|
|
||||||
|
#include "driver_direct3d.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
namespace NL3D
|
||||||
|
{
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4f(TProgram program, uint index, float f0, float f1, float f2, float f3)
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CDriverD3D_setUniform4f);
|
||||||
|
|
||||||
|
const float tabl[4] = { f0, f1, f2, f3 };
|
||||||
|
switch (program)
|
||||||
|
{
|
||||||
|
case VertexProgram:
|
||||||
|
if (_VertexProgram)
|
||||||
|
{
|
||||||
|
setVertexProgramConstant(index, tabl);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PixelProgram:
|
||||||
|
if (_PixelProgram)
|
||||||
|
{
|
||||||
|
setPixelShaderConstant(index, tabl);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4fv(TProgram program, uint index, size_t num, const float *src)
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CDriverD3D_setUniform4fv);
|
||||||
|
|
||||||
|
switch (program)
|
||||||
|
{
|
||||||
|
case VertexProgram:
|
||||||
|
if (_VertexProgram)
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < num; ++i)
|
||||||
|
{
|
||||||
|
setVertexProgramConstant(index + i, src + (i * 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PixelProgram:
|
||||||
|
if (_PixelProgram)
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < num; ++i)
|
||||||
|
{
|
||||||
|
setPixelShaderConstant(index + i, src + (i * 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform1f(TProgram program, uint index, float f0)
|
||||||
|
{
|
||||||
|
CDriverD3D::setUniform4f(program, index, f0, 0.f, 0.f, 0.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform2f(TProgram program, uint index, float f0, float f1)
|
||||||
|
{
|
||||||
|
CDriverD3D::setUniform4f(program, index, f0, f1, 0.f, 0.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform3f(TProgram program, uint index, float f0, float f1, float f2)
|
||||||
|
{
|
||||||
|
CDriverD3D::setUniform4f(program, index, f0, f1, f2, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform1i(TProgram program, uint index, sint32 i0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform2i(TProgram program, uint index, sint32 i0, sint32 i1)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform3i(TProgram program, uint index, sint32 i0, sint32 i1, sint32 i2)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4i(TProgram program, uint index, sint32 i0, sint32 i1, sint32 i2, sint32 i3)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform1ui(TProgram program, uint index, uint32 ui0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform2ui(TProgram program, uint index, uint32 ui0, uint32 ui1)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform3ui(TProgram program, uint index, uint32 ui0, uint32 ui1, uint32 ui2)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4ui(TProgram program, uint index, uint32 ui0, uint32 ui1, uint32 ui2, uint32 ui3)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform3f(TProgram program, uint index, const NLMISC::CVector& v)
|
||||||
|
{
|
||||||
|
CDriverD3D::setUniform4f(program, index, v.x, v.y, v.z, 0.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4f(TProgram program, uint index, const NLMISC::CVector& v, float f3)
|
||||||
|
{
|
||||||
|
CDriverD3D::setUniform4f(program, index, v.x, v.y, v.z, f3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4f(TProgram program, uint index, const NLMISC::CRGBAF& rgba)
|
||||||
|
{
|
||||||
|
CDriverD3D::setUniform4fv(program, index, 1, &rgba.R);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4x4f(TProgram program, uint index, const NLMISC::CMatrix& m)
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CDriverD3D_setUniform4x4f);
|
||||||
|
|
||||||
|
// TODO: Verify this!
|
||||||
|
NLMISC::CMatrix mat = m;
|
||||||
|
mat.transpose();
|
||||||
|
const float *md = mat.get();
|
||||||
|
|
||||||
|
CDriverD3D::setUniform4fv(program, index, 4, md);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4iv(TProgram program, uint index, size_t num, const sint32 *src)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniform4uiv(TProgram program, uint index, size_t num, const uint32 *src)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniformMatrix(NL3D::IDriver::TProgram program, uint index, NL3D::IDriver::TMatrix matrix, NL3D::IDriver::TTransform transform)
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CDriverD3D_setUniformMatrix);
|
||||||
|
|
||||||
|
D3DXMATRIX mat;
|
||||||
|
D3DXMATRIX *matPtr = NULL;
|
||||||
|
switch (matrix)
|
||||||
|
{
|
||||||
|
case IDriver::ModelView:
|
||||||
|
matPtr = &_D3DModelView;
|
||||||
|
break;
|
||||||
|
case IDriver::Projection:
|
||||||
|
matPtr = &(_MatrixCache[remapMatrixIndex(D3DTS_PROJECTION)].Matrix);
|
||||||
|
break;
|
||||||
|
case IDriver::ModelViewProjection:
|
||||||
|
matPtr = &_D3DModelViewProjection;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (transform != IDriver::Identity)
|
||||||
|
{
|
||||||
|
switch (transform)
|
||||||
|
{
|
||||||
|
case IDriver::Inverse:
|
||||||
|
D3DXMatrixInverse(&mat, NULL, matPtr);
|
||||||
|
break;
|
||||||
|
case IDriver::Transpose:
|
||||||
|
D3DXMatrixTranspose(&mat, matPtr);
|
||||||
|
break;
|
||||||
|
case IDriver::InverseTranspose:
|
||||||
|
D3DXMatrixInverse(&mat, NULL, matPtr);
|
||||||
|
D3DXMatrixTranspose(&mat, &mat);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
matPtr = &mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3DXMatrixTranspose(&mat, matPtr);
|
||||||
|
|
||||||
|
CDriverD3D::setUniform4fv(program, index, 4, &mat.m[0][0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniformFog(NL3D::IDriver::TProgram program, uint index)
|
||||||
|
{
|
||||||
|
H_AUTO_D3D(CDriverD3D_setUniformFog)
|
||||||
|
|
||||||
|
/* "oFog" must always be between [1, 0] what ever you set in D3DRS_FOGSTART and D3DRS_FOGEND (1 for no fog, 0 for full fog).
|
||||||
|
The Geforce4 TI 4200 (drivers 53.03 and 45.23) doesn't accept other values for "oFog". */
|
||||||
|
const float delta = _FogEnd - _FogStart;
|
||||||
|
CDriverD3D::setUniform4f(program, index,
|
||||||
|
-_D3DModelView._13 / delta,
|
||||||
|
-_D3DModelView._23 / delta,
|
||||||
|
-_D3DModelView._33 / delta,
|
||||||
|
1 - (_D3DModelView._43 - _FogStart) / delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CDriverD3D::setUniformDriver(TProgram program)
|
||||||
|
{
|
||||||
|
// todo
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CDriverD3D::setUniformMaterial(TProgram program, CMaterial &material)
|
||||||
|
{
|
||||||
|
// todo
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverD3D::setUniformParams(TProgram program, CGPUProgramParams ¶ms)
|
||||||
|
{
|
||||||
|
// todo
|
||||||
|
}
|
||||||
|
|
||||||
|
} // NL3D
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,251 @@
|
|||||||
|
/** \file driver_opengl_pixel_program.cpp
|
||||||
|
* OpenGL driver implementation for pixel program manipulation.
|
||||||
|
*
|
||||||
|
* $Id: driver_opengl_pixel_program.cpp,v 1.1.2.4 2007/07/09 15:29:00 legallo Exp $
|
||||||
|
*
|
||||||
|
* \todo manage better the init/release system (if a throw occurs in the init, we must release correctly the driver)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright, 2000 Nevrax Ltd.
|
||||||
|
*
|
||||||
|
* This file is part of NEVRAX NEL.
|
||||||
|
* NEVRAX NEL is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
|
||||||
|
* NEVRAX NEL is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with NEVRAX NEL; see the file COPYING. If not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
* MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stdopengl.h"
|
||||||
|
|
||||||
|
#include "driver_opengl.h"
|
||||||
|
#include "nel/3d/index_buffer.h"
|
||||||
|
#include "nel/3d/pixel_program.h"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
// tmp
|
||||||
|
#include "nel/misc/file.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
namespace NL3D
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef NL_STATIC
|
||||||
|
#ifdef USE_OPENGLES
|
||||||
|
namespace NLDRIVERGLES {
|
||||||
|
#else
|
||||||
|
namespace NLDRIVERGL {
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
CPixelProgamDrvInfosGL::CPixelProgamDrvInfosGL (CDriverGL *drv, ItGPUPrgDrvInfoPtrList it) : IProgramDrvInfos (drv, it)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CPixelProgamDrvInfosGL_CPixelProgamDrvInfosGL)
|
||||||
|
|
||||||
|
#ifndef USE_OPENGLES
|
||||||
|
// Extension must exist
|
||||||
|
nlassert(drv->_Extensions.ARBFragmentProgram);
|
||||||
|
|
||||||
|
if (drv->_Extensions.ARBFragmentProgram) // ARB implementation
|
||||||
|
{
|
||||||
|
nglGenProgramsARB(1, &ID);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
bool CDriverGL::supportPixelProgram(CPixelProgram::TProfile profile) const
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CPixelProgamDrvInfosGL_supportPixelProgram_profile)
|
||||||
|
switch (profile)
|
||||||
|
{
|
||||||
|
case CPixelProgram::arbfp1:
|
||||||
|
return _Extensions.ARBFragmentProgram;
|
||||||
|
case CPixelProgram::fp40:
|
||||||
|
return _Extensions.NVFragmentProgram2;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
bool CDriverGL::activePixelProgram(CPixelProgram *program)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CDriverGL_activePixelProgram)
|
||||||
|
|
||||||
|
if (_Extensions.ARBFragmentProgram)
|
||||||
|
{
|
||||||
|
return activeARBPixelProgram(program);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
bool CDriverGL::compilePixelProgram(NL3D::CPixelProgram *program)
|
||||||
|
{
|
||||||
|
#ifndef USE_OPENGLES
|
||||||
|
// Program setuped ?
|
||||||
|
if (program->m_DrvInfo == NULL)
|
||||||
|
{
|
||||||
|
glDisable(GL_FRAGMENT_PROGRAM_ARB);
|
||||||
|
_PixelProgramEnabled = false;
|
||||||
|
|
||||||
|
// Insert into driver list. (so it is deleted when driver is deleted).
|
||||||
|
ItGPUPrgDrvInfoPtrList it = _GPUPrgDrvInfos.insert(_GPUPrgDrvInfos.end(), (NL3D::IProgramDrvInfos*)NULL);
|
||||||
|
|
||||||
|
// Create a driver info
|
||||||
|
CPixelProgamDrvInfosGL *drvInfo;
|
||||||
|
*it = drvInfo = new CPixelProgamDrvInfosGL(this, it);
|
||||||
|
// Set the pointer
|
||||||
|
program->m_DrvInfo = drvInfo;
|
||||||
|
|
||||||
|
if (!setupPixelProgram(program, drvInfo->ID))
|
||||||
|
{
|
||||||
|
delete drvInfo;
|
||||||
|
program->m_DrvInfo = NULL;
|
||||||
|
_GPUPrgDrvInfos.erase(it);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
bool CDriverGL::activeARBPixelProgram(CPixelProgram *program)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CDriverGL_activeARBPixelProgram)
|
||||||
|
|
||||||
|
#ifndef USE_OPENGLES
|
||||||
|
// Setup or unsetup ?
|
||||||
|
if (program)
|
||||||
|
{
|
||||||
|
// Program setuped ?
|
||||||
|
if (!CDriverGL::compilePixelProgram(program)) return false;
|
||||||
|
|
||||||
|
// Cast the driver info pointer
|
||||||
|
CPixelProgamDrvInfosGL *drvInfo = safe_cast<CPixelProgamDrvInfosGL*>((IProgramDrvInfos*)program->m_DrvInfo);
|
||||||
|
|
||||||
|
glEnable(GL_FRAGMENT_PROGRAM_ARB);
|
||||||
|
_PixelProgramEnabled = true;
|
||||||
|
nglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, drvInfo->ID);
|
||||||
|
|
||||||
|
_LastSetuppedPP = program;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glDisable(GL_FRAGMENT_PROGRAM_ARB);
|
||||||
|
_PixelProgramEnabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
bool CDriverGL::setupPixelProgram(CPixelProgram *program, GLuint id/*, bool &specularWritten*/)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CDriverGL_setupARBPixelProgram);
|
||||||
|
|
||||||
|
#ifndef USE_OPENGLES
|
||||||
|
CPixelProgamDrvInfosGL *drvInfo = static_cast<CPixelProgamDrvInfosGL *>((IProgramDrvInfos *)program->m_DrvInfo);
|
||||||
|
|
||||||
|
// Find a supported pixel program profile
|
||||||
|
IProgram::CSource *source = NULL;
|
||||||
|
for (uint i = 0; i < program->getSourceNb(); ++i)
|
||||||
|
{
|
||||||
|
if (supportPixelProgram(program->getSource(i)->Profile))
|
||||||
|
{
|
||||||
|
source = program->getSource(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!source)
|
||||||
|
{
|
||||||
|
nlwarning("No supported source profile for pixel program");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compile the program
|
||||||
|
nglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, id);
|
||||||
|
glGetError();
|
||||||
|
nglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, source->SourceLen, source->SourcePtr);
|
||||||
|
GLenum err = glGetError();
|
||||||
|
if (err != GL_NO_ERROR)
|
||||||
|
{
|
||||||
|
if (err == GL_INVALID_OPERATION)
|
||||||
|
{
|
||||||
|
GLint position;
|
||||||
|
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &position);
|
||||||
|
nlassert(position != -1); // there was an error..
|
||||||
|
nlassert(position < (GLint) source->SourceLen);
|
||||||
|
uint line = 0;
|
||||||
|
const char *lineStart = source->SourcePtr;
|
||||||
|
for(uint k = 0; k < (uint) position; ++k)
|
||||||
|
{
|
||||||
|
if (source->SourcePtr[k] == '\n')
|
||||||
|
{
|
||||||
|
lineStart = source->SourcePtr + k;
|
||||||
|
++line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nlwarning("ARB fragment program parse error at line %d.", (int) line);
|
||||||
|
// search end of line
|
||||||
|
const char *lineEnd = source->SourcePtr + source->SourceLen;
|
||||||
|
for(uint k = position; k < source->SourceLen; ++k)
|
||||||
|
{
|
||||||
|
if (source->SourcePtr[k] == '\n')
|
||||||
|
{
|
||||||
|
lineEnd = source->SourcePtr + k;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nlwarning(std::string(lineStart, lineEnd).c_str());
|
||||||
|
// display the gl error msg
|
||||||
|
const GLubyte *errorMsg = glGetString(GL_PROGRAM_ERROR_STRING_ARB);
|
||||||
|
nlassert((const char *) errorMsg);
|
||||||
|
nlwarning((const char *) errorMsg);
|
||||||
|
}
|
||||||
|
nlassert(0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set parameters for assembly programs
|
||||||
|
drvInfo->ParamIndices = source->ParamIndices;
|
||||||
|
|
||||||
|
// Build the feature info
|
||||||
|
program->buildInfo(source);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NL_STATIC
|
||||||
|
} // NLDRIVERGL/ES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // NL3D
|
@ -0,0 +1,509 @@
|
|||||||
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "stdopengl.h"
|
||||||
|
|
||||||
|
#include "driver_opengl.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
#ifdef NL_STATIC
|
||||||
|
#ifdef USE_OPENGLES
|
||||||
|
namespace NLDRIVERGLES {
|
||||||
|
#else
|
||||||
|
namespace NLDRIVERGL {
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inline void CDriverGL::setUniform4fInl(TProgram program, uint index, float f0, float f1, float f2, float f3)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CDriverGL_setUniform4f);
|
||||||
|
|
||||||
|
#ifndef USE_OPENGLES
|
||||||
|
switch (program)
|
||||||
|
{
|
||||||
|
case VertexProgram:
|
||||||
|
if (_Extensions.NVVertexProgram)
|
||||||
|
{
|
||||||
|
// Setup constant
|
||||||
|
nglProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, index, f0, f1, f2, f3);
|
||||||
|
}
|
||||||
|
else if (_Extensions.ARBVertexProgram)
|
||||||
|
{
|
||||||
|
nglProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, index, f0, f1, f2, f3);
|
||||||
|
}
|
||||||
|
else if (_Extensions.EXTVertexShader)
|
||||||
|
{
|
||||||
|
float datas[] = { f0, f1, f2, f3 };
|
||||||
|
nglSetInvariantEXT(_EVSConstantHandle + index, GL_FLOAT, datas);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PixelProgram:
|
||||||
|
if (_Extensions.ARBFragmentProgram)
|
||||||
|
{
|
||||||
|
nglProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, index, f0, f1, f2, f3);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CDriverGL::setUniform4fvInl(TProgram program, uint index, size_t num, const float *src)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CDriverGL_setUniform4fv);
|
||||||
|
|
||||||
|
#ifndef USE_OPENGLES
|
||||||
|
switch (program)
|
||||||
|
{
|
||||||
|
case VertexProgram:
|
||||||
|
if (_Extensions.NVVertexProgram)
|
||||||
|
{
|
||||||
|
nglProgramParameters4fvNV(GL_VERTEX_PROGRAM_NV, index, num, src);
|
||||||
|
}
|
||||||
|
else if (_Extensions.ARBVertexProgram) // ARB pixel and geometry program will only exist when ARB vertex program exists
|
||||||
|
{
|
||||||
|
for (uint k = 0; k < num; ++k)
|
||||||
|
{
|
||||||
|
nglProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, index + k, src + 4 * k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_Extensions.EXTVertexShader)
|
||||||
|
{
|
||||||
|
for (uint k = 0; k < num; ++k)
|
||||||
|
{
|
||||||
|
nglSetInvariantEXT(_EVSConstantHandle + index + k, GL_FLOAT, (void *)(src + 4 * k));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PixelProgram:
|
||||||
|
if (_Extensions.ARBFragmentProgram) // ARB pixel and geometry program will only exist when ARB vertex program exists
|
||||||
|
{
|
||||||
|
for (uint k = 0; k < num; ++k)
|
||||||
|
{
|
||||||
|
nglProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, index + k, src + 4 * k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform1f(TProgram program, uint index, float f0)
|
||||||
|
{
|
||||||
|
CDriverGL::setUniform4fInl(program, index, f0, 0.f, 0.f, 0.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform2f(TProgram program, uint index, float f0, float f1)
|
||||||
|
{
|
||||||
|
CDriverGL::setUniform4fInl(program, index, f0, f1, 0.f, 0.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform3f(TProgram program, uint index, float f0, float f1, float f2)
|
||||||
|
{
|
||||||
|
CDriverGL::setUniform4fInl(program, index, f0, f1, f2, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4f(TProgram program, uint index, float f0, float f1, float f2, float f3)
|
||||||
|
{
|
||||||
|
CDriverGL::setUniform4fInl(program, index, f0, f1, f2, f3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform1i(TProgram program, uint index, sint32 i0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform2i(TProgram program, uint index, sint32 i0, sint32 i1)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform3i(TProgram program, uint index, sint32 i0, sint32 i1, sint32 i2)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4i(TProgram program, uint index, sint32 i0, sint32 i1, sint32 i2, sint32 i3)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform1ui(TProgram program, uint index, uint32 ui0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform2ui(TProgram program, uint index, uint32 ui0, uint32 ui1)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform3ui(TProgram program, uint index, uint32 ui0, uint32 ui1, uint32 ui2)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4ui(TProgram program, uint index, uint32 ui0, uint32 ui1, uint32 ui2, uint32 ui3)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform3f(TProgram program, uint index, const NLMISC::CVector& v)
|
||||||
|
{
|
||||||
|
CDriverGL::setUniform4fInl(program, index, v.x, v.y, v.z, 0.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4f(TProgram program, uint index, const NLMISC::CVector& v, float f3)
|
||||||
|
{
|
||||||
|
CDriverGL::setUniform4fInl(program, index, v.x, v.y, v.z, f3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4f(TProgram program, uint index, const NLMISC::CRGBAF& rgba)
|
||||||
|
{
|
||||||
|
CDriverGL::setUniform4fvInl(program, index, 1, &rgba.R);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4x4f(TProgram program, uint index, const NLMISC::CMatrix& m)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CDriverGL_setUniform4x4f);
|
||||||
|
|
||||||
|
// TODO: Verify this!
|
||||||
|
NLMISC::CMatrix mat = m;
|
||||||
|
mat.transpose();
|
||||||
|
const float *md = mat.get();
|
||||||
|
|
||||||
|
CDriverGL::setUniform4fvInl(program, index, 4, md);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4fv(TProgram program, uint index, size_t num, const float *src)
|
||||||
|
{
|
||||||
|
CDriverGL::setUniform4fvInl(program, index, num, src);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4iv(TProgram program, uint index, size_t num, const sint32 *src)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniform4uiv(TProgram program, uint index, size_t num, const uint32 *src)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint CDriverGL::GLMatrix[IDriver::NumMatrix]=
|
||||||
|
{
|
||||||
|
GL_MODELVIEW,
|
||||||
|
GL_PROJECTION,
|
||||||
|
#ifdef USE_OPENGLES
|
||||||
|
GL_MODELVIEW
|
||||||
|
#else
|
||||||
|
GL_MODELVIEW_PROJECTION_NV
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint CDriverGL::GLTransform[IDriver::NumTransform]=
|
||||||
|
{
|
||||||
|
#ifdef USE_OPENGLES
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
#else
|
||||||
|
GL_IDENTITY_NV,
|
||||||
|
GL_INVERSE_NV,
|
||||||
|
GL_TRANSPOSE_NV,
|
||||||
|
GL_INVERSE_TRANSPOSE_NV
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
void CDriverGL::setUniformMatrix(NL3D::IDriver::TProgram program, uint index, NL3D::IDriver::TMatrix matrix, NL3D::IDriver::TTransform transform)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CDriverGL_setUniformMatrix);
|
||||||
|
|
||||||
|
#ifndef USE_OPENGLES
|
||||||
|
// Vertex program exist ?
|
||||||
|
if (program == VertexProgram && _Extensions.NVVertexProgram)
|
||||||
|
{
|
||||||
|
// First, ensure that the render setup is correclty setuped.
|
||||||
|
refreshRenderSetup();
|
||||||
|
|
||||||
|
// Track the matrix
|
||||||
|
nglTrackMatrixNV(GL_VERTEX_PROGRAM_NV, index, GLMatrix[matrix], GLTransform[transform]);
|
||||||
|
// Release Track => matrix data is copied.
|
||||||
|
nglTrackMatrixNV(GL_VERTEX_PROGRAM_NV, index, GL_NONE, GL_IDENTITY_NV);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// First, ensure that the render setup is correctly setuped.
|
||||||
|
refreshRenderSetup();
|
||||||
|
|
||||||
|
CMatrix mat;
|
||||||
|
switch (matrix)
|
||||||
|
{
|
||||||
|
case IDriver::ModelView:
|
||||||
|
mat = _ModelViewMatrix;
|
||||||
|
break;
|
||||||
|
case IDriver::Projection:
|
||||||
|
{
|
||||||
|
refreshProjMatrixFromGL();
|
||||||
|
mat = _GLProjMat;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IDriver::ModelViewProjection:
|
||||||
|
refreshProjMatrixFromGL();
|
||||||
|
mat = _GLProjMat * _ModelViewMatrix;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(transform)
|
||||||
|
{
|
||||||
|
case IDriver::Identity: break;
|
||||||
|
case IDriver::Inverse:
|
||||||
|
mat.invert();
|
||||||
|
break;
|
||||||
|
case IDriver::Transpose:
|
||||||
|
mat.transpose();
|
||||||
|
break;
|
||||||
|
case IDriver::InverseTranspose:
|
||||||
|
mat.invert();
|
||||||
|
mat.transpose();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mat.transpose();
|
||||||
|
const float *md = mat.get();
|
||||||
|
|
||||||
|
CDriverGL::setUniform4fvInl(program, index, 4, md);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniformFog(NL3D::IDriver::TProgram program, uint index)
|
||||||
|
{
|
||||||
|
H_AUTO_OGL(CDriverGL_setUniformFog)
|
||||||
|
|
||||||
|
const float *values = _ModelViewMatrix.get();
|
||||||
|
CDriverGL::setUniform4fInl(program, index, -values[2], -values[6], -values[10], -values[14]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
bool CDriverGL::setUniformDriver(TProgram program)
|
||||||
|
{
|
||||||
|
IProgram *prog = NULL;
|
||||||
|
switch (program)
|
||||||
|
{
|
||||||
|
case VertexProgram:
|
||||||
|
prog = _LastSetuppedVP;
|
||||||
|
break;
|
||||||
|
case PixelProgram:
|
||||||
|
prog = _LastSetuppedPP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!prog) return false;
|
||||||
|
|
||||||
|
const CProgramFeatures &features = prog->features();
|
||||||
|
|
||||||
|
if (features.DriverFlags)
|
||||||
|
{
|
||||||
|
if (features.DriverFlags & CProgramFeatures::Matrices)
|
||||||
|
{
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ModelView) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ModelView), ModelView, Identity);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ModelViewInverse) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ModelViewInverse), ModelView, Inverse);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ModelViewTranspose) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ModelViewTranspose), ModelView, Transpose);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ModelViewInverseTranspose) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ModelViewInverseTranspose), ModelView, InverseTranspose);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::Projection) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::Projection), Projection, Identity);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ProjectionInverse) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ProjectionInverse), Projection, Inverse);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ProjectionTranspose) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ProjectionTranspose), Projection, Transpose);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ProjectionInverseTranspose) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ProjectionInverseTranspose), Projection, InverseTranspose);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ModelViewProjection) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ModelViewProjection), ModelViewProjection, Identity);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ModelViewProjectionInverse) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ModelViewProjectionInverse), ModelViewProjection, Inverse);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ModelViewProjectionTranspose) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ModelViewProjectionTranspose), ModelViewProjection, Transpose);
|
||||||
|
}
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::ModelViewProjectionInverseTranspose) != ~0)
|
||||||
|
{
|
||||||
|
setUniformMatrix(program, prog->getUniformIndex(CProgramIndex::ModelViewProjectionInverseTranspose), ModelViewProjection, InverseTranspose);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (features.DriverFlags & CProgramFeatures::Fog)
|
||||||
|
{
|
||||||
|
if (prog->getUniformIndex(CProgramIndex::Fog) != ~0)
|
||||||
|
{
|
||||||
|
setUniformFog(program, prog->getUniformIndex(CProgramIndex::Fog));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CDriverGL::setUniformMaterial(TProgram program, CMaterial &material)
|
||||||
|
{
|
||||||
|
IProgram *prog = NULL;
|
||||||
|
switch (program)
|
||||||
|
{
|
||||||
|
case VertexProgram:
|
||||||
|
prog = _LastSetuppedVP;
|
||||||
|
break;
|
||||||
|
case PixelProgram:
|
||||||
|
prog = _LastSetuppedPP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!prog) return false;
|
||||||
|
|
||||||
|
const CProgramFeatures &features = prog->features();
|
||||||
|
|
||||||
|
// These are also already set by setupMaterial, so setupMaterial uses setUniformMaterialInternal instead
|
||||||
|
if (features.MaterialFlags & (CProgramFeatures::TextureStages | CProgramFeatures::TextureMatrices))
|
||||||
|
{
|
||||||
|
if (features.MaterialFlags & CProgramFeatures::TextureStages)
|
||||||
|
{
|
||||||
|
for (uint stage = 0; stage < inlGetNumTextStages(); ++stage)
|
||||||
|
{
|
||||||
|
ITexture *text= material.getTexture(uint8(stage));
|
||||||
|
|
||||||
|
// Must setup textures each frame. (need to test if touched).
|
||||||
|
if (text != NULL && !setupTexture(*text))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// activate the texture, or disable texturing if NULL.
|
||||||
|
activateTexture(stage, text);
|
||||||
|
|
||||||
|
// If texture not NULL, Change texture env function.
|
||||||
|
setTextureEnvFunction(stage, material);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
if (features.MaterialFlags & CProgramFeatures::TextureMatrices)
|
||||||
|
{
|
||||||
|
// Textures user matrix
|
||||||
|
setupUserTextureMatrix(inlGetNumTextStages(), material);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CDriverGL::setUniformMaterialInternal(TProgram program, CMaterial &material)
|
||||||
|
{
|
||||||
|
IProgram *prog = NULL;
|
||||||
|
switch (program)
|
||||||
|
{
|
||||||
|
case VertexProgram:
|
||||||
|
prog = _LastSetuppedVP;
|
||||||
|
break;
|
||||||
|
case PixelProgram:
|
||||||
|
prog = _LastSetuppedPP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!prog) return false;
|
||||||
|
|
||||||
|
const CProgramFeatures &features = prog->features();
|
||||||
|
|
||||||
|
if (features.MaterialFlags & ~(CProgramFeatures::TextureStages | CProgramFeatures::TextureMatrices))
|
||||||
|
{
|
||||||
|
// none
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDriverGL::setUniformParams(TProgram program, CGPUProgramParams ¶ms)
|
||||||
|
{
|
||||||
|
IProgram *prog = NULL;
|
||||||
|
switch (program)
|
||||||
|
{
|
||||||
|
case VertexProgram:
|
||||||
|
prog = _LastSetuppedVP;
|
||||||
|
break;
|
||||||
|
case PixelProgram:
|
||||||
|
prog = _LastSetuppedPP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!prog) return;
|
||||||
|
|
||||||
|
size_t offset = params.getBegin();
|
||||||
|
while (offset != params.getEnd())
|
||||||
|
{
|
||||||
|
uint size = params.getSizeByOffset(offset);
|
||||||
|
uint count = params.getCountByOffset(offset);
|
||||||
|
|
||||||
|
nlassert(size == 4 || count == 1); // only support float4 arrays
|
||||||
|
nlassert(params.getTypeByOffset(offset) == CGPUProgramParams::Float); // only support float
|
||||||
|
|
||||||
|
uint index = params.getIndexByOffset(offset);
|
||||||
|
if (index == ~0)
|
||||||
|
{
|
||||||
|
const std::string &name = params.getNameByOffset(offset);
|
||||||
|
nlassert(!name.empty()); // missing both parameter name and index, code error
|
||||||
|
uint index = prog->getUniformIndex(name.c_str());
|
||||||
|
nlassert(index != ~0); // invalid parameter name
|
||||||
|
params.map(index, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
setUniform4fv(program, index, count, params.getPtrFByOffset(offset));
|
||||||
|
|
||||||
|
offset = params.getNext(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef NL_STATIC
|
||||||
|
} // NLDRIVERGL/ES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // NL3D
|
@ -0,0 +1,49 @@
|
|||||||
|
/** \file geometry_program.cpp
|
||||||
|
* Geometry program definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright, 2000, 2001 Nevrax Ltd.
|
||||||
|
*
|
||||||
|
* This file is part of NEVRAX NEL.
|
||||||
|
* NEVRAX NEL is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
|
||||||
|
* NEVRAX NEL is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with NEVRAX NEL; see the file COPYING. If not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
* MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "std3d.h"
|
||||||
|
|
||||||
|
#include <nel/3d/geometry_program.h>
|
||||||
|
|
||||||
|
#include <nel/3d/driver.h>
|
||||||
|
|
||||||
|
namespace NL3D
|
||||||
|
{
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
CGeometryProgram::CGeometryProgram()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
CGeometryProgram::~CGeometryProgram ()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
} // NL3D
|
@ -0,0 +1,587 @@
|
|||||||
|
/**
|
||||||
|
* \file gpu_program_params.cpp
|
||||||
|
* \brief CGPUProgramParams
|
||||||
|
* \date 2013-09-07 22:17GMT
|
||||||
|
* \author Jan Boon (Kaetemi)
|
||||||
|
* CGPUProgramParams
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 by authors
|
||||||
|
*
|
||||||
|
* This file is part of NL3D.
|
||||||
|
* NL3D is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with NL3D. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
#include <nel/3d/gpu_program_params.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
|
||||||
|
// NeL includes
|
||||||
|
// #include <nel/misc/debug.h>
|
||||||
|
#include <nel/misc/vector.h>
|
||||||
|
#include <nel/misc/matrix.h>
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
#include <nel/3d/driver.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
// using namespace NLMISC;
|
||||||
|
|
||||||
|
namespace NL3D {
|
||||||
|
|
||||||
|
CGPUProgramParams::CGPUProgramParams() : m_First(s_End), m_Last(s_End)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CGPUProgramParams::~CGPUProgramParams()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::copy(CGPUProgramParams *params)
|
||||||
|
{
|
||||||
|
size_t offset = params->getBegin();
|
||||||
|
while (offset != params->getEnd())
|
||||||
|
{
|
||||||
|
uint index = params->getIndexByOffset(offset);
|
||||||
|
const std::string &name = params->getNameByOffset(offset);
|
||||||
|
size_t local;
|
||||||
|
uint size = params->getSizeByOffset(offset);
|
||||||
|
uint count = params->getCountByOffset(offset);
|
||||||
|
uint nbComponents = size * count;
|
||||||
|
if (index)
|
||||||
|
{
|
||||||
|
local = allocOffset(index, size, count, params->getTypeByOffset(offset));
|
||||||
|
if (!name.empty())
|
||||||
|
{
|
||||||
|
map(index, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlassert(!name.empty());
|
||||||
|
local = allocOffset(name, size, count, params->getTypeByOffset(offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 *src = params->getPtrUIByOffset(offset);
|
||||||
|
uint32 *dst = getPtrUIByOffset(local);
|
||||||
|
|
||||||
|
for (uint c = 0; c < nbComponents; ++c)
|
||||||
|
{
|
||||||
|
dst[c] = src[c];
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = params->getNext(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set1f(uint index, float f0)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 1, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set2f(uint index, float f0, float f1)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 2, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
f[1] = f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set3f(uint index, float f0, float f1, float f2)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 3, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
f[1] = f1;
|
||||||
|
f[2] = f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4f(uint index, float f0, float f1, float f2, float f3)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 4, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
f[1] = f1;
|
||||||
|
f[2] = f2;
|
||||||
|
f[3] = f3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set1i(uint index, sint32 i0)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(index, 1, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set2i(uint index, sint32 i0, sint32 i1)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(index, 2, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
i[1] = i1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set3i(uint index, sint32 i0, sint32 i1, sint32 i2)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(index, 3, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
i[1] = i1;
|
||||||
|
i[2] = i2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4i(uint index, sint32 i0, sint32 i1, sint32 i2, sint32 i3)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(index, 4, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
i[1] = i1;
|
||||||
|
i[2] = i2;
|
||||||
|
i[3] = i3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set1ui(uint index, uint32 ui0)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(index, 1, 1, UInt));
|
||||||
|
ui[0] = ui0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set2ui(uint index, uint32 ui0, uint32 ui1)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(index, 2, 1, UInt));
|
||||||
|
ui[0] = ui0;
|
||||||
|
ui[1] = ui1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set3ui(uint index, uint32 ui0, uint32 ui1, uint32 ui2)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(index, 3, 1, UInt));
|
||||||
|
ui[0] = ui0;
|
||||||
|
ui[1] = ui1;
|
||||||
|
ui[2] = ui2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4ui(uint index, uint32 ui0, uint32 ui1, uint32 ui2, uint32 ui3)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(index, 4, 1, UInt));
|
||||||
|
ui[0] = ui0;
|
||||||
|
ui[1] = ui1;
|
||||||
|
ui[2] = ui2;
|
||||||
|
ui[3] = ui3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set3f(uint index, const NLMISC::CVector& v)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 3, 1, Float));
|
||||||
|
f[0] = v.x;
|
||||||
|
f[1] = v.y;
|
||||||
|
f[2] = v.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4f(uint index, const NLMISC::CVector& v, float f3)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 4, 1, Float));
|
||||||
|
f[0] = v.x;
|
||||||
|
f[1] = v.y;
|
||||||
|
f[2] = v.z;
|
||||||
|
f[3] = f3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4x4f(uint index, const NLMISC::CMatrix& m)
|
||||||
|
{
|
||||||
|
// TODO: Verify this!
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 4, 4, Float));
|
||||||
|
NLMISC::CMatrix mt = m;
|
||||||
|
mt.transpose();
|
||||||
|
mt.get(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4fv(uint index, size_t num, const float *src)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 4, num, Float));
|
||||||
|
size_t nb = 4 * num;
|
||||||
|
for (uint c = 0; c < nb; ++c)
|
||||||
|
f[c] = src[c];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4iv(uint index, size_t num, const sint32 *src)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(index, 4, num, Int));
|
||||||
|
size_t nb = 4 * num;
|
||||||
|
for (uint c = 0; c < nb; ++c)
|
||||||
|
i[c] = src[c];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4uiv(uint index, size_t num, const uint32 *src)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(index, 4, num, UInt));
|
||||||
|
size_t nb = 4 * num;
|
||||||
|
for (uint c = 0; c < nb; ++c)
|
||||||
|
ui[c] = src[c];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::unset(uint index)
|
||||||
|
{
|
||||||
|
size_t offset = getOffset(index);
|
||||||
|
if (offset != getEnd())
|
||||||
|
{
|
||||||
|
freeOffset(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set1f(const std::string &name, float f0)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(name, 1, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set2f(const std::string &name, float f0, float f1)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(name, 2, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
f[1] = f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set3f(const std::string &name, float f0, float f1, float f2)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(name, 3, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
f[1] = f1;
|
||||||
|
f[2] = f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4f(const std::string &name, float f0, float f1, float f2, float f3)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(name, 4, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
f[1] = f1;
|
||||||
|
f[2] = f2;
|
||||||
|
f[3] = f3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set1i(const std::string &name, sint32 i0)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(name, 1, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set2i(const std::string &name, sint32 i0, sint32 i1)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(name, 2, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
i[1] = i1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set3i(const std::string &name, sint32 i0, sint32 i1, sint32 i2)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(name, 3, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
i[1] = i1;
|
||||||
|
i[2] = i2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4i(const std::string &name, sint32 i0, sint32 i1, sint32 i2, sint32 i3)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(name, 4, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
i[1] = i1;
|
||||||
|
i[2] = i2;
|
||||||
|
i[3] = i3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set1ui(const std::string &name, uint32 ui0)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(name, 1, 1, UInt));
|
||||||
|
ui[0] = ui0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set2ui(const std::string &name, uint32 ui0, uint32 ui1)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(name, 2, 1, UInt));
|
||||||
|
ui[0] = ui0;
|
||||||
|
ui[1] = ui1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set3ui(const std::string &name, uint32 ui0, uint32 ui1, uint32 ui2)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(name, 3, 1, UInt));
|
||||||
|
ui[0] = ui0;
|
||||||
|
ui[1] = ui1;
|
||||||
|
ui[2] = ui2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4ui(const std::string &name, uint32 ui0, uint32 ui1, uint32 ui2, uint32 ui3)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(name, 4, 1, UInt));
|
||||||
|
ui[0] = ui0;
|
||||||
|
ui[1] = ui1;
|
||||||
|
ui[2] = ui2;
|
||||||
|
ui[3] = ui3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set3f(const std::string &name, const NLMISC::CVector& v)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(name, 3, 1, Float));
|
||||||
|
f[0] = v.x;
|
||||||
|
f[1] = v.y;
|
||||||
|
f[2] = v.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4f(const std::string &name, const NLMISC::CVector& v, float f3)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(name, 4, 1, Float));
|
||||||
|
f[0] = v.x;
|
||||||
|
f[1] = v.y;
|
||||||
|
f[2] = v.z;
|
||||||
|
f[3] = f3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4x4f(const std::string &name, const NLMISC::CMatrix& m)
|
||||||
|
{
|
||||||
|
// TODO: Verify this!
|
||||||
|
float *f = getPtrFByOffset(allocOffset(name, 4, 4, Float));
|
||||||
|
NLMISC::CMatrix mt = m;
|
||||||
|
mt.transpose();
|
||||||
|
mt.get(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4fv(const std::string &name, size_t num, const float *src)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(name, 4, num, Float));
|
||||||
|
size_t nb = 4 * num;
|
||||||
|
for (uint c = 0; c < nb; ++c)
|
||||||
|
f[c] = src[c];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4iv(const std::string &name, size_t num, const sint32 *src)
|
||||||
|
{
|
||||||
|
sint32 *i = getPtrIByOffset(allocOffset(name, 4, num, Int));
|
||||||
|
size_t nb = 4 * num;
|
||||||
|
for (uint c = 0; c < nb; ++c)
|
||||||
|
i[c] = src[c];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::set4uiv(const std::string &name, size_t num, const uint32 *src)
|
||||||
|
{
|
||||||
|
uint32 *ui = getPtrUIByOffset(allocOffset(name, 4, num, UInt));
|
||||||
|
size_t nb = 4 * num;
|
||||||
|
for (uint c = 0; c < nb; ++c)
|
||||||
|
ui[c] = src[c];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::unset(const std::string &name)
|
||||||
|
{
|
||||||
|
size_t offset = getOffset(name);
|
||||||
|
if (offset != getEnd())
|
||||||
|
{
|
||||||
|
freeOffset(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::map(uint index, const std::string &name)
|
||||||
|
{
|
||||||
|
size_t offsetIndex = getOffset(index);
|
||||||
|
size_t offsetName = getOffset(name);
|
||||||
|
if (offsetName != getEnd())
|
||||||
|
{
|
||||||
|
// Remove possible duplicate
|
||||||
|
if (offsetIndex != getEnd())
|
||||||
|
{
|
||||||
|
freeOffset(offsetIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set index
|
||||||
|
m_Meta[offsetName].Index = index;
|
||||||
|
|
||||||
|
// Map index to name
|
||||||
|
if (index >= m_Map.size())
|
||||||
|
m_Map.resize(index + 1, s_End);
|
||||||
|
m_Map[index] = offsetName;
|
||||||
|
}
|
||||||
|
else if (offsetIndex != getEnd())
|
||||||
|
{
|
||||||
|
// Set name
|
||||||
|
m_Meta[offsetIndex].Name = name;
|
||||||
|
|
||||||
|
// Map name to index
|
||||||
|
m_MapName[name] = offsetIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocate specified number of components if necessary
|
||||||
|
size_t CGPUProgramParams::allocOffset(uint index, uint size, uint count, TType type)
|
||||||
|
{
|
||||||
|
nlassert(count > 0); // this code will not properly handle 0
|
||||||
|
nlassert(size > 0); // this code will not properly handle 0
|
||||||
|
nlassert(index < 0xFFFF); // sanity check
|
||||||
|
|
||||||
|
uint nbComponents = size * count;
|
||||||
|
size_t offset = getOffset(index);
|
||||||
|
if (offset != s_End)
|
||||||
|
{
|
||||||
|
if (getCountByOffset(offset) >= nbComponents)
|
||||||
|
{
|
||||||
|
m_Meta[offset].Type = type;
|
||||||
|
m_Meta[offset].Size = size;
|
||||||
|
m_Meta[offset].Count = count;
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
if (getCountByOffset(offset) < nbComponents)
|
||||||
|
{
|
||||||
|
freeOffset(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allocate space
|
||||||
|
offset = allocOffset(size, count, type);
|
||||||
|
|
||||||
|
// Fill
|
||||||
|
m_Meta[offset].Index = index;
|
||||||
|
|
||||||
|
// Store offset in map
|
||||||
|
if (index >= m_Map.size())
|
||||||
|
m_Map.resize(index + 1, s_End);
|
||||||
|
m_Map[index] = offset;
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocate specified number of components if necessary
|
||||||
|
size_t CGPUProgramParams::allocOffset(const std::string &name, uint size, uint count, TType type)
|
||||||
|
{
|
||||||
|
nlassert(count > 0); // this code will not properly handle 0
|
||||||
|
nlassert(size > 0); // this code will not properly handle 0
|
||||||
|
nlassert(!name.empty()); // sanity check
|
||||||
|
|
||||||
|
uint nbComponents = size * count;
|
||||||
|
size_t offset = getOffset(name);
|
||||||
|
if (offset != s_End)
|
||||||
|
{
|
||||||
|
if (getCountByOffset(offset) >= nbComponents)
|
||||||
|
{
|
||||||
|
m_Meta[offset].Type = type;
|
||||||
|
m_Meta[offset].Size = size;
|
||||||
|
m_Meta[offset].Count = count;
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
if (getCountByOffset(offset) < nbComponents)
|
||||||
|
{
|
||||||
|
freeOffset(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allocate space
|
||||||
|
offset = allocOffset(size, count, type);
|
||||||
|
|
||||||
|
// Fill
|
||||||
|
m_Meta[offset].Name = name;
|
||||||
|
|
||||||
|
// Store offset in map
|
||||||
|
m_MapName[name] = offset;
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocate specified number of components if necessary
|
||||||
|
size_t CGPUProgramParams::allocOffset(uint size, uint count, TType type)
|
||||||
|
{
|
||||||
|
uint nbComponents = size * count;
|
||||||
|
|
||||||
|
// Allocate space
|
||||||
|
size_t offset = m_Meta.size();
|
||||||
|
uint blocks = getNbRegistersByComponents(nbComponents); // per 4 components
|
||||||
|
m_Meta.resize(offset + blocks);
|
||||||
|
m_Vec.resize(offset + blocks);
|
||||||
|
|
||||||
|
// Fill
|
||||||
|
m_Meta[offset].Size = size;
|
||||||
|
m_Meta[offset].Count = count;
|
||||||
|
m_Meta[offset].Type = type;
|
||||||
|
m_Meta[offset].Prev = m_Last;
|
||||||
|
m_Meta[offset].Next = s_End;
|
||||||
|
|
||||||
|
// Link
|
||||||
|
if (m_Last == s_End)
|
||||||
|
{
|
||||||
|
m_First = m_Last = offset;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlassert(m_Meta[m_Last].Next == s_End); // code error otherwise
|
||||||
|
m_Meta[m_Last].Next = offset;
|
||||||
|
m_Last = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return offset for specified index
|
||||||
|
size_t CGPUProgramParams::getOffset(uint index) const
|
||||||
|
{
|
||||||
|
if (index >= m_Map.size())
|
||||||
|
return s_End;
|
||||||
|
return m_Map[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t CGPUProgramParams::getOffset(const std::string &name) const
|
||||||
|
{
|
||||||
|
std::map<std::string, size_t>::const_iterator it = m_MapName.find(name);
|
||||||
|
if (it == m_MapName.end())
|
||||||
|
return s_End;
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Remove by offset
|
||||||
|
void CGPUProgramParams::freeOffset(size_t offset)
|
||||||
|
{
|
||||||
|
uint index = getIndexByOffset(offset);
|
||||||
|
if (index != ~0)
|
||||||
|
{
|
||||||
|
if (m_Map.size() > index)
|
||||||
|
{
|
||||||
|
m_Map[index] = getEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const std::string &name = getNameByOffset(offset);
|
||||||
|
if (!name.empty())
|
||||||
|
{
|
||||||
|
if (m_MapName.find(name) != m_MapName.end())
|
||||||
|
{
|
||||||
|
m_MapName.erase(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (offset == m_Last)
|
||||||
|
{
|
||||||
|
nlassert(m_Meta[offset].Next == s_End);
|
||||||
|
m_Last = m_Meta[offset].Prev;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlassert(m_Meta[offset].Next != s_End);
|
||||||
|
m_Meta[m_Meta[offset].Next].Prev = m_Meta[offset].Prev;
|
||||||
|
}
|
||||||
|
if (offset == m_First)
|
||||||
|
{
|
||||||
|
nlassert(m_Meta[offset].Prev == s_End);
|
||||||
|
m_First = m_Meta[offset].Next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlassert(m_Meta[offset].Prev != s_End);
|
||||||
|
m_Meta[m_Meta[offset].Prev].Next = m_Meta[offset].Next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace NL3D */
|
||||||
|
|
||||||
|
/* end of file */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue