Merge branch 'master' of github.com:supertuxkart/stk-code
This commit is contained in:
commit
7f1c460227
@ -47,7 +47,7 @@ install:
|
||||
#Get-ChildItem $env:ASSETS_DIR | Measure-Object -property length -sum
|
||||
|
||||
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: |
|
||||
md build
|
||||
cd build
|
||||
|
@ -4,7 +4,7 @@
|
||||
* Code refactoring of both render pipeline by Benau and Elderme
|
||||
* New kart Wilber and Hexley by Jymis
|
||||
* 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
|
||||
* Kart GFX improvements (exhaust and headlight)
|
||||
* In-game screen recording powered by libopenglrecorder
|
||||
|
@ -10,6 +10,13 @@ endif()
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
|
||||
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)
|
||||
if (NOT CMAKE_BUILD_TYPE)
|
||||
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"
|
||||
if(WIN32)
|
||||
set(ENV{PATH} "$ENV{PATH};${PROJECT_SOURCE_DIR}/dependencies/include")
|
||||
set(ENV{LIB} ${PROJECT_SOURCE_DIR}/dependencies/lib)
|
||||
set(ENV{OPENALDIR} ${PROJECT_SOURCE_DIR}/dependencies)
|
||||
set(ENV{PATH} "$ENV{PATH};${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/include")
|
||||
set(ENV{LIB} ${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib)
|
||||
set(ENV{OPENALDIR} ${PROJECT_SOURCE_DIR}/${DEPENDENCIES})
|
||||
add_definitions(-D_IRR_STATIC_LIB_)
|
||||
add_definitions(-DNO_IRR_COMPILE_WITH_X11_)
|
||||
endif()
|
||||
|
||||
if(USE_GLES2)
|
||||
add_definitions(-DUSE_GLES2)
|
||||
add_definitions(-D_IRR_COMPILE_WITH_OGLES2_ -DNO_IRR_COMPILE_WITH_OPENGL_)
|
||||
endif()
|
||||
|
||||
if(SERVER_ONLY)
|
||||
@ -78,9 +86,9 @@ if(SERVER_ONLY)
|
||||
add_definitions(-DNO_IRR_COMPILE_WITH_X11_)
|
||||
endif()
|
||||
|
||||
if(DISABLE_VPX)
|
||||
add_definitions(-DNO_VPX)
|
||||
endif()
|
||||
#if(DISABLE_VPX)
|
||||
# add_definitions(-DNO_VPX)
|
||||
#endif()
|
||||
|
||||
# Build the Bullet physics library
|
||||
add_subdirectory("${PROJECT_SOURCE_DIR}/lib/bullet")
|
||||
@ -352,7 +360,7 @@ else()
|
||||
elseif(MINGW)
|
||||
set(PTHREAD_NAMES "winpthread-1" "libwinpthread-1" "pthreadGC2")
|
||||
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)
|
||||
|
||||
# Set data dir (absolute or relative to CMAKE_INSTALL_PREFIX)
|
||||
@ -374,9 +382,9 @@ endif()
|
||||
|
||||
# CURL
|
||||
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)
|
||||
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/dependencies/lib/libcurldll.a)
|
||||
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib/libcurldll.a)
|
||||
else()
|
||||
find_package(CURL REQUIRED)
|
||||
include_directories(${CURL_INCLUDE_DIRS})
|
||||
@ -396,7 +404,7 @@ target_link_libraries(supertuxkart
|
||||
${FREETYPE_LIBRARIES}
|
||||
${JPEG_LIBRARIES}
|
||||
${TURBOJPEG_LIBRARY}
|
||||
${VPX_LIBRARIES}
|
||||
#${VPX_LIBRARIES}
|
||||
)
|
||||
|
||||
if(NOT SERVER_ONLY)
|
||||
@ -451,7 +459,7 @@ if(USE_WIIUSE)
|
||||
if(WIIUSE_BUILD)
|
||||
target_link_libraries(supertuxkart wiiuse)
|
||||
else()
|
||||
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/dependencies/lib/wiiuse.lib)
|
||||
target_link_libraries(supertuxkart ${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/lib/wiiuse.lib)
|
||||
endif()
|
||||
else()
|
||||
target_link_libraries(supertuxkart wiiuse bluetooth)
|
||||
@ -464,7 +472,7 @@ if(MSVC OR MINGW)
|
||||
target_link_libraries(supertuxkart iphlpapi.lib)
|
||||
add_custom_command(TARGET supertuxkart POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||
"${PROJECT_SOURCE_DIR}/dependencies/dll"
|
||||
"${PROJECT_SOURCE_DIR}/${DEPENDENCIES}/dll"
|
||||
$<TARGET_FILE_DIR:supertuxkart>)
|
||||
add_custom_target(stkshaders SOURCES ${STK_SHADERS})
|
||||
endif()
|
||||
|
@ -109,7 +109,7 @@ To Build SuperTuxKart on Windows, follow these instructions:
|
||||
2. Download the SuperTuxKart source package from either [SuperTuxKart download area - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart/0.9.2) or [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), and unpack it.
|
||||
*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/)
|
||||
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.
|
||||
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*;
|
||||
|
@ -20,10 +20,11 @@
|
||||
################################################################################
|
||||
|
||||
export KARTS="all"
|
||||
export TRACKS="battleisland cornfield_crossing featunlocked gplose gpwin \
|
||||
hacienda introcutscene introcutscene2 lighthouse olivermath \
|
||||
export TRACKS="abyss battleisland cave cornfield_crossing endcutscene \
|
||||
featunlocked fortmagma gplose gpwin hacienda icy_soccer_field \
|
||||
introcutscene introcutscene2 lighthouse mines olivermath \
|
||||
overworld sandtrack scotland snowmountain snowtuxpeak \
|
||||
soccer_field tutorial"
|
||||
soccer_field stadium tutorial zengarden"
|
||||
|
||||
export ASSETS_PATHS="../data \
|
||||
../../stk-assets \
|
||||
|
@ -342,6 +342,10 @@ check_error
|
||||
# Build apk
|
||||
echo "Building APK"
|
||||
|
||||
sed -i "s/minSdkVersion=\".*\"/minSdkVersion=\"$SDK_VERSION\"/g" \
|
||||
"$DIRNAME/AndroidManifest.xml"
|
||||
|
||||
|
||||
if [ "$BUILD_TOOL" = "gradle" ]; then
|
||||
export ANDROID_HOME="$SDK_PATH"
|
||||
gradle -Psdk_version=$SDK_VERSION \
|
||||
|
@ -10,8 +10,8 @@
|
||||
# Freetype library list
|
||||
|
||||
if(WIN32)
|
||||
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_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")
|
||||
set(FREETYPE_FOUND 1)
|
||||
set(FREETYPE_LIBRARIES ${FREETYPE_LIBRARY})
|
||||
elseif(APPLE)
|
||||
|
@ -24,8 +24,8 @@ else()
|
||||
endif()
|
||||
|
||||
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_library(FRIBIDI_LIBRARY NAMES fribidi PATHS /Library/Frameworks/fribidi.framework "${PROJECT_SOURCE_DIR}/dependencies/lib")
|
||||
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")
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Fribidi DEFAULT_MSG FRIBIDI_INCLUDE_DIR FRIBIDI_LIBRARY)
|
||||
|
@ -10,12 +10,12 @@
|
||||
# OggVorbis library list
|
||||
|
||||
|
||||
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_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_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_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_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_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")
|
||||
|
||||
if (APPLE)
|
||||
set(OGGVORBIS_OGG_INCLUDE_DIR "/Library/Frameworks/Ogg.framework/Headers/")
|
||||
|
30
data/gfx/explosion_low.xml
Normal file
30
data/gfx/explosion_low.xml
Normal file
@ -0,0 +1,30 @@
|
||||
<?xml version="1.0"?>
|
||||
<particles emitter="sphere" radius="0.1">
|
||||
|
||||
<spreading angle="180" />
|
||||
|
||||
<velocity x="0.000"
|
||||
y="0.0035"
|
||||
z="0.000" />
|
||||
|
||||
<material file="explode.png" />
|
||||
|
||||
<!-- Amount of particles emitted per second -->
|
||||
<rate min="100"
|
||||
max="150" />
|
||||
|
||||
<!-- Minimal and maximal lifetime of a particle, in milliseconds. -->
|
||||
<lifetime min="700"
|
||||
max="900" />
|
||||
|
||||
<!-- Size of the particles -->
|
||||
<size min="0.8"
|
||||
max="1.0"
|
||||
x-increase-factor="0.6"
|
||||
y-increase-factor="0.6"
|
||||
/>
|
||||
|
||||
<color min="255 255 255"
|
||||
max="255 255 255" />
|
||||
|
||||
</particles>
|
@ -38,4 +38,5 @@
|
||||
<card contains="Adreno" os="android" version="<=19" disable="VertexIdWorking"/>
|
||||
<card contains="Android Emulator" os="android" disable="ForceLegacyDevice"/>
|
||||
<card os="android" disable="UniformBufferObject"/>
|
||||
<card vendor="Broadcom" os="linux" disable="HighDefinitionTextures256"/>
|
||||
</graphical-restrictions>
|
||||
|
@ -36,12 +36,13 @@ void main(void)
|
||||
}
|
||||
|
||||
float lifetime = color_lifetime.w;
|
||||
pc = vec4(color_lifetime.zyx, 1.0);
|
||||
vec4 particle_color = vec4(color_lifetime.zyx, 1.0);
|
||||
tc = Texcoord;
|
||||
|
||||
#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
|
||||
pc = particle_color;
|
||||
|
||||
vec4 viewpos = vec4(0.);
|
||||
if (flips == 1)
|
||||
|
@ -64,10 +64,12 @@ layout (std140) uniform LightingData
|
||||
float rL22;
|
||||
};
|
||||
|
||||
layout (std140) uniform SkinningData
|
||||
#ifdef SSBO_SKINNING
|
||||
layout (std140, binding = 0) readonly buffer SkinningData
|
||||
{
|
||||
mat4 joint_matrices[MAX_BONES];
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif // HEADER_TXT
|
||||
|
@ -22,6 +22,7 @@ void main(void)
|
||||
#ifdef Use_Bindless_Texture
|
||||
vec4 col = texture(handle, uv);
|
||||
float specmap = texture(secondhandle, uv).g;
|
||||
float emitmap = texture(secondhandle, uv).b;
|
||||
float mask = texture(thirdhandle, uv).a;
|
||||
#ifdef SRGBBindlessFix
|
||||
col.xyz = pow(col.xyz, vec3(2.2));
|
||||
|
@ -49,6 +49,8 @@ flat out sampler2D fourthhandle;
|
||||
|
||||
#stk_include "utils/getworldmatrix.vert"
|
||||
|
||||
uniform samplerBuffer skinning_tex;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
mat4 ModelMatrix = getWorldMatrix(Origin, Orientation, Scale);
|
||||
@ -61,18 +63,35 @@ void main(void)
|
||||
vec4 skinned_normal = vec4(0.);
|
||||
vec4 skinned_tangent = 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)
|
||||
{
|
||||
skinned_position = idle_position;
|
||||
skinned_normal = idle_normal;
|
||||
skinned_tangent = idle_tangent;
|
||||
skinned_bitangent = idle_bitangent;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
vec4 single_bone_influenced_position = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_position;
|
||||
single_bone_influenced_position /= single_bone_influenced_position.w;
|
||||
vec4 single_bone_influenced_normal = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_normal;
|
||||
vec4 single_bone_influenced_tangent = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_tangent;
|
||||
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;
|
||||
skinned_normal += Weight[i] * single_bone_influenced_normal;
|
||||
skinned_tangent += Weight[i] * single_bone_influenced_tangent;
|
||||
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;
|
||||
|
@ -38,16 +38,36 @@ flat out uvec2 hdle;
|
||||
|
||||
#stk_include "utils/getworldmatrix.vert"
|
||||
|
||||
uniform samplerBuffer skinning_tex;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
mat4 ModelMatrix = getWorldMatrix(Origin, Orientation, Scale);
|
||||
vec4 idle_position = vec4(Position, 1.);
|
||||
vec4 skinned_position = vec4(0.);
|
||||
if (Weight[0] < 0.01)
|
||||
{
|
||||
skinned_position = idle_position;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
vec4 single_bone_influenced_position = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_position;
|
||||
single_bone_influenced_position /= single_bone_influenced_position.w;
|
||||
skinned_position += Weight[i] * single_bone_influenced_position;
|
||||
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
|
||||
|
@ -41,12 +41,13 @@ void main(void)
|
||||
float lifetime = color_lifetime.w;
|
||||
float alpha = mix(smoothstep(1.0, 0.8, lifetime), lifetime, billboard);
|
||||
billboard_mix = billboard;
|
||||
pc = vec4(color_lifetime.zyx, 1.0) * alpha;
|
||||
vec4 particle_color = vec4(color_lifetime.zyx, 1.0) * alpha;
|
||||
tc = Texcoord;
|
||||
|
||||
#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
|
||||
pc = particle_color;
|
||||
|
||||
vec4 viewpos = vec4(0.);
|
||||
if (flips == 1)
|
||||
|
@ -17,6 +17,11 @@ uniform mat4 InverseModelMatrix =
|
||||
uniform vec2 texture_trans = vec2(0., 0.);
|
||||
#endif
|
||||
uniform int skinning_offset;
|
||||
#ifdef GL_ES
|
||||
uniform sampler2D skinning_tex;
|
||||
#else
|
||||
uniform samplerBuffer skinning_tex;
|
||||
#endif
|
||||
|
||||
#ifdef Explicit_Attrib_Location_Usable
|
||||
layout(location = 0) in vec3 Position;
|
||||
@ -55,18 +60,41 @@ void main(void)
|
||||
vec4 skinned_normal = vec4(0.);
|
||||
vec4 skinned_tangent = 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)
|
||||
{
|
||||
skinned_position = idle_position;
|
||||
skinned_normal = idle_normal;
|
||||
skinned_tangent = idle_tangent;
|
||||
skinned_bitangent = idle_bitangent;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
vec4 single_bone_influenced_position = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_position;
|
||||
single_bone_influenced_position /= single_bone_influenced_position.w;
|
||||
vec4 single_bone_influenced_normal = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_normal;
|
||||
vec4 single_bone_influenced_tangent = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_tangent;
|
||||
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;
|
||||
skinned_normal += Weight[i] * single_bone_influenced_normal;
|
||||
skinned_tangent += Weight[i] * single_bone_influenced_tangent;
|
||||
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;
|
||||
|
@ -1,6 +1,7 @@
|
||||
uniform mat4 ModelMatrix;
|
||||
uniform int skinning_offset;
|
||||
uniform int layer;
|
||||
uniform samplerBuffer skinning_tex;
|
||||
|
||||
#ifdef Explicit_Attrib_Location_Usable
|
||||
layout(location = 0) in vec3 Position;
|
||||
@ -25,11 +26,35 @@ void main(void)
|
||||
{
|
||||
vec4 idle_position = vec4(Position, 1.);
|
||||
vec4 skinned_position = vec4(0.);
|
||||
if (Weight[0] < 0.01)
|
||||
{
|
||||
skinned_position = idle_position;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
vec4 single_bone_influenced_position = joint_matrices[clamp(Joint[i] + skinning_offset, 0, MAX_BONES)] * idle_position;
|
||||
single_bone_influenced_position /= single_bone_influenced_position.w;
|
||||
skinned_position += Weight[i] * single_bone_influenced_position;
|
||||
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
|
||||
|
@ -461,4 +461,10 @@
|
||||
<fonts-list normal-ttf="Cantarell-Regular.otf FreeSans.ttf wqy-microhei.ttf NotoNaskhArabicUI-Bold.ttf"
|
||||
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>
|
||||
|
@ -213,7 +213,7 @@ protected:
|
||||
|
||||
int *intPtr=0;
|
||||
short *shtPtr=0;
|
||||
#ifdef __MINGW64__
|
||||
#if defined(__MINGW64__) || defined(_WIN64)
|
||||
char *cp = 0;int dataLen =0;intptr_t nr=0;
|
||||
#else
|
||||
char *cp = 0;int dataLen =0;long nr=0;
|
||||
@ -251,7 +251,7 @@ protected:
|
||||
cp++;
|
||||
}
|
||||
{
|
||||
#ifdef __MINGW64__
|
||||
#if defined(__MINGW64__) || defined(_WIN64)
|
||||
nr= (intptr_t)cp;
|
||||
#else
|
||||
nr= (long)cp;
|
||||
@ -290,7 +290,7 @@ protected:
|
||||
}
|
||||
|
||||
{
|
||||
#ifdef __MINGW64__
|
||||
#if defined(__MINGW64__) || defined(_WIN64)
|
||||
nr= (intptr_t)cp;
|
||||
#else
|
||||
nr= (long)cp;
|
||||
|
@ -255,14 +255,8 @@ struct S3DVertexTangents : public S3DVertex
|
||||
|
||||
struct S3DVertexSkinnedMesh : public S3DVertexTangents
|
||||
{
|
||||
s32 m_joint_idx1;
|
||||
s32 m_joint_idx2;
|
||||
s32 m_joint_idx3;
|
||||
s32 m_joint_idx4;
|
||||
f32 m_weight1;
|
||||
f32 m_weight2;
|
||||
f32 m_weight3;
|
||||
f32 m_weight4;
|
||||
s16 m_joint_idx[4];
|
||||
s16 m_weight[4];
|
||||
|
||||
E_VERTEX_TYPE getType() const
|
||||
{
|
||||
|
@ -243,14 +243,14 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
Vertex.TCoords=Vertices_Standard[n].TCoords;
|
||||
Vertex.Tangent=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_idx2 = 0;
|
||||
Vertex.m_joint_idx3 = 0;
|
||||
Vertex.m_joint_idx4 = 0;
|
||||
Vertex.m_weight1 = 0;
|
||||
Vertex.m_weight2 = 0;
|
||||
Vertex.m_weight3 = 0;
|
||||
Vertex.m_weight4 = 0;
|
||||
Vertex.m_joint_idx[0] = 0;
|
||||
Vertex.m_joint_idx[1] = 0;
|
||||
Vertex.m_joint_idx[2] = 0;
|
||||
Vertex.m_joint_idx[3] = 0;
|
||||
Vertex.m_weight[0] = 0;
|
||||
Vertex.m_weight[1] = 0;
|
||||
Vertex.m_weight[2] = 0;
|
||||
Vertex.m_weight[3] = 0;
|
||||
Vertices_SkinnedMesh.push_back(Vertex);
|
||||
}
|
||||
}
|
||||
@ -265,14 +265,14 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
Vertex.TCoords=Vertices_Tangents[n].TCoords;
|
||||
Vertex.Tangent=Vertices_Tangents[n].Tangent;
|
||||
Vertex.Binormal=Vertices_Tangents[n].Binormal;
|
||||
Vertex.m_joint_idx1 = 0;
|
||||
Vertex.m_joint_idx2 = 0;
|
||||
Vertex.m_joint_idx3 = 0;
|
||||
Vertex.m_joint_idx4 = 0;
|
||||
Vertex.m_weight1 = 0;
|
||||
Vertex.m_weight2 = 0;
|
||||
Vertex.m_weight3 = 0;
|
||||
Vertex.m_weight4 = 0;
|
||||
Vertex.m_joint_idx[0] = 0;
|
||||
Vertex.m_joint_idx[1] = 0;
|
||||
Vertex.m_joint_idx[2] = 0;
|
||||
Vertex.m_joint_idx[3] = 0;
|
||||
Vertex.m_weight[0] = 0;
|
||||
Vertex.m_weight[1] = 0;
|
||||
Vertex.m_weight[2] = 0;
|
||||
Vertex.m_weight[3] = 0;
|
||||
Vertices_SkinnedMesh.push_back(Vertex);
|
||||
}
|
||||
}
|
||||
|
@ -101,12 +101,12 @@ void CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
|
||||
if (FramesPerSecond > 0.f) //forwards...
|
||||
{
|
||||
if (CurrentFrameNr > EndFrame)
|
||||
CurrentFrameNr = StartFrame + fmod(CurrentFrameNr - StartFrame, (f32)(EndFrame-StartFrame));
|
||||
CurrentFrameNr = StartFrame + fmodf(CurrentFrameNr - StartFrame, (f32)(EndFrame-StartFrame));
|
||||
}
|
||||
else //backwards...
|
||||
{
|
||||
if (CurrentFrameNr < StartFrame)
|
||||
CurrentFrameNr = EndFrame - fmod(EndFrame - CurrentFrameNr, (f32)(EndFrame-StartFrame));
|
||||
CurrentFrameNr = EndFrame - fmodf(EndFrame - CurrentFrameNr, (f32)(EndFrame-StartFrame));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -11,6 +11,55 @@
|
||||
#include "os.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 scene
|
||||
@ -1450,28 +1499,34 @@ void CSkinnedMesh::convertForSkinning()
|
||||
core::array<JointInfluence> this_influence;
|
||||
core::array<JointInfluence> reported_weight = wi[b][i];
|
||||
reported_weight.sort(sortJointInfluenceFunc);
|
||||
float remaining_weight = 1.0f;
|
||||
for (u32 j = 0; j < 4; j++)
|
||||
{
|
||||
JointInfluence influence;
|
||||
if (reported_weight.size() > j)
|
||||
influence = reported_weight[j];
|
||||
else
|
||||
{
|
||||
influence.joint_idx = -100000;
|
||||
influence.weight = remaining_weight;
|
||||
}
|
||||
remaining_weight -= influence.weight;
|
||||
influence.weight = 0.0f;
|
||||
this_influence.push_back(influence);
|
||||
}
|
||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_joint_idx1 = this_influence[0].joint_idx;
|
||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_joint_idx2 = this_influence[1].joint_idx;
|
||||
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;
|
||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight1 = this_influence[0].weight;
|
||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight2 = this_influence[1].weight;
|
||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight3 = this_influence[2].weight;
|
||||
LocalBuffers[b]->Vertices_SkinnedMesh[i].m_weight4 = this_influence[3].weight;
|
||||
float total_weight = 0.0f;
|
||||
for (u32 j = 0; j < reported_weight.size(); j++)
|
||||
{
|
||||
total_weight += reported_weight[j].weight;
|
||||
this_influence[j].joint_idx = reported_weight[j].joint_idx;
|
||||
this_influence[j].weight = reported_weight[j].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];
|
||||
JointInfluence tmp;
|
||||
tmp.joint_idx = index;
|
||||
tmp.joint_idx = (int)index;
|
||||
tmp.weight = weight.strength;
|
||||
wi[weight.buffer_id][weight.vertex_id].push_back(tmp);
|
||||
}
|
||||
|
@ -529,7 +529,7 @@ void SFXManager::loadSfx()
|
||||
delete root;
|
||||
|
||||
// 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];
|
||||
i = 0;
|
||||
|
||||
|
@ -172,7 +172,7 @@ void SavedGrandPrix::loadKarts(std::vector<RaceManager::KartStatus> & kart_list)
|
||||
else
|
||||
{
|
||||
// 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++)
|
||||
{
|
||||
if(kart_list[x].m_local_player_id == m_karts[i].m_local_player_id)
|
||||
|
@ -181,6 +181,7 @@ void STKConfig::init_defaults()
|
||||
m_disable_steer_while_unskid = false;
|
||||
m_camera_follow_skid = false;
|
||||
m_cutscene_fov = 0.61f;
|
||||
m_max_skinning_bones = 1024;
|
||||
|
||||
m_score_increase.clear();
|
||||
m_leader_intervals.clear();
|
||||
@ -364,6 +365,11 @@ void STKConfig::getAllData(const XMLNode * root)
|
||||
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
|
||||
// ------------------------------
|
||||
const XMLNode *node = root -> getNode("general-kart-defaults");
|
||||
|
@ -152,6 +152,8 @@ public:
|
||||
|
||||
float m_cutscene_fov;
|
||||
|
||||
unsigned m_max_skinning_bones;
|
||||
|
||||
/** Lists of TTF files used in STK. */
|
||||
std::vector<std::string> m_normal_ttf;
|
||||
std::vector<std::string> m_digit_ttf;
|
||||
|
@ -122,7 +122,7 @@ void GroupUserConfigParam::writeInner(std::ofstream& stream, int level) const
|
||||
{
|
||||
std::string tab(level * 4,' ');
|
||||
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";
|
||||
|
||||
@ -144,7 +144,7 @@ void GroupUserConfigParam::findYourDataInAChildOf(const XMLNode* node)
|
||||
return;
|
||||
}
|
||||
|
||||
const int attributes_amount = m_attributes.size();
|
||||
const int attributes_amount = (int)m_attributes.size();
|
||||
for (int n=0; n<attributes_amount; n++)
|
||||
{
|
||||
m_attributes[n]->findYourDataInAnAttributeOf(child);
|
||||
@ -246,7 +246,7 @@ ListUserConfigParam<T, U>::ListUserConfigParam(const char* param_name,
|
||||
template<typename T, typename U>
|
||||
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
|
||||
if(m_comment.size() > 0) stream << " <!-- " << m_comment.c_str();
|
||||
@ -728,7 +728,7 @@ bool UserConfig::loadConfig()
|
||||
UserConfigParams::m_saved_grand_prix_list.clearAndDeleteAll();
|
||||
std::vector<XMLNode*> 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++)
|
||||
{
|
||||
UserConfigParams::m_saved_grand_prix_list.push_back(
|
||||
|
@ -51,7 +51,7 @@ public:
|
||||
FT_Face getFace(unsigned int i) const;
|
||||
// ------------------------------------------------------------------------
|
||||
/** 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
|
||||
|
||||
|
@ -30,6 +30,8 @@
|
||||
#include "guiengine/skin.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
|
||||
#include <array>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** 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.
|
||||
@ -677,15 +679,24 @@ void FontWithFace::render(const core::stringw& text,
|
||||
top.setAlpha(color.getAlpha());
|
||||
bottom.setAlpha(color.getAlpha());
|
||||
|
||||
video::SColor title_colors[] = {top, bottom, top, bottom};
|
||||
if (char_collector != NULL)
|
||||
std::array<video::SColor, 4> title_colors;
|
||||
if (CVS->isGLSL())
|
||||
{
|
||||
char_collector->collectChar(texture, dest, source,
|
||||
title_colors);
|
||||
title_colors = { { top, bottom, top, bottom } };
|
||||
}
|
||||
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
|
||||
|
@ -55,7 +55,8 @@ Camera::CameraType Camera::m_default_type = Camera::CM_TYPE_NORMAL;
|
||||
*/
|
||||
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);
|
||||
return camera;
|
||||
} // createCamera(kart)
|
||||
|
@ -93,7 +93,8 @@ void CentralVideoSettings::init()
|
||||
{
|
||||
std::string driver((char*)(glGetString(GL_VERSION)));
|
||||
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))
|
||||
{
|
||||
@ -210,13 +211,6 @@ void CentralVideoSettings::init()
|
||||
hasSRGBFramebuffer = true;
|
||||
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))
|
||||
{
|
||||
@ -293,6 +287,24 @@ void CentralVideoSettings::init()
|
||||
m_need_vertex_id_workaround = true;
|
||||
}
|
||||
#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
|
||||
{
|
||||
return isARBUniformBufferObjectUsable();
|
||||
return !GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_HARDWARE_SKINNING);
|
||||
}
|
||||
|
||||
bool CentralVideoSettings::isARBTextureSwizzleUsable() const
|
||||
|
@ -74,13 +74,13 @@ template<typename T>
|
||||
void FillInstances_impl(const InstanceList& instance_list,
|
||||
T * instance_buffer,
|
||||
DrawElementsIndirectCommand *command_buffer,
|
||||
size_t &instance_buffer_offset,
|
||||
size_t &command_buffer_offset,
|
||||
size_t &poly_count)
|
||||
unsigned int &instance_buffer_offset,
|
||||
unsigned int &command_buffer_offset,
|
||||
unsigned int&poly_count)
|
||||
{
|
||||
// Should never be empty
|
||||
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++)
|
||||
{
|
||||
@ -92,7 +92,7 @@ void FillInstances_impl(const InstanceList& instance_list,
|
||||
DrawElementsIndirectCommand &CurrentCommand = command_buffer[command_buffer_offset++];
|
||||
CurrentCommand.baseVertex = mesh->vaoBaseVertex;
|
||||
CurrentCommand.count = mesh->IndexCount;
|
||||
CurrentCommand.firstIndex = mesh->vaoOffset / 2;
|
||||
CurrentCommand.firstIndex = GLuint(mesh->vaoOffset / 2);
|
||||
CurrentCommand.baseInstance = initial_offset;
|
||||
CurrentCommand.instanceCount = instance_buffer_offset - initial_offset;
|
||||
|
||||
@ -145,12 +145,12 @@ protected:
|
||||
DrawElementsIndirectCommand *m_draw_indirect_cmd;
|
||||
|
||||
std::array<std::vector<GLMesh *>, N> m_meshes;
|
||||
std::array<size_t,N> m_offset;
|
||||
std::array<size_t,N> m_size;
|
||||
std::array<unsigned int,N> m_offset;
|
||||
std::array<unsigned int,N> m_size;
|
||||
|
||||
size_t m_poly_count;
|
||||
size_t m_instance_buffer_offset;
|
||||
size_t m_command_buffer_offset;
|
||||
unsigned int m_poly_count;
|
||||
unsigned int m_instance_buffer_offset;
|
||||
unsigned int m_command_buffer_offset;
|
||||
|
||||
void clearMeshes();
|
||||
void mapIndirectBuffer();
|
||||
@ -230,7 +230,7 @@ public:
|
||||
CommandBuffer();
|
||||
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
|
||||
{
|
||||
@ -263,7 +263,7 @@ public:
|
||||
{
|
||||
T::InstancedFirstPassShader::getInstance()->use();
|
||||
T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...);
|
||||
|
||||
handleSkinning(T::InstancedFirstPassShader::getInstance());
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
T::Instance));
|
||||
for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++)
|
||||
@ -303,7 +303,7 @@ public:
|
||||
{
|
||||
T::InstancedFirstPassShader::getInstance()->use();
|
||||
T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...);
|
||||
|
||||
handleSkinning(T::InstancedFirstPassShader::getInstance());
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
T::Instance));
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||
@ -329,7 +329,7 @@ public:
|
||||
{
|
||||
T::InstancedSecondPassShader::getInstance()->use();
|
||||
T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...);
|
||||
|
||||
handleSkinning(T::InstancedSecondPassShader::getInstance());
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
T::Instance));
|
||||
for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++)
|
||||
@ -364,7 +364,7 @@ public:
|
||||
{
|
||||
T::InstancedSecondPassShader::getInstance()->use();
|
||||
T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...);
|
||||
|
||||
handleSkinning(T::InstancedSecondPassShader::getInstance());
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
T::Instance));
|
||||
expandHandlesSecondPass<T>(handles);
|
||||
@ -451,7 +451,7 @@ public:
|
||||
{
|
||||
T::InstancedShadowPassShader::getInstance()->use();
|
||||
T::InstancedShadowPassShader::getInstance()->setUniforms(cascade, uniforms...);
|
||||
|
||||
handleSkinning(T::InstancedShadowPassShader::getInstance());
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
InstanceTypeShadow));
|
||||
|
||||
@ -488,7 +488,7 @@ public:
|
||||
{
|
||||
T::InstancedShadowPassShader::getInstance()->use();
|
||||
T::InstancedShadowPassShader::getInstance()->setUniforms(cascade, uniforms...);
|
||||
|
||||
handleSkinning(T::InstancedShadowPassShader::getInstance());
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
InstanceTypeShadow));
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||
|
@ -302,7 +302,7 @@ void CPUParticleManager::drawAll()
|
||||
}
|
||||
glBindVertexArray(std::get<0>(m_gl_particles[p.second]));
|
||||
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4,
|
||||
m_particles_generated.at(p.second).size());
|
||||
(unsigned)m_particles_generated.at(p.second).size());
|
||||
}
|
||||
|
||||
} // drawAll
|
||||
|
@ -18,6 +18,7 @@
|
||||
#ifndef SERVER_ONLY
|
||||
#include "graphics/draw_calls.hpp"
|
||||
|
||||
#include "config/stk_config.hpp"
|
||||
#include "config/user_config.hpp"
|
||||
#include "graphics/command_buffer.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[3] || !culled_for_cams[4] || !culled_for_cams[5]))
|
||||
{
|
||||
skinning_offset = getSkinningOffset() + 1/*reserved identity matrix*/;
|
||||
skinning_offset = getSkinningOffset();
|
||||
if (skinning_offset + am->getTotalJoints() >
|
||||
SharedGPUObjects::getMaxMat4Size())
|
||||
stk_config->m_max_skinning_bones)
|
||||
{
|
||||
Log::error("DrawCalls", "Don't have enough space to render skinned"
|
||||
" mesh %s! Max joints can hold: %d",
|
||||
am->getMeshDebugName().c_str(),
|
||||
SharedGPUObjects::getMaxMat4Size());
|
||||
stk_config->m_max_skinning_bones);
|
||||
return;
|
||||
}
|
||||
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);
|
||||
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++)
|
||||
{
|
||||
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_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(),
|
||||
m_mesh_for_skinning.end(), 0, []
|
||||
(const size_t previous, const STKAnimatedMesh* m)
|
||||
(const unsigned int previous, const STKAnimatedMesh* m)
|
||||
{ return previous + m->getTotalJoints(); });
|
||||
} // getSkinningOffset
|
||||
#endif // !SERVER_ONLY
|
||||
|
@ -28,6 +28,7 @@ void renderMeshes1stPass()
|
||||
{
|
||||
auto &meshes = T::List::getInstance()->SolidPass;
|
||||
T::FirstPassShader::getInstance()->use();
|
||||
handleSkinning(T::FirstPassShader::getInstance());
|
||||
if (CVS->isARBBaseInstanceUsable())
|
||||
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
||||
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;
|
||||
T::SecondPassShader::getInstance()->use();
|
||||
handleSkinning(T::SecondPassShader::getInstance());
|
||||
if (CVS->isARBBaseInstanceUsable())
|
||||
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
||||
for (unsigned i = 0; i < meshes.size(); i++)
|
||||
@ -95,6 +97,7 @@ void renderShadow(unsigned cascade)
|
||||
{
|
||||
auto &t = T::List::getInstance()->Shadows[cascade];
|
||||
T::ShadowPassShader::getInstance()->use();
|
||||
handleSkinning(T::ShadowPassShader::getInstance());
|
||||
if (CVS->isARBBaseInstanceUsable())
|
||||
glBindVertexArray(VAOManager::getInstance()->getVAO(T::VertexType));
|
||||
for (unsigned i = 0; i < t.size(); i++)
|
||||
|
@ -183,5 +183,14 @@ struct HandleExpander
|
||||
} // Expand
|
||||
}; // HandleExpander
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
template <typename Shader>
|
||||
inline void handleSkinning(Shader* s)
|
||||
{
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(s))
|
||||
{
|
||||
sms->bindSkinningTexture();
|
||||
}
|
||||
}
|
||||
|
||||
#endif //HEADER_DRAW_TOOLS_HPP
|
||||
|
@ -42,8 +42,20 @@ Explosion::Explosion(const Vec3& coord, const char* explosion_sound, const char
|
||||
m_emission_frames = 0;
|
||||
|
||||
#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();
|
||||
ParticleKind* particles = pkm->getParticles(particle_file);
|
||||
ParticleKind* particles = pkm->getParticles(filename);
|
||||
m_emitter = NULL;
|
||||
|
||||
if (UserConfigParams::m_graphical_effects > 1)
|
||||
|
@ -202,6 +202,7 @@ void renderTransparenPass(const std::vector<RenderGeometry::TexUnit> &TexUnits,
|
||||
std::vector<std::tuple<TupleType...> > *meshes)
|
||||
{
|
||||
Shader::getInstance()->use();
|
||||
handleSkinning(Shader::getInstance());
|
||||
if (CVS->isARBBaseInstanceUsable())
|
||||
glBindVertexArray(VAOManager::getInstance()->getVAO(VertexType));
|
||||
for (unsigned i = 0; i < meshes->size(); i++)
|
||||
|
@ -226,8 +226,8 @@ unsigned GPUTimer::elapsedTimeus()
|
||||
|
||||
FrameBuffer::FrameBuffer() {}
|
||||
|
||||
FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, size_t w, size_t h,
|
||||
bool layered)
|
||||
FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, unsigned int w,
|
||||
unsigned int h, bool layered)
|
||||
: fbolayer(0), RenderTargets(RTTs), DepthTexture(0),
|
||||
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);
|
||||
}
|
||||
|
||||
FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, GLuint DS, size_t w,
|
||||
size_t h, bool layered)
|
||||
FrameBuffer::FrameBuffer(const std::vector<GLuint> &RTTs, GLuint DS, unsigned int w,
|
||||
unsigned int h, bool layered)
|
||||
: fbolayer(0), RenderTargets(RTTs), DepthTexture(DS), width(w),
|
||||
height(h)
|
||||
{
|
||||
|
@ -66,18 +66,18 @@ private:
|
||||
GLuint fbo, fbolayer;
|
||||
std::vector<GLuint> RenderTargets;
|
||||
GLuint DepthTexture;
|
||||
size_t width, height;
|
||||
unsigned int width, height;
|
||||
public:
|
||||
FrameBuffer();
|
||||
FrameBuffer(const std::vector <GLuint> &RTTs, size_t w, size_t 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, unsigned int w, unsigned int h, bool layered = false);
|
||||
FrameBuffer(const std::vector <GLuint> &RTTs, GLuint DS, unsigned int w, unsigned int h, bool layered = false);
|
||||
~FrameBuffer();
|
||||
void bind() const;
|
||||
void bindLayer(unsigned) const;
|
||||
const std::vector<GLuint> &getRTT() const { return RenderTargets; }
|
||||
GLuint getDepthTexture() const { assert(DepthTexture); return DepthTexture; }
|
||||
size_t getWidth() const { return width; }
|
||||
size_t getHeight() const { return height; }
|
||||
unsigned int getWidth() const { return width; }
|
||||
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);
|
||||
void BlitToDefault(size_t, size_t, size_t, size_t);
|
||||
|
||||
@ -154,9 +154,9 @@ public:
|
||||
glEnableVertexAttribArray(4);
|
||||
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, getVertexPitchFromType(tp), (GLvoid*)44);
|
||||
glEnableVertexAttribArray(5);
|
||||
glVertexAttribIPointer(5, 4, GL_INT, getVertexPitchFromType(tp), (GLvoid*)60);
|
||||
glVertexAttribIPointer(5, 4, GL_SHORT, getVertexPitchFromType(tp), (GLvoid*)60);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,9 @@ namespace GraphicsRestrictions
|
||||
/** The list of names used in the XML file for the graphics
|
||||
* 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",
|
||||
@ -67,13 +69,16 @@ namespace GraphicsRestrictions
|
||||
"ColorBufferFloat",
|
||||
"DriverRecentEnough",
|
||||
"HighDefinitionTextures",
|
||||
"HighDefinitionTextures256",
|
||||
"AdvancedPipeline",
|
||||
"FramebufferSRGB",
|
||||
"FramebufferSRGBWorkaround1",
|
||||
"FramebufferSRGBWorkaround2",
|
||||
"GI",
|
||||
"ForceLegacyDevice",
|
||||
"VertexIdWorking"
|
||||
"VertexIdWorking",
|
||||
"HardwareSkinning"
|
||||
}
|
||||
};
|
||||
} // namespace Private
|
||||
using namespace Private;
|
||||
@ -261,7 +266,7 @@ public:
|
||||
/** If *this < other. */
|
||||
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++)
|
||||
{
|
||||
if (m_version[i] > other.m_version[i]) return false;
|
||||
@ -276,7 +281,7 @@ public:
|
||||
/** If *this <= other. */
|
||||
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++)
|
||||
{
|
||||
if (m_version[i] > other.m_version[i]) return false;
|
||||
@ -309,6 +314,9 @@ private:
|
||||
/** For which OS this rule applies. */
|
||||
std::string m_os;
|
||||
|
||||
/** For which vendor this rule applies. */
|
||||
std::string m_vendor;
|
||||
|
||||
/** Which options to disable. */
|
||||
std::vector<std::string> m_disable_options;
|
||||
public:
|
||||
@ -327,6 +335,7 @@ public:
|
||||
}
|
||||
|
||||
rule->get("os", &m_os);
|
||||
rule->get("vendor", &m_vendor);
|
||||
|
||||
std::string s;
|
||||
if(rule->get("version", &s) && s.size()>1)
|
||||
@ -358,7 +367,8 @@ public:
|
||||
m_disable_options = StringUtils::split(s, ' ');
|
||||
} // 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
|
||||
// -----------
|
||||
@ -379,6 +389,14 @@ public:
|
||||
#endif
|
||||
} // m_os.size()>0
|
||||
|
||||
// Test for vendor
|
||||
// ---------------
|
||||
if (m_vendor.size() > 0)
|
||||
{
|
||||
if (m_vendor != vendor)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Test for card
|
||||
// -------------
|
||||
switch(m_card_test)
|
||||
@ -482,9 +500,11 @@ void unitTesting()
|
||||
* \param driver_version The GL_VERSION string (i.e. opengl and version
|
||||
* number).
|
||||
* \param card_name The GL_RENDERER string (i.e. graphics card).
|
||||
* \param vendor The GL_VENDOR string
|
||||
*/
|
||||
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++)
|
||||
m_all_graphics_restriction.push_back(false);
|
||||
@ -518,7 +538,7 @@ void init(const std::string &driver_version,
|
||||
continue;
|
||||
}
|
||||
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>::iterator p;
|
||||
|
@ -56,6 +56,7 @@ namespace GraphicsRestrictions
|
||||
GR_COLOR_BUFFER_FLOAT,
|
||||
GR_DRIVER_RECENT_ENOUGH,
|
||||
GR_HIGHDEFINITION_TEXTURES,
|
||||
GR_HIGHDEFINITION_TEXTURES_256,
|
||||
GR_ADVANCED_PIPELINE,
|
||||
GR_FRAMEBUFFER_SRGB,
|
||||
GR_FRAMEBUFFER_SRGB_WORKAROUND1,
|
||||
@ -63,11 +64,13 @@ namespace GraphicsRestrictions
|
||||
GR_GI,
|
||||
GR_FORCE_LEGACY_DEVICE,
|
||||
GR_VERTEX_ID_WORKING,
|
||||
GR_HARDWARE_SKINNING,
|
||||
GR_COUNT /** MUST be last entry. */
|
||||
} ;
|
||||
|
||||
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);
|
||||
|
||||
void unitTesting();
|
||||
|
@ -317,7 +317,7 @@ public:
|
||||
{
|
||||
if (m_hue_settings.empty())
|
||||
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());
|
||||
return m_hue_settings[hue];
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include "config/user_config.hpp"
|
||||
#include "graphics/material.hpp"
|
||||
#include "graphics/particle_kind_manager.hpp"
|
||||
#include "graphics/shaders.hpp"
|
||||
#include "io/file_manager.hpp"
|
||||
#include "io/xml_node.hpp"
|
||||
@ -381,14 +382,26 @@ void MaterialManager::makeMaterialsPermanent()
|
||||
} // makeMaterialsPermanent
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
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++)
|
||||
{
|
||||
if (m_materials[i]->getTexFullPath().find(texture_folder) != std::string::npos)
|
||||
m_materials[i]->unloadTexture();
|
||||
// Global particle textures will stay until exit
|
||||
// STK, which avoid hangs when lazy-loading the texture when being
|
||||
// triggered.
|
||||
Material* m = m_materials[i];
|
||||
if (!ParticleKindManager::get()->isGlobalParticleMaterial(m)
|
||||
&& m->getTexFullPath().find(texture_folder) != std::string::npos)
|
||||
{
|
||||
m->unloadTexture();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -488,6 +488,10 @@ SkinnedPass1Shader::SkinnedPass1Shader()
|
||||
if (!CVS->supportsHardwareSkinning()) return;
|
||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "object_pass1.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "InverseModelMatrix", "skinning_offset");
|
||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
} // SkinnedPass1Shader
|
||||
@ -499,6 +503,10 @@ InstancedSkinnedPass1Shader::InstancedSkinnedPass1Shader()
|
||||
loadProgram(SKINNED_MESH,
|
||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "instanced_object_pass1.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms();
|
||||
assignSamplerNames(0, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
} // InstancedSkinnedPass1Shader
|
||||
@ -509,6 +517,10 @@ SkinnedPass2Shader::SkinnedPass2Shader()
|
||||
if (!CVS->supportsHardwareSkinning()) return;
|
||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "object_pass2.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "texture_trans", "color_change",
|
||||
"skinning_offset");
|
||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||
@ -527,6 +539,10 @@ InstancedSkinnedPass2Shader::InstancedSkinnedPass2Shader()
|
||||
loadProgram(SKINNED_MESH,
|
||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "instanced_object_pass2.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms();
|
||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||
@ -543,6 +559,10 @@ SkinnedRefPass1Shader::SkinnedRefPass1Shader()
|
||||
if (!CVS->supportsHardwareSkinning()) return;
|
||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "objectref_pass1.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "InverseModelMatrix", "texture_trans",
|
||||
"skinning_offset");
|
||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||
@ -556,6 +576,10 @@ InstancedSkinnedRefPass1Shader::InstancedSkinnedRefPass1Shader()
|
||||
loadProgram(SKINNED_MESH,
|
||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "instanced_objectref_pass1.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms();
|
||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||
1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
@ -567,6 +591,10 @@ SkinnedRefPass2Shader::SkinnedRefPass2Shader()
|
||||
if (!CVS->supportsHardwareSkinning()) return;
|
||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "objectref_pass2.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "texture_trans", "color_change",
|
||||
"skinning_offset");
|
||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||
@ -585,6 +613,10 @@ InstancedSkinnedRefPass2Shader::InstancedSkinnedRefPass2Shader()
|
||||
loadProgram(SKINNED_MESH,
|
||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "instanced_objectref_pass2.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms();
|
||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||
@ -601,6 +633,10 @@ SkinnedUnlitShader::SkinnedUnlitShader()
|
||||
if (!CVS->supportsHardwareSkinning()) return;
|
||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "object_unlit.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "texture_trans", "skinning_offset");
|
||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||
@ -615,6 +651,10 @@ InstancedSkinnedUnlitShader::InstancedSkinnedUnlitShader()
|
||||
loadProgram(SKINNED_MESH,
|
||||
GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "instanced_object_unlit.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms();
|
||||
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||
@ -628,6 +668,10 @@ SkinnedNormalMapShader::SkinnedNormalMapShader()
|
||||
if (!CVS->supportsHardwareSkinning()) return;
|
||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "normalmap.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "InverseModelMatrix", "skinning_offset");
|
||||
assignSamplerNames(0, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||
1, "glossMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
@ -639,6 +683,10 @@ InstancedSkinnedNormalMapShader::InstancedSkinnedNormalMapShader()
|
||||
if (!CVS->supportsHardwareSkinning()) return;
|
||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "instanced_skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "instanced_normalmap.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms();
|
||||
assignSamplerNames(0, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||
1, "glossMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
@ -662,6 +710,10 @@ SkinnedShadowShader::SkinnedShadowShader()
|
||||
GL_GEOMETRY_SHADER, "shadow.geom",
|
||||
GL_FRAGMENT_SHADER, "shadow.frag");
|
||||
}
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "skinning_offset", "layer");
|
||||
#endif
|
||||
} // SkinnedShadowShader
|
||||
@ -686,6 +738,10 @@ InstancedSkinnedShadowShader::InstancedSkinnedShadowShader()
|
||||
GL_GEOMETRY_SHADER, "instanced_shadow.geom",
|
||||
GL_FRAGMENT_SHADER, "shadow.frag");
|
||||
}
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("layer");
|
||||
#endif
|
||||
} // InstancedSkinnedShadowShader
|
||||
@ -708,6 +764,10 @@ SkinnedRefShadowShader::SkinnedRefShadowShader()
|
||||
GL_GEOMETRY_SHADER, "shadow.geom",
|
||||
GL_FRAGMENT_SHADER, "shadowref.frag");
|
||||
}
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "skinning_offset", "layer");
|
||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
#endif
|
||||
@ -733,6 +793,10 @@ InstancedSkinnedRefShadowShader::InstancedSkinnedRefShadowShader()
|
||||
GL_GEOMETRY_SHADER, "instanced_shadow.geom",
|
||||
GL_FRAGMENT_SHADER, "instanced_shadowref.frag");
|
||||
}
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("layer");
|
||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
#endif
|
||||
|
@ -296,7 +296,8 @@ public:
|
||||
// ============================================================================
|
||||
class SkinnedPass1Shader : public TextureShader<SkinnedPass1Shader, 1,
|
||||
core::matrix4, core::matrix4,
|
||||
int>
|
||||
int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedPass1Shader();
|
||||
@ -304,7 +305,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class InstancedSkinnedPass1Shader
|
||||
: public TextureShader<InstancedSkinnedPass1Shader, 1>
|
||||
: public TextureShader<InstancedSkinnedPass1Shader, 1>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
InstancedSkinnedPass1Shader();
|
||||
@ -313,7 +315,8 @@ public:
|
||||
// ============================================================================
|
||||
class SkinnedPass2Shader : public TextureShader<SkinnedPass2Shader, 6,
|
||||
core::matrix4, core::vector2df,
|
||||
core::vector2df, int >
|
||||
core::vector2df, int >,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedPass2Shader();
|
||||
@ -321,7 +324,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class InstancedSkinnedPass2Shader
|
||||
: public TextureShader<InstancedSkinnedPass2Shader, 6>
|
||||
: public TextureShader<InstancedSkinnedPass2Shader, 6>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
InstancedSkinnedPass2Shader();
|
||||
@ -331,7 +335,8 @@ public:
|
||||
class SkinnedRefPass1Shader : public TextureShader<SkinnedRefPass1Shader, 2,
|
||||
core::matrix4,
|
||||
core::matrix4,
|
||||
core::vector2df, int>
|
||||
core::vector2df, int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedRefPass1Shader();
|
||||
@ -339,7 +344,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class InstancedSkinnedRefPass1Shader
|
||||
: public TextureShader<InstancedSkinnedRefPass1Shader, 2>
|
||||
: public TextureShader<InstancedSkinnedRefPass1Shader, 2>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
InstancedSkinnedRefPass1Shader();
|
||||
@ -349,7 +355,8 @@ public:
|
||||
class SkinnedRefPass2Shader : public TextureShader<SkinnedRefPass2Shader, 6,
|
||||
core::matrix4,
|
||||
core::vector2df,
|
||||
core::vector2df, int>
|
||||
core::vector2df, int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedRefPass2Shader();
|
||||
@ -357,7 +364,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class InstancedSkinnedRefPass2Shader
|
||||
: public TextureShader<InstancedSkinnedRefPass2Shader, 6>
|
||||
: public TextureShader<InstancedSkinnedRefPass2Shader, 6>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
InstancedSkinnedRefPass2Shader();
|
||||
@ -366,7 +374,8 @@ public:
|
||||
// ============================================================================
|
||||
class SkinnedUnlitShader : public TextureShader<SkinnedUnlitShader, 4,
|
||||
core::matrix4, core::vector2df,
|
||||
int>
|
||||
int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedUnlitShader();
|
||||
@ -374,7 +383,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class InstancedSkinnedUnlitShader
|
||||
: public TextureShader<InstancedSkinnedUnlitShader, 4>
|
||||
: public TextureShader<InstancedSkinnedUnlitShader, 4>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
InstancedSkinnedUnlitShader();
|
||||
@ -383,7 +393,8 @@ public:
|
||||
// ============================================================================
|
||||
class SkinnedNormalMapShader : public TextureShader<SkinnedNormalMapShader, 2,
|
||||
core::matrix4,
|
||||
core::matrix4, int>
|
||||
core::matrix4, int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedNormalMapShader();
|
||||
@ -391,7 +402,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class InstancedSkinnedNormalMapShader
|
||||
: public TextureShader<InstancedSkinnedNormalMapShader, 2>
|
||||
: public TextureShader<InstancedSkinnedNormalMapShader, 2>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
InstancedSkinnedNormalMapShader();
|
||||
@ -399,7 +411,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class SkinnedShadowShader : public TextureShader<SkinnedShadowShader, 0,
|
||||
core::matrix4, int, int>
|
||||
core::matrix4, int, int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedShadowShader();
|
||||
@ -407,7 +420,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class InstancedSkinnedShadowShader
|
||||
: public TextureShader<InstancedSkinnedShadowShader, 0, int>
|
||||
: public TextureShader<InstancedSkinnedShadowShader, 0, int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
InstancedSkinnedShadowShader();
|
||||
@ -415,7 +429,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class SkinnedRefShadowShader : public TextureShader<SkinnedRefShadowShader, 1,
|
||||
core::matrix4, int, int>
|
||||
core::matrix4, int, int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedRefShadowShader();
|
||||
@ -423,7 +438,8 @@ public:
|
||||
|
||||
// ============================================================================
|
||||
class InstancedSkinnedRefShadowShader
|
||||
: public TextureShader<InstancedSkinnedRefShadowShader, 1, int>
|
||||
: public TextureShader<InstancedSkinnedRefShadowShader, 1, int>,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
InstancedSkinnedRefShadowShader();
|
||||
|
@ -124,3 +124,14 @@ ParticleKind* ParticleKindManager::getParticles(const std::string &name)
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
bool ParticleKindManager::isGlobalParticleMaterial(Material* m) const
|
||||
{
|
||||
for (auto& p : m_kinds)
|
||||
{
|
||||
if (p.second->getMaterial() == m)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
class Material;
|
||||
|
||||
/**
|
||||
* \brief Holds and manages a list of all types of particles
|
||||
* \ingroup graphics
|
||||
@ -45,6 +47,7 @@ public:
|
||||
|
||||
ParticleKind* getParticles(const std::string &name);
|
||||
|
||||
bool isGlobalParticleMaterial(Material* m) const;
|
||||
void cleanUpTrackSpecificGfx();
|
||||
void cleanup();
|
||||
|
||||
|
@ -998,7 +998,7 @@ void PostProcessing::renderGaussian3Blur(const FrameBuffer &in_fbo,
|
||||
// ----------------------------------------------------------------------------
|
||||
void PostProcessing::renderGaussian6BlurLayer(const FrameBuffer &in_fbo,
|
||||
const FrameBuffer &scalar_fbo,
|
||||
size_t layer, float sigma_h,
|
||||
unsigned int layer, float sigma_h,
|
||||
float sigma_v) const
|
||||
{
|
||||
#if !defined(USE_GLES2)
|
||||
|
@ -93,7 +93,7 @@ public:
|
||||
void renderHorizontalBlur(const FrameBuffer &in_fbo, const FrameBuffer &auxiliary) const;
|
||||
|
||||
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,
|
||||
const FrameBuffer &auxiliary,
|
||||
const FrameBuffer &linear_depth) const;
|
||||
|
@ -76,7 +76,10 @@ public:
|
||||
*/
|
||||
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
|
||||
{
|
||||
|
@ -25,7 +25,9 @@
|
||||
#include "graphics/materials.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;
|
||||
glGenTextures(1, &result);
|
||||
@ -49,10 +51,10 @@ static GLuint generateRTT(const core::dimension2du &res, GLint internalFormat, G
|
||||
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_height = size_t(height * rtt_scale);
|
||||
m_width = (unsigned int)(width * rtt_scale);
|
||||
m_height = (unsigned int)(height * rtt_scale);
|
||||
m_shadow_FBO = NULL;
|
||||
m_RH_FBO = NULL;
|
||||
m_RSM = NULL;
|
||||
|
@ -144,11 +144,11 @@ enum TypeRTT : unsigned int
|
||||
class RTT
|
||||
{
|
||||
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();
|
||||
|
||||
size_t getWidth () const { return m_width ; }
|
||||
size_t getHeight() const { return m_height; }
|
||||
unsigned int getWidth () const { return m_width ; }
|
||||
unsigned int getHeight() const { return m_height; }
|
||||
|
||||
FrameBuffer &getShadowFrameBuffer() { return *m_shadow_FBO; }
|
||||
FrameBuffer &getRadianceHintFrameBuffer() { return *m_RH_FBO; }
|
||||
@ -165,8 +165,8 @@ private:
|
||||
std::vector<uint64_t> m_prefilled_handles;
|
||||
unsigned DepthStencilTexture;
|
||||
|
||||
size_t m_width;
|
||||
size_t m_height;
|
||||
unsigned int m_width;
|
||||
unsigned int m_height;
|
||||
|
||||
unsigned shadowColorTex, shadowDepthTex;
|
||||
unsigned RSM_Color, RSM_Normal, RSM_Depth;
|
||||
|
@ -146,9 +146,8 @@ private:
|
||||
/** End of recursive implementation of assignUniforms. */
|
||||
void assignUniformsImpl()
|
||||
{
|
||||
bindPoint("MatrixData", 0);
|
||||
bindPoint("MatrixesData", 0);
|
||||
bindPoint("LightingData", 1);
|
||||
bindPoint("SkinningData", 2);
|
||||
} // assignUniformsImpl
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
@ -367,6 +366,8 @@ public:
|
||||
}
|
||||
} // loadProgram
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
virtual void bindCustomTextures() {}
|
||||
// ------------------------------------------------------------------------
|
||||
void drawFullScreenEffect(Args...args)
|
||||
{
|
||||
@ -379,6 +380,50 @@ public:
|
||||
}; // 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
|
||||
|
||||
|
@ -152,42 +152,9 @@ void ShaderBasedRenderer::prepareForwardRenderer()
|
||||
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,
|
||||
size_t width, size_t height)
|
||||
unsigned int width, unsigned int height)
|
||||
{
|
||||
m_current_screen_size = core::vector2df((float)width, (float)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, 1, SharedGPUObjects::getLightingDataUBO());
|
||||
if (CVS->supportsHardwareSkinning())
|
||||
glBindBufferBase(GL_UNIFORM_BUFFER, 2, SharedGPUObjects::getSkinningUBO());
|
||||
}
|
||||
irr_driver->getSceneManager()->setActiveCamera(camnode);
|
||||
|
||||
@ -668,8 +633,8 @@ ShaderBasedRenderer::~ShaderBasedRenderer()
|
||||
void ShaderBasedRenderer::onLoadWorld()
|
||||
{
|
||||
const core::recti &viewport = Camera::getCamera(0)->getViewport();
|
||||
size_t width = viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X;
|
||||
size_t height = viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y;
|
||||
unsigned int width = viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X;
|
||||
unsigned int height = viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y;
|
||||
RTT* rtts = new RTT(width, height, CVS->isDefferedEnabled() ?
|
||||
UserConfigParams::m_scale_rtts_factor : 1.0f);
|
||||
setRTT(rtts);
|
||||
@ -812,11 +777,9 @@ void ShaderBasedRenderer::render(float dt)
|
||||
glEnable(GL_FRAMEBUFFER_SRGB);
|
||||
#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());
|
||||
m_shadow_matrices.updateSunOrthoMatrices();
|
||||
if(CVS->isARBUniformBufferObjectUsable())
|
||||
uploadLightingData();
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
renderScene(camnode, dt, track->hasShadows(), false);
|
||||
|
||||
@ -923,9 +886,6 @@ void ShaderBasedRenderer::renderToTexture(GL3RenderTarget *render_target,
|
||||
irr_driver->getSceneManager()->setActiveCamera(camera);
|
||||
|
||||
computeMatrixesAndCameras(camera, m_rtts->getWidth(), m_rtts->getHeight());
|
||||
if (CVS->isARBUniformBufferObjectUsable())
|
||||
uploadLightingData();
|
||||
|
||||
renderScene(camera, dt, false, true);
|
||||
render_target->setFrameBuffer(m_post_processing
|
||||
->render(camera, false, m_rtts));
|
||||
|
@ -52,7 +52,7 @@ private:
|
||||
/** Static glowing things are loaded once per track.
|
||||
* Glowing items can appear ordisappear each frame */
|
||||
std::vector<GlowData> m_glowing;
|
||||
size_t m_nb_static_glowing;
|
||||
unsigned int m_nb_static_glowing;
|
||||
|
||||
void setOverrideMaterial();
|
||||
|
||||
@ -61,10 +61,8 @@ private:
|
||||
|
||||
void prepareForwardRenderer();
|
||||
|
||||
void uploadLightingData() const;
|
||||
|
||||
void computeMatrixesAndCameras(scene::ICameraSceneNode * const camnode,
|
||||
size_t width, size_t height);
|
||||
unsigned int width, unsigned int height);
|
||||
|
||||
void resetShadowCamNodes(){m_shadow_matrices.resetShadowCamNodes();}
|
||||
|
||||
|
@ -18,8 +18,8 @@
|
||||
#ifndef SERVER_ONLY
|
||||
|
||||
#include "graphics/shader_files_manager.hpp"
|
||||
#include "config/stk_config.hpp"
|
||||
#include "graphics/central_settings.hpp"
|
||||
#include "graphics/shared_gpu_objects.hpp"
|
||||
#include "io/file_manager.hpp"
|
||||
#include "utils/log.hpp"
|
||||
|
||||
@ -170,7 +170,9 @@ GLuint ShaderFilesManager::loadShader(const std::string &file, unsigned type)
|
||||
code << "#define Advanced_Lighting_Enabled\n";
|
||||
if (CVS->isARBSRGBFramebufferUsable())
|
||||
code << "#define sRGB_Framebuffer_Usable\n";
|
||||
|
||||
if (CVS->isARBShaderStorageBufferObjectUsable() &&
|
||||
CVS->supportsHardwareSkinning())
|
||||
code << "#define SSBO_SKINNING\n";
|
||||
#if !defined(USE_GLES2)
|
||||
// shader compilation fails with some drivers if there is no precision
|
||||
// qualifier
|
||||
@ -186,7 +188,7 @@ GLuint ShaderFilesManager::loadShader(const std::string &file, unsigned type)
|
||||
else
|
||||
code << "precision mediump float;\n";
|
||||
#endif
|
||||
code << "#define MAX_BONES " << SharedGPUObjects::getMaxMat4Size() << "\n";
|
||||
code << "#define MAX_BONES " << stk_config->m_max_skinning_bones << "\n";
|
||||
|
||||
code << getHeader();
|
||||
|
||||
@ -195,7 +197,7 @@ GLuint ShaderFilesManager::loadShader(const std::string &file, unsigned type)
|
||||
Log::info("ShaderFilesManager", "Compiling shader : %s", file.c_str());
|
||||
const std::string &source = code.str();
|
||||
char const *source_pointer = source.c_str();
|
||||
int len = source.size();
|
||||
int len = (int)source.size();
|
||||
glShaderSource(id, 1, &source_pointer, &len);
|
||||
glCompileShader(id);
|
||||
|
||||
|
@ -277,6 +277,10 @@ Shaders::SkinnedTransparentShader::SkinnedTransparentShader()
|
||||
if (!CVS->supportsHardwareSkinning()) return;
|
||||
loadProgram(SKINNED_MESH, GL_VERTEX_SHADER, "skinning.vert",
|
||||
GL_FRAGMENT_SHADER, "transparent.frag");
|
||||
if (SkinnedMeshShader* sms = dynamic_cast<SkinnedMeshShader*>(this))
|
||||
{
|
||||
sms->init(this);
|
||||
}
|
||||
assignUniforms("ModelMatrix", "texture_trans", "skinning_offset", "custom_alpha");
|
||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
} // SkinnedTransparentShader
|
||||
|
@ -140,7 +140,8 @@ public:
|
||||
// ========================================================================
|
||||
class SkinnedTransparentShader : public TextureShader<SkinnedTransparentShader, 1,
|
||||
core::matrix4, core::vector2df,
|
||||
int, float >
|
||||
int, float >,
|
||||
public SkinnedMeshShader
|
||||
{
|
||||
public:
|
||||
SkinnedTransparentShader();
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "graphics/post_processing.hpp"
|
||||
#include "graphics/rtts.hpp"
|
||||
#include "graphics/shared_gpu_objects.hpp"
|
||||
#include "graphics/spherical_harmonics.hpp"
|
||||
#include "graphics/texture_shader.hpp"
|
||||
#include "modes/world.hpp"
|
||||
#include "physics/triangle_mesh.hpp"
|
||||
@ -311,6 +312,55 @@ void ShadowMatrices::updateSplitAndLightcoordRangeFromComputeShaders(unsigned in
|
||||
#endif
|
||||
} // 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
|
||||
* 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 oldnear = camnode->getNearValue();
|
||||
|
||||
float tmp[16 * 9 + 2];
|
||||
memcpy(tmp, irr_driver->getViewMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(&tmp[16], irr_driver->getProjMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(&tmp[32], irr_driver->getInvViewMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(&tmp[48], irr_driver->getInvProjMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(&tmp[64], irr_driver->getProjViewMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(m_ubo_data, irr_driver->getViewMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(&m_ubo_data[16], irr_driver->getProjMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(&m_ubo_data[32], irr_driver->getInvViewMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(&m_ubo_data[48], irr_driver->getInvProjMatrix().pointer(), 16 * sizeof(float));
|
||||
memcpy(&m_ubo_data[64], irr_driver->getProjViewMatrix().pointer(), 16 * sizeof(float));
|
||||
|
||||
m_sun_cam->render();
|
||||
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();
|
||||
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(),
|
||||
16 * sizeof(float));
|
||||
}
|
||||
|
||||
if(!CVS->isARBUniformBufferObjectUsable())
|
||||
return;
|
||||
|
||||
tmp[144] = float(width);
|
||||
tmp[145] = float(height);
|
||||
glBindBuffer(GL_UNIFORM_BUFFER,
|
||||
SharedGPUObjects::getViewProjectionMatricesUBO());
|
||||
m_ubo_data[144] = float(width);
|
||||
m_ubo_data[145] = float(height);
|
||||
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),
|
||||
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
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -49,6 +49,7 @@ private:
|
||||
core::matrix4 m_rsm_matrix;
|
||||
bool m_rsm_matrix_initialized;
|
||||
float m_shadows_cam[4][24];
|
||||
float m_ubo_data[16 * 9 + 2];
|
||||
bool m_rsm_map_available;
|
||||
core::vector3df m_rh_extend;
|
||||
core::matrix4 m_rh_matrix;
|
||||
@ -104,6 +105,7 @@ public:
|
||||
return m_shadow_scales;
|
||||
}
|
||||
// ------------------------------------------------------------------------
|
||||
void updateUBO();
|
||||
|
||||
}; // class ShadowMatrices
|
||||
|
||||
|
@ -18,12 +18,10 @@
|
||||
#ifndef SERVER_ONLY
|
||||
|
||||
#include "graphics/shared_gpu_objects.hpp"
|
||||
#include "config/stk_config.hpp"
|
||||
#include "graphics/central_settings.hpp"
|
||||
#include "utils/log.hpp"
|
||||
|
||||
#include "matrix4.h"
|
||||
#include <algorithm>
|
||||
|
||||
GLuint SharedGPUObjects::m_sky_tri_vbo;
|
||||
GLuint SharedGPUObjects::m_frustrum_vbo;
|
||||
GLuint SharedGPUObjects::m_frustrum_indices;
|
||||
@ -33,8 +31,8 @@ GLuint SharedGPUObjects::m_full_screen_quad_vao;
|
||||
GLuint SharedGPUObjects::m_ui_vao;
|
||||
GLuint SharedGPUObjects::m_quad_buffer;
|
||||
GLuint SharedGPUObjects::m_quad_vbo;
|
||||
GLuint SharedGPUObjects::m_skinning_ubo;
|
||||
int SharedGPUObjects::m_max_mat4_size = 1024;
|
||||
GLuint SharedGPUObjects::m_skinning_tex;
|
||||
GLuint SharedGPUObjects::m_skinning_buf;
|
||||
bool SharedGPUObjects::m_has_been_initialised = false;
|
||||
|
||||
/** Initialises m_full_screen_quad_vbo.
|
||||
@ -158,24 +156,61 @@ void SharedGPUObjects::initLightingDataUBO()
|
||||
} // initLightingDataUBO
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void SharedGPUObjects::initSkinningUBO()
|
||||
void SharedGPUObjects::initSkinning()
|
||||
{
|
||||
assert(CVS->isARBUniformBufferObjectUsable());
|
||||
irr::core::matrix4 m;
|
||||
glGenBuffers(1, &m_skinning_ubo);
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, m_skinning_ubo);
|
||||
glGenTextures(1, &m_skinning_tex);
|
||||
int max_size = 0;
|
||||
glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &max_size);
|
||||
max_size = std::min(max_size, 65536);
|
||||
m_max_mat4_size = max_size / 16 / sizeof(float);
|
||||
Log::info("SharedGPUObjects", "Hardware skinning supported, max joints"
|
||||
" support: %d", m_max_mat4_size);
|
||||
glBufferData(GL_UNIFORM_BUFFER, max_size, 0, GL_STREAM_DRAW);
|
||||
// Reserve a identity matrix for non moving mesh in animated model used by
|
||||
// vertex shader calculation
|
||||
glBufferSubData(GL_UNIFORM_BUFFER, 0, 16 * sizeof(float), m.pointer());
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||
} // initSkinningUBO
|
||||
#ifdef USE_GLES2
|
||||
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_size);
|
||||
|
||||
if (stk_config->m_max_skinning_bones > (unsigned)max_size)
|
||||
{
|
||||
Log::warn("SharedGPUObjects", "Too many bones for skinning, max: %d",
|
||||
max_size);
|
||||
stk_config->m_max_skinning_bones = max_size;
|
||||
}
|
||||
Log::info("SharedGPUObjects", "Hardware Skinning enabled, method: %u"
|
||||
" (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()
|
||||
@ -186,13 +221,14 @@ void SharedGPUObjects::init()
|
||||
initQuadBuffer();
|
||||
initSkyTriVBO();
|
||||
initFrustrumVBO();
|
||||
|
||||
if (CVS->supportsHardwareSkinning())
|
||||
{
|
||||
initSkinning();
|
||||
}
|
||||
if (CVS->isARBUniformBufferObjectUsable())
|
||||
{
|
||||
initShadowVPMUBO();
|
||||
initLightingDataUBO();
|
||||
if (CVS->supportsHardwareSkinning())
|
||||
initSkinningUBO();
|
||||
}
|
||||
|
||||
m_has_been_initialised = true;
|
||||
|
@ -35,8 +35,8 @@ private:
|
||||
static GLuint m_ui_vao;
|
||||
static GLuint m_quad_buffer;
|
||||
static GLuint m_quad_vbo;
|
||||
static GLuint m_skinning_ubo;
|
||||
static int m_max_mat4_size;
|
||||
static GLuint m_skinning_tex;
|
||||
static GLuint m_skinning_buf;
|
||||
|
||||
static void initQuadVBO();
|
||||
static void initQuadBuffer();
|
||||
@ -44,7 +44,7 @@ private:
|
||||
static void initFrustrumVBO();
|
||||
static void initShadowVPMUBO();
|
||||
static void initLightingDataUBO();
|
||||
static void initSkinningUBO();
|
||||
static void initSkinning();
|
||||
|
||||
public:
|
||||
static void init();
|
||||
@ -104,16 +104,18 @@ public:
|
||||
return m_quad_vbo;
|
||||
} // getQuadVBO
|
||||
// ------------------------------------------------------------------------
|
||||
static GLuint getSkinningUBO()
|
||||
static GLuint getSkinningTexture()
|
||||
{
|
||||
assert(m_has_been_initialised);
|
||||
return m_skinning_ubo;
|
||||
} // getSkinningUBO
|
||||
return m_skinning_tex;
|
||||
} // getSkinningTexture
|
||||
// ------------------------------------------------------------------------
|
||||
static int getMaxMat4Size()
|
||||
static GLuint getSkinningBuffer()
|
||||
{
|
||||
return m_max_mat4_size;
|
||||
} // getMaxMat4Size
|
||||
assert(m_has_been_initialised);
|
||||
return m_skinning_buf;
|
||||
} // getSkinningBuffer
|
||||
|
||||
}; // class SharedGPUObjects
|
||||
|
||||
|
||||
|
@ -206,7 +206,7 @@ void Skybox::generateSpecularCubemap()
|
||||
{
|
||||
glGenTextures(1, &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++)
|
||||
{
|
||||
#if !defined(USE_GLES2)
|
||||
|
@ -233,7 +233,8 @@ namespace
|
||||
* \param sh_rgba The 6 cubemap faces (sRGB byte textures)
|
||||
* \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
|
||||
@ -644,7 +645,7 @@ void SphericalHarmonics::printCoeff() {
|
||||
* \param Yml The sphericals harmonics functions 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 *Y11[], float *Y2minus2[], float *Y2minus1[],
|
||||
float *Y20[], float *Y21[], float *Y22[],
|
||||
|
@ -49,7 +49,7 @@ private:
|
||||
/** The spherical harmonics coefficients */
|
||||
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:
|
||||
SphericalHarmonics(const std::vector<irr::video::ITexture *> &spherical_harmonics_textures);
|
||||
@ -65,7 +65,7 @@ public:
|
||||
|
||||
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 *Y11[], float *Y2minus2[], float *Y2minus1[],
|
||||
float * Y20[], float *Y21[], float *Y22[],
|
||||
|
@ -378,9 +378,15 @@ void STKAnimatedMesh::uploadJoints(const irr::core::matrix4& m,
|
||||
int joint, int offset)
|
||||
{
|
||||
assert(offset != -1);
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, SharedGPUObjects::getSkinningUBO());
|
||||
glBufferSubData(GL_UNIFORM_BUFFER, offset + joint * 16 * sizeof(float),
|
||||
#ifdef USE_GLES2
|
||||
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());
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // !SERVER_ONLY
|
||||
|
@ -193,9 +193,9 @@ GLuint createVAO(GLuint vbo, GLuint idx, video::E_VERTEX_TYPE type)
|
||||
glEnableVertexAttribArray(4);
|
||||
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)44);
|
||||
glEnableVertexAttribArray(5);
|
||||
glVertexAttribIPointer(5, 4, GL_INT, getVertexPitchFromType(type), (GLvoid*)60);
|
||||
glVertexAttribIPointer(5, 4, GL_SHORT, getVertexPitchFromType(type), (GLvoid*)60);
|
||||
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;
|
||||
default:
|
||||
assert(0 && "Wrong vertex type");
|
||||
|
@ -52,11 +52,11 @@ struct GLMesh
|
||||
video::ITexture *textures[8];
|
||||
GLenum PrimitiveType;
|
||||
GLenum IndexType;
|
||||
size_t IndexCount;
|
||||
size_t Stride;
|
||||
unsigned int IndexCount;
|
||||
unsigned int Stride;
|
||||
core::vector2df texture_trans;
|
||||
size_t vaoBaseVertex;
|
||||
size_t vaoOffset;
|
||||
unsigned int vaoBaseVertex;
|
||||
intptr_t vaoOffset;
|
||||
video::E_VERTEX_TYPE VAOType;
|
||||
uint64_t TextureHandles[8];
|
||||
scene::IMeshBuffer *mb;
|
||||
@ -72,7 +72,7 @@ GLMesh allocateMeshBuffer(scene::IMeshBuffer* mb,
|
||||
const std::string& debug_name,
|
||||
RenderInfo* render_info);
|
||||
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);
|
||||
core::matrix4 computeMVP(const core::matrix4 &ModelViewProjectionMatrix);
|
||||
bool isObject(video::E_MATERIAL_TYPE type);
|
||||
|
@ -158,7 +158,7 @@ void STKMeshSceneNode::drawGlow(const GLMesh &mesh)
|
||||
|
||||
GLenum ptype = mesh.PrimitiveType;
|
||||
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));
|
||||
glDrawElementsBaseVertex(ptype, count, itype, (GLvoid *)mesh.vaoOffset, mesh.vaoBaseVertex);
|
||||
}
|
||||
@ -352,7 +352,7 @@ void STKMeshSceneNode::render()
|
||||
GLMesh &mesh = GLmeshes[i];
|
||||
GLenum ptype = mesh.PrimitiveType;
|
||||
GLenum itype = mesh.IndexType;
|
||||
size_t count = mesh.IndexCount;
|
||||
unsigned int count = mesh.IndexCount;
|
||||
|
||||
#if !defined(USE_GLES2)
|
||||
if (CVS->isAZDOEnabled())
|
||||
@ -392,7 +392,7 @@ void STKMeshSceneNode::render()
|
||||
GLMesh &mesh = GLmeshes[i];
|
||||
GLenum ptype = mesh.PrimitiveType;
|
||||
GLenum itype = mesh.IndexType;
|
||||
size_t count = mesh.IndexCount;
|
||||
unsigned int count = mesh.IndexCount;
|
||||
|
||||
#if !defined(USE_GLES2)
|
||||
if (CVS->isAZDOEnabled())
|
||||
@ -484,7 +484,7 @@ void STKMeshSceneNode::render()
|
||||
irr_driver->increaseObjectCount();
|
||||
GLenum ptype = mesh.PrimitiveType;
|
||||
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.
|
||||
const float fogmax = track->getFogMax();
|
||||
@ -531,7 +531,7 @@ void STKMeshSceneNode::render()
|
||||
GLMesh &mesh = GLmeshes[i];
|
||||
GLenum ptype = mesh.PrimitiveType;
|
||||
GLenum itype = mesh.IndexType;
|
||||
size_t count = mesh.IndexCount;
|
||||
unsigned int count = mesh.IndexCount;
|
||||
|
||||
#if !defined(USE_GLES2)
|
||||
if (CVS->isAZDOEnabled())
|
||||
|
@ -253,11 +253,11 @@ void STKParticle::generate(std::vector<CPUParticle>* out)
|
||||
{
|
||||
if (m_hm != NULL)
|
||||
{
|
||||
stimulateHeightMap(i, active_count, NULL);
|
||||
stimulateHeightMap((float)i, active_count, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
stimulateNormal(i, active_count, NULL);
|
||||
stimulateNormal((float)i, active_count, NULL);
|
||||
}
|
||||
}
|
||||
m_first_execution = false;
|
||||
@ -513,6 +513,10 @@ void STKParticle::OnRegisterSceneNode()
|
||||
continue;
|
||||
}
|
||||
scene::SParticle p;
|
||||
p.startTime = 0;
|
||||
p.endTime = 0;
|
||||
p.color = 0;
|
||||
p.startColor = 0;
|
||||
p.pos = m_particles_generating[i].m_position;
|
||||
Buffer->BoundingBox.addInternalPoint(p.pos);
|
||||
p.size = core::dimension2df(m_particles_generating[i].m_size,
|
||||
|
@ -65,7 +65,7 @@ STKTexture::STKTexture(const std::string& path, TexConfig* tc, bool no_upload)
|
||||
} // STKTexture
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
STKTexture::STKTexture(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)
|
||||
: video::ITexture(name.c_str()), m_texture_handle(0),
|
||||
m_single_channel(single_channel), m_tex_config(NULL),
|
||||
|
@ -90,7 +90,7 @@ public:
|
||||
// ------------------------------------------------------------------------
|
||||
STKTexture(const std::string& path, TexConfig* tc, bool no_upload = false);
|
||||
// ------------------------------------------------------------------------
|
||||
STKTexture(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);
|
||||
// ------------------------------------------------------------------------
|
||||
STKTexture(video::IImage* img, const std::string& name);
|
||||
|
@ -177,6 +177,7 @@ public:
|
||||
template<int N, typename... TexIds>
|
||||
void setTextureUnitsImpl(GLuint tex_id, TexIds... args)
|
||||
{
|
||||
static_assert(N != 15, "15 is reserved for skinning texture");
|
||||
#if defined(USE_GLES2)
|
||||
if (CVS->getGLSLVersion() >= 300)
|
||||
#else
|
||||
|
@ -83,7 +83,9 @@ VAOManager::~VAOManager()
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@ -116,11 +118,14 @@ resizeBufferIfNecessary(size_t &lastIndex, size_t newLastIndex, size_t& bufferSi
|
||||
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);
|
||||
resizeBufferIfNecessary(last_vertex[tp], newlastvertex, RealVBOSize[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]);
|
||||
resizeBufferIfNecessary(last_vertex[tp], newlastvertex, RealVBOSize[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)
|
||||
@ -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)
|
||||
{
|
||||
@ -318,8 +323,8 @@ irr::video::E_VERTEX_TYPE VAOManager::getVertexType(enum VTXTYPE tp)
|
||||
|
||||
void VAOManager::append(scene::IMeshBuffer *mb, VTXTYPE tp)
|
||||
{
|
||||
size_t old_vtx_cnt = last_vertex[tp];
|
||||
size_t old_idx_cnt = last_index[tp];
|
||||
unsigned int old_vtx_cnt = last_vertex[tp];
|
||||
unsigned int old_idx_cnt = last_index[tp];
|
||||
|
||||
regenerateBuffer(tp, old_vtx_cnt + mb->getVertexCount(), old_idx_cnt + mb->getIndexCount());
|
||||
#if !defined(USE_GLES2)
|
||||
|
@ -194,16 +194,16 @@ class VAOManager : public Singleton<VAOManager>
|
||||
GLuint instance_vbo[InstanceTypeCount];
|
||||
void *Ptr[InstanceTypeCount];
|
||||
void *VBOPtr[VTXTYPE_COUNT], *IBOPtr[VTXTYPE_COUNT];
|
||||
size_t RealVBOSize[VTXTYPE_COUNT], RealIBOSize[VTXTYPE_COUNT];
|
||||
size_t last_vertex[VTXTYPE_COUNT], last_index[VTXTYPE_COUNT];
|
||||
unsigned int RealVBOSize[VTXTYPE_COUNT], RealIBOSize[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::map<std::pair<irr::video::E_VERTEX_TYPE, InstanceType>, GLuint> InstanceVAO;
|
||||
|
||||
void cleanInstanceVAOs();
|
||||
void regenerateBuffer(enum VTXTYPE, size_t, size_t);
|
||||
void regenerateBuffer(enum VTXTYPE, unsigned int, unsigned int);
|
||||
void regenerateVAO(enum VTXTYPE);
|
||||
void regenerateInstancedVAO();
|
||||
size_t getVertexPitch(enum VTXTYPE) const;
|
||||
unsigned int getVertexPitch(enum VTXTYPE) const;
|
||||
VTXTYPE getVTXTYPE(irr::video::E_VERTEX_TYPE type);
|
||||
irr::video::E_VERTEX_TYPE getVertexType(enum VTXTYPE tp);
|
||||
void append(irr::scene::IMeshBuffer *, VTXTYPE tp);
|
||||
|
@ -170,7 +170,10 @@ namespace GUIEngine
|
||||
// --------------------------------------------------------------------
|
||||
/** Returns the number of screens on the stack. Is used to decide
|
||||
* 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
|
||||
|
||||
} // GUIEngine
|
||||
|
@ -318,7 +318,7 @@ void SpinnerWidget::addLabel(stringw label)
|
||||
{
|
||||
m_labels.push_back(label);
|
||||
m_min = 0;
|
||||
m_max = m_labels.size()-1;
|
||||
m_max = (int)m_labels.size()-1;
|
||||
|
||||
if (m_element != NULL) setValue(0);
|
||||
}
|
||||
|
@ -1038,7 +1038,7 @@ EventPropagation InputManager::input(const SEvent& event)
|
||||
else if (event.EventType == EET_TOUCH_INPUT_EVENT)
|
||||
{
|
||||
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())
|
||||
{
|
||||
|
@ -114,7 +114,7 @@ public:
|
||||
void reset();
|
||||
|
||||
/** 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 */
|
||||
MultitouchButton* getButton(unsigned int i) {return m_buttons.at(i);}
|
||||
|
@ -828,7 +828,7 @@ float Kart::getSpeedForTurnRadius(float radius) const
|
||||
{
|
||||
InterpolationArray turn_angle_at_speed = m_kart_properties->getTurnRadius();
|
||||
// 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.getY(i)));
|
||||
|
||||
@ -842,7 +842,7 @@ float Kart::getMaxSteerAngle(float speed) const
|
||||
{
|
||||
InterpolationArray turn_angle_at_speed = m_kart_properties->getTurnRadius();
|
||||
// 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.getY(i)));
|
||||
|
||||
|
@ -570,7 +570,8 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool human_playe
|
||||
m_animated_node->getJointNode(m_hat_bone.c_str()) : node;
|
||||
scene::IMesh* hat_mesh = irr_driver->getAnimatedMesh
|
||||
(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 ?
|
||||
getInverseBoneMatrix(m_hat_bone) : core::matrix4());
|
||||
}
|
||||
|
@ -251,7 +251,7 @@ void FollowTheLeaderRace::terminateRace()
|
||||
endSetKartPositions();
|
||||
|
||||
// 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);
|
||||
if (kart->isEliminated() || kart->hasFinishedRace())
|
||||
|
@ -618,7 +618,7 @@ void SoccerWorld::enterRaceOverState()
|
||||
std::sort(m_goal_frame.begin(), m_goal_frame.end());
|
||||
|
||||
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
|
||||
double squared_sum = 0;
|
||||
@ -660,9 +660,9 @@ void SoccerWorld::enterRaceOverState()
|
||||
}
|
||||
|
||||
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 ?
|
||||
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,"
|
||||
"Blue goal: %d, Blue own goal: %d", red_goal, red_own_goal,
|
||||
|
@ -340,8 +340,8 @@ public:
|
||||
// ------------------------------------------------------------------------
|
||||
int getScore(SoccerTeam team) const
|
||||
{
|
||||
return (team == SOCCER_TEAM_BLUE ? m_blue_scorers.size() :
|
||||
m_red_scorers.size());
|
||||
return (int)(team == SOCCER_TEAM_BLUE ? m_blue_scorers.size()
|
||||
: m_red_scorers.size());
|
||||
}
|
||||
// ------------------------------------------------------------------------
|
||||
const std::vector<ScorerData>& getScorers(SoccerTeam team) const
|
||||
|
@ -655,7 +655,7 @@ void ThreeStrikesBattle::spawnSpareTireKarts()
|
||||
if (ratio < 1.5f) return;
|
||||
unsigned int spawn_sta = unsigned(ratio);
|
||||
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!",
|
||||
"%i spare tire karts have been spawned!",
|
||||
spawn_sta), NULL, 2.0f);
|
||||
@ -714,15 +714,15 @@ void ThreeStrikesBattle::loadCustomModels()
|
||||
|
||||
// Compute a random kart list
|
||||
std::vector<std::string> sta_list;
|
||||
kart_properties_manager->getRandomKartList(pos.size(), NULL,
|
||||
kart_properties_manager->getRandomKartList((int)pos.size(), NULL,
|
||||
&sta_list);
|
||||
|
||||
assert(sta_list.size() == pos.size());
|
||||
// Now add them
|
||||
for (unsigned int i = 0; i < pos.size(); i++)
|
||||
{
|
||||
AbstractKart* sta = new Kart(sta_list[i], m_karts.size(),
|
||||
m_karts.size() + 1, pos[i], PLAYER_DIFFICULTY_NORMAL,
|
||||
AbstractKart* sta = new Kart(sta_list[i], (int)m_karts.size(),
|
||||
(int)m_karts.size() + 1, pos[i], PLAYER_DIFFICULTY_NORMAL,
|
||||
KRT_RED);
|
||||
sta->init(RaceManager::KartType::KT_SPARE_TIRE);
|
||||
sta->setController(new SpareTireAI(sta));
|
||||
|
@ -1202,10 +1202,15 @@ void World::eliminateKart(int kart_id, bool notify_of_elimination)
|
||||
m_race_gui->addMessage(_("You have been eliminated!"), kart,
|
||||
2.0f);
|
||||
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.",
|
||||
kart->getName()),
|
||||
kart_name),
|
||||
camera->getKart(),
|
||||
2.0f);
|
||||
}
|
||||
} // for i < number of cameras
|
||||
} // if notify_of_elimination
|
||||
|
||||
|
@ -49,7 +49,7 @@ Event::Event(ENetEvent* event)
|
||||
if (m_type == EVENT_TYPE_MESSAGE)
|
||||
{
|
||||
m_data = new NetworkString(event->packet->data,
|
||||
event->packet->dataLength);
|
||||
(int)event->packet->dataLength);
|
||||
}
|
||||
else
|
||||
m_data = NULL;
|
||||
|
@ -75,7 +75,7 @@ void NetworkString::unitTesting()
|
||||
* the characters of the given string. */
|
||||
BareNetworkString& BareNetworkString::encodeString(const std::string &value)
|
||||
{
|
||||
int len = value.size();
|
||||
int len = (int)value.size();
|
||||
if(len<=255)
|
||||
return this->addUInt8(len).addString(value);
|
||||
else
|
||||
|
@ -171,7 +171,7 @@ public:
|
||||
* 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
|
||||
* 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
|
||||
/** Add 8 bit unsigned int. */
|
||||
|
@ -53,9 +53,9 @@ Protocol::~Protocol()
|
||||
/** Returns a network string with the given type.
|
||||
* \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
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -128,7 +128,7 @@ public:
|
||||
virtual void asynchronousUpdate() = 0;
|
||||
|
||||
/// 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);
|
||||
void sendMessageToPeersChangingToken(NetworkString *message,
|
||||
bool reliable = true);
|
||||
|
@ -128,7 +128,7 @@ void LatencyProtocol::asynchronousUpdate()
|
||||
{
|
||||
NetworkString *ping_request =
|
||||
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;
|
||||
peers[i]->sendPacket(ping_request, false);
|
||||
delete ping_request;
|
||||
|
@ -172,7 +172,7 @@ unsigned int RewindManager::findFirstIndex(float target_time) const
|
||||
#ifdef REWIND_SEARCH_STATS
|
||||
m_count_of_searches++;
|
||||
#endif
|
||||
int index = m_rewind_info.size()-1;
|
||||
int index = (int)m_rewind_info.size()-1;
|
||||
int index_last_state = -1;
|
||||
while(index>=0)
|
||||
{
|
||||
@ -294,7 +294,7 @@ void RewindManager::rewindTo(float rewind_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();
|
||||
|
||||
|
@ -618,7 +618,7 @@ void STKHost::handleDirectSocketRequest()
|
||||
// current players, and the client's ip address and port
|
||||
// number (which solves the problem which network interface
|
||||
// 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.addUInt8(NetworkConfig::get()->getMaxPlayers());
|
||||
s.addUInt8(0); // FIXME: current number of connected players
|
||||
|
@ -499,9 +499,9 @@ bool GrandPrixData::isEditable() const
|
||||
unsigned int GrandPrixData::getNumberOfTracks(bool includeLocked) const
|
||||
{
|
||||
if (includeLocked)
|
||||
return m_tracks.size();
|
||||
return (unsigned int)m_tracks.size();
|
||||
else
|
||||
return getTrackNames(false).size();
|
||||
return (unsigned int)getTrackNames(false).size();
|
||||
} // getNumberOfTracks
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -338,7 +338,7 @@ void RaceManager::startNew(bool from_overworld)
|
||||
->getUniqueID(),
|
||||
m_grand_prix.getId(),
|
||||
m_minor_mode,
|
||||
m_player_karts.size());
|
||||
(unsigned int)m_player_karts.size());
|
||||
|
||||
// Saved GP only in offline mode
|
||||
if (m_continue_saved_gp)
|
||||
@ -394,7 +394,7 @@ void RaceManager::startNew(bool from_overworld)
|
||||
|
||||
// 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++)
|
||||
{
|
||||
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(),
|
||||
m_grand_prix.getId(),
|
||||
m_minor_mode,
|
||||
m_player_karts.size());
|
||||
(unsigned int)m_player_karts.size());
|
||||
} // while m_saved_gp
|
||||
} // if m_continue_saved_gp
|
||||
} // if grand prix
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user