merge from default

This commit is contained in:
dnk-88 2011-05-23 00:55:36 +03:00
parent 80e6476270
commit ffa3434a11
64 changed files with 1216 additions and 519 deletions

View file

@ -41,10 +41,6 @@ INCLUDE(${CMAKE_ROOT}/Modules/Documentation.cmake OPTIONAL)
# Force out of source builds.
CHECK_OUT_OF_SOURCE()
# Variables which must be set before PROJECT
NL_SETUP_BUILD()
NL_SETUP_BUILD_FLAGS()
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(RyzomCore CXX C)
SET(NL_VERSION_MAJOR 0)
@ -52,6 +48,9 @@ SET(NL_VERSION_MINOR 8)
SET(NL_VERSION_PATCH 0)
SET(NL_VERSION "${NL_VERSION_MAJOR}.${NL_VERSION_MINOR}.${NL_VERSION_PATCH}")
NL_SETUP_BUILD()
NL_SETUP_BUILD_FLAGS()
#-----------------------------------------------------------------------------
# Redirect output files
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
@ -101,8 +100,15 @@ IF(WIN32)
# convert IDE fullpath to VC++ path
STRING(REGEX REPLACE "Common7/IDE/.+" "VC" VC_DIR ${CMAKE_MAKE_PROGRAM})
ELSE(${CMAKE_MAKE_PROGRAM} MATCHES "Common7")
IF(${CMAKE_CXX_COMPILER} MATCHES "VC")
# convert compiler fullpath to VC++ path
STRING(REGEX REPLACE "VC/bin/.+" "VC" VC_DIR ${CMAKE_CXX_COMPILER})
ELSE(${CMAKE_CXX_COMPILER} MATCHES "VC")
# Hack for Visual C++ 2010
GET_FILENAME_COMPONENT(VC_ROOT_PATH "[HKEY_CURRENT_USER\\Software\\Microsoft\\VCExpress\\10.0_Config;InstallDir]" ABSOLUTE)
# convert IDE fullpath to VC++ path
STRING(REGEX REPLACE "Common7/.*" "VC" VC_DIR ${VC_ROOT_PATH})
ENDIF(${CMAKE_CXX_COMPILER} MATCHES "VC")
ENDIF(${CMAKE_MAKE_PROGRAM} MATCHES "Common7")
IF(WITH_MFC)

View file

@ -48,6 +48,10 @@ MACRO(NL_CONFIGURE_CHECKS)
SET(NL_OPENGL_AVAILABLE 1)
ENDIF(WITH_DRIVER_OPENGL)
IF(WITH_DRIVER_OPENGLES)
SET(NL_OPENGLES_AVAILABLE 1)
ENDIF(WITH_DRIVER_OPENGLES)
IF(WITH_DRIVER_DIRECT3D)
SET(NL_DIRECT3D_AVAILABLE 1)
ENDIF(WITH_DRIVER_DIRECT3D)

View file

@ -40,17 +40,12 @@ ENDIF(WITH_STLPORT OR NOT MFC_FOUND)
# Only if using a custom path
IF(CUSTOM_MFC_DIR)
IF(NOT CMAKE_SIZEOF_VOID_P)
INCLUDE (CheckTypeSize)
CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P)
ENDIF(NOT CMAKE_SIZEOF_VOID_P)
# Using 32 or 64 bits libraries
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
IF(TARGET_X64)
SET(MFC_LIBRARY_DIR "${MFC_DIR}/lib/amd64")
ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8)
ELSE(TARGET_X64)
SET(MFC_LIBRARY_DIR "${MFC_DIR}/lib")
ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8)
ENDIF(TARGET_X64)
# Add MFC libraries directory to default library path
LINK_DIRECTORIES(${MFC_LIBRARY_DIR})

View file

@ -30,16 +30,11 @@ ENDMACRO(FIND_DXSDK_LIBRARY MYLIBRARY MYLIBRARYNAME)
IF(DXSDK_DIR)
SET(DXSDK_INCLUDE_DIR "${DXSDK_DIR}/Include")
IF(NOT CMAKE_SIZEOF_VOID_P)
INCLUDE (CheckTypeSize)
CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P)
ENDIF(NOT CMAKE_SIZEOF_VOID_P)
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
IF(TARGET_X64)
SET(DXSDK_LIBRARY_DIR "${DXSDK_DIR}/Lib/x64")
ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8)
ELSE(TARGET_X64)
SET(DXSDK_LIBRARY_DIR "${DXSDK_DIR}/Lib/x86")
ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8)
ENDIF(TARGET_X64)
FIND_DXSDK_LIBRARY(DXSDK_GUID_LIBRARY dxguid)
FIND_DXSDK_LIBRARY(DXSDK_DINPUT_LIBRARY dinput8)
@ -59,7 +54,7 @@ ENDIF(DXSDK_DIR)
# all listed variables are TRUE.
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(DIRECTXSDK DEFAULT_MSG DXSDK_DIR DXSDK_GUID_LIBRARY DXSDK_DINPUT_LIBRARY)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(DirectXSDK DEFAULT_MSG DXSDK_DIR DXSDK_GUID_LIBRARY DXSDK_DINPUT_LIBRARY)
MARK_AS_ADVANCED(DXSDK_INCLUDE_DIR
DXSDK_GUID_LIBRARY

View file

@ -7,7 +7,7 @@
# EXTERNAL_FOUND - True if the external libraries are available
SET(EXTERNAL_TEMP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external ${CMAKE_CURRENT_SOURCE_DIR}/../external ${CMAKE_CURRENT_SOURCE_DIR}/3rdParty ${CMAKE_CURRENT_SOURCE_DIR}/../3rdParty ${EXTERNAL_PATH})
SET(EXTERNAL_TEMP_FILE "include/png.h")
SET(EXTERNAL_TEMP_FILE "include/zlib.h")
SET(EXTERNAL_NAME "external")
# If using STLport preprend external_stlport
@ -17,36 +17,35 @@ IF(WITH_STLPORT)
SET(EXTERNAL_NAME "external with STLport")
ENDIF(WITH_STLPORT)
SET(EXTERNAL_FOUND FALSE)
FOREACH(ITEM ${EXTERNAL_TEMP_PATH})
IF(EXISTS "${ITEM}/${EXTERNAL_TEMP_FILE}" AND NOT EXTERNAL_FOUND)
SET(EXTERNAL_FOUND TRUE)
# Get absolute path to avoid ..
GET_FILENAME_COMPONENT(ITEM ${ITEM} ABSOLUTE)
SET(EXTERNAL_PATH ${ITEM} CACHE PATH "" FORCE)
ENDIF(EXISTS "${ITEM}/${EXTERNAL_TEMP_FILE}" AND NOT EXTERNAL_FOUND)
ENDFOREACH(ITEM ${EXTERNAL_TEMP_PATH})
FIND_PATH(EXTERNAL_PATH
${EXTERNAL_TEMP_FILE}
PATHS
$ENV{EXTERNAL_PATH}
${EXTERNAL_TEMP_PATH}
/usr/local
/usr
/sw
/opt/local
/opt/csw
/opt
)
IF(EXTERNAL_FOUND)
IF(EXTERNAL_PATH)
SET(EXTERNAL_FOUND TRUE)
SET(EXTERNAL_INCLUDE_PATH "${EXTERNAL_PATH}/include")
IF(NOT CMAKE_SIZEOF_VOID_P)
INCLUDE (CheckTypeSize)
CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P)
ENDIF(NOT CMAKE_SIZEOF_VOID_P)
# Using 32 or 64 bits libraries
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
IF(TARGET_X64)
SET(EXTERNAL_LIBRARY_PATH "${EXTERNAL_PATH}/lib64")
ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8)
ELSE(TARGET_X64)
SET(EXTERNAL_LIBRARY_PATH "${EXTERNAL_PATH}/lib")
ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8)
ENDIF(TARGET_X64)
SET(CMAKE_INCLUDE_PATH "${EXTERNAL_INCLUDE_PATH};${CMAKE_INCLUDE_PATH}")
# Stupid hack for FindOpenAL.cmake
SET(CMAKE_INCLUDE_PATH "${EXTERNAL_PATH};${CMAKE_INCLUDE_PATH}")
SET(CMAKE_LIBRARY_PATH "${EXTERNAL_LIBRARY_PATH};${CMAKE_LIBRARY_PATH}")
ENDIF(EXTERNAL_FOUND)
ENDIF(EXTERNAL_PATH)
IF(EXTERNAL_FOUND)
IF(NOT External_FIND_QUIETLY)

View file

@ -9,17 +9,32 @@ IF(WINSDK_INCLUDE_DIR)
SET(WINSDK_FIND_QUIETLY TRUE)
ENDIF(WINSDK_INCLUDE_DIR)
GET_FILENAME_COMPONENT(WINSDK71_DIR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1;InstallationFolder]" ABSOLUTE CACHE)
GET_FILENAME_COMPONENT(WINSDK71_VERSION "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1;ProductVersion]" NAME)
IF(WINSDK71_DIR)
IF(NOT WINSDK_FIND_QUIETLY)
MESSAGE(STATUS "Found Windows SDK ${WINSDK71_VERSION} in ${WINSDK71_DIR}")
ENDIF(NOT WINSDK_FIND_QUIETLY)
ENDIF(WINSDK71_DIR)
GET_FILENAME_COMPONENT(WINSDKCURRENT_DIR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" ABSOLUTE CACHE)
GET_FILENAME_COMPONENT(WINSDKCURRENT_VERSION "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentVersion]" NAME)
IF(WINSDKCURRENT_DIR)
IF(NOT WINSDK_FIND_QUIETLY)
MESSAGE(STATUS "Found Windows SDK ${WINSDKCURRENT_VERSION} in ${WINSDKCURRENT_DIR}")
ENDIF(NOT WINSDK_FIND_QUIETLY)
ENDIF(WINSDKCURRENT_DIR)
FIND_PATH(WINSDK_INCLUDE_DIR Windows.h
PATHS
"[HKEY_CURRENT_USER\\Software\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]/Include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]/Include"
${WINSDK71_DIR}/Include
${WINSDKCURRENT_DIR}/Include
)
IF(WINSDK_INCLUDE_DIR)
SET(WINSDK_FOUND TRUE)
IF(NOT WINSDK_FIND_QUIETLY)
MESSAGE(STATUS "Found Windows SDK.")
ENDIF(NOT WINSDK_FIND_QUIETLY)
ELSE(WINSDK_INCLUDE_DIR)
IF(NOT WINSDK_FIND_QUIETLY)
MESSAGE(STATUS "Warning: Unable to find Windows SDK!")

View file

@ -45,8 +45,6 @@ MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags)
IF(${_targetType} STREQUAL SHARED_LIBRARY OR ${_targetType} STREQUAL MODULE_LIBRARY)
LIST(APPEND ${_out_compile_flags} "-fPIC")
ENDIF(${_targetType} STREQUAL SHARED_LIBRARY OR ${_targetType} STREQUAL MODULE_LIBRARY)
ELSE(CMAKE_COMPILER_IS_GNUCXX)
## TODO ... ? or does it work out of the box
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES )
@ -115,6 +113,11 @@ MACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input _output)
ENDMACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input)
MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use )
GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS)
IF(${oldProps} MATCHES NOTFOUND)
SET(oldProps "")
ENDIF(${oldProps} MATCHES NOTFOUND)
IF(CMAKE_COMPILER_IS_GNUCXX)
# to do: test whether compiler flags match between target _targetName
# and _pch_output_to_use
@ -123,19 +126,15 @@ MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use )
# for use with distcc and gcc >4.0.1 if preprocessed files are accessible
# on all remote machines set
# PCH_ADDITIONAL_COMPILER_FLAGS to -fpch-preprocess
SET(_target_cflags "${PCH_ADDITIONAL_COMPILER_FLAGS}-include ${_input} -Winvalid-pch")
SET(_target_cflags "${oldProps} ${PCH_ADDITIONAL_COMPILER_FLAGS}-include ${_input} -Winvalid-pch")
ELSE(CMAKE_COMPILER_IS_GNUCXX)
IF(MSVC)
GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS)
IF(${oldProps} MATCHES NOTFOUND)
SET(oldProps "")
ENDIF(${oldProps} MATCHES NOTFOUND)
SET(_target_cflags "${oldProps} /Yu\"${_input}\" /FI\"${_input}\" /Fp\"${_pch_output_to_use}\"")
ENDIF(MSVC)
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS ${_target_cflags})
SET_TARGET_PROPERTIES(${_targetName}_pch_dephelp PROPERTIES COMPILE_FLAGS ${_target_cflags})
ADD_CUSTOM_TARGET(pch_Generate_${_targetName} DEPENDS ${_pch_output_to_use})
ADD_DEPENDENCIES(${_targetName} pch_Generate_${_targetName})
ENDMACRO(ADD_PRECOMPILED_HEADER_TO_TARGET)

View file

@ -37,16 +37,17 @@ ENDMACRO(NL_TARGET_DRIVER)
# Argument:
###
MACRO(NL_DEFAULT_PROPS name label)
IF(NOT MSVC10)
SET_TARGET_PROPERTIES(${name} PROPERTIES PROJECT_LABEL ${label})
ENDIF(NOT MSVC10)
GET_TARGET_PROPERTY(type ${name} TYPE)
IF(${type} STREQUAL SHARED_LIBRARY)
# Set versions only if target is a shared library
SET_TARGET_PROPERTIES(${name} PROPERTIES
VERSION ${NL_VERSION} SOVERSION ${NL_VERSION_MAJOR}
INSTALL_NAME_DIR ${NL_LIB_PREFIX}
PROJECT_LABEL ${label})
ELSE(${type} STREQUAL SHARED_LIBRARY)
SET_TARGET_PROPERTIES(${name} PROPERTIES
PROJECT_LABEL ${label})
VERSION ${NL_VERSION} SOVERSION ${NL_VERSION_MAJOR})
IF(NL_LIB_PREFIX)
SET_TARGET_PROPERTIES(${name} PROPERTIES INSTALL_NAME_DIR ${NL_LIB_PREFIX})
ENDIF(NL_LIB_PREFIX)
ENDIF(${type} STREQUAL SHARED_LIBRARY)
IF(WITH_STLPORT AND WIN32)
SET_TARGET_PROPERTIES(${name} PROPERTIES COMPILE_FLAGS "/X")
@ -93,6 +94,14 @@ MACRO(NL_ADD_STATIC_VID_DRIVERS name)
TARGET_LINK_LIBRARIES(${name} nel_drv_opengl)
ENDIF(WIN32)
ENDIF(WITH_DRIVER_OPENGL)
IF(WITH_DRIVER_OPENGLES)
IF(WIN32)
TARGET_LINK_LIBRARIES(${name} nel_drv_opengles_win)
ELSE(WIN32)
TARGET_LINK_LIBRARIES(${name} nel_drv_opengles)
ENDIF(WIN32)
ENDIF(WITH_DRIVER_OPENGLES)
ENDIF(WITH_STATIC_DRIVERS)
ENDMACRO(NL_ADD_STATIC_VID_DRIVERS)
@ -208,6 +217,7 @@ MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS)
# Drivers Support
###
OPTION(WITH_DRIVER_OPENGL "Build OpenGL Driver (3D)" ON )
OPTION(WITH_DRIVER_OPENGLES "Build OpenGL ES Driver (3D)" OFF)
OPTION(WITH_DRIVER_DIRECT3D "Build Direct3D Driver (3D)" OFF)
OPTION(WITH_DRIVER_OPENAL "Build OpenAL Driver (Sound)" ON )
OPTION(WITH_DRIVER_FMOD "Build FMOD Driver (Sound)" OFF)
@ -279,12 +289,19 @@ MACRO(NL_SETUP_BUILD)
ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug")
IF(WIN32)
IF(MSVC10)
# /Ox is working with VC++ 2010, but custom optimizations don't exist
SET(SPEED_OPTIMIZATIONS "/Ox /GF /GS-")
# without inlining it's unusable, use custom optimizations again
SET(MIN_OPTIMIZATIONS "/Od /Ob1")
ELSE(MSVC10)
# don't use a /O[012x] flag if you want custom optimizations
SET(SPEED_OPTIMIZATIONS "/Ob2 /Oi /Ot /Oy /GT /GF /GS-")
# without inlining it's unusable, use custom optimizations again
SET(MIN_OPTIMIZATIONS "/Ob1")
ENDIF(MSVC10)
SET(PLATFORM_CFLAGS "/D_CRT_SECURE_NO_WARNINGS /DWIN32 /D_WINDOWS /W3 /Zi /Zm1000")
SET(PLATFORM_CFLAGS "/D_CRT_SECURE_NO_WARNINGS /DWIN32 /D_WINDOWS /W3 /Zi /Zm1000 /MP")
# Exceptions are only set for C++
SET(PLATFORM_CXXFLAGS "${PLATFORM_CFLAGS} /EHa")
@ -317,30 +334,29 @@ MACRO(NL_SETUP_BUILD)
ENDIF(WIN32)
# Determine host CPU
IF(UNIX AND NOT WIN32)
FIND_PROGRAM(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin )
IF(CMAKE_UNAME)
EXEC_PROGRAM(uname ARGS -m OUTPUT_VARIABLE CMAKE_SYSTEM_PROCESSOR)
SET(CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR} CACHE INTERNAL "processor type (i386 and x86_64)")
IF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
# Determine target CPU
# IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86")
IF(NOT CMAKE_SIZEOF_VOID_P)
INCLUDE (CheckTypeSize)
CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P)
ENDIF(NOT CMAKE_SIZEOF_VOID_P)
# Using 32 or 64 bits libraries
SET(TARGET_X86 1)
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(ARCH "x86_64")
SET(TARGET_X64 1)
ADD_DEFINITIONS(-DHAVE_X86_64)
ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "ia64")
ADD_DEFINITIONS(-DHAVE_IA64)
ELSE(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(ARCH "x86")
ADD_DEFINITIONS(-DHAVE_X86)
ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
ELSE(CMAKE_UNAME) # Assume that if uname is not found that we're x86.
ADD_DEFINITIONS(-DHAVE_X86)
ENDIF(CMAKE_UNAME)
ENDIF(UNIX AND NOT WIN32)
ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8)
# ADD_DEFINITIONS(-DHAVE_IA64)
# ENDIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86")
ENDMACRO(NL_SETUP_BUILD)
MACRO(NL_SETUP_BUILD_FLAGS)
#SET(CMAKE_DEBUG_POSTFIX "_d")
#SET(CMAKE_RELEASE_POSTFIX "_r")
SET(CMAKE_C_FLAGS ${PLATFORM_CFLAGS} CACHE STRING "" FORCE)
SET(CMAKE_CXX_FLAGS ${PLATFORM_CXXFLAGS} CACHE STRING "" FORCE)

View file

@ -35,6 +35,7 @@
#cmakedefine HAVE_STAT64 1
#cmakedefine NL_OPENGL_AVAILABLE ${NL_OPENGL_AVAILABLE}
#cmakedefine NL_OPENGLES_AVAILABLE ${NL_OPENGLES_AVAILABLE}
#cmakedefine NL_DIRECT3D_AVAILABLE ${NL_DIRECT3D_AVAILABLE}
#cmakedefine NL_FMOD_AVAILABLE ${NL_FMOD_AVAILABLE}

View file

@ -2508,8 +2508,13 @@ void CDriverGL::checkTextureOn() const
GLboolean flagCM;
GLboolean flagTR;
glGetBooleanv(GL_TEXTURE_2D, &flag2D);
#ifdef USE_OPENGLES
glGetBooleanv(GL_TEXTURE_CUBE_MAP_OES, &flagCM);
flagTR = true; // always true in OpenGL ES
#else
glGetBooleanv(GL_TEXTURE_CUBE_MAP_ARB, &flagCM);
glGetBooleanv(GL_TEXTURE_RECTANGLE_NV, &flagTR);
#endif
switch(dgs.getTextureMode())
{
case CDriverGLStates::TextureDisabled:
@ -2545,7 +2550,8 @@ bool CDriverGL::supportOcclusionQuery() const
// ***************************************************************************
bool CDriverGL::supportTextureRectangle() const
{
H_AUTO_OGL(CDriverGL_supportTextureRectangle)
H_AUTO_OGL(CDriverGL_supportTextureRectangle);
return (_Extensions.NVTextureRectangle || _Extensions.EXTTextureRectangle || _Extensions.ARBTextureRectangle);
}

View file

@ -139,8 +139,13 @@ void CDriverGL::setLightInternal(uint8 num, const CLight& light)
else
{
// Deactivate spot properties
#ifdef USE_OPENGLES
glLightf (lightNum, GL_SPOT_CUTOFF, 180.f);
glLightf (lightNum, GL_SPOT_EXPONENT, 0.f);
#else
glLighti (lightNum, GL_SPOT_CUTOFF, 180);
glLighti (lightNum, GL_SPOT_EXPONENT, 0);
#endif
}
// Flag this light as dirt.

View file

@ -35,10 +35,18 @@ static void convBlend(CMaterial::TBlend blend, GLenum& glenum)
case CMaterial::srccolor: glenum=GL_SRC_COLOR; break;
case CMaterial::invsrccolor:glenum=GL_ONE_MINUS_SRC_COLOR; break;
// Extended Blend modes.
#ifdef USE_OPENGLES
case CMaterial::blendConstantColor: glenum=GL_CONSTANT_COLOR; break;
case CMaterial::blendConstantInvColor: glenum=GL_ONE_MINUS_CONSTANT_COLOR; break;
case CMaterial::blendConstantAlpha: glenum=GL_CONSTANT_ALPHA; break;
case CMaterial::blendConstantInvAlpha: glenum=GL_ONE_MINUS_CONSTANT_ALPHA; break;
#else
case CMaterial::blendConstantColor: glenum=GL_CONSTANT_COLOR_EXT; break;
case CMaterial::blendConstantInvColor: glenum=GL_ONE_MINUS_CONSTANT_COLOR_EXT; break;
case CMaterial::blendConstantAlpha: glenum=GL_CONSTANT_ALPHA_EXT; break;
case CMaterial::blendConstantInvAlpha: glenum=GL_ONE_MINUS_CONSTANT_ALPHA_EXT; break;
#endif
default: nlstop;
}
}
@ -137,8 +145,10 @@ void CDriverGL::setTextureEnvFunction(uint stage, CMaterial& mat)
_DriverGLStates.setTexGenMode (stage, GL_OBJECT_LINEAR);
}
else if(mode==CMaterial::TexCoordGenEyeSpace)
{
_DriverGLStates.setTexGenMode (stage, GL_EYE_LINEAR);
}
}
else
{
// Disable.
@ -240,7 +250,9 @@ void CDriverGL::setTextureShaders(const uint8 *addressingModes, const CSmartPtr<
if (glAddrMode != _CurrentTexAddrMode[stage]) // addressing mode different from the one in the device?
{
_DriverGLStates.activeTextureARB(stage);
#ifndef USE_OPENGLES
glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, glAddrMode);
#endif
_CurrentTexAddrMode[stage] = glAddrMode;
}
}
@ -918,7 +930,11 @@ void CDriverGL::setupLightMapPass(uint pass)
if (mat._LightMapsMulx2)
{
// Multiply x 2
#ifdef USE_OPENGLES
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 2);
#else
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2);
#endif
}
}
}
@ -1027,7 +1043,11 @@ void CDriverGL::endLightMapMultiPass()
for (uint32 i = 0; i < (_NLightMapPerPass+1); ++i)
{
_DriverGLStates.activeTextureARB(i);
#ifdef USE_OPENGLES
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 1);
#else
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1);
#endif
}
}
}
@ -1102,13 +1122,16 @@ void CDriverGL::setupSpecularBegin()
// todo hulud remove
// _DriverGLStates.setTextureMode(CDriverGLStates::TextureCubeMap);
#ifdef USE_OPENGLES
_DriverGLStates.setTexGenMode (1, GL_REFLECTION_MAP_OES);
#else
_DriverGLStates.setTexGenMode (1, GL_REFLECTION_MAP_ARB);
#endif
// setup the good matrix for stage 1.
glMatrixMode(GL_TEXTURE);
glLoadMatrixf( _SpecularTexMtx.get() );
glMatrixMode(GL_MODELVIEW);
}
// ***************************************************************************
@ -1292,7 +1315,8 @@ void CDriverGL::setupSpecularPass(uint pass)
_DriverGLStates.setTextureMode(CDriverGLStates::TextureDisabled);
}
else
{ // Multiply texture1 by alpha_texture0 and display with add
{
// Multiply texture1 by alpha_texture0 and display with add
_DriverGLStates.enableBlend(true);
_DriverGLStates.blendFunc(GL_ONE, GL_ONE);
@ -1957,7 +1981,9 @@ void CDriverGL::endCloudMultiPass()
nlassert(_CurrentMaterial->getShader() == CMaterial::Cloud);
if (ATICloudShaderHandle)
{
#ifndef USE_OPENGLES
glDisable(GL_FRAGMENT_SHADER_ATI);
#endif
}
}
@ -1975,7 +2001,9 @@ sint CDriverGL::beginWaterMultiPass()
*/
void CDriverGL::setupWaterPassR200(const CMaterial &mat)
{
H_AUTO_OGL(CDriverGL_setupWaterPassR200)
H_AUTO_OGL(CDriverGL_setupWaterPassR200);
#ifndef USE_OPENGLES
uint k;
ITexture *tex = mat.getTexture(0);
if (tex)
@ -2047,6 +2075,7 @@ void CDriverGL::setupWaterPassR200(const CMaterial &mat)
float cst[4] = { 1.f, 1.f, 1.f, 0.f };
nglSetFragmentShaderConstantATI(GL_CON_0_ATI, cst);
}
#endif
}
// ***************************************************************************
@ -2054,7 +2083,9 @@ void CDriverGL::setupWaterPassR200(const CMaterial &mat)
*/
void CDriverGL::setupWaterPassARB(const CMaterial &mat)
{
H_AUTO_OGL(CDriverGL_setupWaterPassARB)
H_AUTO_OGL(CDriverGL_setupWaterPassARB);
#ifndef USE_OPENGLES
uint k;
ITexture *tex = mat.getTexture(0);
if (tex)
@ -2133,6 +2164,7 @@ void CDriverGL::setupWaterPassARB(const CMaterial &mat)
}
}
}
#endif
}
// ***************************************************************************
@ -2161,6 +2193,7 @@ void CDriverGL::setupWaterPassNV20(const CMaterial &mat)
{
H_AUTO_OGL(CDriverGL_setupWaterPassNV20)
#ifndef USE_OPENGLES
static bool setupDone = false;
static CMaterial::CTexEnv texEnvReplace;
static CMaterial::CTexEnv texEnvModulate;
@ -2245,6 +2278,7 @@ void CDriverGL::setupWaterPassNV20(const CMaterial &mat)
activateTexEnvMode(2, texEnvReplace);
activateTexEnvMode(3, texEnvModulate);
}
#endif
}
// ***************************************************************************
@ -2272,7 +2306,9 @@ void CDriverGL::setupWaterPass(uint /* pass */)
// ***************************************************************************
void CDriverGL::endWaterMultiPass()
{
H_AUTO_OGL(CDriverGL_endWaterMultiPass)
H_AUTO_OGL(CDriverGL_endWaterMultiPass);
#ifndef USE_OPENGLES
nlassert(_CurrentMaterial->getShader() == CMaterial::Water);
// NB : as fragment shaders / programs bypass the texture envs, no special env enum is added (c.f CTexEnvSpecial)
if (_Extensions.NVTextureShader) return;
@ -2284,6 +2320,7 @@ void CDriverGL::endWaterMultiPass()
{
glDisable(GL_FRAGMENT_SHADER_ATI);
}
#endif
}
} // NL3D

View file

@ -15,24 +15,35 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdopengl.h"
#include "driver_opengl.h"
namespace NL3D {
// ***************************************************************************
void CDriverGL::setFrustum(float left, float right, float bottom, float top, float znear, float zfar, bool perspective)
{
H_AUTO_OGL(CDriverGL_setFrustum)
H_AUTO_OGL(CDriverGL_setFrustum);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (perspective)
{
#ifdef USE_OPENGLES
glFrustumf(left,right,bottom,top,znear,zfar);
#else
glFrustum(left,right,bottom,top,znear,zfar);
#endif
}
else
{
#ifdef USE_OPENGLES
glOrthof(left,right,bottom,top,znear,zfar);
#else
glOrtho(left,right,bottom,top,znear,zfar);
#endif
}
_ProjMatDirty = true;
// Backup znear and zfar for zbias setup

View file

@ -77,7 +77,8 @@ void CDriverGLStates::init(bool supportTextureCubeMap, bool supportTextureRect
// ***************************************************************************
void CDriverGLStates::forceDefaults(uint nbStages)
{
H_AUTO_OGL(CDriverGLStates_forceDefaults)
H_AUTO_OGL(CDriverGLStates_forceDefaults);
// Enable / disable.
_CurFog= false;
_CurBlend= false;
@ -86,6 +87,7 @@ void CDriverGLStates::forceDefaults(uint nbStages)
_CurLighting= false;
_CurZWrite= true;
_CurStencilTest=false;
// setup GLStates.
glDisable(GL_FOG);
glDisable(GL_BLEND);
@ -144,33 +146,62 @@ void CDriverGLStates::forceDefaults(uint nbStages)
for(stage=0;stage<nbStages; stage++)
{
// disable texturing.
#ifdef USE_OPENGLES
glActiveTexture(GL_TEXTURE0+stage);
#else
nglActiveTextureARB(GL_TEXTURE0_ARB+stage);
#endif
glDisable(GL_TEXTURE_2D);
if(_TextureCubeMapSupported)
{
#ifdef USE_OPENGLES
glDisable(GL_TEXTURE_CUBE_MAP_OES);
glDisable(GL_TEXTURE_GEN_STR_OES);
#else
glDisable(GL_TEXTURE_CUBE_MAP_ARB);
if(_TextureRectangleSupported)
glDisable(GL_TEXTURE_RECTANGLE_NV);
#endif
}
_TextureMode[stage]= TextureDisabled;
// Tex gen init
_TexGenMode[stage] = 0;
glDisable( GL_TEXTURE_GEN_S );
glDisable( GL_TEXTURE_GEN_T );
glDisable( GL_TEXTURE_GEN_R );
glDisable( GL_TEXTURE_GEN_Q );
#ifndef USE_OPENGLES
if(_TextureRectangleSupported)
glDisable(GL_TEXTURE_RECTANGLE_NV);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q);
#endif
}
// ActiveTexture current texture to 0.
#ifdef USE_OPENGLES
glActiveTexture(GL_TEXTURE0);
glClientActiveTexture(GL_TEXTURE0);
#else
nglActiveTextureARB(GL_TEXTURE0_ARB);
_CurrentActiveTextureARB= 0;
nglClientActiveTextureARB(GL_TEXTURE0_ARB);
#endif
_CurrentActiveTextureARB= 0;
_CurrentClientActiveTextureARB= 0;
// Depth range
_DepthRangeNear = 0.f;
_DepthRangeFar = 1.f;
_ZBias = 0.f;
#ifdef USE_OPENGLES
glDepthRangef (0.f, 1.f);
#else
glDepthRange (0, 1);
#endif
// Cull order
_CullMode = CCW;
@ -536,7 +567,9 @@ void CDriverGLStates::setVertexColorLighted(bool enable)
if (_VertexColorLighted)
{
glEnable (GL_COLOR_MATERIAL);
#ifndef USE_OPENGLES
glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE);
#endif
}
else
{
@ -558,9 +591,15 @@ void CDriverGLStates::setVertexColorLighted(bool enable)
// ***************************************************************************
void CDriverGLStates::updateDepthRange()
{
H_AUTO_OGL(CDriverGLStates_updateDepthRange)
H_AUTO_OGL(CDriverGLStates_updateDepthRange);
float delta = _ZBias * (_DepthRangeFar - _DepthRangeNear);
#ifdef USE_OPENGLES
glDepthRangef(delta + _DepthRangeNear, delta + _DepthRangeFar);
#else
glDepthRange(delta + _DepthRangeNear, delta + _DepthRangeFar);
#endif
}
// ***************************************************************************
@ -605,10 +644,14 @@ void CDriverGLStates::setTexGenMode (uint stage, GLint mode)
if(mode==0)
{
#ifdef USE_OPENGLES
glDisable(GL_TEXTURE_GEN_STR_OES);
#else
glDisable( GL_TEXTURE_GEN_S );
glDisable( GL_TEXTURE_GEN_T );
glDisable( GL_TEXTURE_GEN_R );
glDisable( GL_TEXTURE_GEN_Q );
#endif
}
else
{
@ -630,10 +673,15 @@ void CDriverGLStates::setTexGenMode (uint stage, GLint mode)
{
glDisable( GL_TEXTURE_GEN_Q );
}
// Enable All.
#ifdef USE_OPENGLES
glEnable(GL_TEXTURE_GEN_STR_OES);
#else
glEnable( GL_TEXTURE_GEN_S );
glEnable( GL_TEXTURE_GEN_T );
glEnable( GL_TEXTURE_GEN_R );
#endif
}
}
}
@ -649,12 +697,19 @@ void CDriverGLStates::resetTextureMode()
if (_TextureCubeMapSupported)
{
#ifdef USE_OPENGLES
glDisable(GL_TEXTURE_CUBE_MAP_OES);
#else
glDisable(GL_TEXTURE_CUBE_MAP_ARB);
#endif
}
#ifndef USE_OPENGLES
if (_TextureRectangleSupported)
{
glDisable(GL_TEXTURE_RECTANGLE_NV);
}
#endif
_TextureMode[_CurrentActiveTextureARB]= TextureDisabled;
}
@ -674,11 +729,13 @@ void CDriverGLStates::setTextureMode(TTextureMode texMode)
}
else if(oldTexMode == TextureRect)
{
#ifndef USE_OPENGLES
if(_TextureRectangleSupported)
{
glDisable(GL_TEXTURE_RECTANGLE_NV);
}
else
#endif
{
glDisable(GL_TEXTURE_2D);
}
@ -687,7 +744,11 @@ void CDriverGLStates::setTextureMode(TTextureMode texMode)
{
if(_TextureCubeMapSupported)
{
#ifdef USE_OPENGLES
glDisable(GL_TEXTURE_CUBE_MAP_OES);
#else
glDisable(GL_TEXTURE_CUBE_MAP_ARB);
#endif
}
else
{
@ -702,24 +763,30 @@ void CDriverGLStates::setTextureMode(TTextureMode texMode)
}
else if(texMode == TextureRect)
{
#ifndef USE_OPENGLES
if(_TextureRectangleSupported)
{
glEnable(GL_TEXTURE_RECTANGLE_NV);
}
else
#endif
{
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);
}
}
else if(texMode == TextureCubeMap)
{
if(_TextureCubeMapSupported)
{
#ifdef USE_OPENGLES
glEnable(GL_TEXTURE_CUBE_MAP_OES);
#else
glEnable(GL_TEXTURE_CUBE_MAP_ARB);
#endif
}
else
{
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);
}
}
@ -736,8 +803,11 @@ void CDriverGLStates::activeTextureARB(uint stage)
if( _CurrentActiveTextureARB != stage )
{
#ifdef USE_OPENGLES
glActiveTexture(GL_TEXTURE0+stage);
#else
nglActiveTextureARB(GL_TEXTURE0_ARB+stage);
#endif
_CurrentActiveTextureARB= stage;
}
@ -748,7 +818,11 @@ void CDriverGLStates::forceActiveTextureARB(uint stage)
{
H_AUTO_OGL(CDriverGLStates_forceActiveTextureARB);
#ifdef USE_OPENGLES
glActiveTexture(GL_TEXTURE0+stage);
#else
nglActiveTextureARB(GL_TEXTURE0_ARB+stage);
#endif
_CurrentActiveTextureARB= stage;
}
@ -786,22 +860,25 @@ void CDriverGLStates::enableNormalArray(bool enable)
// ***************************************************************************
void CDriverGLStates::enableWeightArray(bool enable)
{
H_AUTO_OGL(CDriverGLStates_enableWeightArray)
H_AUTO_OGL(CDriverGLStates_enableWeightArray);
if(_WeightArrayEnabled != enable)
{
#ifndef USE_OPENGLES
if(enable)
glEnableClientState(GL_VERTEX_WEIGHTING_EXT);
else
glDisableClientState(GL_VERTEX_WEIGHTING_EXT);
#endif
_WeightArrayEnabled= enable;
}
}
// ***************************************************************************
void CDriverGLStates::enableColorArray(bool enable)
{
H_AUTO_OGL(CDriverGLStates_enableColorArray)
H_AUTO_OGL(CDriverGLStates_enableColorArray);
if(_ColorArrayEnabled != enable)
{
if(enable)
@ -818,32 +895,42 @@ void CDriverGLStates::enableColorArray(bool enable)
// ***************************************************************************
void CDriverGLStates::enableSecondaryColorArray(bool enable)
{
H_AUTO_OGL(CDriverGLStates_enableSecondaryColorArray)
H_AUTO_OGL(CDriverGLStates_enableSecondaryColorArray);
if(_SecondaryColorArrayEnabled != enable)
{
#ifndef USE_OPENGLES
if(enable)
glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
else
glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
#endif
_SecondaryColorArrayEnabled= enable;
#ifndef USE_OPENGLES
// If disable
if(!enable)
{
// GeForceFx Bug: Must reset Secondary color to 0 (if comes from a VP), else bugs
nglSecondaryColor3ubEXT(0,0,0);
}
#endif
}
}
// ***************************************************************************
void CDriverGLStates::clientActiveTextureARB(uint stage)
{
H_AUTO_OGL(CDriverGLStates_clientActiveTextureARB)
H_AUTO_OGL(CDriverGLStates_clientActiveTextureARB);
if( _CurrentClientActiveTextureARB != stage )
{
#ifdef USE_OPENGLES
glClientActiveTexture(GL_TEXTURE0+stage);
#else
nglClientActiveTextureARB(GL_TEXTURE0_ARB+stage);
#endif
_CurrentClientActiveTextureARB= stage;
}
}
@ -851,7 +938,8 @@ void CDriverGLStates::clientActiveTextureARB(uint stage)
// ***************************************************************************
void CDriverGLStates::enableTexCoordArray(bool enable)
{
H_AUTO_OGL(CDriverGLStates_enableTexCoordArray)
H_AUTO_OGL(CDriverGLStates_enableTexCoordArray);
if(_TexCoordArrayEnabled[_CurrentClientActiveTextureARB] != enable)
{
if(enable)
@ -867,14 +955,16 @@ void CDriverGLStates::enableTexCoordArray(bool enable)
// ***************************************************************************
void CDriverGLStates::enableVertexAttribArray(uint glIndex, bool enable)
{
H_AUTO_OGL(CDriverGLStates_enableVertexAttribArray)
H_AUTO_OGL(CDriverGLStates_enableVertexAttribArray);
if(_VertexAttribArrayEnabled[glIndex] != enable)
{
#ifndef USE_OPENGLES
if(enable)
glEnableClientState(glIndex+GL_VERTEX_ATTRIB_ARRAY0_NV);
else
glDisableClientState(glIndex+GL_VERTEX_ATTRIB_ARRAY0_NV);
#endif
_VertexAttribArrayEnabled[glIndex]= enable;
}
@ -883,15 +973,18 @@ void CDriverGLStates::enableVertexAttribArray(uint glIndex, bool enable)
// ***************************************************************************
void CDriverGLStates::enableVertexAttribArrayARB(uint glIndex,bool enable)
{
H_AUTO_OGL(CDriverGLStates_enableVertexAttribArrayARB)
H_AUTO_OGL(CDriverGLStates_enableVertexAttribArrayARB);
#ifndef NL3D_GLSTATE_DISABLE_CACHE
if(_VertexAttribArrayEnabled[glIndex] != enable)
#endif
{
#ifndef USE_OPENGLES
if(enable)
nglEnableVertexAttribArrayARB(glIndex);
else
nglDisableVertexAttribArrayARB(glIndex);
#endif
_VertexAttribArrayEnabled[glIndex]= enable;
}
@ -988,7 +1081,13 @@ void CDriverGLStates::enableFog(uint enable)
void CDriverGLStates::forceBindARBVertexBuffer(uint objectID)
{
H_AUTO_OGL(CDriverGLStates_forceBindARBVertexBuffer)
#ifdef USE_OPENGLES
glBindBuffer(GL_ARRAY_BUFFER, objectID);
#else
nglBindBufferARB(GL_ARRAY_BUFFER_ARB, objectID);
#endif
_CurrARBVertexBuffer = objectID;
}

View file

@ -20,11 +20,15 @@
#include "nel/misc/types_nl.h"
#include "nel/3d/vertex_buffer.h"
#ifdef NL_OS_MAC
#ifdef USE_OPENGLES
# include <GLES/gl.h>
#else
# ifdef NL_OS_MAC
# define GL_GLEXT_LEGACY
# include <OpenGL/gl.h>
#else
# else
# include <GL/gl.h>
# endif
#endif
@ -41,7 +45,7 @@ namespace NL3D
- GL_ALPHA_TEST
- GL_LIGHTING
- GL_LIGHT0 + i .....
- GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP_ARB.
- GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP_ARB/OES.
- GL_TEXTURE_GEN_S, GL_TEXTURE_GEN_T, GL_TEXTURE_GEN_R
- GL_COLOR_MATERIAL
- GL_FOG

View file

@ -155,7 +155,11 @@ bool CTextureDrvInfosGL::initFrameBufferObject(ITexture * tex)
// check status
GLenum status;
#ifdef USE_OPENGLES
status = (GLenum) nglCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
#else
status = (GLenum) nglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
#endif
switch(status) {
case GL_FRAMEBUFFER_COMPLETE_EXT:
InitFBO = true;
@ -204,12 +208,24 @@ bool CTextureDrvInfosGL::initFrameBufferObject(ITexture * tex)
// clean up resources if allocation failed
if (!InitFBO)
{
#ifdef USE_OPENGLES
nglDeleteFramebuffersOES(1, &FBOId);
#else
nglDeleteFramebuffersEXT(1, &FBOId);
#endif
if (AttachDepthStencil)
{
#ifdef USE_OPENGLES
nglDeleteRenderbuffersOES(1, &DepthFBOId);
#else
nglDeleteRenderbuffersEXT(1, &DepthFBOId);
#endif
if(!UsePackedDepthStencil)
#ifdef USE_OPENGLES
nglDeleteRenderbuffersOES(1, &StencilFBOId);
#else
nglDeleteRenderbuffersEXT(1, &StencilFBOId);
#endif
}
}
@ -226,14 +242,22 @@ bool CTextureDrvInfosGL::activeFrameBufferObject(ITexture * tex)
if(initFrameBufferObject(tex))
{
glBindTexture(TextureMode, 0);
#ifdef USE_OPENGLES
nglBindFramebufferOES(GL_FRAMEBUFFER_OES, FBOId);
#else
nglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBOId);
#endif
}
else
return false;
}
else
{
#ifdef USE_OPENGLES
nglBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
#else
nglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
#endif
}
return true;
@ -840,8 +864,13 @@ bool CDriverGL::setupTextureEx (ITexture& tex, bool bUpload, bool &bAllUploaded,
sint size= tex.getPixels(i).size();
if (bUpload)
{
#ifdef USE_OPENGLES
glCompressedTexImage2D (GL_TEXTURE_2D, i-decalMipMapResize, glfmt,
tex.getWidth(i),tex.getHeight(i), 0, size, ptr);
#else
nglCompressedTexImage2DARB (GL_TEXTURE_2D, i-decalMipMapResize, glfmt,
tex.getWidth(i),tex.getHeight(i), 0, size, ptr);
#endif
bAllUploaded = true;
}
else

View file

@ -280,8 +280,12 @@ bool CDriverGL::renderLines(CMaterial& mat, uint32 firstIndex, uint32 nlines)
}
else
{
#ifdef USE_OPENGLES
nlerror("not available in OpenGL ES 1.0, only use 16 bits indices");
#else
nlassert(_LastIB._Format == CIndexBuffer::Indices32);
glDrawElements(GL_LINES,2*nlines,GL_UNSIGNED_INT,((uint32 *) _LastIB._Values)+firstIndex);
#endif
}
}
}
@ -336,8 +340,12 @@ bool CDriverGL::renderTriangles(CMaterial& mat, uint32 firstIndex, uint32 ntris)
}
else
{
#ifdef USE_OPENGLES
nlerror("not available in OpenGL ES 1.0, only use 16 bits indices");
#else
nlassert(_LastIB._Format == CIndexBuffer::Indices32);
glDrawElements(GL_TRIANGLES,3*ntris,GL_UNSIGNED_INT, ((uint32 *) _LastIB._Values)+firstIndex);
#endif
}
}
}
@ -380,8 +388,12 @@ bool CDriverGL::renderSimpleTriangles(uint32 firstTri, uint32 ntris)
}
else
{
#ifdef USE_OPENGLES
nlerror("not available in OpenGL ES 1.0, only use 16 bits indices");
#else
nlassert(_LastIB._Format == CIndexBuffer::Indices32);
glDrawElements(GL_TRIANGLES,3*ntris,GL_UNSIGNED_INT, ((uint32 *) _LastIB._Values)+firstTri);
#endif
}
// Profiling.
@ -608,6 +620,9 @@ bool CDriverGL::renderRawQuads(CMaterial& mat, uint32 startIndex, uint32 numQuad
}
else
{
#ifdef USE_OPENGLES
nlerror("not available in OpenGL ES 1.0, only use 16 bits indices");
#else
// indices fits on 32 bits
GLint indices[QUAD_BATCH_SIZE];
GLint *curr = indices;
@ -625,6 +640,7 @@ bool CDriverGL::renderRawQuads(CMaterial& mat, uint32 startIndex, uint32 numQuad
}
while(curr != end);
glDrawElements(GL_TRIANGLES, 6 * numQuadsToDraw, GL_UNSIGNED_INT, indices);
#endif
}
numLeftQuads -= numQuadsToDraw;
currIndex += 4 * numQuadsToDraw;
@ -665,10 +681,12 @@ void CDriverGL::setupUVPtr(uint stage, CVertexBufferInfo &VB, uint uvId)
// Setup ATI VBHard or std ptr.
switch(VB.VBMode)
{
#ifndef USE_OPENGLES
case CVertexBufferInfo::HwATI:
nglArrayObjectATI(GL_TEXTURE_COORD_ARRAY, numTexCoord, GL_FLOAT, VB.VertexSize, VB.VertexObjectId,
(ptrdiff_t) VB.ValuePtr[CVertexBuffer::TexCoord0+uvId]);
break;
#endif
case CVertexBufferInfo::HwARB:
_DriverGLStates.bindARBVertexBuffer(VB.VertexObjectId);
// with arb buffers, position is relative to the start of the stream
@ -811,6 +829,21 @@ const uint CDriverGL::NumCoordinatesType[CVertexBuffer::NumType]=
// ***************************************************************************
const uint CDriverGL::GLType[CVertexBuffer::NumType]=
{
#ifdef USE_OPENGLES
GL_FLOAT, // Double1
GL_FLOAT, // Float1
GL_SHORT, // Short1
GL_FLOAT, // Double2
GL_FLOAT, // Float2
GL_SHORT, // Short2
GL_FLOAT, // Double3
GL_FLOAT, // Float3
GL_SHORT, // Short3
GL_FLOAT, // Double4
GL_FLOAT, // Float4
GL_SHORT, // Short4
GL_UNSIGNED_BYTE // UChar4
#else
GL_DOUBLE, // Double1
GL_FLOAT, // Float1
GL_SHORT, // Short1
@ -824,6 +857,7 @@ const uint CDriverGL::GLType[CVertexBuffer::NumType]=
GL_FLOAT, // Float4
GL_SHORT, // Short4
GL_UNSIGNED_BYTE // UChar4
#endif
};
// ***************************************************************************
@ -926,6 +960,7 @@ void CDriverGL::setupGlArraysStd(CVertexBufferInfo &vb)
}
}
break;
#ifndef USE_OPENGLES
case CVertexBufferInfo::HwATI:
{
// setup vertex ptr.
@ -963,9 +998,12 @@ void CDriverGL::setupGlArraysStd(CVertexBufferInfo &vb)
nglArrayObjectATI(GL_COLOR_ARRAY, 4, GL_UNSIGNED_BYTE, vb.VertexSize, vb.VertexObjectId, (ptrdiff_t) vb.ValuePtr[CVertexBuffer::PrimaryColor]);
}
else
{
_DriverGLStates.enableColorArray(false);
}
}
break;
#endif
default:
nlassert(0);
break;
@ -1035,7 +1073,9 @@ void CDriverGL::toggleGlArraysForARBVertexProgram()
// If last was a VertexProgram setup, and now it is a standard GL array setup.
if( _LastSetupGLArrayVertexProgram && !isVertexProgramEnabled () )
{
#ifndef USE_OPENGLES
if (_Extensions.ATITextureEnvCombine3)
#endif
{
// fix for ATI : when switching from Vertex Program to fixed Pipe, must clean texture, otherwise texture may be disabled in next render
// (seems to be a driver bug)
@ -1046,12 +1086,16 @@ void CDriverGL::toggleGlArraysForARBVertexProgram()
// activate the texture, or disable texturing if NULL.
activateTexture(stage, NULL);
}
#ifndef USE_OPENGLES
glBegin(GL_QUADS);
glVertex4f(0.f, 0.f, 0.f, 1.f);
glVertex4f(0.f, 0.f, 0.f, 1.f);
glVertex4f(0.f, 0.f, 0.f, 1.f);
glVertex4f(0.f, 0.f, 0.f, 1.f);
glEnd();
#endif
for(uint stage=0 ; stage<inlGetNumTextStages() ; stage++)
{
// activate the texture, or disable texturing if NULL.
@ -1185,7 +1229,9 @@ void CDriverGL::setupGlArraysForNVVertexProgram(CVertexBufferInfo &vb)
{
// Secondary color
_DriverGLStates.enableSecondaryColorArray(true);
nglSecondaryColorPointerEXT(4,GL_UNSIGNED_BYTE, vb.VertexSize, vb.ValuePtr[value]);
#ifndef USE_OPENGLES
nglSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, vb.VertexSize, vb.ValuePtr[value]);
#endif
}
}
else
@ -1199,7 +1245,9 @@ void CDriverGL::setupGlArraysForNVVertexProgram(CVertexBufferInfo &vb)
// Active this value
_DriverGLStates.enableVertexAttribArray(glIndex, true);
#ifndef USE_OPENGLES
nglVertexAttribPointerNV (glIndex, NumCoordinatesType[type], GLType[type], vb.VertexSize, vb.ValuePtr[value]);
#endif
}
}
// Else normal case, can't do anything for other values with UChar4....
@ -1207,7 +1255,9 @@ void CDriverGL::setupGlArraysForNVVertexProgram(CVertexBufferInfo &vb)
{
// Active this value
_DriverGLStates.enableVertexAttribArray(glIndex, true);
#ifndef USE_OPENGLES
nglVertexAttribPointerNV (glIndex, NumCoordinatesType[type], GLType[type], vb.VertexSize, vb.ValuePtr[value]);
#endif
}
}
else

View file

@ -69,7 +69,7 @@ IVertexBufferHardGL::~IVertexBufferHardGL()
H_AUTO_OGL(IVertexBufferHardGL_IVertexBufferHardGLDtor)
}
#ifndef USE_OPENGLES
// ***************************************************************************
// ***************************************************************************
@ -1133,7 +1133,7 @@ void CVertexArrayRangeMapObjectATI::updateLostBuffers()
}
#endif
#endif // USE_OPENGLES
// ***************************************************************************
@ -1210,19 +1210,37 @@ IVertexBufferHardGL *CVertexArrayRangeARB::createVBHardGL(uint size, CVertexBuff
// create a ARB VBHard
GLuint vertexBufferID;
glGetError();
#ifdef USE_OPENGLES
glGenBuffers(1, &vertexBufferID);
#else
nglGenBuffersARB(1, &vertexBufferID);
#endif
if (glGetError() != GL_NO_ERROR) return false;
_Driver->_DriverGLStates.forceBindARBVertexBuffer(vertexBufferID);
switch(_VBType)
{
case CVertexBuffer::AGPPreferred:
#ifdef USE_OPENGLES
glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW);
#else
nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB);
#endif
break;
case CVertexBuffer::StaticPreferred:
if (_Driver->getStaticMemoryToVRAM())
#ifdef USE_OPENGLES
glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW);
#else
nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_STATIC_DRAW_ARB);
#endif
else
#ifdef USE_OPENGLES
glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW);
#else
nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB);
#endif
break;
default:
nlassert(0);
@ -1230,7 +1248,12 @@ IVertexBufferHardGL *CVertexArrayRangeARB::createVBHardGL(uint size, CVertexBuff
}
if (glGetError() != GL_NO_ERROR)
{
#ifdef USE_OPENGLES
glDeleteBuffers(1, &vertexBufferID);
#else
nglDeleteBuffersARB(1, &vertexBufferID);
#endif
return false;
}
CVertexBufferHardARB *newVbHard= new CVertexBufferHardARB(_Driver, vb);
@ -1272,8 +1295,13 @@ void CVertexArrayRangeARB::updateLostBuffers()
{
nlassert((*it)->_VertexObjectId);
GLuint id = (GLuint) (*it)->_VertexObjectId;
#ifdef USE_OPENGLES
nlassert(glIsBuffer(id));
glDeleteBuffers(1, &id);
#else
nlassert(nglIsBufferARB(id));
nglDeleteBuffersARB(1, &id);
#endif
(*it)->_VertexObjectId = 0;
(*it)->VB->setLocation(CVertexBuffer::NotResident);
}
@ -1300,6 +1328,12 @@ CVertexBufferHardARB::CVertexBufferHardARB(CDriverGL *drv, CVertexBuffer *vb) :
#ifdef NL_DEBUG
_Unmapping = false;
#endif
#ifdef USE_OPENGLES
_Buffer = NULL;
_BufferSize = 0;
_LastBufferSize = 0;
#endif
}
// ***************************************************************************
@ -1316,8 +1350,13 @@ CVertexBufferHardARB::~CVertexBufferHardARB()
if (_VertexObjectId)
{
GLuint id = (GLuint) _VertexObjectId;
#ifdef USE_OPENGLES
nlassert(glIsBuffer(id));
glDeleteBuffers(1, &id);
#else
nlassert(nglIsBufferARB(id));
nglDeleteBuffersARB(1, &id);
#endif
}
if (_VertexArrayRange)
{
@ -1336,12 +1375,21 @@ CVertexBufferHardARB::~CVertexBufferHardARB()
_VertexArrayRange->_MappedVBList.erase(_IteratorInMappedVBList);
}
#endif
#ifdef USE_OPENGLES
if (_Buffer)
{
delete [] _Buffer;
_Buffer = NULL;
}
#endif
}
// ***************************************************************************
void *CVertexBufferHardARB::lock()
{
H_AUTO_OGL(CVertexBufferHardARB_lock)
H_AUTO_OGL(CVertexBufferHardARB_lock);
if (_VertexPtr) return _VertexPtr; // already locked
if (_Invalid)
{
@ -1352,7 +1400,13 @@ void *CVertexBufferHardARB::lock()
}
// recreate a vb
GLuint vertexBufferID;
#ifdef USE_OPENGLES
glGenBuffers(1, &vertexBufferID);
#else
nglGenBuffersARB(1, &vertexBufferID);
#endif
if (glGetError() != GL_NO_ERROR)
{
_Driver->incrementResetCounter();
@ -1363,13 +1417,25 @@ void *CVertexBufferHardARB::lock()
switch(_MemType)
{
case CVertexBuffer::AGPPreferred:
#ifdef USE_OPENGLES
glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW);
#else
nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB);
#endif
break;
case CVertexBuffer::StaticPreferred:
if (_Driver->getStaticMemoryToVRAM())
#ifdef USE_OPENGLES
glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW);
#else
nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_STATIC_DRAW_ARB);
#endif
else
#ifdef USE_OPENGLES
glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW);
#else
nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB);
#endif
break;
default:
nlassert(0);
@ -1378,7 +1444,11 @@ void *CVertexBufferHardARB::lock()
if (glGetError() != GL_NO_ERROR)
{
_Driver->incrementResetCounter();
#ifdef USE_OPENGLES
glDeleteBuffers(1, &vertexBufferID);
#else
nglDeleteBuffersARB(1, &vertexBufferID);
#endif
return &_DummyVB[0];;
}
_VertexObjectId = vertexBufferID;
@ -1394,6 +1464,39 @@ void *CVertexBufferHardARB::lock()
beforeLock= CTime::getPerformanceTime();
}
_Driver->_DriverGLStates.bindARBVertexBuffer(_VertexObjectId);
#ifdef USE_OPENGLES
if (_Driver->_Extensions.OESMapBuffer)
{
_VertexPtr = nglMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
if (!_VertexPtr)
{
nglUnmapBufferOES(GL_ARRAY_BUFFER);
nlassert(glIsBuffer(_VertexObjectId));
invalidate();
return &_DummyVB[0];
}
}
else
{
const uint size = VB->getNumVertices() * VB->getVertexSize();
if (size > _BufferSize)
{
if (_Buffer) delete [] _Buffer;
_Buffer = new uint8[size+3];
_BufferSize = size;
}
uint8 offset = (size_t)_Buffer % 4;
if (offset > 0) offset = 4 - offset;
_VertexPtr = _Buffer + offset;
_LastBufferSize = size;
}
#else
_VertexPtr = nglMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
if (!_VertexPtr)
{
@ -1402,6 +1505,8 @@ void *CVertexBufferHardARB::lock()
invalidate();
return &_DummyVB[0];
}
#endif
#ifdef NL_DEBUG
_VertexArrayRange->_MappedVBList.push_front(this);
_IteratorInMappedVBList = _VertexArrayRange->_MappedVBList.begin();
@ -1420,7 +1525,8 @@ void *CVertexBufferHardARB::lock()
// ***************************************************************************
void CVertexBufferHardARB::unlock()
{
H_AUTO_OGL(CVertexBufferHardARB_unlock)
H_AUTO_OGL(CVertexBufferHardARB_unlock);
_VertexPtr = NULL;
if (_Invalid) return;
if (!_VertexObjectId) return;
@ -1434,7 +1540,17 @@ void CVertexBufferHardARB::unlock()
#ifdef NL_DEBUG
_Unmapping = true;
#endif
GLboolean unmapOk = nglUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
GLboolean unmapOk = false;
#ifdef USE_OPENGLES
if (_Driver->_Extensions.OESMapBuffer)
{
unmapOk = nglUnmapBufferOES(GL_ARRAY_BUFFER);
}
#else
unmapOk = nglUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
#endif
#ifdef NL_DEBUG
_Unmapping = false;
#endif

View file

@ -2376,11 +2376,15 @@ void CDriverGL::getWindowSize(uint32 &width, uint32 &height)
if (_CurrentMode.OffScreen)
{
#ifdef NL_OS_WINDOWS
#ifndef USE_OPENGLES
if (_PBuffer)
{
nwglQueryPbufferARB( _PBuffer, WGL_PBUFFER_WIDTH_ARB, (int*)&width );
nwglQueryPbufferARB( _PBuffer, WGL_PBUFFER_HEIGHT_ARB, (int*)&height );
}
#endif
#endif
}
else

View file

@ -31,7 +31,7 @@ PROJECT_NAME = "Object Viewer Qt"
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER = r90
PROJECT_NUMBER =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
@ -643,7 +643,7 @@ FILE_PATTERNS = *.c \
# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = NO
RECURSIVE = YES
# The EXCLUDE tag can be used to specify files and/or directories that should
# excluded from the INPUT source files. This way you can easily exclude a

View file

@ -1,6 +1,6 @@
/**
@mainpage Object Viewer Qt
@author Dzmitry Kamiahin <dnk-88@tut.by>, (C) 2010
@author Dzmitry Kamiahin <dnk-88@tut.by>, (C) 2011
@section introduce Introduce
@details
@ -15,130 +15,22 @@ The tool can be used in different tasks:
- Create and modify micro-vegetation material (.vegetset files)
- Viewing landscape (.zonel files)
- Dialog allows to specify graphical, sound, search path and landscape settings.
@section project_structure Overview of the Object Viewer Qt Project Structure
@details
OVQT - consists of several major subsystems. Each subsystem performs its defined part of the task.
Through Modules:: provides access to all other program subsystems.
Program has the following subsystems:
- @ref Modules - Main modules aggregated all parts of the program.
- @ref NLQT::CConfiguration - is responsible for loading and saving settings from the configuration file. As well as search path of data.
- @ref NLQT::CObjectViewer - main subsystem of the program, which initializes the driver, creates a scene and other supporting elements.
It is a container for loaded models, which can further be viewed and animated.
- @ref NLQT::CMainWindow - is responsible for the GUI.
- @ref NLQT::CParticleEditor - is responsible for the particle systems and provides access to a container that keeps all the loaded particle systems.
And also allows you to view an animation of particle systems, with the ability to control its parameters.
- @ref NLQT::CVegetableEditor - is responsible for the landscape zones and the editor of vegetation.
Allows you to load and view the landscape. Also has the ability to create and edit the parameters of the micro-vegetation.
- @ref NLQT::CSoundSystem - is responsible for the sound in the program.
<b>
The structure of the GUI in the editor of the particles.
</b><br>
This can be useful for new developers who want to add more new dialogs or to improve the functionality of existing dialogues.
<img src="gui_struct.png" alt="Particle Workspace">
ParticleWorkspace dialogue uses the technique of model-view.
Using the signal/slot link QTreeView with QStackWidget, Editor properties dialog.
When you select an item in QTreeView, QStackWidget displays the necessary page(PageWidget) where you can edit the element of the particles system.
Each page is made in the designer and has a separate forms(.ui).
In accordance with the recommendations of dialogues design, with a large number of items,every page uses QTabWidget.
In case when there is a great number of controls, and not everything you want to display,
it's used the dynamic creation of tabs. Moreover, each tab uses a separate forms(.ui).
@section for_new_developer Guide for new developers of the Object Viewer Qt.
@details
First of all, to begin developing dialogues that add new features ovqt,
it is needed to read the documentation Qt libs (http://doc.qt.nokia.com/) and NeL documentation.
In order to have convenient using of the tool and its further development,
it is expected to make a unified interface that is why all dialogs should adhere to a standard design,
which will be written further. For this goals program provides some additional widgets,
which are recommended to use. As in the development Qt Designer is actively used.
To get access to founded here widgets from the designer,the technique promotion is used,
which can be found <a href="http://doc.qt.nokia.com/4.5/designer-using-custom-widgets.html"> here </a>.
<ol>
<li><b>
CEditRangeUIntWidget / CEditRangeIntWidget / CEditRangeFloatWidget
</b><br>
Widgets provides a slider that allows you to specify an integer (or float, depending on which widget used) number within a set range.
The range is also can be set by the user, or for a more accurate selection of numbers, either for receiving large values.
As there may be situations when the range that a user requests,has to be restricted, and widget provides methods that allow you to do so.
<br><br>
<img src="cedit_range_int_widget.png" alt="CEditRangeIntWidget">
<br>
<img src="cedit_range_float_widget.png" alt="CEditRangeFloatWidget">
@see
@ref NLQT::CEditRangeUIntWidget, @ref NLQT::CEditRangeIntWidget, @ref NLQT::CEditRangeFloatWidget
<li><b>
CColorEditWidget
</b><br>
Using this widget you can set the color(RGBA) using the four sliders or through the color selection dialog.
<br><br>
<img src="cedit_color_widget.png" alt="CColorEditWidget">
@see
@ref NLQT::CColorEditWidget
<li><b>
CDirectionWidget
</b><br>
This widget helps to choose from several preset directions, or to choose a custom one.
<br><br>
<img src="cdirection_widget.png" alt="CDirectionWidget">
@see
@ref NLQT::CDirectionWidget
</ol><br><br>
To further convinience of instrument using dialogues interface is recommended to make as follows.
The most sophisticated tools of the program, should take the form of three dock windows (example shown in the screenshot).
<img src="object_viewer_qt_window.png" alt="Object Viewer Qt">
<ol>
<li>
The first dock window - is a control dock window, it should focus all of the control functions of general purpose
(for example: start/stop/pause animations or particles system).
It is recommended to perform of the horizontal type window and placed in the bottom of the main window.
<li>
The second dock window - is a list or a tree of items. In which selecting of the current element,
which assumes to modify or viewis possible.Operations "add/remove/insert or other" items are recommended to make as a popur menu.
It is recommended to perform of the vertical type window and placed in the left of the main window.
<li>
The third dock - is an editor for properties of the element that was selected in the list or in the tree of elements.
As all the controls occupy much space or do not fit at all, you have to use tabs QTabWidget,
which in total can contains quite a lot of elements.
For a small number of tabs it is allowed to use both horizontal and vertical location.
But with a large number of tabs, it is necessary to apply the vertical arrangement.
It is recommended to perform of the vertical type of window and placed in the right of the main window.
</ol>
In the simple dialogues do not necessary to use all three windows, but user has to adhere to the recommendations given above as well.
Also, <b>all dialogs must use the qt layout manager</b>. And if you do not use the designer,
make sure you use the qt tools internationalization applications.
<br><br>
In ovqt for most dialogs their owner is NLQT::CMainWindow and in its methods creating and initializing all dependent dialogs occur.
For the convenience of the program using, most dialogues are created in the form of docking windows.
Creating all the dialogues are carried out in a private method NLQT::CMainWindow::createDialogs().
Hence, it is necessary to add operations in this method to create new dialogues.
But we must take into account that at this moment is fully available only one component of the program CConfiguration,
to read the settings from the configuration file. The remaining components of the program are available only after the main window stays visible.
Calling the dialogues going through the menu or the toolbar, usually it is a checkable item.
Adding of the new menu items or items toolbars is need in methods NLQT::CMainWindow::createMenus(), NLQT::CMainWindow::createToolBars().
- OVQT supports loading third-party plug-ins.
@section license_ovqt License Object Viewer Qt
@details
Object Viewer Qt
Object Viewer Qt - MMORPG Framework <http://dev.ryzom.com/projects/ryzom>
<br>
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
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.
<br><br>
This program 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 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.
<br><br>
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 General Public License for more details.
<br><br>
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
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/>.
*/

View file

@ -40,7 +40,6 @@ class IPluginSpec;
class IPluginManager: public QObject
{
Q_OBJECT
public:
IPluginManager(QObject *parent = 0): QObject(parent) {}
virtual ~IPluginManager() {}

View file

@ -292,4 +292,4 @@ void CPluginManager::deleteAll()
}
}
}; // namespace NLQT
}; // namespace ExtensionSystem

View file

@ -74,6 +74,6 @@ private:
}; // class CPluginManager
} // namespace NLQT
} // namespace ExtensionSystem
#endif // PLUGINMANAGER_H

View file

@ -266,4 +266,4 @@ bool CPluginSpec::reportError(const QString &err)
return false;
}
} // namespace NLQT
} // namespace ExtensionSystem

View file

@ -79,7 +79,7 @@ private:
friend class CPluginManager;
};
} // namespace NLQT
} // namespace ExtensionSystem
#endif // PLUGINSPEC_H

View file

@ -38,6 +38,8 @@
#include <QtGui/QMessageBox>
#include <QtGui/QApplication>
#include <QtGui/QSplashScreen>
#include <QtGui/QFileDialog>
#include <QtGui/QInputDialog>
static const char *appNameC = "ObjectViewerQt";
@ -135,7 +137,7 @@ sint main(int argc, char **argv)
QTranslator qtTranslator;
QString locale = settings->value("Language", QLocale::system().name()).toString();
QString qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
translator.load("object_viewer_qt_" + locale, ":/");
// translator.load("object_viewer_qt_" + locale, ":/");
qtTranslator.load("qt_" + locale, qtTrPath);
app.installTranslator(&translator);
app.installTranslator(&qtTranslator);
@ -149,9 +151,9 @@ sint main(int argc, char **argv)
pluginManager.setSettings(settings);
QStringList pluginPaths;
#if !defined(NL_OS_MAC)
pluginPaths << QString("./plugins");
pluginPaths << settings->value("PluginPath", "./plugins").toString();
#else
pluginPaths << qApp->applicationDirPath() + QString("/../PlugIns/ovqt");
pluginPaths << settings->value("PluginPath", qApp->applicationDirPath() + QString("/../PlugIns/ovqt")).toString();
#endif
pluginManager.setPluginPaths(pluginPaths);
@ -176,6 +178,15 @@ sint main(int argc, char **argv)
QString absolutePaths = absolutePluginPaths.absolutePath();
const QString reason = QCoreApplication::translate("Application", "Could not find ovqt_plugin_core in %1").arg(absolutePaths);
displayError(msgCoreLoadFailure(reason));
QString newPath = QFileDialog::getExistingDirectory(0, QCoreApplication::translate("Application", "Change the plugins path"), QDir::homePath());
bool ok;
QString text = QInputDialog::getText(0, QCoreApplication::translate("Application", "Enter the plugins path"),
QCoreApplication::translate("Application", "Plugin path:"), QLineEdit::Normal,
newPath, &ok);
if (ok && !text.isEmpty())
settings->setValue("PluginPath", text);
settings->sync();
return 1;
}
if (corePlugin->hasError())

View file

@ -20,10 +20,12 @@ SET(OVQT_CORE_PLUGIN_HDR
menu_manager.h
settings_dialog.h
search_paths_settings_page.h
general_settings_page.h
plugin_view_dialog.h)
SET(OVQT_CORE_PLUGIN_UIS settings_dialog.ui
plugin_view_dialog.ui
general_settings_page.ui
search_paths_settings_page.ui)
SET(OVQT_CORE_PLUGIN_RCS core.qrc)

View file

@ -24,7 +24,7 @@ namespace Constants
{
const char * const OVQT_VERSION_LONG = "0.0.1";
const char * const OVQT_VENDOR = "Dzmitry Kamiahin";
const char * const OVQT_VENDOR = "Ryzom Core";
const char * const OVQT_YEAR = "2010, 2011";
const char * const OVQT_CORE_PLUGIN = "Core";
@ -61,11 +61,24 @@ const char * const ABOUT_PLUGINS = "ObjectViewerQt.AboutPlugins";
const char * const ABOUT_QT = "ObjectViewerQt.AboutQt";
//settings
const char * const SETTINGS_CATEGORY_GENERAL = "general";
const char * const SETTINGS_CATEGORY_GENERAL_ICON = ":/icons/ic_nel_generic_settings.png";
const char * const SETTINGS_TR_CATEGORY_GENERAL = QT_TR_NOOP("General");
const char * const MAIN_WINDOW_SECTION = "MainWindow";
const char * const MAIN_WINDOW_STATE = "WindowState";
const char * const MAIN_WINDOW_GEOMETRY = "WindowGeometry";
const char * const QT_STYLE = "QtStyle";
const char * const QT_PALETTE = "QtPalette";
const char * const LANGUAGE = "Language";
const char * const PLUGINS_PATH = "PluginPath";
const char * const DATA_PATH_SECTION = "DataPath";
const char * const SEARCH_PATHS = "SearchPaths";
const char * const RECURSIVE_SEARCH_PATHS = "RecursiveSearchPathes";
const char * const LEVELDESIGN_PATH = "LevelDesignPath";
const char * const ASSETS_PATH = "LevelDesignPath";
const char * const ASSETS_PATH = "AssetsPath";
const char * const REMAP_EXTENSIONS = "RemapExtensions";
//resources
const char * const ICON_NEL = ":/core/images/nel.png";

View file

@ -20,8 +20,8 @@
#include "settings_dialog.h"
#include "core_constants.h"
#include "search_paths_settings_page.h"
#include "general_settings_page.h"
#include "../../extension_system/iplugin_spec.h"
#include "qtwin.h"
// NeL includes
#include "nel/misc/debug.h"
@ -42,37 +42,37 @@ CorePlugin::CorePlugin()
CorePlugin::~CorePlugin()
{
Q_FOREACH(QObject *obj, _autoReleaseObjects)
Q_FOREACH(QObject *obj, m_autoReleaseObjects)
{
_plugMan->removeObject(obj);
m_plugMan->removeObject(obj);
}
qDeleteAll(_autoReleaseObjects);
_autoReleaseObjects.clear();
qDeleteAll(m_autoReleaseObjects);
m_autoReleaseObjects.clear();
delete _mainWindow;
delete m_mainWindow;
}
bool CorePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString)
{
Q_UNUSED(errorString);
_plugMan = pluginManager;
m_plugMan = pluginManager;
_mainWindow = new MainWindow(pluginManager);
/*if (QtWin::isCompositionEnabled())
{
QtWin::extendFrameIntoClientArea(_mainWindow);
_mainWindow->setContentsMargins(0, 0, 0, 0);
}*/
bool success = _mainWindow->initialize(errorString);
CSearchPathsSettingsPage *serchPathPage = new CSearchPathsSettingsPage(this);
serchPathPage->applySearchPaths();
addAutoReleasedObject(serchPathPage);
m_mainWindow = new MainWindow(pluginManager);
bool success = m_mainWindow->initialize(errorString);
GeneralSettingsPage *generalSettings = new GeneralSettingsPage(this);
CSearchPathsSettingsPage *searchPathPage = new CSearchPathsSettingsPage(this);
generalSettings->applyGeneralSettings();
searchPathPage->applySearchPaths();
addAutoReleasedObject(generalSettings);
addAutoReleasedObject(searchPathPage);
return success;
}
void CorePlugin::extensionsInitialized()
{
_mainWindow->extensionsInitialized();
m_mainWindow->extensionsInitialized();
}
void CorePlugin::shutdown()
@ -86,7 +86,7 @@ void CorePlugin::setNelContext(NLMISC::INelContext *nelContext)
// This only applies to platforms without PIC, e.g. Windows.
nlassert(!NLMISC::INelContext::isContextInitialised());
#endif // NL_OS_WINDOWS
_LibContext = new NLMISC::CLibraryContext(*nelContext);
m_libContext = new NLMISC::CLibraryContext(*nelContext);
}
QString CorePlugin::name() const
@ -116,8 +116,8 @@ QStringList CorePlugin::dependencies() const
void CorePlugin::addAutoReleasedObject(QObject *obj)
{
_plugMan->addObject(obj);
_autoReleaseObjects.prepend(obj);
m_plugMan->addObject(obj);
m_autoReleaseObjects.prepend(obj);
}
Q_EXPORT_PLUGIN(CorePlugin)

View file

@ -63,16 +63,16 @@ public:
ExtensionSystem::IPluginManager *pluginManager() const
{
return _plugMan;
return m_plugMan;
}
protected:
NLMISC::CLibraryContext *_LibContext;
NLMISC::CLibraryContext *m_libContext;
private:
ExtensionSystem::IPluginManager *_plugMan;
MainWindow *_mainWindow;
QList<QObject *> _autoReleaseObjects;
ExtensionSystem::IPluginManager *m_plugMan;
MainWindow *m_mainWindow;
QList<QObject *> m_autoReleaseObjects;
};
} // namespace Core

View file

@ -0,0 +1,187 @@
// Object Viewer Qt - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Dzmitry Kamiahin <dnk-88@tut.by>
//
// 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/>.
// Project includes
#include "general_settings_page.h"
#include "core_constants.h"
#include "icore.h"
// NeL includes
#include <nel/misc/path.h>
// Qt includes
#include <QtCore/QSettings>
#include <QtGui/QWidget>
#include <QtGui/QMessageBox>
#include <QtGui/QFileDialog>
#include <QtGui/QStyleFactory>
#include <QtGui/QStyle>
namespace Core
{
GeneralSettingsPage::GeneralSettingsPage(QObject *parent)
: IOptionsPage(parent),
m_page(0)
{
m_originalPalette = QApplication::palette();
}
GeneralSettingsPage::~GeneralSettingsPage()
{
}
QString GeneralSettingsPage::id() const
{
return QLatin1String("general_settings");
}
QString GeneralSettingsPage::trName() const
{
return tr("General");
}
QString GeneralSettingsPage::category() const
{
return QLatin1String(Constants::SETTINGS_CATEGORY_GENERAL);
}
QString GeneralSettingsPage::trCategory() const
{
return tr(Constants::SETTINGS_TR_CATEGORY_GENERAL);
}
void GeneralSettingsPage::applyGeneralSettings()
{
QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup(Constants::MAIN_WINDOW_SECTION);
QApplication::setStyle(QStyleFactory::create(settings->value(Constants::QT_STYLE, "").toString()));
if (settings->value(Constants::QT_PALETTE, true).toBool())
QApplication::setPalette(QApplication::style()->standardPalette());
else
QApplication::setPalette(m_originalPalette);
settings->endGroup();
}
QWidget *GeneralSettingsPage::createPage(QWidget *parent)
{
m_page = new QWidget(parent);
m_ui.setupUi(m_page);
readSettings();
connect(m_ui.languageComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(changeLanguage(QString)));
connect(m_ui.pluginsPathButton, SIGNAL(clicked()), this, SLOT(setPluginsPath()));
connect(m_ui.leveldesignPathButton, SIGNAL(clicked()), this, SLOT(setLevelDesignPath()));
connect(m_ui.assetsPathButton, SIGNAL(clicked()), this, SLOT(setAssetsPath()));
return m_page;
}
void GeneralSettingsPage::apply()
{
writeSettings();
applyGeneralSettings();
}
void GeneralSettingsPage::finish()
{
delete m_page;
m_page = 0;
}
void GeneralSettingsPage::changeLanguage(const QString &lang)
{
QMessageBox::information(0, tr("Restart required"),
tr("The language change will take effect after a restart of Object Viewer Qt."));
}
void GeneralSettingsPage::setPluginsPath()
{
QString newPath = QFileDialog::getExistingDirectory(0, tr("Set the plugins path"),
m_ui.pluginsPathLineEdit->text());
if (!newPath.isEmpty())
{
m_ui.pluginsPathLineEdit->setText(newPath);
}
}
void GeneralSettingsPage::setLevelDesignPath()
{
QString newPath = QFileDialog::getExistingDirectory(0, tr("Set the level design path"),
m_ui.leveldesignPathLineEdit->text());
if (!newPath.isEmpty())
{
m_ui.leveldesignPathLineEdit->setText(newPath);
}
}
void GeneralSettingsPage::setAssetsPath()
{
QString newPath = QFileDialog::getExistingDirectory(0, tr("Set the assets path"),
m_ui.assetsPathLineEdit->text());
if (!newPath.isEmpty())
{
m_ui.assetsPathLineEdit->setText(newPath);
}
}
void GeneralSettingsPage::readSettings()
{
QSettings *settings = Core::ICore::instance()->settings();
m_ui.pluginsPathLineEdit->setText(settings->value(Core::Constants::PLUGINS_PATH, "./plugins").toString());
settings->beginGroup(Constants::MAIN_WINDOW_SECTION);
m_ui.styleComboBox->addItems(QStyleFactory::keys());
QString style = settings->value(Constants::QT_STYLE, "").toString();
if (style == "")
m_ui.styleComboBox->setCurrentIndex(0);
else
m_ui.styleComboBox->setCurrentIndex(m_ui.styleComboBox->findText(style));
m_ui.paletteCheckBox->setChecked(settings->value(Constants::QT_PALETTE, true).toBool());
settings->endGroup();
QStringList paths;
settings->beginGroup(Core::Constants::DATA_PATH_SECTION);
m_ui.leveldesignPathLineEdit->setText(settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString());
m_ui.assetsPathLineEdit->setText(settings->value(Core::Constants::ASSETS_PATH, "w:/database").toString());
settings->endGroup();
}
void GeneralSettingsPage::writeSettings()
{
QSettings *settings = Core::ICore::instance()->settings();
settings->setValue(Core::Constants::PLUGINS_PATH, m_ui.pluginsPathLineEdit->text());
settings->beginGroup(Constants::MAIN_WINDOW_SECTION);
if (m_ui.styleComboBox->currentIndex() == 0)
settings->setValue(Constants::QT_STYLE, "");
else
settings->setValue(Constants::QT_STYLE, m_ui.styleComboBox->currentText());
settings->setValue(Constants::QT_PALETTE, m_ui.paletteCheckBox->isChecked());
settings->endGroup();
settings->beginGroup(Core::Constants::DATA_PATH_SECTION);
settings->setValue(Core::Constants::LEVELDESIGN_PATH, m_ui.leveldesignPathLineEdit->text());
settings->setValue(Core::Constants::ASSETS_PATH, m_ui.assetsPathLineEdit->text());
settings->endGroup();
settings->sync();
}
} /* namespace Core */

View file

@ -0,0 +1,71 @@
// Object Viewer Qt - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Dzmitry Kamiahin <dnk-88@tut.by>
//
// 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 GENERAL_SETTINGS_PAGE_H
#define GENERAL_SETTINGS_PAGE_H
#include <QtCore/QObject>
#include "ioptions_page.h"
#include "ui_general_settings_page.h"
class QWidget;
namespace Core
{
/**
@class GeneralSettingsPage
*/
class GeneralSettingsPage : public Core::IOptionsPage
{
Q_OBJECT
public:
GeneralSettingsPage(QObject *parent = 0);
~GeneralSettingsPage();
QString id() const;
QString trName() const;
QString category() const;
QString trCategory() const;
QWidget *createPage(QWidget *parent);
void apply();
void finish();
void applyGeneralSettings();
private Q_SLOTS:
void changeLanguage(const QString &lang);
void setPluginsPath();
void setLevelDesignPath();
void setAssetsPath();
private:
void readSettings();
void writeSettings();
QPalette m_originalPalette;
QWidget *m_page;
Ui::GeneralSettingsPage m_ui;
};
} // namespace Core
#endif // GENERAL_SETTINGS_H

View file

@ -0,0 +1,199 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>GeneralSettingsPage</class>
<widget class="QWidget" name="GeneralSettingsPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>267</width>
<height>282</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="margin">
<number>6</number>
</property>
<property name="spacing">
<number>3</number>
</property>
<item row="0" column="0">
<widget class="QGroupBox" name="qtStyleGroupBox">
<property name="title">
<string>Qt Style</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>6</number>
</property>
<item>
<widget class="QComboBox" name="styleComboBox">
<item>
<property name="text">
<string>default</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QCheckBox" name="paletteCheckBox">
<property name="text">
<string>Use style's standard palette</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="languageGroupBox">
<property name="title">
<string>Language</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="margin">
<number>6</number>
</property>
<item>
<widget class="QComboBox" name="languageComboBox">
<property name="enabled">
<bool>false</bool>
</property>
<item>
<property name="text">
<string>English</string>
</property>
</item>
<item>
<property name="text">
<string>German</string>
</property>
</item>
<item>
<property name="text">
<string>French</string>
</property>
</item>
<item>
<property name="text">
<string>Russian</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<widget class="QGroupBox" name="pathsGroupBox">
<property name="title">
<string>Paths</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>6</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="pluginsPathLabel">
<property name="text">
<string>Plugins path:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="pluginsPathLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QToolButton" name="pluginsPathButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="leveldesignPathLabel">
<property name="text">
<string>Level design path:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="leveldesignPathLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QToolButton" name="leveldesignPathButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="assetsPathLabel">
<property name="text">
<string>Assets path:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="assetsPathLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QToolButton" name="assetsPathButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources>
<include location="core.qrc"/>
</resources>
<connections/>
</ui>

View file

@ -59,6 +59,7 @@ public:
virtual ExtensionSystem::IPluginManager *pluginManager() const = 0;
Q_SIGNALS:
void changeSettings();
void closeMainWindow();
};

View file

@ -60,6 +60,7 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget *
m_tabWidget = new QTabWidget(this);
m_tabWidget->setTabPosition(QTabWidget::South);
m_tabWidget->setMovable(true);
m_tabWidget->setDocumentMode(true);
setCentralWidget(m_tabWidget);
setDockNestingEnabled(true);
@ -118,6 +119,10 @@ ExtensionSystem::IPluginManager *MainWindow::pluginManager() const
return m_pluginManager;
}
void MainWindow::open()
{
}
void MainWindow::checkObject(QObject *obj)
{
IContext *context = qobject_cast<IContext *>(obj);
@ -133,7 +138,10 @@ bool MainWindow::showOptionsDialog(const QString &group,
parent = this;
CSettingsDialog settingsDialog(m_pluginManager, group, page, parent);
settingsDialog.show();
return settingsDialog.execDialog();
bool ok = settingsDialog.execDialog();
if (ok)
Q_EMIT m_coreImpl->changeSettings();
return ok;
}
void MainWindow::about()
@ -177,7 +185,7 @@ void MainWindow::createActions()
m_openAction->setShortcut(QKeySequence::Open);
m_openAction->setStatusTip(tr("Open an existing file"));
menuManager()->registerAction(m_openAction, Constants::OPEN);
// connect(m_openAction, SIGNAL(triggered()), this, SLOT(open()));
connect(m_openAction, SIGNAL(triggered()), this, SLOT(open()));
m_exitAction = new QAction(tr("E&xit"), this);
m_exitAction->setShortcut(QKeySequence(tr("Ctrl+Q")));
@ -220,6 +228,7 @@ void MainWindow::createMenus()
{
m_fileMenu = menuBar()->addMenu(tr("&File"));
menuManager()->registerMenu(m_fileMenu, Constants::M_FILE);
// m_fileMenu->addAction(m_openAction);
m_fileMenu->addSeparator();
m_fileMenu->addAction(m_exitAction);
@ -260,17 +269,17 @@ void MainWindow::createDialogs()
void MainWindow::readSettings()
{
m_settings->beginGroup("MainWindow");
restoreState(m_settings->value("WindowState").toByteArray());
restoreGeometry(m_settings->value("WindowGeometry").toByteArray());
m_settings->beginGroup(Constants::MAIN_WINDOW_SECTION);
restoreState(m_settings->value(Constants::MAIN_WINDOW_STATE).toByteArray());
restoreGeometry(m_settings->value(Constants::MAIN_WINDOW_GEOMETRY).toByteArray());
m_settings->endGroup();
}
void MainWindow::writeSettings()
{
m_settings->beginGroup("MainWindow");
m_settings->setValue("WindowState", saveState());
m_settings->setValue("WindowGeometry", saveGeometry());
m_settings->beginGroup(Constants::MAIN_WINDOW_SECTION);
m_settings->setValue(Constants::MAIN_WINDOW_STATE, saveState());
m_settings->setValue(Constants::MAIN_WINDOW_GEOMETRY, saveGeometry());
m_settings->endGroup();
}

View file

@ -59,6 +59,7 @@ public Q_SLOTS:
QWidget *parent = 0);
private Q_SLOTS:
void open();
void checkObject(QObject *obj);
void about();

View file

@ -45,7 +45,7 @@ CSearchPathsSettingsPage::~CSearchPathsSettingsPage()
QString CSearchPathsSettingsPage::id() const
{
return QLatin1String("SearchPaths");
return QLatin1String("search_paths");
}
QString CSearchPathsSettingsPage::trName() const
@ -55,12 +55,12 @@ QString CSearchPathsSettingsPage::trName() const
QString CSearchPathsSettingsPage::category() const
{
return QLatin1String("General");
return QLatin1String(Constants::SETTINGS_CATEGORY_GENERAL);
}
QString CSearchPathsSettingsPage::trCategory() const
{
return tr("General");
return tr(Constants::SETTINGS_TR_CATEGORY_GENERAL);
}
QWidget *CSearchPathsSettingsPage::createPage(QWidget *parent)
@ -92,17 +92,20 @@ void CSearchPathsSettingsPage::finish()
void CSearchPathsSettingsPage::applySearchPaths()
{
QStringList paths;
QStringList paths, remapExt;
QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup(Core::Constants::DATA_PATH_SECTION);
paths = settings->value(Core::Constants::SEARCH_PATHS).toStringList();
remapExt = settings->value(Core::Constants::REMAP_EXTENSIONS).toStringList();
settings->endGroup();
for (int i = 1; i < remapExt.size(); i += 2)
NLMISC::CPath::remapExtension(remapExt.at(i - 1).toStdString(), remapExt.at(i).toStdString(), true);
Q_FOREACH(QString path, paths)
{
NLMISC::CPath::addSearchPath(path.toStdString(), false, false);
}
NLMISC::CPath::remapExtension("png", "tga", true);
NLMISC::CPath::remapExtension("png", "dds", true);
}
void CSearchPathsSettingsPage::addPath()

View file

@ -49,6 +49,7 @@ public:
void apply();
void finish();
// Set of the search paths(not recursive) and the remap extensions (loading from settings file)
void applySearchPaths();
private Q_SLOTS:

View file

@ -38,6 +38,9 @@ QNLWidget::QNLWidget(QWidget *parent)
m_initialized(false),
m_interval(25)
{
setAttribute(Qt::WA_OpaquePaintEvent);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_PaintOnScreen);
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);

View file

@ -45,7 +45,7 @@ using namespace Plugin;
namespace ExtensionSystem
{
class IPluginSpec;
class IPluginSpec;
}
CLogPlugin::CLogPlugin(QWidget *parent): QDockWidget(parent)
@ -55,7 +55,7 @@ CLogPlugin::CLogPlugin(QWidget *parent): QDockWidget(parent)
CLogPlugin::~CLogPlugin()
{
_plugMan->removeObject(_logSettingsPage);
//_plugMan->removeObject(_logSettingsPage);
delete _logSettingsPage;
NLMISC::ErrorLog->removeDisplayer(_displayer);
@ -71,7 +71,7 @@ bool CLogPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QStr
Q_UNUSED(errorString);
_plugMan = pluginManager;
_logSettingsPage = new CLogSettingsPage(this);
_plugMan->addObject(_logSettingsPage);
//_plugMan->addObject(_logSettingsPage);
return true;
}

View file

@ -193,7 +193,7 @@
</property>
<property name="icon">
<iconset resource="object_viewer.qrc">
<normaloff>:/images/animset.png</normaloff>:/images/animset.png</iconset>
<normaloff>:/icons/ic_nel_animset.png</normaloff>:/icons/ic_nel_animset.png</iconset>
</property>
<property name="iconSize">
<size>

View file

@ -91,7 +91,7 @@
<item>
<widget class="QPushButton" name="bankButton">
<property name="enabled">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>195</width>
<height>64</height>
<width>192</width>
<height>52</height>
</rect>
</property>
<property name="maximumSize">
@ -21,6 +21,12 @@
</property>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>3</number>
</property>
<property name="spacing">
<number>3</number>
</property>
<item row="1" column="1" colspan="2">
<widget class="QSlider" name="horizontalSlider">
<property name="maximum">

View file

@ -25,8 +25,6 @@
// Qt includes
#include <QtCore/QSettings>
#include <QtGui/QWidget>
#include <QtGui/QStyleFactory>
#include <QtGui/QStyle>
// NeL includes
#include <nel/3d/bloom_effect.h>
@ -75,11 +73,6 @@ QWidget *GraphicsSettingsPage::createPage(QWidget *parent)
m_ui.squareBloomCheckBox->setChecked(NL3D::CBloomEffect::instance().getSquareBloom());
m_ui.bloomDensityHorizontalSlider->setValue(NL3D::CBloomEffect::instance().getDensityBloom());
m_ui.styleComboBox->addItems(QStyleFactory::keys());
QString style = settings->value(Constants::QT_STYLE, "").toString();
m_ui.styleComboBox->setCurrentIndex(m_ui.styleComboBox->findText(style));
m_ui.paletteCheckBox->setChecked(settings->value(Constants::QT_PALETTE, true).toBool());
settings->endGroup();
connect(m_ui.enableBloomCheckBox, SIGNAL(toggled(bool)), this, SLOT(setEnableBloom(bool)));
@ -103,16 +96,6 @@ void GraphicsSettingsPage::apply()
settings->setValue(Constants::ENABLE_BLOOM, m_ui.enableBloomCheckBox->isChecked());
settings->setValue(Constants::ENABLE_SQUARE_BLOOM, m_ui.squareBloomCheckBox->isChecked());
settings->setValue(Constants::BLOOM_DENSITY, m_ui.bloomDensityHorizontalSlider->value());
settings->setValue(Constants::QT_STYLE, m_ui.styleComboBox->currentText());
settings->setValue(Constants::QT_PALETTE, m_ui.paletteCheckBox->isChecked());
// apply qt style and palette
QApplication::setStyle(QStyleFactory::create(m_ui.styleComboBox->currentText()));
if (m_ui.paletteCheckBox->isChecked())
QApplication::setPalette(QApplication::style()->standardPalette());
else
QApplication::setPalette(Modules::mainWin().getOriginalPalette());
settings->endGroup();
settings->sync();

View file

@ -117,50 +117,7 @@
</layout>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QGroupBox" name="qtStyleGroupBox">
<property name="title">
<string>Qt Style</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Style</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QComboBox" name="styleComboBox"/>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="paletteCheckBox">
<property name="text">
<string>Use style's standard palette</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="enabled">
<bool>false</bool>
@ -170,14 +127,14 @@
</property>
</widget>
</item>
<item row="3" column="1">
<item row="2" column="1">
<widget class="QLineEdit" name="fontLineEdit">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="2">
<item row="2" column="2">
<widget class="QToolButton" name="fontSelectButton">
<property name="enabled">
<bool>false</bool>
@ -187,7 +144,7 @@
</property>
</widget>
</item>
<item row="4" column="1">
<item row="3" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>

View file

@ -49,6 +49,9 @@ namespace NLQT
CGraphicsViewport::CGraphicsViewport(QWidget *parent)
: QNLWidget(parent)
{
setAttribute(Qt::WA_OpaquePaintEvent);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_PaintOnScreen);
}
CGraphicsViewport::~CGraphicsViewport()
@ -119,39 +122,6 @@ void CGraphicsViewport::resizeEvent(QResizeEvent *resizeEvent)
Modules::objView().setSizeViewport(resizeEvent->size().width(), resizeEvent->size().height());
}
#if defined(NL_OS_MAC)
// Qt does not provide wheel events through winEvent() and macEvent() (but it
// does through x11Event(), which is inconsistent...)
// Workaround is to handle wheel events like implemented below.
//
// TODO: this is not a clean solution, because all but wheel events are
// handled using winEvent(), x11Event(), macEvent(). But this seems to be a
// limitation of current (4.7.1) Qt versions. (see e.g. qapplication_mac.mm)
void CGraphicsViewport::wheelEvent(QWheelEvent *event)
{
// Get relative positions.
float fX = 1.0f - (float)event->pos().x() / this->width();
float fY = 1.0f - (float)event->pos().y() / this->height();
// Get the buttons currently pressed.
uint32 buttons = NLMISC::noButton;
if(event->buttons() & Qt::LeftButton) buttons |= NLMISC::leftButton;
if(event->buttons() & Qt::RightButton) buttons |= NLMISC::rightButton;
if(event->buttons() & Qt::MidButton) buttons |= NLMISC::middleButton;
if(event->modifiers() & Qt::ControlModifier) buttons |= NLMISC::ctrlButton;
if(event->modifiers() & Qt::ShiftModifier) buttons |= NLMISC::shiftButton;
if(event->modifiers() & Qt::AltModifier) buttons |= NLMISC::altButton;
if(event->delta() > 0)
Modules::objView().getDriver()->EventServer.postEvent(
new NLMISC::CEventMouseWheel(-fX, fY, (NLMISC::TMouseButton)buttons, true, NULL));
else
Modules::objView().getDriver()->EventServer.postEvent(
new NLMISC::CEventMouseWheel(-fX, fY, (NLMISC::TMouseButton)buttons, false, NULL));
}
#endif // defined(NL_OS_MAC)
#if defined(NL_OS_WINDOWS)
typedef bool (*winProc)(NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

View file

@ -80,10 +80,6 @@ private Q_SLOTS:
protected:
virtual void resizeEvent(QResizeEvent *resizeEvent);
#if defined(NL_OS_MAC)
virtual void wheelEvent(QWheelEvent *event);
#endif
#if defined(NL_OS_WINDOWS)
virtual bool winEvent(MSG *message, long *result);
#elif defined(NL_OS_MAC)

View file

@ -66,7 +66,7 @@ CMainWindow::CMainWindow(QWidget *parent)
_isGraphicsInitialized(false),
_isGraphicsEnabled(false),
_isSoundInitialized(false),
_isSoundEnabled(false),
_isSoundEnabled(true),
_GraphicsViewport(NULL),
_lastDir("."),
_mouseMode(NL3D::U3dMouseListener::edit3d)
@ -80,19 +80,6 @@ CMainWindow::CMainWindow(QWidget *parent)
setDockNestingEnabled(true);
QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup(Constants::OBJECT_VIEWER_SECTION);
// setup Qt style and palette from config file
_originalPalette = QApplication::palette();
QApplication::setStyle(QStyleFactory::create(settings->value(Constants::QT_STYLE, "").toString()));
if (settings->value(Constants::QT_PALETTE, true).toBool())
QApplication::setPalette(QApplication::style()->standardPalette());
else
QApplication::setPalette(_originalPalette);
_GraphicsViewport->init();
_isGraphicsInitialized = true;
@ -111,6 +98,9 @@ CMainWindow::CMainWindow(QWidget *parent)
setWindowIcon(QIcon(":/images/nel.png"));
QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup(Constants::OBJECT_VIEWER_SECTION);
restoreState(settings->value("QtWindowState").toByteArray());
restoreGeometry(settings->value("QtWindowGeometry").toByteArray());
@ -484,22 +474,6 @@ bool CMainWindow::loadFile(const QString &fileName, const QString &skelName)
return true;
}
void CMainWindow::cfcbQtStyle(NLMISC::CConfigFile::CVar &var)
{
QApplication::setStyle(QStyleFactory::create(var.asString().c_str()));
}
void CMainWindow::cfcbQtPalette(NLMISC::CConfigFile::CVar &var)
{
if (var.asBool()) QApplication::setPalette(QApplication::style()->standardPalette());
else QApplication::setPalette(_originalPalette);
}
void CMainWindow::cfcbSoundEnabled(NLMISC::CConfigFile::CVar &var)
{
_isSoundEnabled = var.asBool(); // update loop inits
}
void CMainWindow::updateRender()
{
if (isVisible())

View file

@ -71,10 +71,6 @@ public:
{
return _SkeletonTreeModel;
}
QPalette getOriginalPalette() const
{
return _originalPalette;
}
private Q_SLOTS:
void open();
@ -96,10 +92,6 @@ private:
bool loadFile(const QString &fileName, const QString &skelName);
void cfcbQtStyle(NLMISC::CConfigFile::CVar &var);
void cfcbQtPalette(NLMISC::CConfigFile::CVar &var);
void cfcbSoundEnabled(NLMISC::CConfigFile::CVar &var);
bool _isGraphicsInitialized, _isGraphicsEnabled;
bool _isSoundInitialized, _isSoundEnabled;
@ -122,7 +114,6 @@ private:
CCameraControl *_cameraControl;
QPalette _originalPalette;
QString _lastDir;
QTimer *_mainTimer;

View file

@ -605,25 +605,21 @@ void CParticleSystemPage::setMaxSteps(uint32 value)
void CParticleSystemPage::setUserParam1(float value)
{
_Node->getPSPointer()->setUserParam(0, value);
updateModifiedFlag();
}
void CParticleSystemPage::setUserParam2(float value)
{
_Node->getPSPointer()->setUserParam(1, value);
updateModifiedFlag();
}
void CParticleSystemPage::setUserParam3(float value)
{
_Node->getPSPointer()->setUserParam(2, value);
updateModifiedFlag();
}
void CParticleSystemPage::setUserParam4(float value)
{
_Node->getPSPointer()->setUserParam(3, value);
updateModifiedFlag();
}
void CParticleSystemPage::setMaxViewDist(float value)

View file

@ -177,7 +177,7 @@ CParticleTreeModel::~CParticleTreeModel()
int CParticleTreeModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid())
return static_cast<CParticleTreeItem*>(parent.internalPointer())->columnCount();
return static_cast<CParticleTreeItem *>(parent.internalPointer())->columnCount();
else
return _rootItem->columnCount();
}

View file

@ -222,24 +222,27 @@ void CParticleWorkspaceDialog::touchPSState(CParticleTreeItem *item)
void CParticleWorkspaceDialog::clickedItem(const QModelIndex & index)
{
if (_currentItem != NULL)
if (_currentItem != 0)
_treeModel->getOwnerNode(_currentItem)->getPSPointer()->setCurrentEditedElement(NULL);
_currentItem = static_cast<CParticleTreeItem *>(index.internalPointer());
if (_currentItem == 0)
return;
if (index.flags() != Qt::NoItemFlags)
_PropertyDialog->setCurrentEditedElement(_currentItem);
if ((_currentItem->itemType() == ItemType::Workspace) ||
(_currentItem->itemType() == ItemType::ParticleSystemNotLoaded))
_currentItem = NULL;
_currentItem = 0;
}
void CParticleWorkspaceDialog::customContextMenu()
{
if (!Modules::psEdit().getParticleWorkspace()) return;
clickedItem(_ui.treeView->currentIndex());
if (_currentItem == NULL) return;
if (_currentItem == 0) return;
QMenu *popurMenu = new QMenu(this);
switch (_currentItem->itemType())
{

View file

@ -25,7 +25,7 @@
namespace NL3D
{
class CPSAttribMakerBase;
class CPSAttribMakerBase;
}
namespace NLQT
@ -51,7 +51,6 @@ public:
// rename a scheme, given a pointer on it
void rename(NL3D::CPSAttribMakerBase *am, const std::string &newName);
protected:
typedef std::pair<std::string, NL3D::CPSAttribMakerBase *> TSchemeInfo;
typedef std::multimap<std::string, TSchemeInfo> TSchemeMap;
TSchemeMap _SchemeMap;
};

View file

@ -6,14 +6,14 @@
<rect>
<x>0</x>
<y>0</y>
<width>460</width>
<height>64</height>
<width>452</width>
<height>52</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>86</width>
<height>64</height>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="features">
@ -24,6 +24,12 @@
</property>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>3</number>
</property>
<property name="spacing">
<number>3</number>
</property>
<item row="0" column="0">
<widget class="QSlider" name="horizontalSlider">
<property name="maximum">

View file

@ -154,6 +154,9 @@ void CGradientDialog::valueDown()
m_ui.listWidget->setCurrentRow(currentRow);
}
m_ui.listWidget->setCurrentRow(currentRow);
--currentRow;
QListWidgetItem *item = m_ui.listWidget->item(currentRow);
m_clientInterface->displayValue(currentRow, item);
}
void CGradientDialog::valueUp()

View file

@ -62,7 +62,8 @@ namespace NLQT
_CameraFocal(75), _CurrentInstance(""), _BloomEffect(false),
_Scene(0), QWidget(parent)
{
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);
_objectViewerWidget = this;
_isGraphicsEnabled = true;
@ -78,7 +79,7 @@ namespace NLQT
CObjectViewerWidget::~CObjectViewerWidget()
{
release();
}
void CObjectViewerWidget::showEvent ( QShowEvent * event )
@ -261,7 +262,7 @@ namespace NLQT
//updateAnimation(_AnimationDialog->getTime());
updateAnimatePS();
// 10. Update Camera (depends on entities)
// ...
@ -719,6 +720,19 @@ namespace NLQT
return icon;
}
void CObjectViewerWidget::updateAnimatePS(uint64 deltaTime)
{
static sint64 firstTime = NLMISC::CTime::getLocalTime();
static sint64 lastTime = NLMISC::CTime::getLocalTime();
if (deltaTime == 0)
{
deltaTime = NLMISC::CTime::getLocalTime() - lastTime;
}
lastTime += deltaTime;
float fdelta = 0.001f * (float) (lastTime - firstTime);
_Scene->animate ( fdelta);
}
#if defined(NL_OS_WINDOWS)
typedef bool (*winProc)(NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

View file

@ -179,6 +179,10 @@ namespace NLQT
private:
/// Update the animation time for Particle System animation.
/// @param deltaTime - set the manual animation time.
void updateAnimatePS(uint64 deltaTime = 0);
static CObjectViewerWidget *_objectViewerWidget;
NLMISC::CLibraryContext *_LibContext;

View file

@ -113,8 +113,8 @@ bool CCtrlTextButton::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup)
_TextureIdOver[2].setTexture((TxName+"_r.tga").c_str());
}
// Compute Bmp Sizes
nlctassert(NumTexture==3);
// Compute Bmp Sizes (crash with VC++ 2010)
// nlctassert(NumTexture==3);
rVR.getTextureSizeFromId(_TextureIdNormal[0], _BmpLeftW, _BmpH);
rVR.getTextureSizeFromId(_TextureIdNormal[1], _BmpMiddleW, _BmpH);
rVR.getTextureSizeFromId(_TextureIdNormal[2], _BmpRightW, _BmpH);

View file

@ -222,7 +222,7 @@ namespace NLQT
{
COFile file;
std::string s = CPath::lookup(loadedForm.toStdString());
std::string s = CPath::lookup(loadedForm.toStdString(), false);
if (file.open (s))
{
try
@ -323,6 +323,8 @@ namespace NLQT
path,
"Images (*.png *.tga)"
);
if (file.isNull())
return;
QFileInfo info = QFileInfo(file);
// TODO?
@ -333,7 +335,7 @@ namespace NLQT
}
else
{
if (path.contains(".shape"))
if (path.contains(".shape") || path.contains(".ps"))
{
if (Modules::objViewInt())
{

View file

@ -57,6 +57,9 @@
<height>0</height>
</size>
</property>
<attribute name="headerCascadingSectionResizes">
<bool>true</bool>
</attribute>
</widget>
</item>
<item row="1" column="0">

View file

@ -184,11 +184,18 @@ namespace NLQT
if (Modules::objViewInt())
{
QIcon *icon = Modules::objViewInt()->saveOneImage(value.toStdString());
if (icon->isNull())
if (icon)
{
if(icon->isNull())
return QIcon(":/images/pqrticles.png");
else
return QIcon(*icon);
}
else
{
return QIcon();
}
}
}
else if(value.contains(".tga") || value.contains(".png"))
{