Merge branch 'master' of github.com:supertuxkart/stk-code

This commit is contained in:
hiker 2017-10-21 01:00:44 +11:00
commit 7f1c460227
121 changed files with 1115 additions and 583 deletions

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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*;

View File

@ -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 \

View File

@ -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 \

View File

@ -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)

View File

@ -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)

View File

@ -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/")

View 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>

View File

@ -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>

View File

@ -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)

View File

@ -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

View File

@ -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));

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -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>

View File

@ -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;

View File

@ -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
{ {

View File

@ -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);
} }
} }

View File

@ -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

View File

@ -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);
} }

View File

@ -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;

View File

@ -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)

View File

@ -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");

View File

@ -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;

View File

@ -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(

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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++)

View File

@ -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

View File

@ -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)

View File

@ -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++)

View File

@ -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)
{ {

View File

@ -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;
} }
} }

View File

@ -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;

View File

@ -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();

View File

@ -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];
} }

View File

@ -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();
}
} }
} }

View File

@ -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

View File

@ -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();

View File

@ -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;
}

View File

@ -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();

View File

@ -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)

View File

@ -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;

View File

@ -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
{ {

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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));

View File

@ -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();}

View File

@ -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);

View File

@ -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

View File

@ -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();

View File

@ -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
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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[],

View File

@ -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[],

View File

@ -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

View File

@ -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");

View File

@ -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);

View File

@ -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())

View File

@ -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,

View File

@ -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),

View File

@ -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);

View File

@ -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

View File

@ -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)

View File

@ -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);

View File

@ -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

View File

@ -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);
} }

View File

@ -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())
{ {

View File

@ -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);}

View File

@ -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)));

View File

@ -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());
} }

View File

@ -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())

View File

@ -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,

View File

@ -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

View File

@ -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));

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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. */

View File

@ -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
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@ -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);

View File

@ -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;

View File

@ -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();

View File

@ -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

View File

@ -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
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@ -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