Merge branch 'master' of github.com:supertuxkart/stk-code
This commit is contained in:
commit
7f1c460227
@ -47,7 +47,7 @@ install:
|
|||||||
#Get-ChildItem $env:ASSETS_DIR | Measure-Object -property length -sum
|
#Get-ChildItem $env:ASSETS_DIR | Measure-Object -property length -sum
|
||||||
|
|
||||||
before_build:
|
before_build:
|
||||||
- ps: Copy-Item "${env:DEPS_DIR}\windows_64bit\dependencies" c:\projects\stk-code\dependencies –Recurse
|
- ps: Copy-Item "${env:DEPS_DIR}\windows_64bit\dependencies" c:\projects\stk-code\dependencies-64bit –Recurse
|
||||||
- cmd: |
|
- cmd: |
|
||||||
md build
|
md build
|
||||||
cd build
|
cd build
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* Code refactoring of both render pipeline by Benau and Elderme
|
* Code refactoring of both render pipeline by Benau and Elderme
|
||||||
* New kart Wilber and Hexley by Jymis
|
* New kart Wilber and Hexley by Jymis
|
||||||
* New kart Kiki by Benau
|
* New kart Kiki by Benau
|
||||||
* New tracks Cornfield Crossing and Candela City by samuncle
|
* New tracks Candela City, Cornfield Crossing and Las Dunas Arena by samuncle
|
||||||
* Physics improvements and various physics bugfixes by hiker
|
* Physics improvements and various physics bugfixes by hiker
|
||||||
* Kart GFX improvements (exhaust and headlight)
|
* Kart GFX improvements (exhaust and headlight)
|
||||||
* In-game screen recording powered by libopenglrecorder
|
* In-game screen recording powered by libopenglrecorder
|
||||||
|
@ -10,6 +10,13 @@ endif()
|
|||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
|
||||||
include(CMakeDependentOption)
|
include(CMakeDependentOption)
|
||||||
|
|
||||||
|
set(DEPENDENCIES "dependencies")
|
||||||
|
# In case of 64-bit windows, use a different path for dependencies
|
||||||
|
# so that both dependencies can be installed next to each other
|
||||||
|
if ( WIN32 AND (CMAKE_SIZEOF_VOID_P EQUAL 8 ) )
|
||||||
|
set(DEPENDENCIES "dependencies-64bit")
|
||||||
|
endif()
|
||||||
|
|
||||||
include(BuildTypeSTKRelease)
|
include(BuildTypeSTKRelease)
|
||||||
if (NOT CMAKE_BUILD_TYPE)
|
if (NOT CMAKE_BUILD_TYPE)
|
||||||
message(STATUS "No build type selected, default to STKRelease")
|
message(STATUS "No build type selected, default to STKRelease")
|
||||||
@ -62,15 +69,16 @@ set(STK_INSTALL_DATA_DIR "share/supertuxkart" CACHE
|
|||||||
|
|
||||||
# These variables enable MSVC to find libraries located in "dependencies"
|
# These variables enable MSVC to find libraries located in "dependencies"
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(ENV{PATH} "$ENV{PATH};${PROJECT_SOURCE_DIR}/dependencies/include")
|
set(ENV{PATH} "$ENV{PATH};${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/include")
|
||||||
set(ENV{LIB} ${PROJECT_SOURCE_DIR}/dependencies/lib)
|
set(ENV{LIB} ${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib)
|
||||||
set(ENV{OPENALDIR} ${PROJECT_SOURCE_DIR}/dependencies)
|
set(ENV{OPENALDIR} ${PROJECT_SOURCE_DIR}/${DEPENDENCIES})
|
||||||
add_definitions(-D_IRR_STATIC_LIB_)
|
add_definitions(-D_IRR_STATIC_LIB_)
|
||||||
add_definitions(-DNO_IRR_COMPILE_WITH_X11_)
|
add_definitions(-DNO_IRR_COMPILE_WITH_X11_)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(USE_GLES2)
|
if(USE_GLES2)
|
||||||
add_definitions(-DUSE_GLES2)
|
add_definitions(-DUSE_GLES2)
|
||||||
|
add_definitions(-D_IRR_COMPILE_WITH_OGLES2_ -DNO_IRR_COMPILE_WITH_OPENGL_)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(SERVER_ONLY)
|
if(SERVER_ONLY)
|
||||||
@ -78,9 +86,9 @@ if(SERVER_ONLY)
|
|||||||
add_definitions(-DNO_IRR_COMPILE_WITH_X11_)
|
add_definitions(-DNO_IRR_COMPILE_WITH_X11_)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(DISABLE_VPX)
|
#if(DISABLE_VPX)
|
||||||
add_definitions(-DNO_VPX)
|
# add_definitions(-DNO_VPX)
|
||||||
endif()
|
#endif()
|
||||||
|
|
||||||
# Build the Bullet physics library
|
# Build the Bullet physics library
|
||||||
add_subdirectory("${PROJECT_SOURCE_DIR}/lib/bullet")
|
add_subdirectory("${PROJECT_SOURCE_DIR}/lib/bullet")
|
||||||
@ -352,7 +360,7 @@ else()
|
|||||||
elseif(MINGW)
|
elseif(MINGW)
|
||||||
set(PTHREAD_NAMES "winpthread-1" "libwinpthread-1" "pthreadGC2")
|
set(PTHREAD_NAMES "winpthread-1" "libwinpthread-1" "pthreadGC2")
|
||||||
endif()
|
endif()
|
||||||
find_library(PTHREAD_LIBRARY NAMES pthread ${PTHREAD_NAMES} PATHS ${PROJECT_SOURCE_DIR}/dependencies/lib)
|
find_library(PTHREAD_LIBRARY NAMES pthread ${PTHREAD_NAMES} PATHS ${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib)
|
||||||
mark_as_advanced(PTHREAD_LIBRARY)
|
mark_as_advanced(PTHREAD_LIBRARY)
|
||||||
|
|
||||||
# Set data dir (absolute or relative to CMAKE_INSTALL_PREFIX)
|
# Set data dir (absolute or relative to CMAKE_INSTALL_PREFIX)
|
||||||
@ -374,9 +382,9 @@ endif()
|
|||||||
|
|
||||||
# CURL
|
# CURL
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/dependencies/lib/libcurl.lib)
|
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib/libcurl.lib)
|
||||||
elseif(MINGW)
|
elseif(MINGW)
|
||||||
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/dependencies/lib/libcurldll.a)
|
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib/libcurldll.a)
|
||||||
else()
|
else()
|
||||||
find_package(CURL REQUIRED)
|
find_package(CURL REQUIRED)
|
||||||
include_directories(${CURL_INCLUDE_DIRS})
|
include_directories(${CURL_INCLUDE_DIRS})
|
||||||
@ -396,7 +404,7 @@ target_link_libraries(supertuxkart
|
|||||||
${FREETYPE_LIBRARIES}
|
${FREETYPE_LIBRARIES}
|
||||||
${JPEG_LIBRARIES}
|
${JPEG_LIBRARIES}
|
||||||
${TURBOJPEG_LIBRARY}
|
${TURBOJPEG_LIBRARY}
|
||||||
${VPX_LIBRARIES}
|
#${VPX_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
if(NOT SERVER_ONLY)
|
if(NOT SERVER_ONLY)
|
||||||
@ -451,7 +459,7 @@ if(USE_WIIUSE)
|
|||||||
if(WIIUSE_BUILD)
|
if(WIIUSE_BUILD)
|
||||||
target_link_libraries(supertuxkart wiiuse)
|
target_link_libraries(supertuxkart wiiuse)
|
||||||
else()
|
else()
|
||||||
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/dependencies/lib/wiiuse.lib)
|
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib/wiiuse.lib)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
target_link_libraries(supertuxkart wiiuse bluetooth)
|
target_link_libraries(supertuxkart wiiuse bluetooth)
|
||||||
@ -464,7 +472,7 @@ if(MSVC OR MINGW)
|
|||||||
target_link_libraries(supertuxkart iphlpapi.lib)
|
target_link_libraries(supertuxkart iphlpapi.lib)
|
||||||
add_custom_command(TARGET supertuxkart POST_BUILD
|
add_custom_command(TARGET supertuxkart POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||||
"${PROJECT_SOURCE_DIR}/dependencies/dll"
|
"${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/dll"
|
||||||
$<TARGET_FILE_DIR:supertuxkart>)
|
$<TARGET_FILE_DIR:supertuxkart>)
|
||||||
add_custom_target(stkshaders SOURCES ${STK_SHADERS})
|
add_custom_target(stkshaders SOURCES ${STK_SHADERS})
|
||||||
endif()
|
endif()
|
||||||
|
@ -109,7 +109,7 @@ To Build SuperTuxKart on Windows, follow these instructions:
|
|||||||
2. Download the SuperTuxKart source package from either [SuperTuxKart download area - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart/0.9.2) or [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), and unpack it.
|
2. Download the SuperTuxKart source package from either [SuperTuxKart download area - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart/0.9.2) or [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), and unpack it.
|
||||||
*Note: If you downloaded the source package from here: [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), then both `stk-code` and `stk-assets` **must** be in the same directory, otherwise the build can result in failure*
|
*Note: If you downloaded the source package from here: [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), then both `stk-code` and `stk-assets` **must** be in the same directory, otherwise the build can result in failure*
|
||||||
3. Download the Windows dependencies package from either [SuperTuxKart download area: Dependecies - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart%20Dependencies/Windows/)
|
3. Download the Windows dependencies package from either [SuperTuxKart download area: Dependecies - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart%20Dependencies/Windows/)
|
||||||
or [SuperTuxKart on GitHub - Dependencies](https://github.com/supertuxkart/dependencies), and unpack it; then, copy the `dependencies` directory from either the `windows` or the `windows_64bit` directories into the `stk-code` directory
|
or [SuperTuxKart on GitHub - Dependencies](https://github.com/supertuxkart/dependencies), and unpack it; then, copy the `dependencies` directory from either the `windows` or the `windows_64bit` directories into the `stk-code` directory, rename it to `dependencies-64bit` if you want to compile a 64bit build.
|
||||||
4. Download CMake from here: [CMake - download page](https://cmake.org/download/), install it; once CMake is installed, double click on the CMake icon on your desktop, and point it towards your `stk-code` directory in the 'Where is the source code' field, and point it to a directory called `build` or `bld` inside the stk-code directory.
|
4. Download CMake from here: [CMake - download page](https://cmake.org/download/), install it; once CMake is installed, double click on the CMake icon on your desktop, and point it towards your `stk-code` directory in the 'Where is the source code' field, and point it to a directory called `build` or `bld` inside the stk-code directory.
|
||||||
5. Press 'Configure'; CMake will ask you if it is OK to create the aformentioned directory, press `Yes`. CMake will then ask you about your version of Visual Studio.
|
5. Press 'Configure'; CMake will ask you if it is OK to create the aformentioned directory, press `Yes`. CMake will then ask you about your version of Visual Studio.
|
||||||
Confirm your selection; *Please look at the table below to avoid confusion between version numbers and releases of Visual Studio*;
|
Confirm your selection; *Please look at the table below to avoid confusion between version numbers and releases of Visual Studio*;
|
||||||
|
@ -20,10 +20,11 @@
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
export KARTS="all"
|
export KARTS="all"
|
||||||
export TRACKS="battleisland cornfield_crossing featunlocked gplose gpwin \
|
export TRACKS="abyss battleisland cave cornfield_crossing endcutscene \
|
||||||
hacienda introcutscene introcutscene2 lighthouse olivermath \
|
featunlocked fortmagma gplose gpwin hacienda icy_soccer_field \
|
||||||
overworld sandtrack scotland snowmountain snowtuxpeak \
|
introcutscene introcutscene2 lighthouse mines olivermath \
|
||||||
soccer_field tutorial"
|
overworld sandtrack scotland snowmountain snowtuxpeak \
|
||||||
|
soccer_field stadium tutorial zengarden"
|
||||||
|
|
||||||
export ASSETS_PATHS="../data \
|
export ASSETS_PATHS="../data \
|
||||||
../../stk-assets \
|
../../stk-assets \
|
||||||
|
@ -342,6 +342,10 @@ check_error
|
|||||||
# Build apk
|
# Build apk
|
||||||
echo "Building APK"
|
echo "Building APK"
|
||||||
|
|
||||||
|
sed -i "s/minSdkVersion=\".*\"/minSdkVersion=\"$SDK_VERSION\"/g" \
|
||||||
|
"$DIRNAME/AndroidManifest.xml"
|
||||||
|
|
||||||
|
|
||||||
if [ "$BUILD_TOOL" = "gradle" ]; then
|
if [ "$BUILD_TOOL" = "gradle" ]; then
|
||||||
export ANDROID_HOME="$SDK_PATH"
|
export ANDROID_HOME="$SDK_PATH"
|
||||||
gradle -Psdk_version=$SDK_VERSION \
|
gradle -Psdk_version=$SDK_VERSION \
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
# Freetype library list
|
# Freetype library list
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
find_path(FREETYPE_INCLUDE_DIRS NAMES freetype/freetype.h PATHS "${PROJECT_SOURCE_DIR}/dependencies/include")
|
find_path(FREETYPE_INCLUDE_DIRS NAMES freetype/freetype.h PATHS "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/include")
|
||||||
find_library(FREETYPE_LIBRARY NAMES freetype PATHS "${PROJECT_SOURCE_DIR}/dependencies/lib")
|
find_library(FREETYPE_LIBRARY NAMES freetype PATHS "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib")
|
||||||
set(FREETYPE_FOUND 1)
|
set(FREETYPE_FOUND 1)
|
||||||
set(FREETYPE_LIBRARIES ${FREETYPE_LIBRARY})
|
set(FREETYPE_LIBRARIES ${FREETYPE_LIBRARY})
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
|
@ -24,8 +24,8 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT FRIBIDI_FOUND)
|
if(NOT FRIBIDI_FOUND)
|
||||||
find_path(FRIBIDI_INCLUDE_DIR NAMES fribidi/fribidi.h PATHS /Library/Frameworks/fribidi.framework/Headers "${PROJECT_SOURCE_DIR}/dependencies/include")
|
find_path(FRIBIDI_INCLUDE_DIR NAMES fribidi/fribidi.h PATHS /Library/Frameworks/fribidi.framework/Headers "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/include")
|
||||||
find_library(FRIBIDI_LIBRARY NAMES fribidi PATHS /Library/Frameworks/fribidi.framework "${PROJECT_SOURCE_DIR}/dependencies/lib")
|
find_library(FRIBIDI_LIBRARY NAMES fribidi PATHS /Library/Frameworks/fribidi.framework "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib")
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
find_package_handle_standard_args(Fribidi DEFAULT_MSG FRIBIDI_INCLUDE_DIR FRIBIDI_LIBRARY)
|
find_package_handle_standard_args(Fribidi DEFAULT_MSG FRIBIDI_INCLUDE_DIR FRIBIDI_LIBRARY)
|
||||||
|
@ -10,12 +10,12 @@
|
|||||||
# OggVorbis library list
|
# OggVorbis library list
|
||||||
|
|
||||||
|
|
||||||
find_path(OGGVORBIS_OGG_INCLUDE_DIR NAMES ogg/ogg.h PATHS "${PROJECT_SOURCE_DIR}/dependencies/include")
|
find_path(OGGVORBIS_OGG_INCLUDE_DIR NAMES ogg/ogg.h PATHS "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/include")
|
||||||
find_path(OGGVORBIS_VORBIS_INCLUDE_DIR NAMES vorbis/vorbisfile.h PATHS "${PROJECT_SOURCE_DIR}/dependencies/include")
|
find_path(OGGVORBIS_VORBIS_INCLUDE_DIR NAMES vorbis/vorbisfile.h PATHS "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/include")
|
||||||
find_library(OGGVORBIS_OGG_LIBRARY NAMES ogg Ogg libogg PATHS "${PROJECT_SOURCE_DIR}/dependencies/lib")
|
find_library(OGGVORBIS_OGG_LIBRARY NAMES ogg Ogg libogg PATHS "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib")
|
||||||
find_library(OGGVORBIS_VORBIS_LIBRARY NAMES vorbis Vorbis libvorbis PATHS "${PROJECT_SOURCE_DIR}/dependencies/lib")
|
find_library(OGGVORBIS_VORBIS_LIBRARY NAMES vorbis Vorbis libvorbis PATHS "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib")
|
||||||
find_library(OGGVORBIS_VORBISFILE_LIBRARY NAMES vorbisfile libvorbisfile PATHS "${PROJECT_SOURCE_DIR}/dependencies/lib")
|
find_library(OGGVORBIS_VORBISFILE_LIBRARY NAMES vorbisfile libvorbisfile PATHS "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib")
|
||||||
find_library(OGGVORBIS_VORBISENC_LIBRARY NAMES vorbisenc libvorbisenc PATHS "${PROJECT_SOURCE_DIR}/dependencies/lib")
|
find_library(OGGVORBIS_VORBISENC_LIBRARY NAMES vorbisenc libvorbisenc PATHS "${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib")
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
set(OGGVORBIS_OGG_INCLUDE_DIR "/Library/Frameworks/Ogg.framework/Headers/")
|
set(OGGVORBIS_OGG_INCLUDE_DIR "/Library/Frameworks/Ogg.framework/Headers/")
|
||||||
|
30
data/gfx/explosion_low.xml
Normal file
30
data/gfx/explosion_low.xml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<particles emitter="sphere" radius="0.1">
|
||||||
|
|
||||||
|
<spreading angle="180" />
|
||||||
|
|
||||||
|
<velocity x="0.000"
|
||||||
|
y="0.0035"
|
||||||
|
z="0.000" />
|
||||||
|
|
||||||
|
<material file="explode.png" />
|
||||||
|
|
||||||
|
<!-- Amount of particles emitted per second -->
|
||||||
|
<rate min="100"
|
||||||
|
max="150" />
|
||||||
|
|
||||||
|
<!-- Minimal and maximal lifetime of a particle, in milliseconds. -->
|
||||||
|
<lifetime min="700"
|
||||||
|
max="900" />
|
||||||
|
|
||||||
|
<!-- Size of the particles -->
|
||||||
|
<size min="0.8"
|
||||||
|
max="1.0"
|
||||||
|
x-increase-factor="0.6"
|
||||||
|
y-increase-factor="0.6"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<color min="255 255 255"
|
||||||
|
max="255 255 255" />
|
||||||
|
|
||||||
|
</particles>
|
@ -38,4 +38,5 @@
|
|||||||
<card contains="Adreno" os="android" version="<=19" disable="VertexIdWorking"/>
|
<card contains="Adreno" os="android" version="<=19" disable="VertexIdWorking"/>
|
||||||
<card contains="Android Emulator" os="android" disable="ForceLegacyDevice"/>
|
<card contains="Android Emulator" os="android" disable="ForceLegacyDevice"/>
|
||||||
<card os="android" disable="UniformBufferObject"/>
|
<card os="android" disable="UniformBufferObject"/>
|
||||||
|
<card vendor="Broadcom" os="linux" disable="HighDefinitionTextures256"/>
|
||||||
</graphical-restrictions>
|
</graphical-restrictions>
|
||||||
|
@ -36,12 +36,13 @@ void main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
float lifetime = color_lifetime.w;
|
float lifetime = color_lifetime.w;
|
||||||
pc = vec4(color_lifetime.zyx, 1.0);
|
vec4 particle_color = vec4(color_lifetime.zyx, 1.0);
|
||||||
tc = Texcoord;
|
tc = Texcoord;
|
||||||
|
|
||||||
#if !defined(sRGB_Framebuffer_Usable) && !defined(Advanced_Lighting_Enabled)
|
#if !defined(sRGB_Framebuffer_Usable) && !defined(Advanced_Lighting_Enabled)
|
||||||
pc.rgb = pow(pc.rgb, vec3(1.0 / 2.2));
|
particle_color.rgb = pow(particle_color.rgb, vec3(1.0 / 2.2));
|
||||||
#endif
|
#endif
|
||||||
|
pc = particle_color;
|
||||||
|
|
||||||
vec4 viewpos = vec4(0.);
|
vec4 viewpos = vec4(0.);
|
||||||
if (flips == 1)
|
if (flips == 1)
|
||||||
|
@ -64,10 +64,12 @@ layout (std140) uniform LightingData
|
|||||||
float rL22;
|
float rL22;
|
||||||
};
|
};
|
||||||
|
|
||||||
layout (std140) uniform SkinningData
|
#ifdef SSBO_SKINNING
|
||||||
|
layout (std140, binding = 0) readonly buffer SkinningData
|
||||||
{
|
{
|
||||||
mat4 joint_matrices[MAX_BONES];
|
mat4 joint_matrices[MAX_BONES];
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif // HEADER_TXT
|
#endif // HEADER_TXT
|
||||||
|
@ -22,6 +22,7 @@ void main(void)
|
|||||||
#ifdef Use_Bindless_Texture
|
#ifdef Use_Bindless_Texture
|
||||||
vec4 col = texture(handle, uv);
|
vec4 col = texture(handle, uv);
|
||||||
float specmap = texture(secondhandle, uv).g;
|
float specmap = texture(secondhandle, uv).g;
|
||||||
|
float emitmap = texture(secondhandle, uv).b;
|
||||||
float mask = texture(thirdhandle, uv).a;
|
float mask = texture(thirdhandle, uv).a;
|
||||||
#ifdef SRGBBindlessFix
|
#ifdef SRGBBindlessFix
|
||||||
col.xyz = pow(col.xyz, vec3(2.2));
|
col.xyz = pow(col.xyz, vec3(2.2));
|
||||||
|
@ -49,6 +49,8 @@ flat out sampler2D fourthhandle;
|
|||||||
|
|
||||||
#stk_include "utils/getworldmatrix.vert"
|
#stk_include "utils/getworldmatrix.vert"
|
||||||
|
|
||||||
|
uniform samplerBuffer skinning_tex;
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
mat4 ModelMatrix = getWorldMatrix(Origin, Orientation, Scale);
|
mat4 ModelMatrix = getWorldMatrix(Origin, Orientation, Scale);
|
||||||
@ -61,18 +63,35 @@ void main(void)
|
|||||||
vec4 skinned_normal = vec4(0.);
|
vec4 skinned_normal = vec4(0.);
|
||||||
vec4 skinned_tangent = vec4(0.);
|
vec4 skinned_tangent = vec4(0.);
|
||||||
vec4 skinned_bitangent = vec4(0.);
|
vec4 skinned_bitangent = vec4(0.);
|
||||||
// Note : For normal we assume no scale factor in bone (otherwise we'll have to compute inversematrix for each bones...)
|
if (Weight[0] < 0.01)
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
{
|
||||||
vec4 single_bone_influenced_position = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_position;
|
skinned_position = idle_position;
|
||||||
single_bone_influenced_position /= single_bone_influenced_position.w;
|
skinned_normal = idle_normal;
|
||||||
vec4 single_bone_influenced_normal = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_normal;
|
skinned_tangent = idle_tangent;
|
||||||
vec4 single_bone_influenced_tangent = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_tangent;
|
skinned_bitangent = idle_bitangent;
|
||||||
vec4 single_bone_influenced_bitangent = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_bitangent;
|
}
|
||||||
skinned_position += Weight[i] * single_bone_influenced_position;
|
else
|
||||||
skinned_normal += Weight[i] * single_bone_influenced_normal;
|
{
|
||||||
skinned_tangent += Weight[i] * single_bone_influenced_tangent;
|
for (int i = 0; i < 4; i++)
|
||||||
skinned_bitangent += Weight[i] * single_bone_influenced_bitangent;
|
{
|
||||||
|
if (Weight[i] < 0.01)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef SSBO_SKINNING
|
||||||
|
mat4 joint_matrix = joint_matrices[Joint[i] + skinning_offset];
|
||||||
|
#else
|
||||||
|
mat4 joint_matrix = mat4(
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 1),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 2),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 3));
|
||||||
|
#endif
|
||||||
|
skinned_position += Weight[i] * joint_matrix * idle_position;
|
||||||
|
skinned_normal += Weight[i] * joint_matrix * idle_normal;
|
||||||
|
skinned_tangent += Weight[i] * joint_matrix * idle_tangent;
|
||||||
|
skinned_bitangent += Weight[i] * joint_matrix * idle_bitangent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_Position = ProjectionViewMatrix * ModelMatrix * skinned_position;
|
gl_Position = ProjectionViewMatrix * ModelMatrix * skinned_position;
|
||||||
|
@ -38,16 +38,36 @@ flat out uvec2 hdle;
|
|||||||
|
|
||||||
#stk_include "utils/getworldmatrix.vert"
|
#stk_include "utils/getworldmatrix.vert"
|
||||||
|
|
||||||
|
uniform samplerBuffer skinning_tex;
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
mat4 ModelMatrix = getWorldMatrix(Origin, Orientation, Scale);
|
mat4 ModelMatrix = getWorldMatrix(Origin, Orientation, Scale);
|
||||||
vec4 idle_position = vec4(Position, 1.);
|
vec4 idle_position = vec4(Position, 1.);
|
||||||
vec4 skinned_position = vec4(0.);
|
vec4 skinned_position = vec4(0.);
|
||||||
for (int i = 0; i < 4; i++)
|
if (Weight[0] < 0.01)
|
||||||
{
|
{
|
||||||
vec4 single_bone_influenced_position = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_position;
|
skinned_position = idle_position;
|
||||||
single_bone_influenced_position /= single_bone_influenced_position.w;
|
}
|
||||||
skinned_position += Weight[i] * single_bone_influenced_position;
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (Weight[i] < 0.01)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef SSBO_SKINNING
|
||||||
|
mat4 joint_matrix = joint_matrices[Joint[i] + skinning_offset];
|
||||||
|
#else
|
||||||
|
mat4 joint_matrix = mat4(
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 1),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 2),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 3));
|
||||||
|
#endif
|
||||||
|
skinned_position += Weight[i] * joint_matrix * idle_position;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VSLayer
|
#ifdef VSLayer
|
||||||
|
@ -41,12 +41,13 @@ void main(void)
|
|||||||
float lifetime = color_lifetime.w;
|
float lifetime = color_lifetime.w;
|
||||||
float alpha = mix(smoothstep(1.0, 0.8, lifetime), lifetime, billboard);
|
float alpha = mix(smoothstep(1.0, 0.8, lifetime), lifetime, billboard);
|
||||||
billboard_mix = billboard;
|
billboard_mix = billboard;
|
||||||
pc = vec4(color_lifetime.zyx, 1.0) * alpha;
|
vec4 particle_color = vec4(color_lifetime.zyx, 1.0) * alpha;
|
||||||
tc = Texcoord;
|
tc = Texcoord;
|
||||||
|
|
||||||
#if !defined(sRGB_Framebuffer_Usable) && !defined(Advanced_Lighting_Enabled)
|
#if !defined(sRGB_Framebuffer_Usable) && !defined(Advanced_Lighting_Enabled)
|
||||||
pc.rgb = pow(pc.rgb, vec3(1.0 / 2.2));
|
particle_color.rgb = pow(particle_color.rgb, vec3(1.0 / 2.2));
|
||||||
#endif
|
#endif
|
||||||
|
pc = particle_color;
|
||||||
|
|
||||||
vec4 viewpos = vec4(0.);
|
vec4 viewpos = vec4(0.);
|
||||||
if (flips == 1)
|
if (flips == 1)
|
||||||
|
@ -17,6 +17,11 @@ uniform mat4 InverseModelMatrix =
|
|||||||
uniform vec2 texture_trans = vec2(0., 0.);
|
uniform vec2 texture_trans = vec2(0., 0.);
|
||||||
#endif
|
#endif
|
||||||
uniform int skinning_offset;
|
uniform int skinning_offset;
|
||||||
|
#ifdef GL_ES
|
||||||
|
uniform sampler2D skinning_tex;
|
||||||
|
#else
|
||||||
|
uniform samplerBuffer skinning_tex;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef Explicit_Attrib_Location_Usable
|
#ifdef Explicit_Attrib_Location_Usable
|
||||||
layout(location = 0) in vec3 Position;
|
layout(location = 0) in vec3 Position;
|
||||||
@ -55,18 +60,41 @@ void main(void)
|
|||||||
vec4 skinned_normal = vec4(0.);
|
vec4 skinned_normal = vec4(0.);
|
||||||
vec4 skinned_tangent = vec4(0.);
|
vec4 skinned_tangent = vec4(0.);
|
||||||
vec4 skinned_bitangent = vec4(0.);
|
vec4 skinned_bitangent = vec4(0.);
|
||||||
// Note : For normal we assume no scale factor in bone (otherwise we'll have to compute inversematrix for each bones...)
|
if (Weight[0] < 0.01)
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
{
|
||||||
vec4 single_bone_influenced_position = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_position;
|
skinned_position = idle_position;
|
||||||
single_bone_influenced_position /= single_bone_influenced_position.w;
|
skinned_normal = idle_normal;
|
||||||
vec4 single_bone_influenced_normal = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_normal;
|
skinned_tangent = idle_tangent;
|
||||||
vec4 single_bone_influenced_tangent = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_tangent;
|
skinned_bitangent = idle_bitangent;
|
||||||
vec4 single_bone_influenced_bitangent = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_bitangent;
|
}
|
||||||
skinned_position += Weight[i] * single_bone_influenced_position;
|
else
|
||||||
skinned_normal += Weight[i] * single_bone_influenced_normal;
|
{
|
||||||
skinned_tangent += Weight[i] * single_bone_influenced_tangent;
|
for (int i = 0; i < 4; i++)
|
||||||
skinned_bitangent += Weight[i] * single_bone_influenced_bitangent;
|
{
|
||||||
|
if (Weight[i] < 0.01)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef SSBO_SKINNING
|
||||||
|
mat4 joint_matrix = joint_matrices[Joint[i] + skinning_offset];
|
||||||
|
#elif defined(GL_ES)
|
||||||
|
mat4 joint_matrix = mat4(
|
||||||
|
texelFetch(skinning_tex, ivec2(0, skinning_offset + Joint[i]), 0),
|
||||||
|
texelFetch(skinning_tex, ivec2(1, skinning_offset + Joint[i]), 0),
|
||||||
|
texelFetch(skinning_tex, ivec2(2, skinning_offset + Joint[i]), 0),
|
||||||
|
texelFetch(skinning_tex, ivec2(3, skinning_offset + Joint[i]), 0));
|
||||||
|
#else
|
||||||
|
mat4 joint_matrix = mat4(
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 1),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 2),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 3));
|
||||||
|
#endif
|
||||||
|
skinned_position += Weight[i] * joint_matrix * idle_position;
|
||||||
|
skinned_normal += Weight[i] * joint_matrix * idle_normal;
|
||||||
|
skinned_tangent += Weight[i] * joint_matrix * idle_tangent;
|
||||||
|
skinned_bitangent += Weight[i] * joint_matrix * idle_bitangent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_Position = ProjectionViewMatrix * ModelMatrix * skinned_position;
|
gl_Position = ProjectionViewMatrix * ModelMatrix * skinned_position;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
uniform mat4 ModelMatrix;
|
uniform mat4 ModelMatrix;
|
||||||
uniform int skinning_offset;
|
uniform int skinning_offset;
|
||||||
uniform int layer;
|
uniform int layer;
|
||||||
|
uniform samplerBuffer skinning_tex;
|
||||||
|
|
||||||
#ifdef Explicit_Attrib_Location_Usable
|
#ifdef Explicit_Attrib_Location_Usable
|
||||||
layout(location = 0) in vec3 Position;
|
layout(location = 0) in vec3 Position;
|
||||||
@ -25,11 +26,35 @@ void main(void)
|
|||||||
{
|
{
|
||||||
vec4 idle_position = vec4(Position, 1.);
|
vec4 idle_position = vec4(Position, 1.);
|
||||||
vec4 skinned_position = vec4(0.);
|
vec4 skinned_position = vec4(0.);
|
||||||
for (int i = 0; i < 4; i++)
|
if (Weight[0] < 0.01)
|
||||||
{
|
{
|
||||||
vec4 single_bone_influenced_position = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_position;
|
skinned_position = idle_position;
|
||||||
single_bone_influenced_position /= single_bone_influenced_position.w;
|
}
|
||||||
skinned_position += Weight[i] * single_bone_influenced_position;
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (Weight[i] < 0.01)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef SSBO_SKINNING
|
||||||
|
mat4 joint_matrix = joint_matrices[Joint[i] + skinning_offset];
|
||||||
|
#elif defined(GL_ES)
|
||||||
|
mat4 joint_matrix = mat4(
|
||||||
|
texelFetch(skinning_tex, ivec2(0, skinning_offset + Joint[i]), 0),
|
||||||
|
texelFetch(skinning_tex, ivec2(1, skinning_offset + Joint[i]), 0),
|
||||||
|
texelFetch(skinning_tex, ivec2(2, skinning_offset + Joint[i]), 0),
|
||||||
|
texelFetch(skinning_tex, ivec2(3, skinning_offset + Joint[i]), 0));
|
||||||
|
#else
|
||||||
|
mat4 joint_matrix = mat4(
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 1),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 2),
|
||||||
|
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 3));
|
||||||
|
#endif
|
||||||
|
skinned_position += Weight[i] * joint_matrix * idle_position;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VSLayer
|
#ifdef VSLayer
|
||||||
|
@ -461,4 +461,10 @@
|
|||||||
<fonts-list normal-ttf="Cantarell-Regular.otf FreeSans.ttf wqy-microhei.ttf NotoNaskhArabicUI-Bold.ttf"
|
<fonts-list normal-ttf="Cantarell-Regular.otf FreeSans.ttf wqy-microhei.ttf NotoNaskhArabicUI-Bold.ttf"
|
||||||
digit-ttf="SigmarOne.otf" />
|
digit-ttf="SigmarOne.otf" />
|
||||||
|
|
||||||
|
<!-- Maximum bones from all animated meshes in each frame to be uploaded for
|
||||||
|
hardware skinning, For gles 3.0 the specification guarantees at least 2048, for
|
||||||
|
TBO in desktop at least 65536 (max buffer size) / 64, SSBO at least 2^24 / 64,
|
||||||
|
so 1024 will work everywhere. -->
|
||||||
|
<skinning max-bones="1024"/>
|
||||||
|
|
||||||
</config>
|
</config>
|
||||||
|
@ -213,7 +213,7 @@ protected:
|
|||||||
|
|
||||||
int *intPtr=0;
|
int *intPtr=0;
|
||||||
short *shtPtr=0;
|
short *shtPtr=0;
|
||||||
#ifdef __MINGW64__
|
#if defined(__MINGW64__) || defined(_WIN64)
|
||||||
char *cp = 0;int dataLen =0;intptr_t nr=0;
|
char *cp = 0;int dataLen =0;intptr_t nr=0;
|
||||||
#else
|
#else
|
||||||
char *cp = 0;int dataLen =0;long nr=0;
|
char *cp = 0;int dataLen =0;long nr=0;
|
||||||
@ -251,7 +251,7 @@ protected:
|
|||||||
cp++;
|
cp++;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
#ifdef __MINGW64__
|
#if defined(__MINGW64__) || defined(_WIN64)
|
||||||
nr= (intptr_t)cp;
|
nr= (intptr_t)cp;
|
||||||
#else
|
#else
|
||||||
nr= (long)cp;
|
nr= (long)cp;
|
||||||
@ -290,7 +290,7 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
#ifdef __MINGW64__
|
#if defined(__MINGW64__) || defined(_WIN64)
|
||||||
nr= (intptr_t)cp;
|
nr= (intptr_t)cp;
|
||||||
#else
|
#else
|
||||||
nr= (long)cp;
|
nr= (long)cp;
|
||||||
|
@ -255,14 +255,8 @@ struct S3DVertexTangents : public S3DVertex
|
|||||||
|
|
||||||
struct S3DVertexSkinnedMesh : public S3DVertexTangents
|
struct S3DVertexSkinnedMesh : public S3DVertexTangents
|
||||||
{
|
{
|
||||||
s32 m_joint_idx1;
|
s16 m_joint_idx[4];
|
||||||
s32 m_joint_idx2;
|
s16 m_weight[4];
|
||||||
s32 m_joint_idx3;
|
|
||||||
s32 m_joint_idx4;
|
|
||||||
f32 m_weight1;
|
|
||||||
f32 m_weight2;
|
|
||||||
f32 m_weight3;
|
|
||||||
f32 m_weight4;
|
|
||||||
|
|
||||||
E_VERTEX_TYPE getType() const
|
E_VERTEX_TYPE getType() const
|
||||||
{
|
{
|
||||||
|
@ -243,14 +243,14 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
Vertex.TCoords=Vertices_Standard[n].TCoords;
|
Vertex.TCoords=Vertices_Standard[n].TCoords;
|
||||||
Vertex.Tangent=core::vector3df(0.0f, 0.0f, 0.0f);
|
Vertex.Tangent=core::vector3df(0.0f, 0.0f, 0.0f);
|
||||||
Vertex.Binormal=core::vector3df(0.0f, 0.0f, 0.0f);
|
Vertex.Binormal=core::vector3df(0.0f, 0.0f, 0.0f);
|
||||||
Vertex.m_joint_idx1 = 0;
|
Vertex.m_joint_idx[0] = 0;
|
||||||
Vertex.m_joint_idx2 = 0;
|
Vertex.m_joint_idx[1] = 0;
|
||||||
Vertex.m_joint_idx3 = 0;
|
Vertex.m_joint_idx[2] = 0;
|
||||||
Vertex.m_joint_idx4 = 0;
|
Vertex.m_joint_idx[3] = 0;
|
||||||
Vertex.m_weight1 = 0;
|
Vertex.m_weight[0] = 0;
|
||||||
Vertex.m_weight2 = 0;
|
Vertex.m_weight[1] = 0;
|
||||||
Vertex.m_weight3 = 0;
|
Vertex.m_weight[2] = 0;
|
||||||
Vertex.m_weight4 = 0;
|
Vertex.m_weight[3] = 0;
|
||||||
Vertices_SkinnedMesh.push_back(Vertex);
|
Vertices_SkinnedMesh.push_back(Vertex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -265,14 +265,14 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
Vertex.TCoords=Vertices_Tangents[n].TCoords;
|
Vertex.TCoords=Vertices_Tangents[n].TCoords;
|
||||||
Vertex.Tangent=Vertices_Tangents[n].Tangent;
|
Vertex.Tangent=Vertices_Tangents[n].Tangent;
|
||||||
Vertex.Binormal=Vertices_Tangents[n].Binormal;
|
Vertex.Binormal=Vertices_Tangents[n].Binormal;
|
||||||
Vertex.m_joint_idx1 = 0;
|
Vertex.m_joint_idx[0] = 0;
|
||||||
Vertex.m_joint_idx2 = 0;
|
Vertex.m_joint_idx[1] = 0;
|
||||||
Vertex.m_joint_idx3 = 0;
|
Vertex.m_joint_idx[2] = 0;
|
||||||
Vertex.m_joint_idx4 = 0;
|
Vertex.m_joint_idx[3] = 0;
|
||||||
Vertex.m_weight1 = 0;
|
Vertex.m_weight[0] = 0;
|
||||||
Vertex.m_weight2 = 0;
|
Vertex.m_weight[1] = 0;
|
||||||
Vertex.m_weight3 = 0;
|
Vertex.m_weight[2] = 0;
|
||||||
Vertex.m_weight4 = 0;
|
Vertex.m_weight[3] = 0;
|
||||||
Vertices_SkinnedMesh.push_back(Vertex);
|
Vertices_SkinnedMesh.push_back(Vertex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,12 +101,12 @@ void CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
|
|||||||
if (FramesPerSecond > 0.f) //forwards...
|
if (FramesPerSecond > 0.f) //forwards...
|
||||||
{
|
{
|
||||||
if (CurrentFrameNr > EndFrame)
|
if (CurrentFrameNr > EndFrame)
|
||||||
CurrentFrameNr = StartFrame + fmod(CurrentFrameNr - StartFrame, (f32)(EndFrame-StartFrame));
|
CurrentFrameNr = StartFrame + fmodf(CurrentFrameNr - StartFrame, (f32)(EndFrame-StartFrame));
|
||||||
}
|
}
|
||||||
else //backwards...
|
else //backwards...
|
||||||
{
|
{
|
||||||
if (CurrentFrameNr < StartFrame)
|
if (CurrentFrameNr < StartFrame)
|
||||||
CurrentFrameNr = EndFrame - fmod(EndFrame - CurrentFrameNr, (f32)(EndFrame-StartFrame));
|
CurrentFrameNr = EndFrame - fmodf(EndFrame - CurrentFrameNr, (f32)(EndFrame-StartFrame));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -11,6 +11,55 @@
|
|||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "irrMap.h"
|
#include "irrMap.h"
|
||||||
|
|
||||||
|
inline irr::s16 float_16(irr::f32 in)
|
||||||
|
{
|
||||||
|
irr::s32 i;
|
||||||
|
memcpy(&i, &in, 4);
|
||||||
|
irr::s32 s = (i >> 16) & 0x00008000;
|
||||||
|
irr::s32 e = ((i >> 23) & 0x000000ff) - (127 - 15);
|
||||||
|
irr::s32 m = i & 0x007fffff;
|
||||||
|
if (e <= 0)
|
||||||
|
{
|
||||||
|
if (e < -10)
|
||||||
|
{
|
||||||
|
return irr::s16(s);
|
||||||
|
}
|
||||||
|
m = (m | 0x00800000) >> (1 - e);
|
||||||
|
if (m & 0x00001000)
|
||||||
|
m += 0x00002000;
|
||||||
|
return irr::s16(s | (m >> 13));
|
||||||
|
}
|
||||||
|
else if (e == 0xff - (127 - 15))
|
||||||
|
{
|
||||||
|
if (m == 0)
|
||||||
|
{
|
||||||
|
return irr::s16(s | 0x7c00);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m >>= 13;
|
||||||
|
return irr::s16(s | 0x7c00 | m | (m == 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m & 0x00001000)
|
||||||
|
{
|
||||||
|
m += 0x00002000;
|
||||||
|
if (m & 0x00800000)
|
||||||
|
{
|
||||||
|
m = 0; // overflow in significand,
|
||||||
|
e += 1; // adjust exponent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (e > 30)
|
||||||
|
{
|
||||||
|
return irr::s16(s | 0x7c00);
|
||||||
|
}
|
||||||
|
return irr::s16(s | (e << 10) | (m >> 13));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
namespace scene
|
namespace scene
|
||||||
@ -1450,28 +1499,34 @@ void CSkinnedMesh::convertForSkinning()
|
|||||||
core::array<JointInfluence> this_influence;
|
core::array<JointInfluence> this_influence;
|
||||||
core::array<JointInfluence> reported_weight = wi[b][i];
|
core::array<JointInfluence> reported_weight = wi[b][i];
|
||||||
reported_weight.sort(sortJointInfluenceFunc);
|
reported_weight.sort(sortJointInfluenceFunc);
|
||||||
float remaining_weight = 1.0f;
|
|
||||||
for (u32 j = 0; j < 4; j++)
|
for (u32 j = 0; j < 4; j++)
|
||||||
{
|
{
|
||||||
JointInfluence influence;
|
JointInfluence influence;
|
||||||
if (reported_weight.size() > j)
|
influence.joint_idx = -100000;
|
||||||
influence = reported_weight[j];
|
influence.weight = 0.0f;
|
||||||
else
|
|
||||||
{
|
|
||||||
influence.joint_idx = -100000;
|
|
||||||
influence.weight = remaining_weight;
|
|
||||||
}
|
|
||||||
remaining_weight -= influence.weight;
|
|
||||||
this_influence.push_back(influence);
|
this_influence.push_back(influence);
|
||||||
}
|
}
|
||||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_joint_idx1 = this_influence[0].joint_idx;
|
float total_weight = 0.0f;
|
||||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_joint_idx2 = this_influence[1].joint_idx;
|
for (u32 j = 0; j < reported_weight.size(); j++)
|
||||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_joint_idx3 = this_influence[2].joint_idx;
|
{
|
||||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_joint_idx4 = this_influence[3].joint_idx;
|
total_weight += reported_weight[j].weight;
|
||||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight1 = this_influence[0].weight;
|
this_influence[j].joint_idx = reported_weight[j].joint_idx;
|
||||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight2 = this_influence[1].weight;
|
this_influence[j].weight = reported_weight[j].weight;
|
||||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight3 = this_influence[2].weight;
|
}
|
||||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight4 = this_influence[3].weight;
|
if (!reported_weight.empty())
|
||||||
|
{
|
||||||
|
for (u32 j = 0; j < reported_weight.size(); j++)
|
||||||
|
{
|
||||||
|
this_influence[j].weight =
|
||||||
|
this_influence[j].weight / total_weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_joint_idx[j] = (s16)this_influence[j].joint_idx;
|
||||||
|
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight[j] = float_16
|
||||||
|
(this_influence[j].weight);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1488,7 +1543,7 @@ void CSkinnedMesh::computeWeightInfluence(SJoint *joint, size_t &index, WeightIn
|
|||||||
{
|
{
|
||||||
SWeight& weight = joint->Weights[i];
|
SWeight& weight = joint->Weights[i];
|
||||||
JointInfluence tmp;
|
JointInfluence tmp;
|
||||||
tmp.joint_idx = index;
|
tmp.joint_idx = (int)index;
|
||||||
tmp.weight = weight.strength;
|
tmp.weight = weight.strength;
|
||||||
wi[weight.buffer_id][weight.vertex_id].push_back(tmp);
|
wi[weight.buffer_id][weight.vertex_id].push_back(tmp);
|
||||||
}
|
}
|
||||||
|
@ -529,7 +529,7 @@ void SFXManager::loadSfx()
|
|||||||
delete root;
|
delete root;
|
||||||
|
|
||||||
// Now load them in parallel
|
// Now load them in parallel
|
||||||
const int max = m_all_sfx_types.size();
|
const int max = (int)m_all_sfx_types.size();
|
||||||
SFXBuffer **array = new SFXBuffer *[max];
|
SFXBuffer **array = new SFXBuffer *[max];
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
|
@ -172,7 +172,7 @@ void SavedGrandPrix::loadKarts(std::vector<RaceManager::KartStatus> & kart_list)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Get correct player
|
// Get correct player
|
||||||
for(unsigned int x = kart_list.size()-m_player_karts;
|
for(unsigned int x = (unsigned int)kart_list.size()-m_player_karts;
|
||||||
x < kart_list.size(); x++)
|
x < kart_list.size(); x++)
|
||||||
{
|
{
|
||||||
if(kart_list[x].m_local_player_id == m_karts[i].m_local_player_id)
|
if(kart_list[x].m_local_player_id == m_karts[i].m_local_player_id)
|
||||||
|
@ -181,6 +181,7 @@ void STKConfig::init_defaults()
|
|||||||
m_disable_steer_while_unskid = false;
|
m_disable_steer_while_unskid = false;
|
||||||
m_camera_follow_skid = false;
|
m_camera_follow_skid = false;
|
||||||
m_cutscene_fov = 0.61f;
|
m_cutscene_fov = 0.61f;
|
||||||
|
m_max_skinning_bones = 1024;
|
||||||
|
|
||||||
m_score_increase.clear();
|
m_score_increase.clear();
|
||||||
m_leader_intervals.clear();
|
m_leader_intervals.clear();
|
||||||
@ -364,6 +365,11 @@ void STKConfig::getAllData(const XMLNode * root)
|
|||||||
fonts_list->get("digit-ttf", &m_digit_ttf );
|
fonts_list->get("digit-ttf", &m_digit_ttf );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (const XMLNode *skinning = root->getNode("skinning"))
|
||||||
|
{
|
||||||
|
skinning->get("max-bones", &m_max_skinning_bones);
|
||||||
|
}
|
||||||
|
|
||||||
// Get the default KartProperties
|
// Get the default KartProperties
|
||||||
// ------------------------------
|
// ------------------------------
|
||||||
const XMLNode *node = root -> getNode("general-kart-defaults");
|
const XMLNode *node = root -> getNode("general-kart-defaults");
|
||||||
|
@ -152,6 +152,8 @@ public:
|
|||||||
|
|
||||||
float m_cutscene_fov;
|
float m_cutscene_fov;
|
||||||
|
|
||||||
|
unsigned m_max_skinning_bones;
|
||||||
|
|
||||||
/** Lists of TTF files used in STK. */
|
/** Lists of TTF files used in STK. */
|
||||||
std::vector<std::string> m_normal_ttf;
|
std::vector<std::string> m_normal_ttf;
|
||||||
std::vector<std::string> m_digit_ttf;
|
std::vector<std::string> m_digit_ttf;
|
||||||
|
@ -122,7 +122,7 @@ void GroupUserConfigParam::writeInner(std::ofstream& stream, int level) const
|
|||||||
{
|
{
|
||||||
std::string tab(level * 4,' ');
|
std::string tab(level * 4,' ');
|
||||||
for(int i = 0; i < level; i++) tab =+ " ";
|
for(int i = 0; i < level; i++) tab =+ " ";
|
||||||
const int children_amount = m_attributes.size();
|
const int children_amount = (int)m_attributes.size();
|
||||||
|
|
||||||
stream << " " << tab.c_str() << "<" << m_param_name.c_str() << "\n";
|
stream << " " << tab.c_str() << "<" << m_param_name.c_str() << "\n";
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ void GroupUserConfigParam::findYourDataInAChildOf(const XMLNode* node)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int attributes_amount = m_attributes.size();
|
const int attributes_amount = (int)m_attributes.size();
|
||||||
for (int n=0; n<attributes_amount; n++)
|
for (int n=0; n<attributes_amount; n++)
|
||||||
{
|
{
|
||||||
m_attributes[n]->findYourDataInAnAttributeOf(child);
|
m_attributes[n]->findYourDataInAnAttributeOf(child);
|
||||||
@ -246,7 +246,7 @@ ListUserConfigParam<T, U>::ListUserConfigParam(const char* param_name,
|
|||||||
template<typename T, typename U>
|
template<typename T, typename U>
|
||||||
void ListUserConfigParam<T, U>::write(std::ofstream& stream) const
|
void ListUserConfigParam<T, U>::write(std::ofstream& stream) const
|
||||||
{
|
{
|
||||||
const int elts_amount = m_elements.size();
|
const int elts_amount = (int)m_elements.size();
|
||||||
|
|
||||||
// comment
|
// comment
|
||||||
if(m_comment.size() > 0) stream << " <!-- " << m_comment.c_str();
|
if(m_comment.size() > 0) stream << " <!-- " << m_comment.c_str();
|
||||||
@ -728,7 +728,7 @@ bool UserConfig::loadConfig()
|
|||||||
UserConfigParams::m_saved_grand_prix_list.clearAndDeleteAll();
|
UserConfigParams::m_saved_grand_prix_list.clearAndDeleteAll();
|
||||||
std::vector<XMLNode*> saved_gps;
|
std::vector<XMLNode*> saved_gps;
|
||||||
root->getNodes("SavedGP", saved_gps);
|
root->getNodes("SavedGP", saved_gps);
|
||||||
const int gp_amount = saved_gps.size();
|
const int gp_amount = (int)saved_gps.size();
|
||||||
for (int i=0; i<gp_amount; i++)
|
for (int i=0; i<gp_amount; i++)
|
||||||
{
|
{
|
||||||
UserConfigParams::m_saved_grand_prix_list.push_back(
|
UserConfigParams::m_saved_grand_prix_list.push_back(
|
||||||
|
@ -51,7 +51,7 @@ public:
|
|||||||
FT_Face getFace(unsigned int i) const;
|
FT_Face getFace(unsigned int i) const;
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
/** Return the total TTF files loaded. */
|
/** Return the total TTF files loaded. */
|
||||||
unsigned int getTotalFaces() const { return m_faces.size(); }
|
unsigned int getTotalFaces() const { return (unsigned int)m_faces.size(); }
|
||||||
|
|
||||||
}; // FaceTTF
|
}; // FaceTTF
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
#include "guiengine/skin.hpp"
|
#include "guiengine/skin.hpp"
|
||||||
#include "utils/string_utils.hpp"
|
#include "utils/string_utils.hpp"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
/** Constructor. It will initialize the \ref m_spritebank and TTF files to use.
|
/** Constructor. It will initialize the \ref m_spritebank and TTF files to use.
|
||||||
* \param name The name of face, used by irrlicht to distinguish spritebank.
|
* \param name The name of face, used by irrlicht to distinguish spritebank.
|
||||||
@ -677,15 +679,24 @@ void FontWithFace::render(const core::stringw& text,
|
|||||||
top.setAlpha(color.getAlpha());
|
top.setAlpha(color.getAlpha());
|
||||||
bottom.setAlpha(color.getAlpha());
|
bottom.setAlpha(color.getAlpha());
|
||||||
|
|
||||||
video::SColor title_colors[] = {top, bottom, top, bottom};
|
std::array<video::SColor, 4> title_colors;
|
||||||
if (char_collector != NULL)
|
if (CVS->isGLSL())
|
||||||
{
|
{
|
||||||
char_collector->collectChar(texture, dest, source,
|
title_colors = { { top, bottom, top, bottom } };
|
||||||
title_colors);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
draw2DImage(texture, dest, source, clip, title_colors, true);
|
title_colors = { { bottom, top, top, bottom } };
|
||||||
|
}
|
||||||
|
if (char_collector != NULL)
|
||||||
|
{
|
||||||
|
char_collector->collectChar(texture, dest, source,
|
||||||
|
title_colors.data());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
draw2DImage(texture, dest, source, clip, title_colors.data(),
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -55,7 +55,8 @@ Camera::CameraType Camera::m_default_type = Camera::CM_TYPE_NORMAL;
|
|||||||
*/
|
*/
|
||||||
Camera* Camera::createCamera(AbstractKart* kart)
|
Camera* Camera::createCamera(AbstractKart* kart)
|
||||||
{
|
{
|
||||||
Camera *camera = createCamera(m_all_cameras.size(), m_default_type, kart);
|
Camera *camera = createCamera((int)m_all_cameras.size(),
|
||||||
|
m_default_type, kart );
|
||||||
m_all_cameras.push_back(camera);
|
m_all_cameras.push_back(camera);
|
||||||
return camera;
|
return camera;
|
||||||
} // createCamera(kart)
|
} // createCamera(kart)
|
||||||
|
@ -93,7 +93,8 @@ void CentralVideoSettings::init()
|
|||||||
{
|
{
|
||||||
std::string driver((char*)(glGetString(GL_VERSION)));
|
std::string driver((char*)(glGetString(GL_VERSION)));
|
||||||
std::string card((char*)(glGetString(GL_RENDERER)));
|
std::string card((char*)(glGetString(GL_RENDERER)));
|
||||||
GraphicsRestrictions::init(driver, card);
|
std::string vendor((char*)(glGetString(GL_VENDOR)));
|
||||||
|
GraphicsRestrictions::init(driver, card, vendor);
|
||||||
|
|
||||||
if (GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_FORCE_LEGACY_DEVICE))
|
if (GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_FORCE_LEGACY_DEVICE))
|
||||||
{
|
{
|
||||||
@ -210,13 +211,6 @@ void CentralVideoSettings::init()
|
|||||||
hasSRGBFramebuffer = true;
|
hasSRGBFramebuffer = true;
|
||||||
Log::info("GLDriver", "ARB framebuffer sRGB Present");
|
Log::info("GLDriver", "ARB framebuffer sRGB Present");
|
||||||
}
|
}
|
||||||
// Only unset the high def textures if they are set as default. If the
|
|
||||||
// user has enabled them (bit 1 set), then leave them enabled.
|
|
||||||
if (GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_HIGHDEFINITION_TEXTURES) &&
|
|
||||||
(UserConfigParams::m_high_definition_textures & 0x02) == 0)
|
|
||||||
{
|
|
||||||
UserConfigParams::m_high_definition_textures = 0x00;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_GI))
|
if (GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_GI))
|
||||||
{
|
{
|
||||||
@ -293,6 +287,24 @@ void CentralVideoSettings::init()
|
|||||||
m_need_vertex_id_workaround = true;
|
m_need_vertex_id_workaround = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Only unset the high def textures if they are set as default. If the
|
||||||
|
// user has enabled them (bit 1 set), then leave them enabled.
|
||||||
|
if (GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_HIGHDEFINITION_TEXTURES) &&
|
||||||
|
(UserConfigParams::m_high_definition_textures & 0x02) == 0)
|
||||||
|
{
|
||||||
|
UserConfigParams::m_high_definition_textures = 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_HIGHDEFINITION_TEXTURES_256))
|
||||||
|
{
|
||||||
|
UserConfigParams::m_high_definition_textures = 0;
|
||||||
|
|
||||||
|
if (UserConfigParams::m_max_texture_size > 256)
|
||||||
|
{
|
||||||
|
UserConfigParams::m_max_texture_size = 256;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,7 +527,7 @@ bool CentralVideoSettings::isDefferedEnabled() const
|
|||||||
|
|
||||||
bool CentralVideoSettings::supportsHardwareSkinning() const
|
bool CentralVideoSettings::supportsHardwareSkinning() const
|
||||||
{
|
{
|
||||||
return isARBUniformBufferObjectUsable();
|
return !GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_HARDWARE_SKINNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CentralVideoSettings::isARBTextureSwizzleUsable() const
|
bool CentralVideoSettings::isARBTextureSwizzleUsable() const
|
||||||
|
@ -74,13 +74,13 @@ template<typename T>
|
|||||||
void FillInstances_impl(const InstanceList& instance_list,
|
void FillInstances_impl(const InstanceList& instance_list,
|
||||||
T * instance_buffer,
|
T * instance_buffer,
|
||||||
DrawElementsIndirectCommand *command_buffer,
|
DrawElementsIndirectCommand *command_buffer,
|
||||||
size_t &instance_buffer_offset,
|
unsigned int &instance_buffer_offset,
|
||||||
size_t &command_buffer_offset,
|
unsigned int &command_buffer_offset,
|
||||||
size_t &poly_count)
|
unsigned int&poly_count)
|
||||||
{
|
{
|
||||||
// Should never be empty
|
// Should never be empty
|
||||||
GLMesh *mesh = instance_list.m_mesh;
|
GLMesh *mesh = instance_list.m_mesh;
|
||||||
size_t initial_offset = instance_buffer_offset;
|
unsigned int initial_offset = instance_buffer_offset;
|
||||||
|
|
||||||
for (unsigned i = 0; i < instance_list.m_instance_settings.size(); i++)
|
for (unsigned i = 0; i < instance_list.m_instance_settings.size(); i++)
|
||||||
{
|
{
|
||||||
@ -92,7 +92,7 @@ void FillInstances_impl(const InstanceList& instance_list,
|
|||||||
DrawElementsIndirectCommand &CurrentCommand = command_buffer[command_buffer_offset++];
|
DrawElementsIndirectCommand &CurrentCommand = command_buffer[command_buffer_offset++];
|
||||||
CurrentCommand.baseVertex = mesh->vaoBaseVertex;
|
CurrentCommand.baseVertex = mesh->vaoBaseVertex;
|
||||||
CurrentCommand.count = mesh->IndexCount;
|
CurrentCommand.count = mesh->IndexCount;
|
||||||
CurrentCommand.firstIndex = mesh->vaoOffset / 2;
|
CurrentCommand.firstIndex = GLuint(mesh->vaoOffset / 2);
|
||||||
CurrentCommand.baseInstance = initial_offset;
|
CurrentCommand.baseInstance = initial_offset;
|
||||||
CurrentCommand.instanceCount = instance_buffer_offset - initial_offset;
|
CurrentCommand.instanceCount = instance_buffer_offset - initial_offset;
|
||||||
|
|
||||||
@ -145,12 +145,12 @@ protected:
|
|||||||
DrawElementsIndirectCommand *m_draw_indirect_cmd;
|
DrawElementsIndirectCommand *m_draw_indirect_cmd;
|
||||||
|
|
||||||
std::array<std::vector<GLMesh *>, N> m_meshes;
|
std::array<std::vector<GLMesh *>, N> m_meshes;
|
||||||
std::array<size_t,N> m_offset;
|
std::array<unsigned int,N> m_offset;
|
||||||
std::array<size_t,N> m_size;
|
std::array<unsigned int,N> m_size;
|
||||||
|
|
||||||
size_t m_poly_count;
|
unsigned int m_poly_count;
|
||||||
size_t m_instance_buffer_offset;
|
unsigned int m_instance_buffer_offset;
|
||||||
size_t m_command_buffer_offset;
|
unsigned int m_command_buffer_offset;
|
||||||
|
|
||||||
void clearMeshes();
|
void clearMeshes();
|
||||||
void mapIndirectBuffer();
|
void mapIndirectBuffer();
|
||||||
@ -230,7 +230,7 @@ public:
|
|||||||
CommandBuffer();
|
CommandBuffer();
|
||||||
virtual ~CommandBuffer() { glDeleteBuffers(1, &m_draw_indirect_cmd_id); }
|
virtual ~CommandBuffer() { glDeleteBuffers(1, &m_draw_indirect_cmd_id); }
|
||||||
|
|
||||||
inline size_t getPolyCount() const {return m_poly_count;}
|
inline unsigned int getPolyCount() const {return m_poly_count;}
|
||||||
|
|
||||||
inline void bind() const
|
inline void bind() const
|
||||||
{
|
{
|
||||||
@ -263,7 +263,7 @@ public:
|
|||||||
{
|
{
|
||||||
T::InstancedFirstPassShader::getInstance()->use();
|
T::InstancedFirstPassShader::getInstance()->use();
|
||||||
T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...);
|
T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...);
|
||||||
|
handleSkinning(T::InstancedFirstPassShader::getInstance());
|
||||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||||
T::Instance));
|
T::Instance));
|
||||||
for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++)
|
for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++)
|
||||||
@ -303,7 +303,7 @@ public:
|
|||||||
{
|
{
|
||||||
T::InstancedFirstPassShader::getInstance()->use();
|
T::InstancedFirstPassShader::getInstance()->use();
|
||||||
T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...);
|
T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...);
|
||||||
|
handleSkinning(T::InstancedFirstPassShader::getInstance());
|
||||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||||
T::Instance));
|
T::Instance));
|
||||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||||
@ -329,7 +329,7 @@ public:
|
|||||||
{
|
{
|
||||||
T::InstancedSecondPassShader::getInstance()->use();
|
T::InstancedSecondPassShader::getInstance()->use();
|
||||||
T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...);
|
T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...);
|
||||||
|
handleSkinning(T::InstancedSecondPassShader::getInstance());
|
||||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||||
T::Instance));
|
T::Instance));
|
||||||
for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++)
|
for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++)
|
||||||
@ -364,7 +364,7 @@ public:
|
|||||||
{
|
{
|
||||||
T::InstancedSecondPassShader::getInstance()->use();
|
T::InstancedSecondPassShader::getInstance()->use();
|
||||||
T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...);
|
T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...);
|
||||||
|
handleSkinning(T::InstancedSecondPassShader::getInstance());
|
||||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||||
T::Instance));
|
T::Instance));
|
||||||
expandHandlesSecondPass<T>(handles);
|
expandHandlesSecondPass<T>(handles);
|
||||||
@ -451,7 +451,7 @@ public:
|
|||||||
{
|
{
|
||||||
T::InstancedShadowPassShader::getInstance()->use();
|
T::InstancedShadowPassShader::getInstance()->use();
|
||||||
T::InstancedShadowPassShader::getInstance()->setUniforms(cascade, uniforms...);
|
T::InstancedShadowPassShader::getInstance()->setUniforms(cascade, uniforms...);
|
||||||
|
handleSkinning(T::InstancedShadowPassShader::getInstance());
|
||||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||||
InstanceTypeShadow));
|
InstanceTypeShadow));
|
||||||
|
|
||||||
@ -488,7 +488,7 @@ public:
|
|||||||
{
|
{
|
||||||
T::InstancedShadowPassShader::getInstance()->use();
|
T::InstancedShadowPassShader::getInstance()->use();
|
||||||
T::InstancedShadowPassShader::getInstance()->setUniforms(cascade, uniforms...);
|
T::InstancedShadowPassShader::getInstance()->setUniforms(cascade, uniforms...);
|
||||||
|
handleSkinning(T::InstancedShadowPassShader::getInstance());
|
||||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||||
InstanceTypeShadow));
|
InstanceTypeShadow));
|
||||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||||
|
@ -302,7 +302,7 @@ void CPUParticleManager::drawAll()
|
|||||||
}
|
}
|
||||||
glBindVertexArray(std::get<0>(m_gl_particles[p.second]));
|
glBindVertexArray(std::get<0>(m_gl_particles[p.second]));
|
||||||
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4,
|
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4,
|
||||||
m_particles_generated.at(p.second).size());
|
(unsigned)m_particles_generated.at(p.second).size());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // drawAll
|
} // drawAll
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#ifndef SERVER_ONLY
|
#ifndef SERVER_ONLY
|
||||||
#include "graphics/draw_calls.hpp"
|
#include "graphics/draw_calls.hpp"
|
||||||
|
|
||||||
|
#include "config/stk_config.hpp"
|
||||||
#include "config/user_config.hpp"
|
#include "config/user_config.hpp"
|
||||||
#include "graphics/command_buffer.hpp"
|
#include "graphics/command_buffer.hpp"
|
||||||
#include "graphics/cpu_particle_manager.hpp"
|
#include "graphics/cpu_particle_manager.hpp"
|
||||||
@ -258,14 +259,14 @@ void DrawCalls::handleSTKCommon(scene::ISceneNode *Node,
|
|||||||
(!culled_for_cams[0] || !culled_for_cams[1] || !culled_for_cams[2] ||
|
(!culled_for_cams[0] || !culled_for_cams[1] || !culled_for_cams[2] ||
|
||||||
!culled_for_cams[3] || !culled_for_cams[4] || !culled_for_cams[5]))
|
!culled_for_cams[3] || !culled_for_cams[4] || !culled_for_cams[5]))
|
||||||
{
|
{
|
||||||
skinning_offset = getSkinningOffset() + 1/*reserved identity matrix*/;
|
skinning_offset = getSkinningOffset();
|
||||||
if (skinning_offset + am->getTotalJoints() >
|
if (skinning_offset + am->getTotalJoints() >
|
||||||
SharedGPUObjects::getMaxMat4Size())
|
stk_config->m_max_skinning_bones)
|
||||||
{
|
{
|
||||||
Log::error("DrawCalls", "Don't have enough space to render skinned"
|
Log::error("DrawCalls", "Don't have enough space to render skinned"
|
||||||
" mesh %s! Max joints can hold: %d",
|
" mesh %s! Max joints can hold: %d",
|
||||||
am->getMeshDebugName().c_str(),
|
am->getMeshDebugName().c_str(),
|
||||||
SharedGPUObjects::getMaxMat4Size());
|
stk_config->m_max_skinning_bones);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_mesh_for_skinning.insert(am);
|
m_mesh_for_skinning.insert(am);
|
||||||
@ -684,8 +685,30 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices,
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
PROFILER_PUSH_CPU_MARKER("- Animations/Buffer upload", 0x0, 0x0, 0x0);
|
PROFILER_PUSH_CPU_MARKER("- Animations/Buffer upload", 0x0, 0x0, 0x0);
|
||||||
|
shadow_matrices.updateUBO();
|
||||||
|
if (CVS->supportsHardwareSkinning())
|
||||||
|
{
|
||||||
|
#ifdef USE_GLES2
|
||||||
|
glBindTexture(GL_TEXTURE_2D, SharedGPUObjects::getSkinningTexture());
|
||||||
|
#else
|
||||||
|
glBindBuffer(CVS->isARBShaderStorageBufferObjectUsable() ?
|
||||||
|
GL_SHADER_STORAGE_BUFFER : GL_TEXTURE_BUFFER,
|
||||||
|
SharedGPUObjects::getSkinningBuffer());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
for (unsigned i = 0; i < m_deferred_update.size(); i++)
|
for (unsigned i = 0; i < m_deferred_update.size(); i++)
|
||||||
|
{
|
||||||
m_deferred_update[i]->updateGL();
|
m_deferred_update[i]->updateGL();
|
||||||
|
}
|
||||||
|
if (CVS->supportsHardwareSkinning())
|
||||||
|
{
|
||||||
|
#ifdef USE_GLES2
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
#else
|
||||||
|
glBindBuffer(CVS->isARBShaderStorageBufferObjectUsable() ?
|
||||||
|
GL_SHADER_STORAGE_BUFFER : GL_TEXTURE_BUFFER, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
PROFILER_POP_CPU_MARKER();
|
PROFILER_POP_CPU_MARKER();
|
||||||
|
|
||||||
PROFILER_PUSH_CPU_MARKER("- cpu particle upload", 0x3F, 0x03, 0x61);
|
PROFILER_PUSH_CPU_MARKER("- cpu particle upload", 0x3F, 0x03, 0x61);
|
||||||
@ -964,7 +987,7 @@ int32_t DrawCalls::getSkinningOffset() const
|
|||||||
{
|
{
|
||||||
return std::accumulate(m_mesh_for_skinning.begin(),
|
return std::accumulate(m_mesh_for_skinning.begin(),
|
||||||
m_mesh_for_skinning.end(), 0, []
|
m_mesh_for_skinning.end(), 0, []
|
||||||
(const size_t previous, const STKAnimatedMesh* m)
|
(const unsigned int previous, const STKAnimatedMesh* m)
|
||||||
{ return previous + m->getTotalJoints(); });
|
{ return previous + m->getTotalJoints(); });
|
||||||
} // getSkinningOffset
|
} // getSkinningOffset
|
||||||
#endif // !SERVER_ONLY
|
#endif // !SERVER_ONLY
|
||||||
|
@ -28,6 +28,7 @@ void renderMeshes1stPass()
|
|||||||
{
|
{
|
||||||
auto &meshes = T::List::getInstance()->SolidPass;
|
auto &meshes = T::List::getInstance()->SolidPass;
|
||||||
T::FirstPassShader::getInstance()->use();
|
T::FirstPassShader::getInstance()->use();
|
||||||
|
handleSkinning(T::FirstPassShader::getInstance());
|
||||||
if (CVS->isARBBaseInstanceUsable())
|
if (CVS->isARBBaseInstanceUsable())
|
||||||
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
||||||
for (unsigned i = 0; i < meshes.size(); i++)
|
for (unsigned i = 0; i < meshes.size(); i++)
|
||||||
@ -58,6 +59,7 @@ void renderMeshes2ndPass( const std::vector<uint64_t> &Prefilled_Handle,
|
|||||||
{
|
{
|
||||||
auto &meshes = T::List::getInstance()->SolidPass;
|
auto &meshes = T::List::getInstance()->SolidPass;
|
||||||
T::SecondPassShader::getInstance()->use();
|
T::SecondPassShader::getInstance()->use();
|
||||||
|
handleSkinning(T::SecondPassShader::getInstance());
|
||||||
if (CVS->isARBBaseInstanceUsable())
|
if (CVS->isARBBaseInstanceUsable())
|
||||||
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
||||||
for (unsigned i = 0; i < meshes.size(); i++)
|
for (unsigned i = 0; i < meshes.size(); i++)
|
||||||
@ -95,6 +97,7 @@ void renderShadow(unsigned cascade)
|
|||||||
{
|
{
|
||||||
auto &t = T::List::getInstance()->Shadows[cascade];
|
auto &t = T::List::getInstance()->Shadows[cascade];
|
||||||
T::ShadowPassShader::getInstance()->use();
|
T::ShadowPassShader::getInstance()->use();
|
||||||
|
handleSkinning(T::ShadowPassShader::getInstance());
|
||||||
if (CVS->isARBBaseInstanceUsable())
|
if (CVS->isARBBaseInstanceUsable())
|
||||||
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
||||||
for (unsigned i = 0; i < t.size(); i++)
|
for (unsigned i = 0; i < t.size(); i++)
|
||||||
|
@ -183,5 +183,14 @@ struct HandleExpander
|
|||||||
} // Expand
|
} // Expand
|
||||||
}; // HandleExpander
|
}; // HandleExpander
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
template <typename Shader>
|
||||||
|
inline void handleSkinning(Shader* s)
|
||||||
|
{
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(s))
|
||||||
|
{
|
||||||
|
sms->bindSkinningTexture();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif //HEADER_DRAW_TOOLS_HPP
|
#endif //HEADER_DRAW_TOOLS_HPP
|
||||||
|
@ -42,8 +42,20 @@ Explosion::Explosion(const Vec3& coord, const char* explosion_sound, const char
|
|||||||
m_emission_frames = 0;
|
m_emission_frames = 0;
|
||||||
|
|
||||||
#ifndef SERVER_ONLY
|
#ifndef SERVER_ONLY
|
||||||
|
std::string filename = particle_file;
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
// Use a lower quality effect on Android for better performance
|
||||||
|
if (filename == "explosion.xml" ||
|
||||||
|
filename == "explosion_bomb.xml" ||
|
||||||
|
filename == "explosion_cake.xml")
|
||||||
|
{
|
||||||
|
filename = "explosion_low.xml";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ParticleKindManager* pkm = ParticleKindManager::get();
|
ParticleKindManager* pkm = ParticleKindManager::get();
|
||||||
ParticleKind* particles = pkm->getParticles(particle_file);
|
ParticleKind* particles = pkm->getParticles(filename);
|
||||||
m_emitter = NULL;
|
m_emitter = NULL;
|
||||||
|
|
||||||
if (UserConfigParams::m_graphical_effects > 1)
|
if (UserConfigParams::m_graphical_effects > 1)
|
||||||
|
@ -202,6 +202,7 @@ void renderTransparenPass(const std::vector<RenderGeometry::TexUnit> &TexUnits,
|
|||||||
std::vector<std::tuple<TupleType...> > *meshes)
|
std::vector<std::tuple<TupleType...> > *meshes)
|
||||||
{
|
{
|
||||||
Shader::getInstance()->use();
|
Shader::getInstance()->use();
|
||||||
|
handleSkinning(Shader::getInstance());
|
||||||
if (CVS->isARBBaseInstanceUsable())
|
if (CVS->isARBBaseInstanceUsable())
|
||||||
glBindVertexArray(VAOManager::getInstance()->getVAO(VertexType));
|
glBindVertexArray(VAOManager::getInstance()->getVAO(VertexType));
|
||||||
for (unsigned i = 0; i < meshes->size(); i++)
|
for (unsigned i = 0; i < meshes->size(); i++)
|
||||||
|
@ -226,8 +226,8 @@ unsigned GPUTimer::elapsedTimeus()
|
|||||||
|
|
||||||
FrameBuffer::FrameBuffer() {}
|
FrameBuffer::FrameBuffer() {}
|
||||||
|
|
||||||
FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, size_t w, size_t h,
|
FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, unsigned int w,
|
||||||
bool layered)
|
unsigned int h, bool layered)
|
||||||
: fbolayer(0), RenderTargets(RTTs), DepthTexture(0),
|
: fbolayer(0), RenderTargets(RTTs), DepthTexture(0),
|
||||||
width(w), height(h)
|
width(w), height(h)
|
||||||
{
|
{
|
||||||
@ -248,8 +248,8 @@ FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, size_t w, size_t h,
|
|||||||
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE_EXT);
|
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE_EXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, GLuint DS, size_t w,
|
FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, GLuint DS, unsigned int w,
|
||||||
size_t h, bool layered)
|
unsigned int h, bool layered)
|
||||||
: fbolayer(0), RenderTargets(RTTs), DepthTexture(DS), width(w),
|
: fbolayer(0), RenderTargets(RTTs), DepthTexture(DS), width(w),
|
||||||
height(h)
|
height(h)
|
||||||
{
|
{
|
||||||
|
@ -66,18 +66,18 @@ private:
|
|||||||
GLuint fbo, fbolayer;
|
GLuint fbo, fbolayer;
|
||||||
std::vector<GLuint> RenderTargets;
|
std::vector<GLuint> RenderTargets;
|
||||||
GLuint DepthTexture;
|
GLuint DepthTexture;
|
||||||
size_t width, height;
|
unsigned int width, height;
|
||||||
public:
|
public:
|
||||||
FrameBuffer();
|
FrameBuffer();
|
||||||
FrameBuffer(const std::vector <GLuint> &RTTs, size_t w, size_t h, bool layered = false);
|
FrameBuffer(const std::vector <GLuint> &RTTs, unsigned int w, unsigned int h, bool layered = false);
|
||||||
FrameBuffer(const std::vector <GLuint> &RTTs, GLuint DS, size_t w, size_t h, bool layered = false);
|
FrameBuffer(const std::vector <GLuint> &RTTs, GLuint DS, unsigned int w, unsigned int h, bool layered = false);
|
||||||
~FrameBuffer();
|
~FrameBuffer();
|
||||||
void bind() const;
|
void bind() const;
|
||||||
void bindLayer(unsigned) const;
|
void bindLayer(unsigned) const;
|
||||||
const std::vector<GLuint> &getRTT() const { return RenderTargets; }
|
const std::vector<GLuint> &getRTT() const { return RenderTargets; }
|
||||||
GLuint getDepthTexture() const { assert(DepthTexture); return DepthTexture; }
|
GLuint getDepthTexture() const { assert(DepthTexture); return DepthTexture; }
|
||||||
size_t getWidth() const { return width; }
|
unsigned int getWidth() const { return width; }
|
||||||
size_t getHeight() const { return height; }
|
unsigned int getHeight() const { return height; }
|
||||||
static void Blit(const FrameBuffer &Src, const FrameBuffer &Dst, GLbitfield mask = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST);
|
static void Blit(const FrameBuffer &Src, const FrameBuffer &Dst, GLbitfield mask = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST);
|
||||||
void BlitToDefault(size_t, size_t, size_t, size_t);
|
void BlitToDefault(size_t, size_t, size_t, size_t);
|
||||||
|
|
||||||
@ -154,9 +154,9 @@ public:
|
|||||||
glEnableVertexAttribArray(4);
|
glEnableVertexAttribArray(4);
|
||||||
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, getVertexPitchFromType(tp), (GLvoid*)44);
|
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, getVertexPitchFromType(tp), (GLvoid*)44);
|
||||||
glEnableVertexAttribArray(5);
|
glEnableVertexAttribArray(5);
|
||||||
glVertexAttribIPointer(5, 4, GL_INT, getVertexPitchFromType(tp), (GLvoid*)60);
|
glVertexAttribIPointer(5, 4, GL_SHORT, getVertexPitchFromType(tp), (GLvoid*)60);
|
||||||
glEnableVertexAttribArray(6);
|
glEnableVertexAttribArray(6);
|
||||||
glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, getVertexPitchFromType(tp), (GLvoid*)76);
|
glVertexAttribPointer(6, 4, GL_HALF_FLOAT, GL_FALSE, getVertexPitchFromType(tp), (GLvoid*)68);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,36 +44,41 @@ namespace GraphicsRestrictions
|
|||||||
/** The list of names used in the XML file for the graphics
|
/** The list of names used in the XML file for the graphics
|
||||||
* restriction types. They must be in the same order as the types. */
|
* restriction types. They must be in the same order as the types. */
|
||||||
|
|
||||||
std::array<std::string, 29> m_names_of_restrictions = {
|
std::array<std::string, 31> m_names_of_restrictions =
|
||||||
"UniformBufferObject",
|
{
|
||||||
"GeometryShader",
|
{
|
||||||
"DrawIndirect",
|
"UniformBufferObject",
|
||||||
"TextureView",
|
"GeometryShader",
|
||||||
"TextureStorage",
|
"DrawIndirect",
|
||||||
"ImageLoadStore",
|
"TextureView",
|
||||||
"BaseInstance",
|
"TextureStorage",
|
||||||
"ComputeShader",
|
"ImageLoadStore",
|
||||||
"ArraysOfArrays",
|
"BaseInstance",
|
||||||
"ShaderStorageBufferObject",
|
"ComputeShader",
|
||||||
"MultiDrawIndirect",
|
"ArraysOfArrays",
|
||||||
"ShaderAtomicCounters",
|
"ShaderStorageBufferObject",
|
||||||
"BufferStorage",
|
"MultiDrawIndirect",
|
||||||
"BindlessTexture",
|
"ShaderAtomicCounters",
|
||||||
"TextureCompressionS3TC",
|
"BufferStorage",
|
||||||
"AMDVertexShaderLayer",
|
"BindlessTexture",
|
||||||
"ExplicitAttribLocation",
|
"TextureCompressionS3TC",
|
||||||
"TextureFilterAnisotropic",
|
"AMDVertexShaderLayer",
|
||||||
"TextureFormatBGRA8888",
|
"ExplicitAttribLocation",
|
||||||
"ColorBufferFloat",
|
"TextureFilterAnisotropic",
|
||||||
"DriverRecentEnough",
|
"TextureFormatBGRA8888",
|
||||||
"HighDefinitionTextures",
|
"ColorBufferFloat",
|
||||||
"AdvancedPipeline",
|
"DriverRecentEnough",
|
||||||
"FramebufferSRGB",
|
"HighDefinitionTextures",
|
||||||
"FramebufferSRGBWorkaround1",
|
"HighDefinitionTextures256",
|
||||||
"FramebufferSRGBWorkaround2",
|
"AdvancedPipeline",
|
||||||
"GI",
|
"FramebufferSRGB",
|
||||||
"ForceLegacyDevice",
|
"FramebufferSRGBWorkaround1",
|
||||||
"VertexIdWorking"
|
"FramebufferSRGBWorkaround2",
|
||||||
|
"GI",
|
||||||
|
"ForceLegacyDevice",
|
||||||
|
"VertexIdWorking",
|
||||||
|
"HardwareSkinning"
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} // namespace Private
|
} // namespace Private
|
||||||
using namespace Private;
|
using namespace Private;
|
||||||
@ -261,7 +266,7 @@ public:
|
|||||||
/** If *this < other. */
|
/** If *this < other. */
|
||||||
bool operator< (const Version &other) const
|
bool operator< (const Version &other) const
|
||||||
{
|
{
|
||||||
unsigned int min_n = std::min(m_version.size(), other.m_version.size());
|
unsigned int min_n = (unsigned int)std::min(m_version.size(), other.m_version.size());
|
||||||
for (unsigned int i = 0; i<min_n; i++)
|
for (unsigned int i = 0; i<min_n; i++)
|
||||||
{
|
{
|
||||||
if (m_version[i] > other.m_version[i]) return false;
|
if (m_version[i] > other.m_version[i]) return false;
|
||||||
@ -276,7 +281,7 @@ public:
|
|||||||
/** If *this <= other. */
|
/** If *this <= other. */
|
||||||
bool operator<= (const Version &other) const
|
bool operator<= (const Version &other) const
|
||||||
{
|
{
|
||||||
unsigned int min_n = std::min(m_version.size(), other.m_version.size());
|
unsigned int min_n = (unsigned int)std::min(m_version.size(), other.m_version.size());
|
||||||
for (unsigned int i = 0; i<min_n; i++)
|
for (unsigned int i = 0; i<min_n; i++)
|
||||||
{
|
{
|
||||||
if (m_version[i] > other.m_version[i]) return false;
|
if (m_version[i] > other.m_version[i]) return false;
|
||||||
@ -309,6 +314,9 @@ private:
|
|||||||
/** For which OS this rule applies. */
|
/** For which OS this rule applies. */
|
||||||
std::string m_os;
|
std::string m_os;
|
||||||
|
|
||||||
|
/** For which vendor this rule applies. */
|
||||||
|
std::string m_vendor;
|
||||||
|
|
||||||
/** Which options to disable. */
|
/** Which options to disable. */
|
||||||
std::vector<std::string> m_disable_options;
|
std::vector<std::string> m_disable_options;
|
||||||
public:
|
public:
|
||||||
@ -327,6 +335,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
rule->get("os", &m_os);
|
rule->get("os", &m_os);
|
||||||
|
rule->get("vendor", &m_vendor);
|
||||||
|
|
||||||
std::string s;
|
std::string s;
|
||||||
if(rule->get("version", &s) && s.size()>1)
|
if(rule->get("version", &s) && s.size()>1)
|
||||||
@ -358,7 +367,8 @@ public:
|
|||||||
m_disable_options = StringUtils::split(s, ' ');
|
m_disable_options = StringUtils::split(s, ' ');
|
||||||
} // Rule
|
} // Rule
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
bool applies(const std::string &card, const Version &version) const
|
bool applies(const std::string &card, const Version &version,
|
||||||
|
const std::string &vendor) const
|
||||||
{
|
{
|
||||||
// Test for OS
|
// Test for OS
|
||||||
// -----------
|
// -----------
|
||||||
@ -378,6 +388,14 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
} // m_os.size()>0
|
} // m_os.size()>0
|
||||||
|
|
||||||
|
// Test for vendor
|
||||||
|
// ---------------
|
||||||
|
if (m_vendor.size() > 0)
|
||||||
|
{
|
||||||
|
if (m_vendor != vendor)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Test for card
|
// Test for card
|
||||||
// -------------
|
// -------------
|
||||||
@ -482,9 +500,11 @@ void unitTesting()
|
|||||||
* \param driver_version The GL_VERSION string (i.e. opengl and version
|
* \param driver_version The GL_VERSION string (i.e. opengl and version
|
||||||
* number).
|
* number).
|
||||||
* \param card_name The GL_RENDERER string (i.e. graphics card).
|
* \param card_name The GL_RENDERER string (i.e. graphics card).
|
||||||
|
* \param vendor The GL_VENDOR string
|
||||||
*/
|
*/
|
||||||
void init(const std::string &driver_version,
|
void init(const std::string &driver_version,
|
||||||
const std::string &card_name)
|
const std::string &card_name,
|
||||||
|
const std::string &vendor)
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < GR_COUNT; i++)
|
for (unsigned int i = 0; i < GR_COUNT; i++)
|
||||||
m_all_graphics_restriction.push_back(false);
|
m_all_graphics_restriction.push_back(false);
|
||||||
@ -518,7 +538,7 @@ void init(const std::string &driver_version,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Rule rule(xml_rule);
|
Rule rule(xml_rule);
|
||||||
if (rule.applies(card_name, version))
|
if (rule.applies(card_name, version, vendor))
|
||||||
{
|
{
|
||||||
std::vector<std::string> restrictions = rule.getRestrictions();
|
std::vector<std::string> restrictions = rule.getRestrictions();
|
||||||
std::vector<std::string>::iterator p;
|
std::vector<std::string>::iterator p;
|
||||||
|
@ -56,6 +56,7 @@ namespace GraphicsRestrictions
|
|||||||
GR_COLOR_BUFFER_FLOAT,
|
GR_COLOR_BUFFER_FLOAT,
|
||||||
GR_DRIVER_RECENT_ENOUGH,
|
GR_DRIVER_RECENT_ENOUGH,
|
||||||
GR_HIGHDEFINITION_TEXTURES,
|
GR_HIGHDEFINITION_TEXTURES,
|
||||||
|
GR_HIGHDEFINITION_TEXTURES_256,
|
||||||
GR_ADVANCED_PIPELINE,
|
GR_ADVANCED_PIPELINE,
|
||||||
GR_FRAMEBUFFER_SRGB,
|
GR_FRAMEBUFFER_SRGB,
|
||||||
GR_FRAMEBUFFER_SRGB_WORKAROUND1,
|
GR_FRAMEBUFFER_SRGB_WORKAROUND1,
|
||||||
@ -63,11 +64,13 @@ namespace GraphicsRestrictions
|
|||||||
GR_GI,
|
GR_GI,
|
||||||
GR_FORCE_LEGACY_DEVICE,
|
GR_FORCE_LEGACY_DEVICE,
|
||||||
GR_VERTEX_ID_WORKING,
|
GR_VERTEX_ID_WORKING,
|
||||||
|
GR_HARDWARE_SKINNING,
|
||||||
GR_COUNT /** MUST be last entry. */
|
GR_COUNT /** MUST be last entry. */
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
void init(const std::string &driver_version,
|
void init(const std::string &driver_version,
|
||||||
const std::string &card_name );
|
const std::string &card_name,
|
||||||
|
const std::string &vendor );
|
||||||
bool isDisabled(GraphicsRestrictionsType type);
|
bool isDisabled(GraphicsRestrictionsType type);
|
||||||
|
|
||||||
void unitTesting();
|
void unitTesting();
|
||||||
|
@ -317,7 +317,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (m_hue_settings.empty())
|
if (m_hue_settings.empty())
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
const unsigned int hue = m_random_hue.get(m_hue_settings.size());
|
const unsigned int hue = m_random_hue.get((int)m_hue_settings.size());
|
||||||
assert(hue < m_hue_settings.size());
|
assert(hue < m_hue_settings.size());
|
||||||
return m_hue_settings[hue];
|
return m_hue_settings[hue];
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "config/user_config.hpp"
|
#include "config/user_config.hpp"
|
||||||
#include "graphics/material.hpp"
|
#include "graphics/material.hpp"
|
||||||
|
#include "graphics/particle_kind_manager.hpp"
|
||||||
#include "graphics/shaders.hpp"
|
#include "graphics/shaders.hpp"
|
||||||
#include "io/file_manager.hpp"
|
#include "io/file_manager.hpp"
|
||||||
#include "io/xml_node.hpp"
|
#include "io/xml_node.hpp"
|
||||||
@ -381,14 +382,26 @@ void MaterialManager::makeMaterialsPermanent()
|
|||||||
} // makeMaterialsPermanent
|
} // makeMaterialsPermanent
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void MaterialManager::unloadAllTextures()
|
void MaterialManager::unloadAllTextures()
|
||||||
{
|
{
|
||||||
std::string texture_folder = file_manager->getAssetDirectory(FileManager::TEXTURE);
|
std::string texture_folder =
|
||||||
|
file_manager->getAssetDirectory(FileManager::TEXTURE);
|
||||||
|
texture_folder = file_manager->getFileSystem()->getAbsolutePath
|
||||||
|
(texture_folder.c_str()).c_str();
|
||||||
|
core::stringc texfname(texture_folder.c_str());
|
||||||
|
texfname.make_lower();
|
||||||
|
texture_folder = texfname.c_str();
|
||||||
for (int i = 0; i < m_shared_material_index; i++)
|
for (int i = 0; i < m_shared_material_index; i++)
|
||||||
{
|
{
|
||||||
if (m_materials[i]->getTexFullPath().find(texture_folder) != std::string::npos)
|
// Global particle textures will stay until exit
|
||||||
m_materials[i]->unloadTexture();
|
// STK, which avoid hangs when lazy-loading the texture when being
|
||||||
|
// triggered.
|
||||||
|
Material* m = m_materials[i];
|
||||||
|
if (!ParticleKindManager::get()->isGlobalParticleMaterial(m)
|
||||||
|
&& m->getTexFullPath().find(texture_folder) != std::string::npos)
|
||||||
|
{
|
||||||
|
m->unloadTexture();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,6 +488,10 @@ SkinnedPass1Shader::SkinnedPass1Shader()
|
|||||||
if (!CVS->supportsHardwareSkinning()) return;
|
if (!CVS->supportsHardwareSkinning()) return;
|
||||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "object_pass1.frag");
|
GL_FRAGMENT_SHADER, "object_pass1.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "InverseModelMatrix", "skinning_offset");
|
assignUniforms("ModelMatrix", "InverseModelMatrix", "skinning_offset");
|
||||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
} // SkinnedPass1Shader
|
} // SkinnedPass1Shader
|
||||||
@ -499,6 +503,10 @@ InstancedSkinnedPass1Shader::InstancedSkinnedPass1Shader()
|
|||||||
loadProgram(SKINNED_MESH,
|
loadProgram(SKINNED_MESH,
|
||||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "instanced_object_pass1.frag");
|
GL_FRAGMENT_SHADER, "instanced_object_pass1.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms();
|
assignUniforms();
|
||||||
assignSamplerNames(0, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
assignSamplerNames(0, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
} // InstancedSkinnedPass1Shader
|
} // InstancedSkinnedPass1Shader
|
||||||
@ -509,6 +517,10 @@ SkinnedPass2Shader::SkinnedPass2Shader()
|
|||||||
if (!CVS->supportsHardwareSkinning()) return;
|
if (!CVS->supportsHardwareSkinning()) return;
|
||||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "object_pass2.frag");
|
GL_FRAGMENT_SHADER, "object_pass2.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "texture_trans", "color_change",
|
assignUniforms("ModelMatrix", "texture_trans", "color_change",
|
||||||
"skinning_offset");
|
"skinning_offset");
|
||||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
@ -527,6 +539,10 @@ InstancedSkinnedPass2Shader::InstancedSkinnedPass2Shader()
|
|||||||
loadProgram(SKINNED_MESH,
|
loadProgram(SKINNED_MESH,
|
||||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "instanced_object_pass2.frag");
|
GL_FRAGMENT_SHADER, "instanced_object_pass2.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms();
|
assignUniforms();
|
||||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
1, "SpecularMap", ST_NEAREST_FILTERED,
|
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||||
@ -543,6 +559,10 @@ SkinnedRefPass1Shader::SkinnedRefPass1Shader()
|
|||||||
if (!CVS->supportsHardwareSkinning()) return;
|
if (!CVS->supportsHardwareSkinning()) return;
|
||||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "objectref_pass1.frag");
|
GL_FRAGMENT_SHADER, "objectref_pass1.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "InverseModelMatrix", "texture_trans",
|
assignUniforms("ModelMatrix", "InverseModelMatrix", "texture_trans",
|
||||||
"skinning_offset");
|
"skinning_offset");
|
||||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||||
@ -556,6 +576,10 @@ InstancedSkinnedRefPass1Shader::InstancedSkinnedRefPass1Shader()
|
|||||||
loadProgram(SKINNED_MESH,
|
loadProgram(SKINNED_MESH,
|
||||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "instanced_objectref_pass1.frag");
|
GL_FRAGMENT_SHADER, "instanced_objectref_pass1.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms();
|
assignUniforms();
|
||||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||||
1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
@ -567,6 +591,10 @@ SkinnedRefPass2Shader::SkinnedRefPass2Shader()
|
|||||||
if (!CVS->supportsHardwareSkinning()) return;
|
if (!CVS->supportsHardwareSkinning()) return;
|
||||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "objectref_pass2.frag");
|
GL_FRAGMENT_SHADER, "objectref_pass2.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "texture_trans", "color_change",
|
assignUniforms("ModelMatrix", "texture_trans", "color_change",
|
||||||
"skinning_offset");
|
"skinning_offset");
|
||||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
@ -585,6 +613,10 @@ InstancedSkinnedRefPass2Shader::InstancedSkinnedRefPass2Shader()
|
|||||||
loadProgram(SKINNED_MESH,
|
loadProgram(SKINNED_MESH,
|
||||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "instanced_objectref_pass2.frag");
|
GL_FRAGMENT_SHADER, "instanced_objectref_pass2.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms();
|
assignUniforms();
|
||||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
1, "SpecularMap", ST_NEAREST_FILTERED,
|
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||||
@ -601,6 +633,10 @@ SkinnedUnlitShader::SkinnedUnlitShader()
|
|||||||
if (!CVS->supportsHardwareSkinning()) return;
|
if (!CVS->supportsHardwareSkinning()) return;
|
||||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "object_unlit.frag");
|
GL_FRAGMENT_SHADER, "object_unlit.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "texture_trans", "skinning_offset");
|
assignUniforms("ModelMatrix", "texture_trans", "skinning_offset");
|
||||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
1, "SpecularMap", ST_NEAREST_FILTERED,
|
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||||
@ -615,6 +651,10 @@ InstancedSkinnedUnlitShader::InstancedSkinnedUnlitShader()
|
|||||||
loadProgram(SKINNED_MESH,
|
loadProgram(SKINNED_MESH,
|
||||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "instanced_object_unlit.frag");
|
GL_FRAGMENT_SHADER, "instanced_object_unlit.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms();
|
assignUniforms();
|
||||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
1, "SpecularMap", ST_NEAREST_FILTERED,
|
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||||
@ -628,6 +668,10 @@ SkinnedNormalMapShader::SkinnedNormalMapShader()
|
|||||||
if (!CVS->supportsHardwareSkinning()) return;
|
if (!CVS->supportsHardwareSkinning()) return;
|
||||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "normalmap.frag");
|
GL_FRAGMENT_SHADER, "normalmap.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "InverseModelMatrix", "skinning_offset");
|
assignUniforms("ModelMatrix", "InverseModelMatrix", "skinning_offset");
|
||||||
assignSamplerNames(0, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
assignSamplerNames(0, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||||
1, "glossMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
1, "glossMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
@ -639,6 +683,10 @@ InstancedSkinnedNormalMapShader::InstancedSkinnedNormalMapShader()
|
|||||||
if (!CVS->supportsHardwareSkinning()) return;
|
if (!CVS->supportsHardwareSkinning()) return;
|
||||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "instanced_skinning.vert",
|
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "instanced_normalmap.frag");
|
GL_FRAGMENT_SHADER, "instanced_normalmap.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms();
|
assignUniforms();
|
||||||
assignSamplerNames(0, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
assignSamplerNames(0, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||||
1, "glossMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
1, "glossMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
@ -662,6 +710,10 @@ SkinnedShadowShader::SkinnedShadowShader()
|
|||||||
GL_GEOMETRY_SHADER, "shadow.geom",
|
GL_GEOMETRY_SHADER, "shadow.geom",
|
||||||
GL_FRAGMENT_SHADER, "shadow.frag");
|
GL_FRAGMENT_SHADER, "shadow.frag");
|
||||||
}
|
}
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "skinning_offset", "layer");
|
assignUniforms("ModelMatrix", "skinning_offset", "layer");
|
||||||
#endif
|
#endif
|
||||||
} // SkinnedShadowShader
|
} // SkinnedShadowShader
|
||||||
@ -686,6 +738,10 @@ InstancedSkinnedShadowShader::InstancedSkinnedShadowShader()
|
|||||||
GL_GEOMETRY_SHADER, "instanced_shadow.geom",
|
GL_GEOMETRY_SHADER, "instanced_shadow.geom",
|
||||||
GL_FRAGMENT_SHADER, "shadow.frag");
|
GL_FRAGMENT_SHADER, "shadow.frag");
|
||||||
}
|
}
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("layer");
|
assignUniforms("layer");
|
||||||
#endif
|
#endif
|
||||||
} // InstancedSkinnedShadowShader
|
} // InstancedSkinnedShadowShader
|
||||||
@ -708,6 +764,10 @@ SkinnedRefShadowShader::SkinnedRefShadowShader()
|
|||||||
GL_GEOMETRY_SHADER, "shadow.geom",
|
GL_GEOMETRY_SHADER, "shadow.geom",
|
||||||
GL_FRAGMENT_SHADER, "shadowref.frag");
|
GL_FRAGMENT_SHADER, "shadowref.frag");
|
||||||
}
|
}
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "skinning_offset", "layer");
|
assignUniforms("ModelMatrix", "skinning_offset", "layer");
|
||||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
#endif
|
#endif
|
||||||
@ -733,6 +793,10 @@ InstancedSkinnedRefShadowShader::InstancedSkinnedRefShadowShader()
|
|||||||
GL_GEOMETRY_SHADER, "instanced_shadow.geom",
|
GL_GEOMETRY_SHADER, "instanced_shadow.geom",
|
||||||
GL_FRAGMENT_SHADER, "instanced_shadowref.frag");
|
GL_FRAGMENT_SHADER, "instanced_shadowref.frag");
|
||||||
}
|
}
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("layer");
|
assignUniforms("layer");
|
||||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
#endif
|
#endif
|
||||||
|
@ -296,7 +296,8 @@ public:
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
class SkinnedPass1Shader : public TextureShader<SkinnedPass1Shader, 1,
|
class SkinnedPass1Shader : public TextureShader<SkinnedPass1Shader, 1,
|
||||||
core::matrix4, core::matrix4,
|
core::matrix4, core::matrix4,
|
||||||
int>
|
int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedPass1Shader();
|
SkinnedPass1Shader();
|
||||||
@ -304,7 +305,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedSkinnedPass1Shader
|
class InstancedSkinnedPass1Shader
|
||||||
: public TextureShader<InstancedSkinnedPass1Shader, 1>
|
: public TextureShader<InstancedSkinnedPass1Shader, 1>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InstancedSkinnedPass1Shader();
|
InstancedSkinnedPass1Shader();
|
||||||
@ -313,7 +315,8 @@ public:
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
class SkinnedPass2Shader : public TextureShader<SkinnedPass2Shader, 6,
|
class SkinnedPass2Shader : public TextureShader<SkinnedPass2Shader, 6,
|
||||||
core::matrix4, core::vector2df,
|
core::matrix4, core::vector2df,
|
||||||
core::vector2df, int >
|
core::vector2df, int >,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedPass2Shader();
|
SkinnedPass2Shader();
|
||||||
@ -321,7 +324,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedSkinnedPass2Shader
|
class InstancedSkinnedPass2Shader
|
||||||
: public TextureShader<InstancedSkinnedPass2Shader, 6>
|
: public TextureShader<InstancedSkinnedPass2Shader, 6>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InstancedSkinnedPass2Shader();
|
InstancedSkinnedPass2Shader();
|
||||||
@ -331,7 +335,8 @@ public:
|
|||||||
class SkinnedRefPass1Shader : public TextureShader<SkinnedRefPass1Shader, 2,
|
class SkinnedRefPass1Shader : public TextureShader<SkinnedRefPass1Shader, 2,
|
||||||
core::matrix4,
|
core::matrix4,
|
||||||
core::matrix4,
|
core::matrix4,
|
||||||
core::vector2df, int>
|
core::vector2df, int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedRefPass1Shader();
|
SkinnedRefPass1Shader();
|
||||||
@ -339,7 +344,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedSkinnedRefPass1Shader
|
class InstancedSkinnedRefPass1Shader
|
||||||
: public TextureShader<InstancedSkinnedRefPass1Shader, 2>
|
: public TextureShader<InstancedSkinnedRefPass1Shader, 2>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InstancedSkinnedRefPass1Shader();
|
InstancedSkinnedRefPass1Shader();
|
||||||
@ -349,7 +355,8 @@ public:
|
|||||||
class SkinnedRefPass2Shader : public TextureShader<SkinnedRefPass2Shader, 6,
|
class SkinnedRefPass2Shader : public TextureShader<SkinnedRefPass2Shader, 6,
|
||||||
core::matrix4,
|
core::matrix4,
|
||||||
core::vector2df,
|
core::vector2df,
|
||||||
core::vector2df, int>
|
core::vector2df, int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedRefPass2Shader();
|
SkinnedRefPass2Shader();
|
||||||
@ -357,7 +364,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedSkinnedRefPass2Shader
|
class InstancedSkinnedRefPass2Shader
|
||||||
: public TextureShader<InstancedSkinnedRefPass2Shader, 6>
|
: public TextureShader<InstancedSkinnedRefPass2Shader, 6>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InstancedSkinnedRefPass2Shader();
|
InstancedSkinnedRefPass2Shader();
|
||||||
@ -366,7 +374,8 @@ public:
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
class SkinnedUnlitShader : public TextureShader<SkinnedUnlitShader, 4,
|
class SkinnedUnlitShader : public TextureShader<SkinnedUnlitShader, 4,
|
||||||
core::matrix4, core::vector2df,
|
core::matrix4, core::vector2df,
|
||||||
int>
|
int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedUnlitShader();
|
SkinnedUnlitShader();
|
||||||
@ -374,7 +383,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedSkinnedUnlitShader
|
class InstancedSkinnedUnlitShader
|
||||||
: public TextureShader<InstancedSkinnedUnlitShader, 4>
|
: public TextureShader<InstancedSkinnedUnlitShader, 4>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InstancedSkinnedUnlitShader();
|
InstancedSkinnedUnlitShader();
|
||||||
@ -383,7 +393,8 @@ public:
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
class SkinnedNormalMapShader : public TextureShader<SkinnedNormalMapShader, 2,
|
class SkinnedNormalMapShader : public TextureShader<SkinnedNormalMapShader, 2,
|
||||||
core::matrix4,
|
core::matrix4,
|
||||||
core::matrix4, int>
|
core::matrix4, int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedNormalMapShader();
|
SkinnedNormalMapShader();
|
||||||
@ -391,7 +402,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedSkinnedNormalMapShader
|
class InstancedSkinnedNormalMapShader
|
||||||
: public TextureShader<InstancedSkinnedNormalMapShader, 2>
|
: public TextureShader<InstancedSkinnedNormalMapShader, 2>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InstancedSkinnedNormalMapShader();
|
InstancedSkinnedNormalMapShader();
|
||||||
@ -399,7 +411,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class SkinnedShadowShader : public TextureShader<SkinnedShadowShader, 0,
|
class SkinnedShadowShader : public TextureShader<SkinnedShadowShader, 0,
|
||||||
core::matrix4, int, int>
|
core::matrix4, int, int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedShadowShader();
|
SkinnedShadowShader();
|
||||||
@ -407,7 +420,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedSkinnedShadowShader
|
class InstancedSkinnedShadowShader
|
||||||
: public TextureShader<InstancedSkinnedShadowShader, 0, int>
|
: public TextureShader<InstancedSkinnedShadowShader, 0, int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InstancedSkinnedShadowShader();
|
InstancedSkinnedShadowShader();
|
||||||
@ -415,7 +429,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class SkinnedRefShadowShader : public TextureShader<SkinnedRefShadowShader, 1,
|
class SkinnedRefShadowShader : public TextureShader<SkinnedRefShadowShader, 1,
|
||||||
core::matrix4, int, int>
|
core::matrix4, int, int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedRefShadowShader();
|
SkinnedRefShadowShader();
|
||||||
@ -423,7 +438,8 @@ public:
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedSkinnedRefShadowShader
|
class InstancedSkinnedRefShadowShader
|
||||||
: public TextureShader<InstancedSkinnedRefShadowShader, 1, int>
|
: public TextureShader<InstancedSkinnedRefShadowShader, 1, int>,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InstancedSkinnedRefShadowShader();
|
InstancedSkinnedRefShadowShader();
|
||||||
|
@ -124,3 +124,14 @@ ParticleKind* ParticleKindManager::getParticles(const std::string &name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
bool ParticleKindManager::isGlobalParticleMaterial(Material* m) const
|
||||||
|
{
|
||||||
|
for (auto& p : m_kinds)
|
||||||
|
{
|
||||||
|
if (p.second->getMaterial() == m)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
class Material;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Holds and manages a list of all types of particles
|
* \brief Holds and manages a list of all types of particles
|
||||||
* \ingroup graphics
|
* \ingroup graphics
|
||||||
@ -45,6 +47,7 @@ public:
|
|||||||
|
|
||||||
ParticleKind* getParticles(const std::string &name);
|
ParticleKind* getParticles(const std::string &name);
|
||||||
|
|
||||||
|
bool isGlobalParticleMaterial(Material* m) const;
|
||||||
void cleanUpTrackSpecificGfx();
|
void cleanUpTrackSpecificGfx();
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
|
@ -998,7 +998,7 @@ void PostProcessing::renderGaussian3Blur(const FrameBuffer &in_fbo,
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void PostProcessing::renderGaussian6BlurLayer(const FrameBuffer &in_fbo,
|
void PostProcessing::renderGaussian6BlurLayer(const FrameBuffer &in_fbo,
|
||||||
const FrameBuffer &scalar_fbo,
|
const FrameBuffer &scalar_fbo,
|
||||||
size_t layer, float sigma_h,
|
unsigned int layer, float sigma_h,
|
||||||
float sigma_v) const
|
float sigma_v) const
|
||||||
{
|
{
|
||||||
#if !defined(USE_GLES2)
|
#if !defined(USE_GLES2)
|
||||||
|
@ -93,7 +93,7 @@ public:
|
|||||||
void renderHorizontalBlur(const FrameBuffer &in_fbo, const FrameBuffer &auxiliary) const;
|
void renderHorizontalBlur(const FrameBuffer &in_fbo, const FrameBuffer &auxiliary) const;
|
||||||
|
|
||||||
void renderGaussian6BlurLayer(const FrameBuffer &in_fbo, const FrameBuffer &scalar_fbo,
|
void renderGaussian6BlurLayer(const FrameBuffer &in_fbo, const FrameBuffer &scalar_fbo,
|
||||||
size_t layer, float sigmaH, float sigmaV) const;
|
unsigned int layer, float sigmaH, float sigmaV) const;
|
||||||
void renderGaussian17TapBlur(const FrameBuffer &in_fbo,
|
void renderGaussian17TapBlur(const FrameBuffer &in_fbo,
|
||||||
const FrameBuffer &auxiliary,
|
const FrameBuffer &auxiliary,
|
||||||
const FrameBuffer &linear_depth) const;
|
const FrameBuffer &linear_depth) const;
|
||||||
|
@ -76,7 +76,10 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool isStatic() const { return m_dynamic_hue.empty(); }
|
bool isStatic() const { return m_dynamic_hue.empty(); }
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
unsigned int getNumberOfHue() const { return m_dynamic_hue.size(); }
|
unsigned int getNumberOfHue() const
|
||||||
|
{
|
||||||
|
return (unsigned int)m_dynamic_hue.size();
|
||||||
|
} // getNumberOfHue
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
float getDynamicHue(unsigned int hue) const
|
float getDynamicHue(unsigned int hue) const
|
||||||
{
|
{
|
||||||
|
@ -25,7 +25,9 @@
|
|||||||
#include "graphics/materials.hpp"
|
#include "graphics/materials.hpp"
|
||||||
#include "utils/log.hpp"
|
#include "utils/log.hpp"
|
||||||
|
|
||||||
static GLuint generateRTT3D(GLenum target, size_t w, size_t h, size_t d, GLint internalFormat, GLint format, GLint type, unsigned mipmaplevel = 1)
|
static GLuint generateRTT3D(GLenum target, unsigned int w, unsigned int h,
|
||||||
|
unsigned int d, GLint internalFormat, GLint format,
|
||||||
|
GLint type, unsigned mipmaplevel = 1)
|
||||||
{
|
{
|
||||||
GLuint result;
|
GLuint result;
|
||||||
glGenTextures(1, &result);
|
glGenTextures(1, &result);
|
||||||
@ -49,10 +51,10 @@ static GLuint generateRTT(const core::dimension2du &res, GLint internalFormat, G
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
RTT::RTT(size_t width, size_t height, float rtt_scale)
|
RTT::RTT(unsigned int width, unsigned int height, float rtt_scale)
|
||||||
{
|
{
|
||||||
m_width = size_t(width * rtt_scale);
|
m_width = (unsigned int)(width * rtt_scale);
|
||||||
m_height = size_t(height * rtt_scale);
|
m_height = (unsigned int)(height * rtt_scale);
|
||||||
m_shadow_FBO = NULL;
|
m_shadow_FBO = NULL;
|
||||||
m_RH_FBO = NULL;
|
m_RH_FBO = NULL;
|
||||||
m_RSM = NULL;
|
m_RSM = NULL;
|
||||||
|
@ -144,11 +144,11 @@ enum TypeRTT : unsigned int
|
|||||||
class RTT
|
class RTT
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RTT(size_t width, size_t height, float rtt_scale = 1.0f);
|
RTT(unsigned int width, unsigned int height, float rtt_scale = 1.0f);
|
||||||
~RTT();
|
~RTT();
|
||||||
|
|
||||||
size_t getWidth () const { return m_width ; }
|
unsigned int getWidth () const { return m_width ; }
|
||||||
size_t getHeight() const { return m_height; }
|
unsigned int getHeight() const { return m_height; }
|
||||||
|
|
||||||
FrameBuffer &getShadowFrameBuffer() { return *m_shadow_FBO; }
|
FrameBuffer &getShadowFrameBuffer() { return *m_shadow_FBO; }
|
||||||
FrameBuffer &getRadianceHintFrameBuffer() { return *m_RH_FBO; }
|
FrameBuffer &getRadianceHintFrameBuffer() { return *m_RH_FBO; }
|
||||||
@ -165,8 +165,8 @@ private:
|
|||||||
std::vector<uint64_t> m_prefilled_handles;
|
std::vector<uint64_t> m_prefilled_handles;
|
||||||
unsigned DepthStencilTexture;
|
unsigned DepthStencilTexture;
|
||||||
|
|
||||||
size_t m_width;
|
unsigned int m_width;
|
||||||
size_t m_height;
|
unsigned int m_height;
|
||||||
|
|
||||||
unsigned shadowColorTex, shadowDepthTex;
|
unsigned shadowColorTex, shadowDepthTex;
|
||||||
unsigned RSM_Color, RSM_Normal, RSM_Depth;
|
unsigned RSM_Color, RSM_Normal, RSM_Depth;
|
||||||
|
@ -146,9 +146,8 @@ private:
|
|||||||
/** End of recursive implementation of assignUniforms. */
|
/** End of recursive implementation of assignUniforms. */
|
||||||
void assignUniformsImpl()
|
void assignUniformsImpl()
|
||||||
{
|
{
|
||||||
bindPoint("MatrixData", 0);
|
bindPoint("MatrixesData", 0);
|
||||||
bindPoint("LightingData", 1);
|
bindPoint("LightingData", 1);
|
||||||
bindPoint("SkinningData", 2);
|
|
||||||
} // assignUniformsImpl
|
} // assignUniformsImpl
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@ -367,6 +366,8 @@ public:
|
|||||||
}
|
}
|
||||||
} // loadProgram
|
} // loadProgram
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
virtual void bindCustomTextures() {}
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void drawFullScreenEffect(Args...args)
|
void drawFullScreenEffect(Args...args)
|
||||||
{
|
{
|
||||||
@ -379,6 +380,50 @@ public:
|
|||||||
}; // Shader
|
}; // Shader
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
class SkinnedMeshShader
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
GLuint m_skinning_location;
|
||||||
|
public:
|
||||||
|
SkinnedMeshShader() : m_skinning_location(0) {}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
template <typename Shader>
|
||||||
|
void init(Shader* s)
|
||||||
|
{
|
||||||
|
s->use();
|
||||||
|
#ifndef USE_GLES2
|
||||||
|
if (CVS->isARBShaderStorageBufferObjectUsable() &&
|
||||||
|
CVS->supportsHardwareSkinning())
|
||||||
|
{
|
||||||
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0,
|
||||||
|
SharedGPUObjects::getSkinningBuffer());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
m_skinning_location = s->getUniformLocation("skinning_tex");
|
||||||
|
glUniform1i(m_skinning_location, 15);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void bindSkinningTexture()
|
||||||
|
{
|
||||||
|
#ifdef USE_GLES2
|
||||||
|
glActiveTexture(GL_TEXTURE0 + 15);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, SharedGPUObjects::getSkinningTexture());
|
||||||
|
glBindSampler(15, 0);
|
||||||
|
#else
|
||||||
|
if (!CVS->isARBShaderStorageBufferObjectUsable())
|
||||||
|
{
|
||||||
|
glActiveTexture(GL_TEXTURE0 + 15);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
|
SharedGPUObjects::getSkinningTexture());
|
||||||
|
glBindSampler(15, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -152,42 +152,9 @@ void ShaderBasedRenderer::prepareForwardRenderer()
|
|||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
/** Upload lighting info to the dedicated uniform buffer
|
|
||||||
*/
|
|
||||||
void ShaderBasedRenderer::uploadLightingData() const
|
|
||||||
{
|
|
||||||
assert(CVS->isARBUniformBufferObjectUsable());
|
|
||||||
|
|
||||||
float Lighting[36];
|
|
||||||
|
|
||||||
core::vector3df sun_direction = irr_driver->getSunDirection();
|
|
||||||
video::SColorf sun_color = irr_driver->getSunColor();
|
|
||||||
|
|
||||||
Lighting[0] = sun_direction.X;
|
|
||||||
Lighting[1] = sun_direction.Y;
|
|
||||||
Lighting[2] = sun_direction.Z;
|
|
||||||
Lighting[4] = sun_color.getRed();
|
|
||||||
Lighting[5] = sun_color.getGreen();
|
|
||||||
Lighting[6] = sun_color.getBlue();
|
|
||||||
Lighting[7] = 0.54f;
|
|
||||||
|
|
||||||
const SHCoefficients* sh_coeff = m_spherical_harmonics->getCoefficients();
|
|
||||||
|
|
||||||
if(sh_coeff) {
|
|
||||||
memcpy(&Lighting[8], sh_coeff->blue_SH_coeff, 9 * sizeof(float));
|
|
||||||
memcpy(&Lighting[17], sh_coeff->green_SH_coeff, 9 * sizeof(float));
|
|
||||||
memcpy(&Lighting[26], sh_coeff->red_SH_coeff, 9 * sizeof(float));
|
|
||||||
}
|
|
||||||
|
|
||||||
glBindBuffer(GL_UNIFORM_BUFFER, SharedGPUObjects::getLightingDataUBO());
|
|
||||||
glBufferSubData(GL_UNIFORM_BUFFER, 0, 36 * sizeof(float), Lighting);
|
|
||||||
} // uploadLightingData
|
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void ShaderBasedRenderer::computeMatrixesAndCameras(scene::ICameraSceneNode *const camnode,
|
void ShaderBasedRenderer::computeMatrixesAndCameras(scene::ICameraSceneNode *const camnode,
|
||||||
size_t width, size_t height)
|
unsigned int width, unsigned int height)
|
||||||
{
|
{
|
||||||
m_current_screen_size = core::vector2df((float)width, (float)height);
|
m_current_screen_size = core::vector2df((float)width, (float)height);
|
||||||
m_shadow_matrices.computeMatrixesAndCameras(camnode, width, height,
|
m_shadow_matrices.computeMatrixesAndCameras(camnode, width, height,
|
||||||
@ -237,8 +204,6 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
|
|||||||
{
|
{
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, 0, SharedGPUObjects::getViewProjectionMatricesUBO());
|
glBindBufferBase(GL_UNIFORM_BUFFER, 0, SharedGPUObjects::getViewProjectionMatricesUBO());
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, 1, SharedGPUObjects::getLightingDataUBO());
|
glBindBufferBase(GL_UNIFORM_BUFFER, 1, SharedGPUObjects::getLightingDataUBO());
|
||||||
if (CVS->supportsHardwareSkinning())
|
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, 2, SharedGPUObjects::getSkinningUBO());
|
|
||||||
}
|
}
|
||||||
irr_driver->getSceneManager()->setActiveCamera(camnode);
|
irr_driver->getSceneManager()->setActiveCamera(camnode);
|
||||||
|
|
||||||
@ -668,8 +633,8 @@ ShaderBasedRenderer::~ShaderBasedRenderer()
|
|||||||
void ShaderBasedRenderer::onLoadWorld()
|
void ShaderBasedRenderer::onLoadWorld()
|
||||||
{
|
{
|
||||||
const core::recti &viewport = Camera::getCamera(0)->getViewport();
|
const core::recti &viewport = Camera::getCamera(0)->getViewport();
|
||||||
size_t width = viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X;
|
unsigned int width = viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X;
|
||||||
size_t height = viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y;
|
unsigned int height = viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y;
|
||||||
RTT* rtts = new RTT(width, height, CVS->isDefferedEnabled() ?
|
RTT* rtts = new RTT(width, height, CVS->isDefferedEnabled() ?
|
||||||
UserConfigParams::m_scale_rtts_factor : 1.0f);
|
UserConfigParams::m_scale_rtts_factor : 1.0f);
|
||||||
setRTT(rtts);
|
setRTT(rtts);
|
||||||
@ -812,11 +777,9 @@ void ShaderBasedRenderer::render(float dt)
|
|||||||
glEnable(GL_FRAMEBUFFER_SRGB);
|
glEnable(GL_FRAMEBUFFER_SRGB);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PROFILER_PUSH_CPU_MARKER("UBO upload", 0x0, 0xFF, 0x0);
|
PROFILER_PUSH_CPU_MARKER("Update camera matrices", 0x0, 0xFF, 0x0);
|
||||||
computeMatrixesAndCameras(camnode, m_rtts->getWidth(), m_rtts->getHeight());
|
computeMatrixesAndCameras(camnode, m_rtts->getWidth(), m_rtts->getHeight());
|
||||||
m_shadow_matrices.updateSunOrthoMatrices();
|
m_shadow_matrices.updateSunOrthoMatrices();
|
||||||
if(CVS->isARBUniformBufferObjectUsable())
|
|
||||||
uploadLightingData();
|
|
||||||
PROFILER_POP_CPU_MARKER();
|
PROFILER_POP_CPU_MARKER();
|
||||||
renderScene(camnode, dt, track->hasShadows(), false);
|
renderScene(camnode, dt, track->hasShadows(), false);
|
||||||
|
|
||||||
@ -923,9 +886,6 @@ void ShaderBasedRenderer::renderToTexture(GL3RenderTarget *render_target,
|
|||||||
irr_driver->getSceneManager()->setActiveCamera(camera);
|
irr_driver->getSceneManager()->setActiveCamera(camera);
|
||||||
|
|
||||||
computeMatrixesAndCameras(camera, m_rtts->getWidth(), m_rtts->getHeight());
|
computeMatrixesAndCameras(camera, m_rtts->getWidth(), m_rtts->getHeight());
|
||||||
if (CVS->isARBUniformBufferObjectUsable())
|
|
||||||
uploadLightingData();
|
|
||||||
|
|
||||||
renderScene(camera, dt, false, true);
|
renderScene(camera, dt, false, true);
|
||||||
render_target->setFrameBuffer(m_post_processing
|
render_target->setFrameBuffer(m_post_processing
|
||||||
->render(camera, false, m_rtts));
|
->render(camera, false, m_rtts));
|
||||||
|
@ -52,7 +52,7 @@ private:
|
|||||||
/** Static glowing things are loaded once per track.
|
/** Static glowing things are loaded once per track.
|
||||||
* Glowing items can appear ordisappear each frame */
|
* Glowing items can appear ordisappear each frame */
|
||||||
std::vector<GlowData> m_glowing;
|
std::vector<GlowData> m_glowing;
|
||||||
size_t m_nb_static_glowing;
|
unsigned int m_nb_static_glowing;
|
||||||
|
|
||||||
void setOverrideMaterial();
|
void setOverrideMaterial();
|
||||||
|
|
||||||
@ -61,10 +61,8 @@ private:
|
|||||||
|
|
||||||
void prepareForwardRenderer();
|
void prepareForwardRenderer();
|
||||||
|
|
||||||
void uploadLightingData() const;
|
|
||||||
|
|
||||||
void computeMatrixesAndCameras(scene::ICameraSceneNode * const camnode,
|
void computeMatrixesAndCameras(scene::ICameraSceneNode * const camnode,
|
||||||
size_t width, size_t height);
|
unsigned int width, unsigned int height);
|
||||||
|
|
||||||
void resetShadowCamNodes(){m_shadow_matrices.resetShadowCamNodes();}
|
void resetShadowCamNodes(){m_shadow_matrices.resetShadowCamNodes();}
|
||||||
|
|
||||||
|
@ -18,8 +18,8 @@
|
|||||||
#ifndef SERVER_ONLY
|
#ifndef SERVER_ONLY
|
||||||
|
|
||||||
#include "graphics/shader_files_manager.hpp"
|
#include "graphics/shader_files_manager.hpp"
|
||||||
|
#include "config/stk_config.hpp"
|
||||||
#include "graphics/central_settings.hpp"
|
#include "graphics/central_settings.hpp"
|
||||||
#include "graphics/shared_gpu_objects.hpp"
|
|
||||||
#include "io/file_manager.hpp"
|
#include "io/file_manager.hpp"
|
||||||
#include "utils/log.hpp"
|
#include "utils/log.hpp"
|
||||||
|
|
||||||
@ -170,7 +170,9 @@ GLuint ShaderFilesManager::loadShader(const std::string &file, unsigned type)
|
|||||||
code << "#define Advanced_Lighting_Enabled\n";
|
code << "#define Advanced_Lighting_Enabled\n";
|
||||||
if (CVS->isARBSRGBFramebufferUsable())
|
if (CVS->isARBSRGBFramebufferUsable())
|
||||||
code << "#define sRGB_Framebuffer_Usable\n";
|
code << "#define sRGB_Framebuffer_Usable\n";
|
||||||
|
if (CVS->isARBShaderStorageBufferObjectUsable() &&
|
||||||
|
CVS->supportsHardwareSkinning())
|
||||||
|
code << "#define SSBO_SKINNING\n";
|
||||||
#if !defined(USE_GLES2)
|
#if !defined(USE_GLES2)
|
||||||
// shader compilation fails with some drivers if there is no precision
|
// shader compilation fails with some drivers if there is no precision
|
||||||
// qualifier
|
// qualifier
|
||||||
@ -186,7 +188,7 @@ GLuint ShaderFilesManager::loadShader(const std::string &file, unsigned type)
|
|||||||
else
|
else
|
||||||
code << "precision mediump float;\n";
|
code << "precision mediump float;\n";
|
||||||
#endif
|
#endif
|
||||||
code << "#define MAX_BONES " << SharedGPUObjects::getMaxMat4Size() << "\n";
|
code << "#define MAX_BONES " << stk_config->m_max_skinning_bones << "\n";
|
||||||
|
|
||||||
code << getHeader();
|
code << getHeader();
|
||||||
|
|
||||||
@ -195,7 +197,7 @@ GLuint ShaderFilesManager::loadShader(const std::string &file, unsigned type)
|
|||||||
Log::info("ShaderFilesManager", "Compiling shader : %s", file.c_str());
|
Log::info("ShaderFilesManager", "Compiling shader : %s", file.c_str());
|
||||||
const std::string &source = code.str();
|
const std::string &source = code.str();
|
||||||
char const *source_pointer = source.c_str();
|
char const *source_pointer = source.c_str();
|
||||||
int len = source.size();
|
int len = (int)source.size();
|
||||||
glShaderSource(id, 1, &source_pointer, &len);
|
glShaderSource(id, 1, &source_pointer, &len);
|
||||||
glCompileShader(id);
|
glCompileShader(id);
|
||||||
|
|
||||||
|
@ -277,6 +277,10 @@ Shaders::SkinnedTransparentShader::SkinnedTransparentShader()
|
|||||||
if (!CVS->supportsHardwareSkinning()) return;
|
if (!CVS->supportsHardwareSkinning()) return;
|
||||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||||
GL_FRAGMENT_SHADER, "transparent.frag");
|
GL_FRAGMENT_SHADER, "transparent.frag");
|
||||||
|
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||||
|
{
|
||||||
|
sms->init(this);
|
||||||
|
}
|
||||||
assignUniforms("ModelMatrix", "texture_trans", "skinning_offset", "custom_alpha");
|
assignUniforms("ModelMatrix", "texture_trans", "skinning_offset", "custom_alpha");
|
||||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
} // SkinnedTransparentShader
|
} // SkinnedTransparentShader
|
||||||
|
@ -140,7 +140,8 @@ public:
|
|||||||
// ========================================================================
|
// ========================================================================
|
||||||
class SkinnedTransparentShader : public TextureShader<SkinnedTransparentShader, 1,
|
class SkinnedTransparentShader : public TextureShader<SkinnedTransparentShader, 1,
|
||||||
core::matrix4, core::vector2df,
|
core::matrix4, core::vector2df,
|
||||||
int, float >
|
int, float >,
|
||||||
|
public SkinnedMeshShader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SkinnedTransparentShader();
|
SkinnedTransparentShader();
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "graphics/post_processing.hpp"
|
#include "graphics/post_processing.hpp"
|
||||||
#include "graphics/rtts.hpp"
|
#include "graphics/rtts.hpp"
|
||||||
#include "graphics/shared_gpu_objects.hpp"
|
#include "graphics/shared_gpu_objects.hpp"
|
||||||
|
#include "graphics/spherical_harmonics.hpp"
|
||||||
#include "graphics/texture_shader.hpp"
|
#include "graphics/texture_shader.hpp"
|
||||||
#include "modes/world.hpp"
|
#include "modes/world.hpp"
|
||||||
#include "physics/triangle_mesh.hpp"
|
#include "physics/triangle_mesh.hpp"
|
||||||
@ -311,6 +312,55 @@ void ShadowMatrices::updateSplitAndLightcoordRangeFromComputeShaders(unsigned in
|
|||||||
#endif
|
#endif
|
||||||
} // updateSplitAndLightcoordRangeFromComputeShaders
|
} // updateSplitAndLightcoordRangeFromComputeShaders
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void ShadowMatrices::updateUBO()
|
||||||
|
{
|
||||||
|
if (!CVS->isARBUniformBufferObjectUsable())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
float lighting[36] = {};
|
||||||
|
core::vector3df sun_direction = irr_driver->getSunDirection();
|
||||||
|
video::SColorf sun_color = irr_driver->getSunColor();
|
||||||
|
|
||||||
|
lighting[0] = sun_direction.X;
|
||||||
|
lighting[1] = sun_direction.Y;
|
||||||
|
lighting[2] = sun_direction.Z;
|
||||||
|
lighting[4] = sun_color.getRed();
|
||||||
|
lighting[5] = sun_color.getGreen();
|
||||||
|
lighting[6] = sun_color.getBlue();
|
||||||
|
lighting[7] = 0.54f;
|
||||||
|
|
||||||
|
const SHCoefficients* sh_coeff = irr_driver->getSHCoefficients();
|
||||||
|
|
||||||
|
if (sh_coeff)
|
||||||
|
{
|
||||||
|
memcpy(&lighting[8], sh_coeff->blue_SH_coeff, 9 * sizeof(float));
|
||||||
|
memcpy(&lighting[17], sh_coeff->green_SH_coeff, 9 * sizeof(float));
|
||||||
|
memcpy(&lighting[26], sh_coeff->red_SH_coeff, 9 * sizeof(float));
|
||||||
|
}
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, SharedGPUObjects::getLightingDataUBO());
|
||||||
|
void* ptr = glMapBufferRange(GL_UNIFORM_BUFFER, 0, 36 * 4,
|
||||||
|
GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT |
|
||||||
|
GL_MAP_INVALIDATE_BUFFER_BIT);
|
||||||
|
memcpy(ptr, lighting, 36 * 4);
|
||||||
|
glUnmapBuffer(GL_UNIFORM_BUFFER);
|
||||||
|
|
||||||
|
if (CVS->isSDSMEnabled())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER,
|
||||||
|
SharedGPUObjects::getViewProjectionMatricesUBO());
|
||||||
|
ptr = glMapBufferRange(GL_UNIFORM_BUFFER, 0, (16 * 9 + 2) * 4,
|
||||||
|
GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT |
|
||||||
|
GL_MAP_INVALIDATE_BUFFER_BIT);
|
||||||
|
memcpy(ptr, m_ubo_data, (16 * 9 + 2) * 4);
|
||||||
|
glUnmapBuffer(GL_UNIFORM_BUFFER);
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||||
|
} // updateUBO
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
/** Generate View, Projection, Inverse View, Inverse Projection, ViewProjection
|
/** Generate View, Projection, Inverse View, Inverse Projection, ViewProjection
|
||||||
* and InverseProjection matrixes and matrixes and cameras for the four shadow
|
* and InverseProjection matrixes and matrixes and cameras for the four shadow
|
||||||
@ -338,12 +388,11 @@ void ShadowMatrices::computeMatrixesAndCameras(scene::ICameraSceneNode *const ca
|
|||||||
const float oldfar = camnode->getFarValue();
|
const float oldfar = camnode->getFarValue();
|
||||||
const float oldnear = camnode->getNearValue();
|
const float oldnear = camnode->getNearValue();
|
||||||
|
|
||||||
float tmp[16 * 9 + 2];
|
memcpy(m_ubo_data, irr_driver->getViewMatrix().pointer(), 16 * sizeof(float));
|
||||||
memcpy(tmp, irr_driver->getViewMatrix().pointer(), 16 * sizeof(float));
|
memcpy(&m_ubo_data[16], irr_driver->getProjMatrix().pointer(), 16 * sizeof(float));
|
||||||
memcpy(&tmp[16], irr_driver->getProjMatrix().pointer(), 16 * sizeof(float));
|
memcpy(&m_ubo_data[32], irr_driver->getInvViewMatrix().pointer(), 16 * sizeof(float));
|
||||||
memcpy(&tmp[32], irr_driver->getInvViewMatrix().pointer(), 16 * sizeof(float));
|
memcpy(&m_ubo_data[48], irr_driver->getInvProjMatrix().pointer(), 16 * sizeof(float));
|
||||||
memcpy(&tmp[48], irr_driver->getInvProjMatrix().pointer(), 16 * sizeof(float));
|
memcpy(&m_ubo_data[64], irr_driver->getProjViewMatrix().pointer(), 16 * sizeof(float));
|
||||||
memcpy(&tmp[64], irr_driver->getProjViewMatrix().pointer(), 16 * sizeof(float));
|
|
||||||
|
|
||||||
m_sun_cam->render();
|
m_sun_cam->render();
|
||||||
for (unsigned i = 0; i < 4; i++)
|
for (unsigned i = 0; i < 4; i++)
|
||||||
@ -469,27 +518,23 @@ void ShadowMatrices::computeMatrixesAndCameras(scene::ICameraSceneNode *const ca
|
|||||||
|
|
||||||
size_t size = m_sun_ortho_matrices.size();
|
size_t size = m_sun_ortho_matrices.size();
|
||||||
for (unsigned i = 0; i < size; i++)
|
for (unsigned i = 0; i < size; i++)
|
||||||
memcpy(&tmp[16 * i + 80],
|
memcpy(&m_ubo_data[16 * i + 80],
|
||||||
m_sun_ortho_matrices[i].pointer(),
|
m_sun_ortho_matrices[i].pointer(),
|
||||||
16 * sizeof(float));
|
16 * sizeof(float));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!CVS->isARBUniformBufferObjectUsable())
|
m_ubo_data[144] = float(width);
|
||||||
return;
|
m_ubo_data[145] = float(height);
|
||||||
|
|
||||||
tmp[144] = float(width);
|
|
||||||
tmp[145] = float(height);
|
|
||||||
glBindBuffer(GL_UNIFORM_BUFFER,
|
|
||||||
SharedGPUObjects::getViewProjectionMatricesUBO());
|
|
||||||
if (CVS->isSDSMEnabled())
|
if (CVS->isSDSMEnabled())
|
||||||
{
|
{
|
||||||
glBufferSubData(GL_UNIFORM_BUFFER, 0, (16 * 5) * sizeof(float), tmp);
|
glBindBuffer(GL_UNIFORM_BUFFER,
|
||||||
|
SharedGPUObjects::getViewProjectionMatricesUBO());
|
||||||
|
glBufferSubData(GL_UNIFORM_BUFFER, 0, (16 * 5) * sizeof(float),
|
||||||
|
m_ubo_data);
|
||||||
glBufferSubData(GL_UNIFORM_BUFFER, (16 * 9) * sizeof(float),
|
glBufferSubData(GL_UNIFORM_BUFFER, (16 * 9) * sizeof(float),
|
||||||
2 * sizeof(float), &tmp[144]);
|
2 * sizeof(float), &m_ubo_data[144]);
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
glBufferSubData(GL_UNIFORM_BUFFER, 0, (16 * 9 + 2) * sizeof(float),
|
|
||||||
tmp);
|
|
||||||
} // computeMatrixesAndCameras
|
} // computeMatrixesAndCameras
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -49,6 +49,7 @@ private:
|
|||||||
core::matrix4 m_rsm_matrix;
|
core::matrix4 m_rsm_matrix;
|
||||||
bool m_rsm_matrix_initialized;
|
bool m_rsm_matrix_initialized;
|
||||||
float m_shadows_cam[4][24];
|
float m_shadows_cam[4][24];
|
||||||
|
float m_ubo_data[16 * 9 + 2];
|
||||||
bool m_rsm_map_available;
|
bool m_rsm_map_available;
|
||||||
core::vector3df m_rh_extend;
|
core::vector3df m_rh_extend;
|
||||||
core::matrix4 m_rh_matrix;
|
core::matrix4 m_rh_matrix;
|
||||||
@ -104,6 +105,7 @@ public:
|
|||||||
return m_shadow_scales;
|
return m_shadow_scales;
|
||||||
}
|
}
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
void updateUBO();
|
||||||
|
|
||||||
}; // class ShadowMatrices
|
}; // class ShadowMatrices
|
||||||
|
|
||||||
|
@ -18,12 +18,10 @@
|
|||||||
#ifndef SERVER_ONLY
|
#ifndef SERVER_ONLY
|
||||||
|
|
||||||
#include "graphics/shared_gpu_objects.hpp"
|
#include "graphics/shared_gpu_objects.hpp"
|
||||||
|
#include "config/stk_config.hpp"
|
||||||
#include "graphics/central_settings.hpp"
|
#include "graphics/central_settings.hpp"
|
||||||
#include "utils/log.hpp"
|
#include "utils/log.hpp"
|
||||||
|
|
||||||
#include "matrix4.h"
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
GLuint SharedGPUObjects::m_sky_tri_vbo;
|
GLuint SharedGPUObjects::m_sky_tri_vbo;
|
||||||
GLuint SharedGPUObjects::m_frustrum_vbo;
|
GLuint SharedGPUObjects::m_frustrum_vbo;
|
||||||
GLuint SharedGPUObjects::m_frustrum_indices;
|
GLuint SharedGPUObjects::m_frustrum_indices;
|
||||||
@ -33,8 +31,8 @@ GLuint SharedGPUObjects::m_full_screen_quad_vao;
|
|||||||
GLuint SharedGPUObjects::m_ui_vao;
|
GLuint SharedGPUObjects::m_ui_vao;
|
||||||
GLuint SharedGPUObjects::m_quad_buffer;
|
GLuint SharedGPUObjects::m_quad_buffer;
|
||||||
GLuint SharedGPUObjects::m_quad_vbo;
|
GLuint SharedGPUObjects::m_quad_vbo;
|
||||||
GLuint SharedGPUObjects::m_skinning_ubo;
|
GLuint SharedGPUObjects::m_skinning_tex;
|
||||||
int SharedGPUObjects::m_max_mat4_size = 1024;
|
GLuint SharedGPUObjects::m_skinning_buf;
|
||||||
bool SharedGPUObjects::m_has_been_initialised = false;
|
bool SharedGPUObjects::m_has_been_initialised = false;
|
||||||
|
|
||||||
/** Initialises m_full_screen_quad_vbo.
|
/** Initialises m_full_screen_quad_vbo.
|
||||||
@ -158,24 +156,61 @@ void SharedGPUObjects::initLightingDataUBO()
|
|||||||
} // initLightingDataUBO
|
} // initLightingDataUBO
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void SharedGPUObjects::initSkinningUBO()
|
void SharedGPUObjects::initSkinning()
|
||||||
{
|
{
|
||||||
assert(CVS->isARBUniformBufferObjectUsable());
|
glGenTextures(1, &m_skinning_tex);
|
||||||
irr::core::matrix4 m;
|
|
||||||
glGenBuffers(1, &m_skinning_ubo);
|
|
||||||
glBindBuffer(GL_UNIFORM_BUFFER, m_skinning_ubo);
|
|
||||||
int max_size = 0;
|
int max_size = 0;
|
||||||
glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &max_size);
|
#ifdef USE_GLES2
|
||||||
max_size = std::min(max_size, 65536);
|
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_size);
|
||||||
m_max_mat4_size = max_size / 16 / sizeof(float);
|
|
||||||
Log::info("SharedGPUObjects", "Hardware skinning supported, max joints"
|
if (stk_config->m_max_skinning_bones > (unsigned)max_size)
|
||||||
" support: %d", m_max_mat4_size);
|
{
|
||||||
glBufferData(GL_UNIFORM_BUFFER, max_size, 0, GL_STREAM_DRAW);
|
Log::warn("SharedGPUObjects", "Too many bones for skinning, max: %d",
|
||||||
// Reserve a identity matrix for non moving mesh in animated model used by
|
max_size);
|
||||||
// vertex shader calculation
|
stk_config->m_max_skinning_bones = max_size;
|
||||||
glBufferSubData(GL_UNIFORM_BUFFER, 0, 16 * sizeof(float), m.pointer());
|
}
|
||||||
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
Log::info("SharedGPUObjects", "Hardware Skinning enabled, method: %u"
|
||||||
} // initSkinningUBO
|
" (max bones) * 16 RGBA float texture",
|
||||||
|
stk_config->m_max_skinning_bones);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, m_skinning_tex);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16,
|
||||||
|
stk_config->m_max_skinning_bones, 0, GL_RGBA, GL_FLOAT, NULL);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
#else
|
||||||
|
|
||||||
|
glGenBuffers(1, &m_skinning_buf);
|
||||||
|
const bool ssbo = CVS->isARBShaderStorageBufferObjectUsable();
|
||||||
|
glGetIntegerv(ssbo ? GL_MAX_SHADER_STORAGE_BLOCK_SIZE :
|
||||||
|
GL_MAX_TEXTURE_BUFFER_SIZE, &max_size);
|
||||||
|
|
||||||
|
if (stk_config->m_max_skinning_bones * 64 > (unsigned)max_size)
|
||||||
|
{
|
||||||
|
Log::warn("SharedGPUObjects", "Too many bones for skinning, max: %d",
|
||||||
|
max_size >> 6);
|
||||||
|
stk_config->m_max_skinning_bones = max_size >> 6;
|
||||||
|
}
|
||||||
|
Log::info("SharedGPUObjects", "Hardware Skinning enabled, method: %s, "
|
||||||
|
"max bones: %u", CVS->isARBShaderStorageBufferObjectUsable() ?
|
||||||
|
"SSBO" : "TBO", stk_config->m_max_skinning_bones);
|
||||||
|
|
||||||
|
const GLenum buffer = ssbo ? GL_SHADER_STORAGE_BUFFER : GL_TEXTURE_BUFFER;
|
||||||
|
glBindBuffer(buffer, m_skinning_buf);
|
||||||
|
glBufferData(buffer, stk_config->m_max_skinning_bones * 64, NULL,
|
||||||
|
GL_DYNAMIC_DRAW);
|
||||||
|
if (!ssbo)
|
||||||
|
{
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, m_skinning_tex);
|
||||||
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_skinning_buf);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||||
|
}
|
||||||
|
glBindBuffer(buffer, 0);
|
||||||
|
#endif
|
||||||
|
} // initSkinning
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void SharedGPUObjects::init()
|
void SharedGPUObjects::init()
|
||||||
@ -186,13 +221,14 @@ void SharedGPUObjects::init()
|
|||||||
initQuadBuffer();
|
initQuadBuffer();
|
||||||
initSkyTriVBO();
|
initSkyTriVBO();
|
||||||
initFrustrumVBO();
|
initFrustrumVBO();
|
||||||
|
if (CVS->supportsHardwareSkinning())
|
||||||
|
{
|
||||||
|
initSkinning();
|
||||||
|
}
|
||||||
if (CVS->isARBUniformBufferObjectUsable())
|
if (CVS->isARBUniformBufferObjectUsable())
|
||||||
{
|
{
|
||||||
initShadowVPMUBO();
|
initShadowVPMUBO();
|
||||||
initLightingDataUBO();
|
initLightingDataUBO();
|
||||||
if (CVS->supportsHardwareSkinning())
|
|
||||||
initSkinningUBO();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_has_been_initialised = true;
|
m_has_been_initialised = true;
|
||||||
|
@ -35,8 +35,8 @@ private:
|
|||||||
static GLuint m_ui_vao;
|
static GLuint m_ui_vao;
|
||||||
static GLuint m_quad_buffer;
|
static GLuint m_quad_buffer;
|
||||||
static GLuint m_quad_vbo;
|
static GLuint m_quad_vbo;
|
||||||
static GLuint m_skinning_ubo;
|
static GLuint m_skinning_tex;
|
||||||
static int m_max_mat4_size;
|
static GLuint m_skinning_buf;
|
||||||
|
|
||||||
static void initQuadVBO();
|
static void initQuadVBO();
|
||||||
static void initQuadBuffer();
|
static void initQuadBuffer();
|
||||||
@ -44,7 +44,7 @@ private:
|
|||||||
static void initFrustrumVBO();
|
static void initFrustrumVBO();
|
||||||
static void initShadowVPMUBO();
|
static void initShadowVPMUBO();
|
||||||
static void initLightingDataUBO();
|
static void initLightingDataUBO();
|
||||||
static void initSkinningUBO();
|
static void initSkinning();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void init();
|
static void init();
|
||||||
@ -104,16 +104,18 @@ public:
|
|||||||
return m_quad_vbo;
|
return m_quad_vbo;
|
||||||
} // getQuadVBO
|
} // getQuadVBO
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
static GLuint getSkinningUBO()
|
static GLuint getSkinningTexture()
|
||||||
{
|
{
|
||||||
assert(m_has_been_initialised);
|
assert(m_has_been_initialised);
|
||||||
return m_skinning_ubo;
|
return m_skinning_tex;
|
||||||
} // getSkinningUBO
|
} // getSkinningTexture
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
static int getMaxMat4Size()
|
static GLuint getSkinningBuffer()
|
||||||
{
|
{
|
||||||
return m_max_mat4_size;
|
assert(m_has_been_initialised);
|
||||||
} // getMaxMat4Size
|
return m_skinning_buf;
|
||||||
|
} // getSkinningBuffer
|
||||||
|
|
||||||
}; // class SharedGPUObjects
|
}; // class SharedGPUObjects
|
||||||
|
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ void Skybox::generateSpecularCubemap()
|
|||||||
{
|
{
|
||||||
glGenTextures(1, &m_specular_probe);
|
glGenTextures(1, &m_specular_probe);
|
||||||
glBindTexture(GL_TEXTURE_CUBE_MAP, m_specular_probe);
|
glBindTexture(GL_TEXTURE_CUBE_MAP, m_specular_probe);
|
||||||
size_t cubemap_size = 256;
|
unsigned int cubemap_size = 256;
|
||||||
for (int i = 0; i < 6; i++)
|
for (int i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
#if !defined(USE_GLES2)
|
#if !defined(USE_GLES2)
|
||||||
|
@ -233,7 +233,8 @@ namespace
|
|||||||
* \param sh_rgba The 6 cubemap faces (sRGB byte textures)
|
* \param sh_rgba The 6 cubemap faces (sRGB byte textures)
|
||||||
* \param edge_size Size of the cubemap face
|
* \param edge_size Size of the cubemap face
|
||||||
*/
|
*/
|
||||||
void SphericalHarmonics::generateSphericalHarmonics(unsigned char *sh_rgba[6], size_t edge_size)
|
void SphericalHarmonics::generateSphericalHarmonics(unsigned char *sh_rgba[6],
|
||||||
|
unsigned int edge_size)
|
||||||
{
|
{
|
||||||
|
|
||||||
#if SIMD_SSE2_SUPPORT
|
#if SIMD_SSE2_SUPPORT
|
||||||
@ -644,7 +645,7 @@ void SphericalHarmonics::printCoeff() {
|
|||||||
* \param Yml The sphericals harmonics functions values
|
* \param Yml The sphericals harmonics functions values
|
||||||
* \param[out] output The environment map texels values
|
* \param[out] output The environment map texels values
|
||||||
*/
|
*/
|
||||||
void SphericalHarmonics::unprojectSH(size_t width, size_t height,
|
void SphericalHarmonics::unprojectSH(unsigned int width, unsigned int height,
|
||||||
float *Y00[], float *Y1minus1[], float *Y10[],
|
float *Y00[], float *Y1minus1[], float *Y10[],
|
||||||
float *Y11[], float *Y2minus2[], float *Y2minus1[],
|
float *Y11[], float *Y2minus2[], float *Y2minus1[],
|
||||||
float *Y20[], float *Y21[], float *Y22[],
|
float *Y20[], float *Y21[], float *Y22[],
|
||||||
|
@ -49,7 +49,7 @@ private:
|
|||||||
/** The spherical harmonics coefficients */
|
/** The spherical harmonics coefficients */
|
||||||
SHCoefficients *m_SH_coeff;
|
SHCoefficients *m_SH_coeff;
|
||||||
|
|
||||||
void generateSphericalHarmonics(unsigned char *sh_rgba[6], size_t edge_size);
|
void generateSphericalHarmonics(unsigned char *sh_rgba[6], unsigned int edge_size);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SphericalHarmonics(const std::vector<irr::video::ITexture *> &spherical_harmonics_textures);
|
SphericalHarmonics(const std::vector<irr::video::ITexture *> &spherical_harmonics_textures);
|
||||||
@ -65,7 +65,7 @@ public:
|
|||||||
|
|
||||||
void printCoeff();
|
void printCoeff();
|
||||||
|
|
||||||
void unprojectSH (size_t width, size_t height,
|
void unprojectSH (unsigned int width, unsigned int height,
|
||||||
float *Y00[], float *Y1minus1[], float *Y10[],
|
float *Y00[], float *Y1minus1[], float *Y10[],
|
||||||
float *Y11[], float *Y2minus2[], float *Y2minus1[],
|
float *Y11[], float *Y2minus2[], float *Y2minus1[],
|
||||||
float * Y20[], float *Y21[], float *Y22[],
|
float * Y20[], float *Y21[], float *Y22[],
|
||||||
|
@ -378,9 +378,15 @@ void STKAnimatedMesh::uploadJoints(const irr::core::matrix4& m,
|
|||||||
int joint, int offset)
|
int joint, int offset)
|
||||||
{
|
{
|
||||||
assert(offset != -1);
|
assert(offset != -1);
|
||||||
glBindBuffer(GL_UNIFORM_BUFFER, SharedGPUObjects::getSkinningUBO());
|
#ifdef USE_GLES2
|
||||||
glBufferSubData(GL_UNIFORM_BUFFER, offset + joint * 16 * sizeof(float),
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, (offset >> 6) + joint, 16, 1, GL_RGBA,
|
||||||
|
GL_FLOAT, m.pointer());
|
||||||
|
#else
|
||||||
|
glBufferSubData(CVS->isARBShaderStorageBufferObjectUsable() ?
|
||||||
|
GL_SHADER_STORAGE_BUFFER : GL_TEXTURE_BUFFER,
|
||||||
|
offset + joint * 16 * sizeof(float),
|
||||||
16 * sizeof(float), m.pointer());
|
16 * sizeof(float), m.pointer());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // !SERVER_ONLY
|
#endif // !SERVER_ONLY
|
||||||
|
@ -193,9 +193,9 @@ GLuint createVAO(GLuint vbo, GLuint idx, video::E_VERTEX_TYPE type)
|
|||||||
glEnableVertexAttribArray(4);
|
glEnableVertexAttribArray(4);
|
||||||
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)44);
|
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)44);
|
||||||
glEnableVertexAttribArray(5);
|
glEnableVertexAttribArray(5);
|
||||||
glVertexAttribIPointer(5, 4, GL_INT, getVertexPitchFromType(type), (GLvoid*)60);
|
glVertexAttribIPointer(5, 4, GL_SHORT, getVertexPitchFromType(type), (GLvoid*)60);
|
||||||
glEnableVertexAttribArray(6);
|
glEnableVertexAttribArray(6);
|
||||||
glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)76);
|
glVertexAttribPointer(6, 4, GL_HALF_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)68);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0 && "Wrong vertex type");
|
assert(0 && "Wrong vertex type");
|
||||||
|
@ -52,11 +52,11 @@ struct GLMesh
|
|||||||
video::ITexture *textures[8];
|
video::ITexture *textures[8];
|
||||||
GLenum PrimitiveType;
|
GLenum PrimitiveType;
|
||||||
GLenum IndexType;
|
GLenum IndexType;
|
||||||
size_t IndexCount;
|
unsigned int IndexCount;
|
||||||
size_t Stride;
|
unsigned int Stride;
|
||||||
core::vector2df texture_trans;
|
core::vector2df texture_trans;
|
||||||
size_t vaoBaseVertex;
|
unsigned int vaoBaseVertex;
|
||||||
size_t vaoOffset;
|
intptr_t vaoOffset;
|
||||||
video::E_VERTEX_TYPE VAOType;
|
video::E_VERTEX_TYPE VAOType;
|
||||||
uint64_t TextureHandles[8];
|
uint64_t TextureHandles[8];
|
||||||
scene::IMeshBuffer *mb;
|
scene::IMeshBuffer *mb;
|
||||||
@ -72,7 +72,7 @@ GLMesh allocateMeshBuffer(scene::IMeshBuffer* mb,
|
|||||||
const std::string& debug_name,
|
const std::string& debug_name,
|
||||||
RenderInfo* render_info);
|
RenderInfo* render_info);
|
||||||
void fillLocalBuffer(GLMesh &, scene::IMeshBuffer* mb);
|
void fillLocalBuffer(GLMesh &, scene::IMeshBuffer* mb);
|
||||||
video::E_VERTEX_TYPE getVTXTYPEFromStride(size_t stride);
|
video::E_VERTEX_TYPE getVTXTYPEFromStride(unsigned int stride);
|
||||||
GLuint createVAO(GLuint vbo, GLuint idx, video::E_VERTEX_TYPE type);
|
GLuint createVAO(GLuint vbo, GLuint idx, video::E_VERTEX_TYPE type);
|
||||||
core::matrix4 computeMVP(const core::matrix4 &ModelViewProjectionMatrix);
|
core::matrix4 computeMVP(const core::matrix4 &ModelViewProjectionMatrix);
|
||||||
bool isObject(video::E_MATERIAL_TYPE type);
|
bool isObject(video::E_MATERIAL_TYPE type);
|
||||||
|
@ -158,7 +158,7 @@ void STKMeshSceneNode::drawGlow(const GLMesh &mesh)
|
|||||||
|
|
||||||
GLenum ptype = mesh.PrimitiveType;
|
GLenum ptype = mesh.PrimitiveType;
|
||||||
GLenum itype = mesh.IndexType;
|
GLenum itype = mesh.IndexType;
|
||||||
size_t count = mesh.IndexCount;
|
unsigned int count = mesh.IndexCount;
|
||||||
ColorizeShader::getInstance()->setUniforms(AbsoluteTransformation, video::SColorf(glowcolor.getRed() / 255.f, glowcolor.getGreen() / 255.f, glowcolor.getBlue() / 255.f));
|
ColorizeShader::getInstance()->setUniforms(AbsoluteTransformation, video::SColorf(glowcolor.getRed() / 255.f, glowcolor.getGreen() / 255.f, glowcolor.getBlue() / 255.f));
|
||||||
glDrawElementsBaseVertex(ptype, count, itype, (GLvoid *)mesh.vaoOffset, mesh.vaoBaseVertex);
|
glDrawElementsBaseVertex(ptype, count, itype, (GLvoid *)mesh.vaoOffset, mesh.vaoBaseVertex);
|
||||||
}
|
}
|
||||||
@ -352,7 +352,7 @@ void STKMeshSceneNode::render()
|
|||||||
GLMesh &mesh = GLmeshes[i];
|
GLMesh &mesh = GLmeshes[i];
|
||||||
GLenum ptype = mesh.PrimitiveType;
|
GLenum ptype = mesh.PrimitiveType;
|
||||||
GLenum itype = mesh.IndexType;
|
GLenum itype = mesh.IndexType;
|
||||||
size_t count = mesh.IndexCount;
|
unsigned int count = mesh.IndexCount;
|
||||||
|
|
||||||
#if !defined(USE_GLES2)
|
#if !defined(USE_GLES2)
|
||||||
if (CVS->isAZDOEnabled())
|
if (CVS->isAZDOEnabled())
|
||||||
@ -392,7 +392,7 @@ void STKMeshSceneNode::render()
|
|||||||
GLMesh &mesh = GLmeshes[i];
|
GLMesh &mesh = GLmeshes[i];
|
||||||
GLenum ptype = mesh.PrimitiveType;
|
GLenum ptype = mesh.PrimitiveType;
|
||||||
GLenum itype = mesh.IndexType;
|
GLenum itype = mesh.IndexType;
|
||||||
size_t count = mesh.IndexCount;
|
unsigned int count = mesh.IndexCount;
|
||||||
|
|
||||||
#if !defined(USE_GLES2)
|
#if !defined(USE_GLES2)
|
||||||
if (CVS->isAZDOEnabled())
|
if (CVS->isAZDOEnabled())
|
||||||
@ -484,7 +484,7 @@ void STKMeshSceneNode::render()
|
|||||||
irr_driver->increaseObjectCount();
|
irr_driver->increaseObjectCount();
|
||||||
GLenum ptype = mesh.PrimitiveType;
|
GLenum ptype = mesh.PrimitiveType;
|
||||||
GLenum itype = mesh.IndexType;
|
GLenum itype = mesh.IndexType;
|
||||||
size_t count = mesh.IndexCount;
|
unsigned int count = mesh.IndexCount;
|
||||||
|
|
||||||
// This function is only called once per frame - thus no need for setters.
|
// This function is only called once per frame - thus no need for setters.
|
||||||
const float fogmax = track->getFogMax();
|
const float fogmax = track->getFogMax();
|
||||||
@ -531,7 +531,7 @@ void STKMeshSceneNode::render()
|
|||||||
GLMesh &mesh = GLmeshes[i];
|
GLMesh &mesh = GLmeshes[i];
|
||||||
GLenum ptype = mesh.PrimitiveType;
|
GLenum ptype = mesh.PrimitiveType;
|
||||||
GLenum itype = mesh.IndexType;
|
GLenum itype = mesh.IndexType;
|
||||||
size_t count = mesh.IndexCount;
|
unsigned int count = mesh.IndexCount;
|
||||||
|
|
||||||
#if !defined(USE_GLES2)
|
#if !defined(USE_GLES2)
|
||||||
if (CVS->isAZDOEnabled())
|
if (CVS->isAZDOEnabled())
|
||||||
|
@ -253,11 +253,11 @@ void STKParticle::generate(std::vector<CPUParticle>* out)
|
|||||||
{
|
{
|
||||||
if (m_hm != NULL)
|
if (m_hm != NULL)
|
||||||
{
|
{
|
||||||
stimulateHeightMap(i, active_count, NULL);
|
stimulateHeightMap((float)i, active_count, NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
stimulateNormal(i, active_count, NULL);
|
stimulateNormal((float)i, active_count, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_first_execution = false;
|
m_first_execution = false;
|
||||||
@ -513,6 +513,10 @@ void STKParticle::OnRegisterSceneNode()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
scene::SParticle p;
|
scene::SParticle p;
|
||||||
|
p.startTime = 0;
|
||||||
|
p.endTime = 0;
|
||||||
|
p.color = 0;
|
||||||
|
p.startColor = 0;
|
||||||
p.pos = m_particles_generating[i].m_position;
|
p.pos = m_particles_generating[i].m_position;
|
||||||
Buffer->BoundingBox.addInternalPoint(p.pos);
|
Buffer->BoundingBox.addInternalPoint(p.pos);
|
||||||
p.size = core::dimension2df(m_particles_generating[i].m_size,
|
p.size = core::dimension2df(m_particles_generating[i].m_size,
|
||||||
|
@ -65,7 +65,7 @@ STKTexture::STKTexture(const std::string& path, TexConfig* tc, bool no_upload)
|
|||||||
} // STKTexture
|
} // STKTexture
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
STKTexture::STKTexture(uint8_t* data, const std::string& name, size_t size,
|
STKTexture::STKTexture(uint8_t* data, const std::string& name, unsigned int size,
|
||||||
bool single_channel, bool delete_ttl)
|
bool single_channel, bool delete_ttl)
|
||||||
: video::ITexture(name.c_str()), m_texture_handle(0),
|
: video::ITexture(name.c_str()), m_texture_handle(0),
|
||||||
m_single_channel(single_channel), m_tex_config(NULL),
|
m_single_channel(single_channel), m_tex_config(NULL),
|
||||||
|
@ -90,7 +90,7 @@ public:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
STKTexture(const std::string& path, TexConfig* tc, bool no_upload = false);
|
STKTexture(const std::string& path, TexConfig* tc, bool no_upload = false);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
STKTexture(uint8_t* data, const std::string& name, size_t size,
|
STKTexture(uint8_t* data, const std::string& name, unsigned int size,
|
||||||
bool single_channel = false, bool delete_ttl = false);
|
bool single_channel = false, bool delete_ttl = false);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
STKTexture(video::IImage* img, const std::string& name);
|
STKTexture(video::IImage* img, const std::string& name);
|
||||||
|
@ -177,6 +177,7 @@ public:
|
|||||||
template<int N, typename... TexIds>
|
template<int N, typename... TexIds>
|
||||||
void setTextureUnitsImpl(GLuint tex_id, TexIds... args)
|
void setTextureUnitsImpl(GLuint tex_id, TexIds... args)
|
||||||
{
|
{
|
||||||
|
static_assert(N != 15, "15 is reserved for skinning texture");
|
||||||
#if defined(USE_GLES2)
|
#if defined(USE_GLES2)
|
||||||
if (CVS->getGLSLVersion() >= 300)
|
if (CVS->getGLSLVersion() >= 300)
|
||||||
#else
|
#else
|
||||||
|
@ -83,7 +83,9 @@ VAOManager::~VAOManager()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
resizeBufferIfNecessary(size_t &lastIndex, size_t newLastIndex, size_t& bufferSize, size_t stride, GLenum type, GLuint &id, void *&Pointer)
|
resizeBufferIfNecessary(unsigned int &lastIndex, unsigned int newLastIndex,
|
||||||
|
unsigned int &bufferSize, unsigned int stride, GLenum type,
|
||||||
|
GLuint &id, void *&Pointer)
|
||||||
{
|
{
|
||||||
if (newLastIndex >= bufferSize)
|
if (newLastIndex >= bufferSize)
|
||||||
{
|
{
|
||||||
@ -116,11 +118,14 @@ resizeBufferIfNecessary(size_t &lastIndex, size_t newLastIndex, size_t& bufferSi
|
|||||||
lastIndex = newLastIndex;
|
lastIndex = newLastIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VAOManager::regenerateBuffer(enum VTXTYPE tp, size_t newlastvertex, size_t newlastindex)
|
void VAOManager::regenerateBuffer(enum VTXTYPE tp, unsigned int newlastvertex,
|
||||||
|
unsigned int newlastindex)
|
||||||
{
|
{
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
resizeBufferIfNecessary(last_vertex[tp], newlastvertex, RealVBOSize[tp], getVertexPitch(tp), GL_ARRAY_BUFFER, vbo[tp], VBOPtr[tp]);
|
resizeBufferIfNecessary(last_vertex[tp], newlastvertex, RealVBOSize[tp],
|
||||||
resizeBufferIfNecessary(last_index[tp], newlastindex, RealIBOSize[tp], sizeof(u16), GL_ELEMENT_ARRAY_BUFFER, ibo[tp], IBOPtr[tp]);
|
getVertexPitch(tp), GL_ARRAY_BUFFER, vbo[tp], VBOPtr[tp]);
|
||||||
|
resizeBufferIfNecessary(last_index[tp], newlastindex, RealIBOSize[tp],
|
||||||
|
sizeof(u16), GL_ELEMENT_ARRAY_BUFFER, ibo[tp], IBOPtr[tp]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VAOManager::regenerateVAO(enum VTXTYPE tp)
|
void VAOManager::regenerateVAO(enum VTXTYPE tp)
|
||||||
@ -265,7 +270,7 @@ void VAOManager::regenerateInstancedVAO()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t VAOManager::getVertexPitch(enum VTXTYPE tp) const
|
unsigned int VAOManager::getVertexPitch(enum VTXTYPE tp) const
|
||||||
{
|
{
|
||||||
switch (tp)
|
switch (tp)
|
||||||
{
|
{
|
||||||
@ -318,8 +323,8 @@ irr::video::E_VERTEX_TYPE VAOManager::getVertexType(enum VTXTYPE tp)
|
|||||||
|
|
||||||
void VAOManager::append(scene::IMeshBuffer *mb, VTXTYPE tp)
|
void VAOManager::append(scene::IMeshBuffer *mb, VTXTYPE tp)
|
||||||
{
|
{
|
||||||
size_t old_vtx_cnt = last_vertex[tp];
|
unsigned int old_vtx_cnt = last_vertex[tp];
|
||||||
size_t old_idx_cnt = last_index[tp];
|
unsigned int old_idx_cnt = last_index[tp];
|
||||||
|
|
||||||
regenerateBuffer(tp, old_vtx_cnt + mb->getVertexCount(), old_idx_cnt + mb->getIndexCount());
|
regenerateBuffer(tp, old_vtx_cnt + mb->getVertexCount(), old_idx_cnt + mb->getIndexCount());
|
||||||
#if !defined(USE_GLES2)
|
#if !defined(USE_GLES2)
|
||||||
|
@ -194,16 +194,16 @@ class VAOManager : public Singleton<VAOManager>
|
|||||||
GLuint instance_vbo[InstanceTypeCount];
|
GLuint instance_vbo[InstanceTypeCount];
|
||||||
void *Ptr[InstanceTypeCount];
|
void *Ptr[InstanceTypeCount];
|
||||||
void *VBOPtr[VTXTYPE_COUNT], *IBOPtr[VTXTYPE_COUNT];
|
void *VBOPtr[VTXTYPE_COUNT], *IBOPtr[VTXTYPE_COUNT];
|
||||||
size_t RealVBOSize[VTXTYPE_COUNT], RealIBOSize[VTXTYPE_COUNT];
|
unsigned int RealVBOSize[VTXTYPE_COUNT], RealIBOSize[VTXTYPE_COUNT];
|
||||||
size_t last_vertex[VTXTYPE_COUNT], last_index[VTXTYPE_COUNT];
|
unsigned int last_vertex[VTXTYPE_COUNT], last_index[VTXTYPE_COUNT];
|
||||||
std::unordered_map<irr::scene::IMeshBuffer*, unsigned> mappedBaseVertex[VTXTYPE_COUNT], mappedBaseIndex[VTXTYPE_COUNT];
|
std::unordered_map<irr::scene::IMeshBuffer*, unsigned> mappedBaseVertex[VTXTYPE_COUNT], mappedBaseIndex[VTXTYPE_COUNT];
|
||||||
std::map<std::pair<irr::video::E_VERTEX_TYPE, InstanceType>, GLuint> InstanceVAO;
|
std::map<std::pair<irr::video::E_VERTEX_TYPE, InstanceType>, GLuint> InstanceVAO;
|
||||||
|
|
||||||
void cleanInstanceVAOs();
|
void cleanInstanceVAOs();
|
||||||
void regenerateBuffer(enum VTXTYPE, size_t, size_t);
|
void regenerateBuffer(enum VTXTYPE, unsigned int, unsigned int);
|
||||||
void regenerateVAO(enum VTXTYPE);
|
void regenerateVAO(enum VTXTYPE);
|
||||||
void regenerateInstancedVAO();
|
void regenerateInstancedVAO();
|
||||||
size_t getVertexPitch(enum VTXTYPE) const;
|
unsigned int getVertexPitch(enum VTXTYPE) const;
|
||||||
VTXTYPE getVTXTYPE(irr::video::E_VERTEX_TYPE type);
|
VTXTYPE getVTXTYPE(irr::video::E_VERTEX_TYPE type);
|
||||||
irr::video::E_VERTEX_TYPE getVertexType(enum VTXTYPE tp);
|
irr::video::E_VERTEX_TYPE getVertexType(enum VTXTYPE tp);
|
||||||
void append(irr::scene::IMeshBuffer *, VTXTYPE tp);
|
void append(irr::scene::IMeshBuffer *, VTXTYPE tp);
|
||||||
|
@ -170,7 +170,10 @@ namespace GUIEngine
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
/** Returns the number of screens on the stack. Is used to decide
|
/** Returns the number of screens on the stack. Is used to decide
|
||||||
* if exiting a screen would cause STK to end or not. */
|
* if exiting a screen would cause STK to end or not. */
|
||||||
unsigned int getMenuStackSize() const { return m_menu_stack.size(); }
|
unsigned int getMenuStackSize() const
|
||||||
|
{
|
||||||
|
return (unsigned int)m_menu_stack.size();
|
||||||
|
}
|
||||||
}; // Class AbstractStateManager
|
}; // Class AbstractStateManager
|
||||||
|
|
||||||
} // GUIEngine
|
} // GUIEngine
|
||||||
|
@ -318,7 +318,7 @@ void SpinnerWidget::addLabel(stringw label)
|
|||||||
{
|
{
|
||||||
m_labels.push_back(label);
|
m_labels.push_back(label);
|
||||||
m_min = 0;
|
m_min = 0;
|
||||||
m_max = m_labels.size()-1;
|
m_max = (int)m_labels.size()-1;
|
||||||
|
|
||||||
if (m_element != NULL) setValue(0);
|
if (m_element != NULL) setValue(0);
|
||||||
}
|
}
|
||||||
|
@ -1038,7 +1038,7 @@ EventPropagation InputManager::input(const SEvent& event)
|
|||||||
else if (event.EventType == EET_TOUCH_INPUT_EVENT)
|
else if (event.EventType == EET_TOUCH_INPUT_EVENT)
|
||||||
{
|
{
|
||||||
MultitouchDevice* device = m_device_manager->getMultitouchDevice();
|
MultitouchDevice* device = m_device_manager->getMultitouchDevice();
|
||||||
unsigned int id = event.TouchInput.ID;
|
unsigned int id = (unsigned int)event.TouchInput.ID;
|
||||||
|
|
||||||
if (device != NULL && id < device->m_events.size())
|
if (device != NULL && id < device->m_events.size())
|
||||||
{
|
{
|
||||||
|
@ -114,7 +114,7 @@ public:
|
|||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
/** Returns the number of created buttons */
|
/** Returns the number of created buttons */
|
||||||
unsigned int getButtonsCount() {return m_buttons.size();}
|
unsigned int getButtonsCount() { return (unsigned int)m_buttons.size();}
|
||||||
|
|
||||||
/** Returns pointer to the selected button */
|
/** Returns pointer to the selected button */
|
||||||
MultitouchButton* getButton(unsigned int i) {return m_buttons.at(i);}
|
MultitouchButton* getButton(unsigned int i) {return m_buttons.at(i);}
|
||||||
|
@ -828,7 +828,7 @@ float Kart::getSpeedForTurnRadius(float radius) const
|
|||||||
{
|
{
|
||||||
InterpolationArray turn_angle_at_speed = m_kart_properties->getTurnRadius();
|
InterpolationArray turn_angle_at_speed = m_kart_properties->getTurnRadius();
|
||||||
// Convert the turn radius into turn angle
|
// Convert the turn radius into turn angle
|
||||||
for(std::size_t i = 0; i < turn_angle_at_speed.size(); i++)
|
for(int i = 0; i < (int)turn_angle_at_speed.size(); i++)
|
||||||
turn_angle_at_speed.setY(i, sin(m_kart_properties->getWheelBase() /
|
turn_angle_at_speed.setY(i, sin(m_kart_properties->getWheelBase() /
|
||||||
turn_angle_at_speed.getY(i)));
|
turn_angle_at_speed.getY(i)));
|
||||||
|
|
||||||
@ -842,7 +842,7 @@ float Kart::getMaxSteerAngle(float speed) const
|
|||||||
{
|
{
|
||||||
InterpolationArray turn_angle_at_speed = m_kart_properties->getTurnRadius();
|
InterpolationArray turn_angle_at_speed = m_kart_properties->getTurnRadius();
|
||||||
// Convert the turn radius into turn angle
|
// Convert the turn radius into turn angle
|
||||||
for(std::size_t i = 0; i < turn_angle_at_speed.size(); i++)
|
for(int i = 0; i < (int)turn_angle_at_speed.size(); i++)
|
||||||
turn_angle_at_speed.setY(i, sin(m_kart_properties->getWheelBase() /
|
turn_angle_at_speed.setY(i, sin(m_kart_properties->getWheelBase() /
|
||||||
turn_angle_at_speed.getY(i)));
|
turn_angle_at_speed.getY(i)));
|
||||||
|
|
||||||
|
@ -570,7 +570,8 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool human_playe
|
|||||||
m_animated_node->getJointNode(m_hat_bone.c_str()) : node;
|
m_animated_node->getJointNode(m_hat_bone.c_str()) : node;
|
||||||
scene::IMesh* hat_mesh = irr_driver->getAnimatedMesh
|
scene::IMesh* hat_mesh = irr_driver->getAnimatedMesh
|
||||||
(file_manager->getAsset(FileManager::MODEL, m_hat_name));
|
(file_manager->getAsset(FileManager::MODEL, m_hat_name));
|
||||||
scene::ISceneNode* node = irr_driver->addMesh(hat_mesh, "hat", parent);
|
scene::ISceneNode* node = irr_driver->addMesh(hat_mesh, "hat", parent,
|
||||||
|
getRenderInfo());
|
||||||
configNode(node, *m_hat_location, bone_attachment ?
|
configNode(node, *m_hat_location, bone_attachment ?
|
||||||
getInverseBoneMatrix(m_hat_bone) : core::matrix4());
|
getInverseBoneMatrix(m_hat_bone) : core::matrix4());
|
||||||
}
|
}
|
||||||
|
@ -251,7 +251,7 @@ void FollowTheLeaderRace::terminateRace()
|
|||||||
endSetKartPositions();
|
endSetKartPositions();
|
||||||
|
|
||||||
// Mark all still racing karts to be finished.
|
// Mark all still racing karts to be finished.
|
||||||
for (int i = m_karts.size(); i>0; i--)
|
for (int i = (int)m_karts.size(); i>0; i--)
|
||||||
{
|
{
|
||||||
AbstractKart *kart = getKartAtPosition(i);
|
AbstractKart *kart = getKartAtPosition(i);
|
||||||
if (kart->isEliminated() || kart->hasFinishedRace())
|
if (kart->isEliminated() || kart->hasFinishedRace())
|
||||||
|
@ -618,7 +618,7 @@ void SoccerWorld::enterRaceOverState()
|
|||||||
std::sort(m_goal_frame.begin(), m_goal_frame.end());
|
std::sort(m_goal_frame.begin(), m_goal_frame.end());
|
||||||
|
|
||||||
const int mean = std::accumulate(m_goal_frame.begin(),
|
const int mean = std::accumulate(m_goal_frame.begin(),
|
||||||
m_goal_frame.end(), 0) / m_goal_frame.size();
|
m_goal_frame.end(), 0) / (int)m_goal_frame.size();
|
||||||
|
|
||||||
// Prevent overflow if there is a large frame in vector
|
// Prevent overflow if there is a large frame in vector
|
||||||
double squared_sum = 0;
|
double squared_sum = 0;
|
||||||
@ -660,9 +660,9 @@ void SoccerWorld::enterRaceOverState()
|
|||||||
}
|
}
|
||||||
|
|
||||||
int red_goal = ((int(m_red_scorers.size()) - blue_own_goal) >= 0 ?
|
int red_goal = ((int(m_red_scorers.size()) - blue_own_goal) >= 0 ?
|
||||||
m_red_scorers.size() - blue_own_goal : 0);
|
(int)m_red_scorers.size() - blue_own_goal : 0);
|
||||||
int blue_goal = ((int(m_blue_scorers.size()) - red_own_goal) >= 0 ?
|
int blue_goal = ((int(m_blue_scorers.size()) - red_own_goal) >= 0 ?
|
||||||
m_blue_scorers.size() - red_own_goal : 0);
|
(int)m_blue_scorers.size() - red_own_goal : 0);
|
||||||
|
|
||||||
Log::verbose("Soccer AI profiling", "Red goal: %d, Red own goal: %d,"
|
Log::verbose("Soccer AI profiling", "Red goal: %d, Red own goal: %d,"
|
||||||
"Blue goal: %d, Blue own goal: %d", red_goal, red_own_goal,
|
"Blue goal: %d, Blue own goal: %d", red_goal, red_own_goal,
|
||||||
|
@ -340,8 +340,8 @@ public:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
int getScore(SoccerTeam team) const
|
int getScore(SoccerTeam team) const
|
||||||
{
|
{
|
||||||
return (team == SOCCER_TEAM_BLUE ? m_blue_scorers.size() :
|
return (int)(team == SOCCER_TEAM_BLUE ? m_blue_scorers.size()
|
||||||
m_red_scorers.size());
|
: m_red_scorers.size());
|
||||||
}
|
}
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
const std::vector<ScorerData>& getScorers(SoccerTeam team) const
|
const std::vector<ScorerData>& getScorers(SoccerTeam team) const
|
||||||
|
@ -655,7 +655,7 @@ void ThreeStrikesBattle::spawnSpareTireKarts()
|
|||||||
if (ratio < 1.5f) return;
|
if (ratio < 1.5f) return;
|
||||||
unsigned int spawn_sta = unsigned(ratio);
|
unsigned int spawn_sta = unsigned(ratio);
|
||||||
if (spawn_sta > m_spare_tire_karts.size())
|
if (spawn_sta > m_spare_tire_karts.size())
|
||||||
spawn_sta = m_spare_tire_karts.size();
|
spawn_sta = (int)m_spare_tire_karts.size();
|
||||||
m_race_gui->addMessage(_P("%i spare tire kart has been spawned!",
|
m_race_gui->addMessage(_P("%i spare tire kart has been spawned!",
|
||||||
"%i spare tire karts have been spawned!",
|
"%i spare tire karts have been spawned!",
|
||||||
spawn_sta), NULL, 2.0f);
|
spawn_sta), NULL, 2.0f);
|
||||||
@ -714,15 +714,15 @@ void ThreeStrikesBattle::loadCustomModels()
|
|||||||
|
|
||||||
// Compute a random kart list
|
// Compute a random kart list
|
||||||
std::vector<std::string> sta_list;
|
std::vector<std::string> sta_list;
|
||||||
kart_properties_manager->getRandomKartList(pos.size(), NULL,
|
kart_properties_manager->getRandomKartList((int)pos.size(), NULL,
|
||||||
&sta_list);
|
&sta_list);
|
||||||
|
|
||||||
assert(sta_list.size() == pos.size());
|
assert(sta_list.size() == pos.size());
|
||||||
// Now add them
|
// Now add them
|
||||||
for (unsigned int i = 0; i < pos.size(); i++)
|
for (unsigned int i = 0; i < pos.size(); i++)
|
||||||
{
|
{
|
||||||
AbstractKart* sta = new Kart(sta_list[i], m_karts.size(),
|
AbstractKart* sta = new Kart(sta_list[i], (int)m_karts.size(),
|
||||||
m_karts.size() + 1, pos[i], PLAYER_DIFFICULTY_NORMAL,
|
(int)m_karts.size() + 1, pos[i], PLAYER_DIFFICULTY_NORMAL,
|
||||||
KRT_RED);
|
KRT_RED);
|
||||||
sta->init(RaceManager::KartType::KT_SPARE_TIRE);
|
sta->init(RaceManager::KartType::KT_SPARE_TIRE);
|
||||||
sta->setController(new SpareTireAI(sta));
|
sta->setController(new SpareTireAI(sta));
|
||||||
|
@ -1202,10 +1202,15 @@ void World::eliminateKart(int kart_id, bool notify_of_elimination)
|
|||||||
m_race_gui->addMessage(_("You have been eliminated!"), kart,
|
m_race_gui->addMessage(_("You have been eliminated!"), kart,
|
||||||
2.0f);
|
2.0f);
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
// Store the temporary string because clang would mess this up
|
||||||
|
// (remove the stringw before the wchar_t* is used).
|
||||||
|
const core::stringw &kart_name = kart->getName();
|
||||||
m_race_gui->addMessage(_("'%s' has been eliminated.",
|
m_race_gui->addMessage(_("'%s' has been eliminated.",
|
||||||
kart->getName()),
|
kart_name),
|
||||||
camera->getKart(),
|
camera->getKart(),
|
||||||
2.0f);
|
2.0f);
|
||||||
|
}
|
||||||
} // for i < number of cameras
|
} // for i < number of cameras
|
||||||
} // if notify_of_elimination
|
} // if notify_of_elimination
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ Event::Event(ENetEvent* event)
|
|||||||
if (m_type == EVENT_TYPE_MESSAGE)
|
if (m_type == EVENT_TYPE_MESSAGE)
|
||||||
{
|
{
|
||||||
m_data = new NetworkString(event->packet->data,
|
m_data = new NetworkString(event->packet->data,
|
||||||
event->packet->dataLength);
|
(int)event->packet->dataLength);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
m_data = NULL;
|
m_data = NULL;
|
||||||
|
@ -75,7 +75,7 @@ void NetworkString::unitTesting()
|
|||||||
* the characters of the given string. */
|
* the characters of the given string. */
|
||||||
BareNetworkString& BareNetworkString::encodeString(const std::string &value)
|
BareNetworkString& BareNetworkString::encodeString(const std::string &value)
|
||||||
{
|
{
|
||||||
int len = value.size();
|
int len = (int)value.size();
|
||||||
if(len<=255)
|
if(len<=255)
|
||||||
return this->addUInt8(len).addString(value);
|
return this->addUInt8(len).addString(value);
|
||||||
else
|
else
|
||||||
|
@ -171,7 +171,7 @@ public:
|
|||||||
* difference to size() happens if the string to be sent was previously
|
* difference to size() happens if the string to be sent was previously
|
||||||
* read, and has m_current_offset != 0. Even in this case the whole
|
* read, and has m_current_offset != 0. Even in this case the whole
|
||||||
* string must be sent. */
|
* string must be sent. */
|
||||||
unsigned int getTotalSize() const { return m_buffer.size(); }
|
unsigned int getTotalSize() const { return (unsigned int)m_buffer.size(); }
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// All functions related to adding data to a network string
|
// All functions related to adding data to a network string
|
||||||
/** Add 8 bit unsigned int. */
|
/** Add 8 bit unsigned int. */
|
||||||
|
@ -53,9 +53,9 @@ Protocol::~Protocol()
|
|||||||
/** Returns a network string with the given type.
|
/** Returns a network string with the given type.
|
||||||
* \capacity Default preallocated size for the message.
|
* \capacity Default preallocated size for the message.
|
||||||
*/
|
*/
|
||||||
NetworkString* Protocol::getNetworkString(int capacity)
|
NetworkString* Protocol::getNetworkString(size_t capacity)
|
||||||
{
|
{
|
||||||
return new NetworkString(m_type, capacity);
|
return new NetworkString(m_type, (int)capacity);
|
||||||
} // getNetworkString
|
} // getNetworkString
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -128,7 +128,7 @@ public:
|
|||||||
virtual void asynchronousUpdate() = 0;
|
virtual void asynchronousUpdate() = 0;
|
||||||
|
|
||||||
/// functions to check incoming data easily
|
/// functions to check incoming data easily
|
||||||
NetworkString* getNetworkString(int capacity=16);
|
NetworkString* getNetworkString(size_t capacity = 16);
|
||||||
bool checkDataSize(Event* event, unsigned int minimum_size);
|
bool checkDataSize(Event* event, unsigned int minimum_size);
|
||||||
void sendMessageToPeersChangingToken(NetworkString *message,
|
void sendMessageToPeersChangingToken(NetworkString *message,
|
||||||
bool reliable = true);
|
bool reliable = true);
|
||||||
|
@ -128,7 +128,7 @@ void LatencyProtocol::asynchronousUpdate()
|
|||||||
{
|
{
|
||||||
NetworkString *ping_request =
|
NetworkString *ping_request =
|
||||||
getNetworkString(5);
|
getNetworkString(5);
|
||||||
ping_request->addUInt8(1).addUInt32(m_pings[i].size());
|
ping_request->addUInt8(1).addUInt32((int)m_pings[i].size());
|
||||||
m_pings[i] [ m_pings_count ] = current_time;
|
m_pings[i] [ m_pings_count ] = current_time;
|
||||||
peers[i]->sendPacket(ping_request, false);
|
peers[i]->sendPacket(ping_request, false);
|
||||||
delete ping_request;
|
delete ping_request;
|
||||||
|
@ -172,7 +172,7 @@ unsigned int RewindManager::findFirstIndex(float target_time) const
|
|||||||
#ifdef REWIND_SEARCH_STATS
|
#ifdef REWIND_SEARCH_STATS
|
||||||
m_count_of_searches++;
|
m_count_of_searches++;
|
||||||
#endif
|
#endif
|
||||||
int index = m_rewind_info.size()-1;
|
int index = (int)m_rewind_info.size()-1;
|
||||||
int index_last_state = -1;
|
int index_last_state = -1;
|
||||||
while(index>=0)
|
while(index>=0)
|
||||||
{
|
{
|
||||||
@ -294,7 +294,7 @@ void RewindManager::rewindTo(float rewind_time)
|
|||||||
|
|
||||||
// Then undo the rewind infos going backwards in time
|
// Then undo the rewind infos going backwards in time
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
for(int i=m_rewind_info.size()-1; i>=(int)index; i--)
|
for(int i=(int)m_rewind_info.size()-1; i>=(int)index; i--)
|
||||||
{
|
{
|
||||||
m_rewind_info[i]->undo();
|
m_rewind_info[i]->undo();
|
||||||
|
|
||||||
|
@ -618,7 +618,7 @@ void STKHost::handleDirectSocketRequest()
|
|||||||
// current players, and the client's ip address and port
|
// current players, and the client's ip address and port
|
||||||
// number (which solves the problem which network interface
|
// number (which solves the problem which network interface
|
||||||
// might be the right one if there is more than one).
|
// might be the right one if there is more than one).
|
||||||
BareNetworkString s(name.size()+1+11);
|
BareNetworkString s((int)name.size()+1+11);
|
||||||
s.encodeString(name);
|
s.encodeString(name);
|
||||||
s.addUInt8(NetworkConfig::get()->getMaxPlayers());
|
s.addUInt8(NetworkConfig::get()->getMaxPlayers());
|
||||||
s.addUInt8(0); // FIXME: current number of connected players
|
s.addUInt8(0); // FIXME: current number of connected players
|
||||||
|
@ -499,9 +499,9 @@ bool GrandPrixData::isEditable() const
|
|||||||
unsigned int GrandPrixData::getNumberOfTracks(bool includeLocked) const
|
unsigned int GrandPrixData::getNumberOfTracks(bool includeLocked) const
|
||||||
{
|
{
|
||||||
if (includeLocked)
|
if (includeLocked)
|
||||||
return m_tracks.size();
|
return (unsigned int)m_tracks.size();
|
||||||
else
|
else
|
||||||
return getTrackNames(false).size();
|
return (unsigned int)getTrackNames(false).size();
|
||||||
} // getNumberOfTracks
|
} // getNumberOfTracks
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -338,7 +338,7 @@ void RaceManager::startNew(bool from_overworld)
|
|||||||
->getUniqueID(),
|
->getUniqueID(),
|
||||||
m_grand_prix.getId(),
|
m_grand_prix.getId(),
|
||||||
m_minor_mode,
|
m_minor_mode,
|
||||||
m_player_karts.size());
|
(unsigned int)m_player_karts.size());
|
||||||
|
|
||||||
// Saved GP only in offline mode
|
// Saved GP only in offline mode
|
||||||
if (m_continue_saved_gp)
|
if (m_continue_saved_gp)
|
||||||
@ -394,7 +394,7 @@ void RaceManager::startNew(bool from_overworld)
|
|||||||
|
|
||||||
// Then add the AI karts (randomly chosen)
|
// Then add the AI karts (randomly chosen)
|
||||||
// ----------------------------------------
|
// ----------------------------------------
|
||||||
const unsigned int ai_kart_count = m_ai_kart_list.size();
|
const unsigned int ai_kart_count = (unsigned int)m_ai_kart_list.size();
|
||||||
for(unsigned int i = 0; i < ai_kart_count; i++)
|
for(unsigned int i = 0; i < ai_kart_count; i++)
|
||||||
{
|
{
|
||||||
m_kart_status.push_back(KartStatus(m_ai_kart_list[i], i, -1, -1,
|
m_kart_status.push_back(KartStatus(m_ai_kart_list[i], i, -1, -1,
|
||||||
@ -445,7 +445,7 @@ void RaceManager::startNew(bool from_overworld)
|
|||||||
->getUniqueID(),
|
->getUniqueID(),
|
||||||
m_grand_prix.getId(),
|
m_grand_prix.getId(),
|
||||||
m_minor_mode,
|
m_minor_mode,
|
||||||
m_player_karts.size());
|
(unsigned int)m_player_karts.size());
|
||||||
} // while m_saved_gp
|
} // while m_saved_gp
|
||||||
} // if m_continue_saved_gp
|
} // if m_continue_saved_gp
|
||||||
} // if grand prix
|
} // if grand prix
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user