mirror of
https://github.com/minetest/irrlicht.git
synced 2025-07-03 08:40:26 +02:00
Compare commits
247 Commits
Author | SHA1 | Date | |
---|---|---|---|
c311d01c07 | |||
d7f75ae882 | |||
e0d4d7d8b4 | |||
fb7a0e4298 | |||
a994c31ccf | |||
c40045a40a | |||
c0ef1092c0 | |||
5ececc7d29 | |||
9e0189019e | |||
b249e4523d | |||
041377c24c | |||
83699a835d | |||
98589d2fd2 | |||
8c856408f5 | |||
cbc7aeb302 | |||
09af5ac00d | |||
2c6efbdf06 | |||
510976f130 | |||
b958fdc271 | |||
1387370260 | |||
49b6ccde72 | |||
acbc90a000 | |||
6a2a569233 | |||
1f15fd0805 | |||
81ad195aa3 | |||
13680ef42d | |||
44f7c22bbf | |||
2e477a07d1 | |||
78d0819a2c | |||
df07b3bf99 | |||
523590e16c | |||
8cf02ea27f | |||
efb660e7ed | |||
5f88555ed3 | |||
4ee1ab261e | |||
ab628e641c | |||
1d782702e1 | |||
c4ab49201b | |||
896c825b9e | |||
7a3fc62ada | |||
09043e3da7 | |||
2d81374b34 | |||
aa1696a7e6 | |||
e01f285c8f | |||
5eb607f86f | |||
fc0440ff89 | |||
462657960d | |||
6a152e8629 | |||
718ba69e1b | |||
54314691ec | |||
36a3a7f349 | |||
ca5f005b74 | |||
e850bd102a | |||
a677f5a01a | |||
f5d3448b17 | |||
3a074e4124 | |||
70ee4b05aa | |||
58a96b7d23 | |||
ba1cd19983 | |||
a67f3003de | |||
4dda28450f | |||
219b7fd7d2 | |||
28d0e0644c | |||
d97d1708d6 | |||
799c8b936f | |||
8da1bcf58b | |||
d86abb40c1 | |||
53b9eaa831 | |||
1967d71cfb | |||
c5373262ca | |||
939b3f7bfb | |||
9c2c91776e | |||
6f3435f349 | |||
9f9d22ca33 | |||
edb381bd50 | |||
8ffa7eafea | |||
2bff147904 | |||
3cf75cdce4 | |||
a7f9afd289 | |||
98df6eae77 | |||
3ce4b2b5dc | |||
424eb85f4d | |||
6a9e0f109c | |||
15e3f15b48 | |||
263f243523 | |||
c5ee8c8397 | |||
b0c03b6f3b | |||
679d3a8ba7 | |||
d1f441787a | |||
739a9eaf7c | |||
0acf0de2db | |||
52a0b9d8e5 | |||
0160cdc51d | |||
5a1565072a | |||
25a7074c9a | |||
df8881898d | |||
ba77d01c91 | |||
f641500d01 | |||
02c6449f0d | |||
2331083837 | |||
d84dc18e13 | |||
ea0ca7f917 | |||
82d1feb933 | |||
d81db9dd6d | |||
6c68217426 | |||
21c61e9973 | |||
5a5a7d04b7 | |||
b279810437 | |||
e484698ba2 | |||
5f76be9380 | |||
6de0afa8b3 | |||
1d43ea17ca | |||
a6d062ebd9 | |||
2e9ed529b1 | |||
ceb53be9e3 | |||
df28a4cc46 | |||
8dd8652f5f | |||
2932065346 | |||
1326dfbcb1 | |||
1bbe341daa | |||
d6716ec31b | |||
620f4869a1 | |||
05384fdc5e | |||
48270029cd | |||
c5ce853148 | |||
4fba496917 | |||
79fdab0551 | |||
608aa150ff | |||
1f750cd7b2 | |||
8c521939b9 | |||
cfa8dd7845 | |||
01295c9ce6 | |||
5a95b40a0e | |||
8efd4527f6 | |||
a0e1e39ea7 | |||
d8e09f14bd | |||
67f852be57 | |||
5a2b807890 | |||
06db7b7ab7 | |||
09e6eeb65b | |||
839bdc1a65 | |||
ea297196b7 | |||
38f18eec56 | |||
5527b9f373 | |||
cd3e784534 | |||
51dffc416a | |||
8f13ae81e5 | |||
3de3ff524a | |||
7d3142b969 | |||
a9230e5f49 | |||
b5a6dc0a15 | |||
ce0d29df93 | |||
2ae816b5a6 | |||
61af99adfa | |||
afbe41019c | |||
05a00a8d91 | |||
07fd32da50 | |||
735af8eec6 | |||
29a448de4d | |||
1579ce2740 | |||
b9e0641203 | |||
6f98515f34 | |||
a549d0bfed | |||
a0af653c3d | |||
cac4e62852 | |||
d6766fb8f4 | |||
e46ab74859 | |||
57705d57cf | |||
e9908ca545 | |||
2709c937d9 | |||
59fc4401f1 | |||
f3a1f9f656 | |||
1128d9deab | |||
9b541f2948 | |||
1cf0f3bef0 | |||
3225007e8d | |||
e9f205f952 | |||
d733e03430 | |||
f0766c845f | |||
ff645cc876 | |||
f6ec00e1c4 | |||
51f0acb7c1 | |||
91edd214aa | |||
538c9e5cde | |||
abebac8bd4 | |||
67c0cb5740 | |||
748e005794 | |||
a7b306f702 | |||
074e81f78f | |||
25ae156944 | |||
c4ca31313f | |||
b787ec3e3e | |||
6db035e0aa | |||
6064e12133 | |||
53e1b52ff4 | |||
a04a0d2a4b | |||
392df9bae3 | |||
426730bf91 | |||
aa095d9525 | |||
128cf1696c | |||
3e81f38098 | |||
593103a261 | |||
0732807cc8 | |||
00a7741cd4 | |||
51ae495c4a | |||
6928c7eb6f | |||
372b3642bf | |||
51dad49d8b | |||
fc4eda0f44 | |||
401e769114 | |||
24594ce226 | |||
ba0396e93d | |||
c9b66c8c58 | |||
8b1d0db8e2 | |||
e469c54f76 | |||
df908ef4ea | |||
01586f584a | |||
95af6d7c08 | |||
00dd274510 | |||
d59bcdbd07 | |||
09b8837ef9 | |||
4fb1c55ec5 | |||
7fb36849c7 | |||
8c0ee7d9ab | |||
684293f527 | |||
1b8be72ccb | |||
d3132e0731 | |||
e5f69157db | |||
fa2a7dc236 | |||
7d1dc8b2d5 | |||
53db262bd2 | |||
195759100f | |||
2fec5e5dd3 | |||
52e03a8485 | |||
dd09fdcb4e | |||
4bdecbc6b7 | |||
6d133e1bcc | |||
d4119ba664 | |||
2f2d37dce6 | |||
d322b73e4c | |||
6779cb7254 | |||
39cad3e618 | |||
81bae5b717 | |||
dbd39120e7 | |||
594de99153 | |||
713471e9a2 | |||
ac57007c55 |
@ -1,3 +1,5 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
|
||||
|
220
.github/workflows/build.yml
vendored
220
.github/workflows/build.yml
vendored
@ -8,13 +8,16 @@ on:
|
||||
jobs:
|
||||
|
||||
linux-gl:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ubuntu:bionic
|
||||
env: { LANG: "C.UTF-8" }
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install g++ cmake libxxf86vm-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
|
||||
apt-get update
|
||||
apt-get install g++ cmake libxi-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
@ -26,25 +29,26 @@ jobs:
|
||||
make DESTDIR=$PWD/_install install
|
||||
tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local .
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: irrlicht-linux
|
||||
path: ./irrlicht-linux.tar.gz
|
||||
|
||||
linux-gles:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ubuntu:bionic
|
||||
env: { LANG: "C.UTF-8" }
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install g++ cmake libxxf86vm-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
|
||||
apt-get update
|
||||
apt-get install g++ cmake libxi-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
sed '/#define _IRR_COMPILE_WITH_OGLES2_/ s|^//||g' -i include/IrrCompileConfig.h
|
||||
sed '/#define _IRR_COMPILE_WITH_OPENGL_/ s|^|//|g' -i include/IrrCompileConfig.h
|
||||
cmake . -DBUILD_EXAMPLES=1
|
||||
cmake . -DBUILD_EXAMPLES=1 -DENABLE_OPENGL=OFF -DENABLE_GLES2=ON
|
||||
make -j2
|
||||
|
||||
- name: Test (headless)
|
||||
@ -55,44 +59,132 @@ jobs:
|
||||
- name: Test (Xvfb)
|
||||
run: |
|
||||
cd bin/Linux
|
||||
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest
|
||||
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest ogles2
|
||||
|
||||
win32:
|
||||
runs-on: ubuntu-18.04
|
||||
linux-sdl:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ubuntu:jammy
|
||||
env: { LANG: "C.UTF-8" }
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install cmake g++-mingw-w64-i686 -qyy
|
||||
apt-get update
|
||||
apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
./scripts/ci-build-mingw.sh
|
||||
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON
|
||||
make -j2
|
||||
|
||||
- name: Test (headless)
|
||||
run: |
|
||||
cd bin/Linux
|
||||
./AutomatedTest null
|
||||
|
||||
linux-sdl-gl3:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ubuntu:jammy
|
||||
env: { LANG: "C.UTF-8" }
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Install deps
|
||||
run: |
|
||||
apt-get update
|
||||
apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON -DENABLE_OPENGL=OFF -DENABLE_OPENGL3=ON
|
||||
make -j2
|
||||
|
||||
- name: Test (headless)
|
||||
run: |
|
||||
cd bin/Linux
|
||||
./AutomatedTest null
|
||||
|
||||
- name: Test (Xvfb)
|
||||
run: |
|
||||
cd bin/Linux
|
||||
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest opengl3
|
||||
|
||||
linux-sdl-gles2:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ubuntu:jammy
|
||||
env: { LANG: "C.UTF-8" }
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Install deps
|
||||
run: |
|
||||
apt-get update
|
||||
apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON -DENABLE_OPENGL=OFF -DENABLE_GLES2=ON
|
||||
make -j2
|
||||
|
||||
- name: Test (headless)
|
||||
run: |
|
||||
cd bin/Linux
|
||||
./AutomatedTest null
|
||||
|
||||
- name: Test (Xvfb)
|
||||
run: |
|
||||
cd bin/Linux
|
||||
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest ogles2
|
||||
|
||||
win32:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Install compiler
|
||||
run: |
|
||||
sudo apt-get update && sudo apt-get install cmake -qyy
|
||||
wget http://minetest.kitsunemimi.pw/mingw-w64-i686_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz
|
||||
sudo tar -xaf mingw.tar.xz -C /usr
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
./scripts/ci-build-mingw.sh package
|
||||
env:
|
||||
CC: i686-w64-mingw32-gcc
|
||||
CXX: i686-w64-mingw32-g++
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: irrlicht-win32
|
||||
path: ./irrlicht-win32.zip
|
||||
|
||||
win64:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install deps
|
||||
- uses: actions/checkout@v3
|
||||
- name: Install compiler
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install cmake g++-mingw-w64-x86-64 -qyy
|
||||
sudo apt-get update && sudo apt-get install cmake -qyy
|
||||
wget http://minetest.kitsunemimi.pw/mingw-w64-x86_64_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz
|
||||
sudo tar -xaf mingw.tar.xz -C /usr
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
./scripts/ci-build-mingw.sh
|
||||
./scripts/ci-build-mingw.sh package
|
||||
env:
|
||||
CC: x86_64-w64-mingw32-gcc
|
||||
CXX: x86_64-w64-mingw32-g++
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: irrlicht-win64
|
||||
path: ./irrlicht-win64.zip
|
||||
|
||||
macos:
|
||||
runs-on: macos-10.15
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Install deps
|
||||
run: |
|
||||
brew update
|
||||
@ -100,5 +192,77 @@ jobs:
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake . -DCMAKE_FIND_FRAMEWORK=LAST
|
||||
cmake . -DCMAKE_FIND_FRAMEWORK=LAST -DBUILD_EXAMPLES=1
|
||||
make -j3
|
||||
|
||||
- name: Test (headless)
|
||||
run: |
|
||||
./bin/OSX/AutomatedTest null
|
||||
|
||||
msvc:
|
||||
name: VS 2019 ${{ matrix.config.arch }} ${{ matrix.sdl.label }}
|
||||
runs-on: windows-2019
|
||||
env:
|
||||
VCPKG_VERSION: 14e7bb4ae24616ec54ff6b2f6ef4e8659434ea44
|
||||
# 2022.05.10
|
||||
vcpkg_packages: zlib libpng libjpeg-turbo opengl-registry
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
-
|
||||
arch: x86
|
||||
generator: "-G'Visual Studio 16 2019' -A Win32"
|
||||
vcpkg_triplet: x86-windows
|
||||
-
|
||||
arch: x64
|
||||
generator: "-G'Visual Studio 16 2019' -A x64"
|
||||
vcpkg_triplet: x64-windows
|
||||
sdl:
|
||||
-
|
||||
use: FALSE
|
||||
label: '(no SDL)'
|
||||
-
|
||||
use: TRUE
|
||||
label: '(with SDL)'
|
||||
vcpkg_packages: sdl2
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Restore from cache and run vcpkg
|
||||
uses: lukka/run-vcpkg@v7
|
||||
with:
|
||||
vcpkgArguments: ${{env.vcpkg_packages}} ${{matrix.sdl.vcpkg_packages}}
|
||||
vcpkgDirectory: '${{ github.workspace }}\vcpkg'
|
||||
appendedCacheKey: ${{ matrix.config.vcpkg_triplet }}
|
||||
vcpkgGitCommitId: ${{ env.VCPKG_VERSION }}
|
||||
vcpkgTriplet: ${{ matrix.config.vcpkg_triplet }}
|
||||
|
||||
- name: CMake
|
||||
run: |
|
||||
cmake ${{matrix.config.generator}} `
|
||||
-DUSE_SDL2=${{matrix.sdl.use}} `
|
||||
-DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}\vcpkg\scripts\buildsystems\vcpkg.cmake" `
|
||||
-DCMAKE_BUILD_TYPE=Release .
|
||||
|
||||
- name: Build
|
||||
run: cmake --build . --config Release
|
||||
|
||||
- name: Create artifact folder
|
||||
run: |
|
||||
mkdir artifact/
|
||||
mkdir artifact/lib/
|
||||
|
||||
- name: Move dlls into artifact folder
|
||||
run: move bin\Win32-VisualStudio\Release\* artifact\lib\
|
||||
|
||||
- name: Move includes into artifact folder
|
||||
run: move include artifact/
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: msvc-${{ matrix.config.arch }}
|
||||
path: artifact/
|
||||
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -15,3 +15,10 @@ bin/Linux
|
||||
scripts/gl2ext.h
|
||||
scripts/glcorearb.h
|
||||
scripts/glext.h
|
||||
*.vcxproj*
|
||||
*.dir/
|
||||
*.sln
|
||||
*visualstudio/
|
||||
|
||||
# vscode cmake plugin
|
||||
build/*
|
@ -1,14 +1,16 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
# Set policies up to 3.9 since we want to enable the IPO option
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.9)
|
||||
# >=3.9 enables IPO; >=3.11 prefers GLVND
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.11)
|
||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||
else()
|
||||
cmake_policy(VERSION 3.9)
|
||||
cmake_policy(VERSION 3.11)
|
||||
endif()
|
||||
|
||||
set(IRRLICHTMT_REVISION 12)
|
||||
|
||||
project(Irrlicht
|
||||
VERSION 1.9.0
|
||||
VERSION 1.9.0.${IRRLICHTMT_REVISION}
|
||||
LANGUAGES CXX
|
||||
)
|
||||
|
||||
|
23
README.md
23
README.md
@ -3,7 +3,8 @@ IrrlichtMt version 1.9
|
||||
|
||||
The Irrlicht Engine is an open source realtime 3D engine written in C++.
|
||||
|
||||
This is a fork by the [Minetest](https://github.com/minetest) developers that contains features, customizations and fixes specifically for use in Minetest.
|
||||
This is a fork by the [Minetest](https://github.com/minetest) developers that was stripped-down and customized specifically for use in Minetest.
|
||||
It is intentionally not compatible to upstream and is planned to be eventually absorbed into Minetest.
|
||||
|
||||
Build
|
||||
-----
|
||||
@ -19,6 +20,11 @@ The following libraries are required to be installed:
|
||||
Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the following options are available:
|
||||
* `BUILD_SHARED_LIBS` (default: `ON`) - Build IrrlichtMt as a shared library
|
||||
* `BUILD_EXAMPLES` (default: `OFF`) - Build example applications
|
||||
* `ENABLE_OPENGL` - Enable OpenGL driver
|
||||
* `ENABLE_OPENGL3` (default: `OFF`) - Enable OpenGL 3+ driver
|
||||
* `ENABLE_GLES1` - Enable OpenGL ES driver, legacy
|
||||
* `ENABLE_GLES2` - Enable OpenGL ES 2+ driver
|
||||
* `USE_SDL2` (default: `OFF`) - Use SDL2 instead of native platform device
|
||||
|
||||
e.g. on a Linux system you might want to build for local use like this:
|
||||
|
||||
@ -29,6 +35,21 @@ e.g. on a Linux system you might want to build for local use like this:
|
||||
|
||||
This will put an IrrlichtMtTargets.cmake file into the cmake directory in the current build directory, and it can then be imported from another project by pointing `find_package()` to the build directory, or by setting the `CMAKE_PREFIX_PATH` variable to that same path.
|
||||
|
||||
on Windows system:
|
||||
|
||||
It is highly recommended to use vcpkg as package manager.
|
||||
|
||||
After you successfully built vcpkg you can easily install the required libraries:
|
||||
|
||||
vcpkg install zlib libjpeg-turbo libpng opengl-registry --triplet x64-windows
|
||||
|
||||
Run the following script in PowerShell:
|
||||
|
||||
git clone https://github.com/minetest/irrlicht
|
||||
cd irrlicht
|
||||
cmake -B build -G "Visual Studio 17 2022" -A "Win64" -DCMAKE_TOOLCHAIN_FILE=[vcpkg-root]/scripts/buildsystems/vcpkg.cmake -DBUILD_SHARED_LIBS=OFF
|
||||
cmake --build build --config Release
|
||||
|
||||
Platforms
|
||||
---------
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 2.2 KiB |
@ -1,24 +0,0 @@
|
||||
The Win64-VisualStudio version is currently (Irrlicht 1.8) compiled with VS 2010 using the Windows 7.1 SDK as platform toolset.
|
||||
You might get the necessary Windows Platform SDK here: http://msdn.microsoft.com/en-us/windows/bb980924.aspx
|
||||
|
||||
To link to that Irrlicht.dll you need to set platform toolset in your VS version to the same target or re-compile the Irrlicht.dll using another platform toolset.
|
||||
|
||||
To re-compile Irrlicht for Win32-VisualStudio:
|
||||
There are several project files for different VS versions in source/Irrlicht.
|
||||
Irrlicht10.0.sln is for VS 2010
|
||||
Irrlicht11.0.sln is for VS 2012
|
||||
Irrlicht12.0.sln is for VS 2013
|
||||
|
||||
To compile Irrlicht + all examples and all tools check the BuildAllExamples_*.sln files in the examples folder.
|
||||
|
||||
For newer VS versions you have update one of those projects (VS usually can do that automatically when you open an older solution file).
|
||||
|
||||
Currently each of those solutions does set the platform toolset "Windows 7.1 SDK" (to be compatible to each other).
|
||||
You might want to change that in the project settings and set it to your current version.
|
||||
Make sure you use the same platform toolset in your application and in the engine.
|
||||
Also when compiling examples each example has to use the same platform toolset as was used for the engine.
|
||||
|
||||
Platform should be Win64
|
||||
Configuration is by default "Release"
|
||||
But you can also chose "Debug" if you want Irrlicht with Debug information.
|
||||
Static builds are possible but you have to additionally set the _IRR_STATIC_LIB_ define in the application when linking to a static Irrlicht.lib
|
5524
changes.txt
5524
changes.txt
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
||||
The Irrlicht Engine may be compiled to provide support for AES encrypted files. The implementation used by Irrlicht is provided by Dr Brian Gladman. The license for these files (including AES, a PRNG, SHA, and other algorithms) is as follows
|
||||
|
||||
/*
|
||||
---------------------------------------------------------------------------
|
||||
Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK.
|
||||
All rights reserved.
|
||||
|
||||
LICENSE TERMS
|
||||
|
||||
The free distribution and use of this software in both source and binary
|
||||
form is allowed (with or without changes) provided that:
|
||||
|
||||
1. distributions of this source code include the above copyright
|
||||
notice, this list of conditions and the following disclaimer;
|
||||
|
||||
2. distributions in binary form include the above copyright
|
||||
notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other associated materials;
|
||||
|
||||
3. the copyright holder's name is not used to endorse products
|
||||
built using this software without specific written permission.
|
||||
|
||||
ALTERNATIVELY, provided that this notice is retained in full, this product
|
||||
may be distributed under the terms of the GNU General Public License (GPL),
|
||||
in which case the provisions of the GPL apply INSTEAD OF those given above.
|
||||
|
||||
DISCLAIMER
|
||||
|
||||
This software is provided 'as is' with no explicit or implied warranties
|
||||
in respect of its properties, including, but not limited to, correctness
|
||||
and/or fitness for purpose.
|
||||
---------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -1,42 +0,0 @@
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
This program, "bzip2", the associated library "libbzip2", and all
|
||||
documentation, are copyright (C) 1996-2007 Julian R Seward. All
|
||||
rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product
|
||||
documentation would be appreciated but is not required.
|
||||
|
||||
3. Altered source versions must be plainly marked as such, and must
|
||||
not be misrepresented as being the original software.
|
||||
|
||||
4. The name of the author may not be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Julian Seward, jseward@bzip.org
|
||||
bzip2/libbzip2 version 1.0.5 of 10 December 2007
|
||||
|
||||
--------------------------------------------------------------------------
|
@ -1,351 +0,0 @@
|
||||
The Independent JPEG Group's JPEG software
|
||||
==========================================
|
||||
|
||||
README for release 8d of 15-Jan-2012
|
||||
====================================
|
||||
|
||||
This distribution contains the eighth public release of the Independent JPEG
|
||||
Group's free JPEG software. You are welcome to redistribute this software and
|
||||
to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
|
||||
|
||||
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
||||
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
||||
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
|
||||
and other members of the Independent JPEG Group.
|
||||
|
||||
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
||||
(also known as JPEG, together with ITU-T SG16).
|
||||
|
||||
|
||||
DOCUMENTATION ROADMAP
|
||||
=====================
|
||||
|
||||
This file contains the following sections:
|
||||
|
||||
OVERVIEW General description of JPEG and the IJG software.
|
||||
LEGAL ISSUES Copyright, lack of warranty, terms of distribution.
|
||||
REFERENCES Where to learn more about JPEG.
|
||||
ARCHIVE LOCATIONS Where to find newer versions of this software.
|
||||
ACKNOWLEDGMENTS Special thanks.
|
||||
FILE FORMAT WARS Software *not* to get.
|
||||
TO DO Plans for future IJG releases.
|
||||
|
||||
Other documentation files in the distribution are:
|
||||
|
||||
User documentation:
|
||||
install.txt How to configure and install the IJG software.
|
||||
usage.txt Usage instructions for cjpeg, djpeg, jpegtran,
|
||||
rdjpgcom, and wrjpgcom.
|
||||
*.1 Unix-style man pages for programs (same info as usage.txt).
|
||||
wizard.txt Advanced usage instructions for JPEG wizards only.
|
||||
change.log Version-to-version change highlights.
|
||||
Programmer and internal documentation:
|
||||
libjpeg.txt How to use the JPEG library in your own programs.
|
||||
example.c Sample code for calling the JPEG library.
|
||||
structure.txt Overview of the JPEG library's internal structure.
|
||||
filelist.txt Road map of IJG files.
|
||||
coderules.txt Coding style rules --- please read if you contribute code.
|
||||
|
||||
Please read at least the files install.txt and usage.txt. Some information
|
||||
can also be found in the JPEG FAQ (Frequently Asked Questions) article. See
|
||||
ARCHIVE LOCATIONS below to find out where to obtain the FAQ article.
|
||||
|
||||
If you want to understand how the JPEG code works, we suggest reading one or
|
||||
more of the REFERENCES, then looking at the documentation files (in roughly
|
||||
the order listed) before diving into the code.
|
||||
|
||||
|
||||
OVERVIEW
|
||||
========
|
||||
|
||||
This package contains C software to implement JPEG image encoding, decoding,
|
||||
and transcoding. JPEG (pronounced "jay-peg") is a standardized compression
|
||||
method for full-color and gray-scale images.
|
||||
|
||||
This software implements JPEG baseline, extended-sequential, and progressive
|
||||
compression processes. Provision is made for supporting all variants of these
|
||||
processes, although some uncommon parameter settings aren't implemented yet.
|
||||
We have made no provision for supporting the hierarchical or lossless
|
||||
processes defined in the standard.
|
||||
|
||||
We provide a set of library routines for reading and writing JPEG image files,
|
||||
plus two sample applications "cjpeg" and "djpeg", which use the library to
|
||||
perform conversion between JPEG and some other popular image file formats.
|
||||
The library is intended to be reused in other applications.
|
||||
|
||||
In order to support file conversion and viewing software, we have included
|
||||
considerable functionality beyond the bare JPEG coding/decoding capability;
|
||||
for example, the color quantization modules are not strictly part of JPEG
|
||||
decoding, but they are essential for output to colormapped file formats or
|
||||
colormapped displays. These extra functions can be compiled out of the
|
||||
library if not required for a particular application.
|
||||
|
||||
We have also included "jpegtran", a utility for lossless transcoding between
|
||||
different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple
|
||||
applications for inserting and extracting textual comments in JFIF files.
|
||||
|
||||
The emphasis in designing this software has been on achieving portability and
|
||||
flexibility, while also making it fast enough to be useful. In particular,
|
||||
the software is not intended to be read as a tutorial on JPEG. (See the
|
||||
REFERENCES section for introductory material.) Rather, it is intended to
|
||||
be reliable, portable, industrial-strength code. We do not claim to have
|
||||
achieved that goal in every aspect of the software, but we strive for it.
|
||||
|
||||
We welcome the use of this software as a component of commercial products.
|
||||
No royalty is required, but we do ask for an acknowledgement in product
|
||||
documentation, as described under LEGAL ISSUES.
|
||||
|
||||
|
||||
LEGAL ISSUES
|
||||
============
|
||||
|
||||
In plain English:
|
||||
|
||||
1. We don't promise that this software works. (But if you find any bugs,
|
||||
please let us know!)
|
||||
2. You can use this software for whatever you want. You don't have to pay us.
|
||||
3. You may not pretend that you wrote this software. If you use it in a
|
||||
program, you must acknowledge somewhere in your documentation that
|
||||
you've used the IJG code.
|
||||
|
||||
In legalese:
|
||||
|
||||
The authors make NO WARRANTY or representation, either express or implied,
|
||||
with respect to this software, its quality, accuracy, merchantability, or
|
||||
fitness for a particular purpose. This software is provided "AS IS", and you,
|
||||
its user, assume the entire risk as to its quality and accuracy.
|
||||
|
||||
This software is copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding.
|
||||
All Rights Reserved except as specified below.
|
||||
|
||||
Permission is hereby granted to use, copy, modify, and distribute this
|
||||
software (or portions thereof) for any purpose, without fee, subject to these
|
||||
conditions:
|
||||
(1) If any part of the source code for this software is distributed, then this
|
||||
README file must be included, with this copyright and no-warranty notice
|
||||
unaltered; and any additions, deletions, or changes to the original files
|
||||
must be clearly indicated in accompanying documentation.
|
||||
(2) If only executable code is distributed, then the accompanying
|
||||
documentation must state that "this software is based in part on the work of
|
||||
the Independent JPEG Group".
|
||||
(3) Permission for use of this software is granted only if the user accepts
|
||||
full responsibility for any undesirable consequences; the authors accept
|
||||
NO LIABILITY for damages of any kind.
|
||||
|
||||
These conditions apply to any software derived from or based on the IJG code,
|
||||
not just to the unmodified library. If you use our work, you ought to
|
||||
acknowledge us.
|
||||
|
||||
Permission is NOT granted for the use of any IJG author's name or company name
|
||||
in advertising or publicity relating to this software or products derived from
|
||||
it. This software may be referred to only as "the Independent JPEG Group's
|
||||
software".
|
||||
|
||||
We specifically permit and encourage the use of this software as the basis of
|
||||
commercial products, provided that all warranty or liability claims are
|
||||
assumed by the product vendor.
|
||||
|
||||
|
||||
ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
|
||||
sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
|
||||
ansi2knr.c is NOT covered by the above copyright and conditions, but instead
|
||||
by the usual distribution terms of the Free Software Foundation; principally,
|
||||
that you must include source code if you redistribute it. (See the file
|
||||
ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
|
||||
of any program generated from the IJG code, this does not limit you more than
|
||||
the foregoing paragraphs do.
|
||||
|
||||
The Unix configuration script "configure" was produced with GNU Autoconf.
|
||||
It is copyright by the Free Software Foundation but is freely distributable.
|
||||
The same holds for its supporting scripts (config.guess, config.sub,
|
||||
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
||||
but is also freely distributable.
|
||||
|
||||
The IJG distribution formerly included code to read and write GIF files.
|
||||
To avoid entanglement with the Unisys LZW patent, GIF reading support has
|
||||
been removed altogether, and the GIF writer has been simplified to produce
|
||||
"uncompressed GIFs". This technique does not use the LZW algorithm; the
|
||||
resulting GIF files are larger than usual, but are readable by all standard
|
||||
GIF decoders.
|
||||
|
||||
We are required to state that
|
||||
"The Graphics Interchange Format(c) is the Copyright property of
|
||||
CompuServe Incorporated. GIF(sm) is a Service Mark property of
|
||||
CompuServe Incorporated."
|
||||
|
||||
|
||||
REFERENCES
|
||||
==========
|
||||
|
||||
We recommend reading one or more of these references before trying to
|
||||
understand the innards of the JPEG software.
|
||||
|
||||
The best short technical introduction to the JPEG compression algorithm is
|
||||
Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
|
||||
Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
|
||||
(Adjacent articles in that issue discuss MPEG motion picture compression,
|
||||
applications of JPEG, and related topics.) If you don't have the CACM issue
|
||||
handy, a PostScript file containing a revised version of Wallace's article is
|
||||
available at http://www.ijg.org/files/wallace.ps.gz. The file (actually
|
||||
a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
|
||||
omits the sample images that appeared in CACM, but it includes corrections
|
||||
and some added material. Note: the Wallace article is copyright ACM and IEEE,
|
||||
and it may not be used for commercial purposes.
|
||||
|
||||
A somewhat less technical, more leisurely introduction to JPEG can be found in
|
||||
"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by
|
||||
M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides
|
||||
good explanations and example C code for a multitude of compression methods
|
||||
including JPEG. It is an excellent source if you are comfortable reading C
|
||||
code but don't know much about data compression in general. The book's JPEG
|
||||
sample code is far from industrial-strength, but when you are ready to look
|
||||
at a full implementation, you've got one here...
|
||||
|
||||
The best currently available description of JPEG is the textbook "JPEG Still
|
||||
Image Data Compression Standard" by William B. Pennebaker and Joan L.
|
||||
Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
|
||||
Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG
|
||||
standards (DIS 10918-1 and draft DIS 10918-2).
|
||||
Although this is by far the most detailed and comprehensive exposition of
|
||||
JPEG publicly available, we point out that it is still missing an explanation
|
||||
of the most essential properties and algorithms of the underlying DCT
|
||||
technology.
|
||||
If you think that you know about DCT-based JPEG after reading this book,
|
||||
then you are in delusion. The real fundamentals and corresponding potential
|
||||
of DCT-based JPEG are not publicly known so far, and that is the reason for
|
||||
all the mistaken developments taking place in the image coding domain.
|
||||
|
||||
The original JPEG standard is divided into two parts, Part 1 being the actual
|
||||
specification, while Part 2 covers compliance testing methods. Part 1 is
|
||||
titled "Digital Compression and Coding of Continuous-tone Still Images,
|
||||
Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
|
||||
10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
|
||||
Continuous-tone Still Images, Part 2: Compliance testing" and has document
|
||||
numbers ISO/IEC IS 10918-2, ITU-T T.83.
|
||||
IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension
|
||||
which is specified in two documents: A contributed document at ITU and ISO
|
||||
with title "ITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced
|
||||
Image Coding", April 2006, Geneva, Switzerland. The latest version of this
|
||||
document is Revision 3. And a contributed document ISO/IEC JTC1/SC29/WG1 N
|
||||
5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany.
|
||||
|
||||
The JPEG standard does not specify all details of an interchangeable file
|
||||
format. For the omitted details we follow the "JFIF" conventions, revision
|
||||
1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report
|
||||
and thus received a formal publication status. It is available as a free
|
||||
download in PDF format from
|
||||
http://www.ecma-international.org/publications/techreports/E-TR-098.htm.
|
||||
A PostScript version of the JFIF document is available at
|
||||
http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at
|
||||
http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures.
|
||||
|
||||
The TIFF 6.0 file format specification can be obtained by FTP from
|
||||
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
||||
found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
|
||||
IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
|
||||
Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
|
||||
(Compression tag 7). Copies of this Note can be obtained from
|
||||
http://www.ijg.org/files/. It is expected that the next revision
|
||||
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
||||
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
||||
uses our library to implement TIFF/JPEG per the Note.
|
||||
|
||||
|
||||
ARCHIVE LOCATIONS
|
||||
=================
|
||||
|
||||
The "official" archive site for this software is www.ijg.org.
|
||||
The most recent released version can always be found there in
|
||||
directory "files". This particular version will be archived as
|
||||
http://www.ijg.org/files/jpegsrc.v8d.tar.gz, and in Windows-compatible
|
||||
"zip" archive format as http://www.ijg.org/files/jpegsr8d.zip.
|
||||
|
||||
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
||||
general information about JPEG.
|
||||
It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
|
||||
and other news.answers archive sites, including the official news.answers
|
||||
archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
|
||||
If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
|
||||
with body
|
||||
send usenet/news.answers/jpeg-faq/part1
|
||||
send usenet/news.answers/jpeg-faq/part2
|
||||
|
||||
|
||||
ACKNOWLEDGMENTS
|
||||
===============
|
||||
|
||||
Thank to Juergen Bruder for providing me with a copy of the common DCT
|
||||
algorithm article, only to find out that I had come to the same result
|
||||
in a more direct and comprehensible way with a more generative approach.
|
||||
|
||||
Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the
|
||||
ITU JPEG (Study Group 16) meeting in Geneva, Switzerland.
|
||||
|
||||
Thank to Thomas Wiegand and Gary Sullivan for inviting me to the
|
||||
Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland.
|
||||
|
||||
Thank to Thomas Richter and Daniel Lee for inviting me to the
|
||||
ISO/IEC JTC1/SC29/WG1 (also known as JPEG, together with ITU-T SG16)
|
||||
meeting in Berlin, Germany.
|
||||
|
||||
Thank to John Korejwa and Massimo Ballerini for inviting me to
|
||||
fruitful consultations in Boston, MA and Milan, Italy.
|
||||
|
||||
Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther
|
||||
Maier-Gerber, Walter Stoeber, Fred Schmitz, and Norbert Braunagel
|
||||
for corresponding business development.
|
||||
|
||||
Thank to Nico Zschach and Dirk Stelling of the technical support team
|
||||
at the Digital Images company in Halle for providing me with extra
|
||||
equipment for configuration tests.
|
||||
|
||||
Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful
|
||||
communication about JPEG configuration in Sigma Photo Pro software.
|
||||
|
||||
Thank to Andrew Finkenstadt for hosting the ijg.org site.
|
||||
|
||||
Last but not least special thank to Thomas G. Lane for the original
|
||||
design and development of this singular software package.
|
||||
|
||||
|
||||
FILE FORMAT WARS
|
||||
================
|
||||
|
||||
The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together
|
||||
with ITU-T SG16) currently promotes different formats containing the name
|
||||
"JPEG" which is misleading because these formats are incompatible with
|
||||
original DCT-based JPEG and are based on faulty technologies.
|
||||
IJG therefore does not and will not support such momentary mistakes
|
||||
(see REFERENCES).
|
||||
There exist also distributions under the name "OpenJPEG" promoting such
|
||||
kind of formats which is misleading because they don't support original
|
||||
JPEG images.
|
||||
We have no sympathy for the promotion of inferior formats. Indeed, one of
|
||||
the original reasons for developing this free software was to help force
|
||||
convergence on common, interoperable format standards for JPEG files.
|
||||
Don't use an incompatible file format!
|
||||
(In any case, our decoder will remain capable of reading existing JPEG
|
||||
image files indefinitely.)
|
||||
|
||||
Furthermore, the ISO committee pretends to be "responsible for the popular
|
||||
JPEG" in their public reports which is not true because they don't respond to
|
||||
actual requirements for the maintenance of the original JPEG specification.
|
||||
|
||||
There are currently distributions in circulation containing the name
|
||||
"libjpeg" which claim to be a "derivative" or "fork" of the original
|
||||
libjpeg, but don't have the features and are incompatible with formats
|
||||
supported by actual IJG libjpeg distributions. Furthermore, they
|
||||
violate the license conditions as described under LEGAL ISSUES above.
|
||||
We have no sympathy for the release of misleading and illegal
|
||||
distributions derived from obsolete code bases.
|
||||
Don't use an obsolete code base!
|
||||
|
||||
|
||||
TO DO
|
||||
=====
|
||||
|
||||
Version 8 is the first release of a new generation JPEG standard
|
||||
to overcome the limitations of the original JPEG specification.
|
||||
More features are being prepared for coming releases...
|
||||
|
||||
Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.
|
@ -1,111 +0,0 @@
|
||||
|
||||
This copy of the libpng notices is provided for your convenience. In case of
|
||||
any discrepancy between this copy and the notices in the file png.h that is
|
||||
included in the libpng distribution, the latter shall prevail.
|
||||
|
||||
COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
|
||||
|
||||
If you modify libpng you may insert additional notices immediately following
|
||||
this sentence.
|
||||
|
||||
This code is released under the libpng license.
|
||||
|
||||
libpng versions 1.2.6, August 15, 2004, through 1.5.9, February 18, 2012, are
|
||||
Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
|
||||
distributed according to the same disclaimer and license as libpng-1.2.5
|
||||
with the following individual added to the list of Contributing Authors
|
||||
|
||||
Cosmin Truta
|
||||
|
||||
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
|
||||
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
||||
distributed according to the same disclaimer and license as libpng-1.0.6
|
||||
with the following individuals added to the list of Contributing Authors
|
||||
|
||||
Simon-Pierre Cadieux
|
||||
Eric S. Raymond
|
||||
Gilles Vollant
|
||||
|
||||
and with the following additions to the disclaimer:
|
||||
|
||||
There is no warranty against interference with your enjoyment of the
|
||||
library or against infringement. There is no warranty that our
|
||||
efforts or the library will fulfill any of your particular purposes
|
||||
or needs. This library is provided with all faults, and the entire
|
||||
risk of satisfactory quality, performance, accuracy, and effort is with
|
||||
the user.
|
||||
|
||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||
Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
|
||||
distributed according to the same disclaimer and license as libpng-0.96,
|
||||
with the following individuals added to the list of Contributing Authors:
|
||||
|
||||
Tom Lane
|
||||
Glenn Randers-Pehrson
|
||||
Willem van Schaik
|
||||
|
||||
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||
Copyright (c) 1996, 1997 Andreas Dilger
|
||||
Distributed according to the same disclaimer and license as libpng-0.88,
|
||||
with the following individuals added to the list of Contributing Authors:
|
||||
|
||||
John Bowler
|
||||
Kevin Bracey
|
||||
Sam Bushell
|
||||
Magnus Holmgren
|
||||
Greg Roelofs
|
||||
Tom Tanner
|
||||
|
||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
||||
For the purposes of this copyright and license, "Contributing Authors"
|
||||
is defined as the following set of individuals:
|
||||
|
||||
Andreas Dilger
|
||||
Dave Martindale
|
||||
Guy Eric Schalnat
|
||||
Paul Schmidt
|
||||
Tim Wegner
|
||||
|
||||
The PNG Reference Library is supplied "AS IS". The Contributing Authors
|
||||
and Group 42, Inc. disclaim all warranties, expressed or implied,
|
||||
including, without limitation, the warranties of merchantability and of
|
||||
fitness for any purpose. The Contributing Authors and Group 42, Inc.
|
||||
assume no liability for direct, indirect, incidental, special, exemplary,
|
||||
or consequential damages, which may result from the use of the PNG
|
||||
Reference Library, even if advised of the possibility of such damage.
|
||||
|
||||
Permission is hereby granted to use, copy, modify, and distribute this
|
||||
source code, or portions hereof, for any purpose, without fee, subject
|
||||
to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented.
|
||||
|
||||
2. Altered versions must be plainly marked as such and must not
|
||||
be misrepresented as being the original source.
|
||||
|
||||
3. This Copyright notice may not be removed or altered from any
|
||||
source or altered source distribution.
|
||||
|
||||
The Contributing Authors and Group 42, Inc. specifically permit, without
|
||||
fee, and encourage the use of this source code as a component to
|
||||
supporting the PNG file format in commercial products. If you use this
|
||||
source code in a product, acknowledgment is not required but would be
|
||||
appreciated.
|
||||
|
||||
|
||||
A "png_get_copyright" function is available, for convenient use in "about"
|
||||
boxes and the like:
|
||||
|
||||
printf("%s",png_get_copyright(NULL));
|
||||
|
||||
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||
|
||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
|
||||
certification mark of the Open Source Initiative.
|
||||
|
||||
Glenn Randers-Pehrson
|
||||
glennrp at users.sourceforge.net
|
||||
February 18, 2012
|
@ -1,2 +0,0 @@
|
||||
Linux Users: There are some tools at the web for reading .chm files (try http://xchm.sourceforge.net/).
|
||||
You can find a html version of this documentation at http://irrlicht.sourceforge.net/docu/index.html
|
@ -1,32 +1,74 @@
|
||||
#include <iostream>
|
||||
#include <irrlicht.h>
|
||||
#include "exampleHelper.h"
|
||||
|
||||
using namespace irr;
|
||||
|
||||
static video::E_DRIVER_TYPE chooseDriver(const char *arg_)
|
||||
{
|
||||
if (core::stringc(arg_) == "null")
|
||||
return video::EDT_NULL;
|
||||
static IrrlichtDevice *device = nullptr;
|
||||
static int test_fail = 0;
|
||||
|
||||
if (IrrlichtDevice::isDriverSupported(video::EDT_OGLES1))
|
||||
void test_irr_array();
|
||||
void test_irr_string();
|
||||
|
||||
static video::E_DRIVER_TYPE chooseDriver(core::stringc arg_)
|
||||
{
|
||||
if (arg_ == "null")
|
||||
return video::EDT_NULL;
|
||||
if (arg_ == "ogles1")
|
||||
return video::EDT_OGLES1;
|
||||
if (IrrlichtDevice::isDriverSupported(video::EDT_OGLES2))
|
||||
if (arg_ == "ogles2")
|
||||
return video::EDT_OGLES2;
|
||||
if (arg_ == "opengl")
|
||||
return video::EDT_OPENGL;
|
||||
if (arg_ == "opengl3")
|
||||
return video::EDT_OPENGL3;
|
||||
std::cerr << "Unknown driver type: " << arg_.c_str() << ". Trying OpenGL." << std::endl;
|
||||
return video::EDT_OPENGL;
|
||||
}
|
||||
|
||||
static inline void check(bool ok, const char *msg)
|
||||
{
|
||||
if (!ok)
|
||||
{
|
||||
test_fail++;
|
||||
device->getLogger()->log((core::stringc("FAILED TEST: ") + msg).c_str(), ELL_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
void run_unit_tests() {
|
||||
std::cout << "Running unit tests:" << std::endl;
|
||||
try {
|
||||
test_irr_array();
|
||||
test_irr_string();
|
||||
} catch (const std::exception &e) {
|
||||
std::cerr << e.what() << std::endl;
|
||||
test_fail++;
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
run_unit_tests();
|
||||
|
||||
SIrrlichtCreationParameters p;
|
||||
p.DriverType = chooseDriver(argc > 1 ? argv[1] : "");
|
||||
p.WindowSize = core::dimension2du(640, 480);
|
||||
p.Vsync = true;
|
||||
p.LoggingLevel = ELL_DEBUG;
|
||||
|
||||
IrrlichtDevice *device = createDeviceEx(p);
|
||||
device = createDeviceEx(p);
|
||||
if (!device)
|
||||
return 1;
|
||||
|
||||
{
|
||||
u32 total = 0;
|
||||
device->getOSOperator()->getSystemMemory(&total, nullptr);
|
||||
core::stringc message = core::stringc("Total RAM in MiB: ") + core::stringc(total >> 10);
|
||||
device->getLogger()->log(message.c_str(), ELL_INFORMATION);
|
||||
check(total > 130 * 1024, "RAM amount");
|
||||
}
|
||||
|
||||
device->setWindowCaption(L"Hello World!");
|
||||
device->setResizable(true);
|
||||
|
||||
@ -45,16 +87,26 @@ int main(int argc, char *argv[])
|
||||
|
||||
const io::path mediaPath = getExampleMediaPath();
|
||||
|
||||
scene::IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "coolguy_opt.x");
|
||||
if (!mesh)
|
||||
return 1;
|
||||
scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
|
||||
if (node)
|
||||
auto mesh_file = device->getFileSystem()->createAndOpenFile(mediaPath + "coolguy_opt.x");
|
||||
check(mesh_file, "mesh file loading");
|
||||
scene::IAnimatedMesh* mesh = smgr->getMesh(mesh_file);
|
||||
check(mesh, "mesh loading");
|
||||
if (mesh_file)
|
||||
mesh_file->drop();
|
||||
if (mesh)
|
||||
{
|
||||
node->setMaterialFlag(video::EMF_LIGHTING, false);
|
||||
node->setFrameLoop(0, 29);
|
||||
node->setAnimationSpeed(30);
|
||||
node->setMaterialTexture(0, driver->getTexture(mediaPath + "cooltexture.png"));
|
||||
video::ITexture* tex = driver->getTexture(mediaPath + "cooltexture.png");
|
||||
check(tex, "texture loading");
|
||||
scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
|
||||
if (node)
|
||||
{
|
||||
node->forEachMaterial([tex] (video::SMaterial &mat) {
|
||||
mat.Lighting = false;
|
||||
mat.setTexture(0, tex);
|
||||
});
|
||||
node->setFrameLoop(0, 29);
|
||||
node->setAnimationSpeed(30);
|
||||
}
|
||||
}
|
||||
|
||||
smgr->addCameraSceneNode(0, core::vector3df(0,4,5), core::vector3df(0,2,0));
|
||||
@ -65,7 +117,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
while (device->run())
|
||||
{
|
||||
if (device->getTimer()->getTime() >= 1300)
|
||||
if (device->getTimer()->getTime() >= 1000)
|
||||
{
|
||||
device->getTimer()->setTime(0);
|
||||
++n;
|
||||
@ -102,12 +154,9 @@ int main(int argc, char *argv[])
|
||||
driver->endScene();
|
||||
}
|
||||
|
||||
if (core::stringw(L"a") != editbox->getText()) {
|
||||
device->getLogger()->log("EditBox text mismatch", ELL_INFORMATION);
|
||||
return 1;
|
||||
}
|
||||
check(core::stringw(L"a") == editbox->getText(), "EditBox text");
|
||||
|
||||
device->getLogger()->log("Done.", ELL_INFORMATION);
|
||||
device->drop();
|
||||
return 0;
|
||||
return test_fail > 0 ? 1 : 0;
|
||||
}
|
||||
|
135
examples/AutomatedTest/test_array.cpp
Normal file
135
examples/AutomatedTest/test_array.cpp
Normal file
@ -0,0 +1,135 @@
|
||||
#include <irrArray.h>
|
||||
#include "test_helper.h"
|
||||
|
||||
using namespace irr;
|
||||
using core::array;
|
||||
|
||||
static void test_basics() {
|
||||
array<int> v;
|
||||
v.push_back(1); // 1
|
||||
v.push_front(2); // 2, 1
|
||||
v.insert(4, 0); // 4, 2, 1
|
||||
v.insert(3, 1); // 4, 3, 2, 1
|
||||
v.insert(0, 4); // 4, 3, 2, 1, 0
|
||||
UASSERTEQ(v.size(), 5);
|
||||
UASSERTEQ(v[0], 4);
|
||||
UASSERTEQ(v[1], 3);
|
||||
UASSERTEQ(v[2], 2);
|
||||
UASSERTEQ(v[3], 1);
|
||||
UASSERTEQ(v[4], 0);
|
||||
array<int> w = v;
|
||||
UASSERTEQ(w.size(), 5);
|
||||
UASSERT(w == v);
|
||||
w.clear();
|
||||
UASSERTEQ(w.size(), 0);
|
||||
UASSERTEQ(w.allocated_size(), 0);
|
||||
UASSERT(w.empty());
|
||||
w = v;
|
||||
UASSERTEQ(w.size(), 5);
|
||||
w.set_used(3);
|
||||
UASSERTEQ(w.size(), 3);
|
||||
UASSERTEQ(w[0], 4);
|
||||
UASSERTEQ(w[1], 3);
|
||||
UASSERTEQ(w[2], 2);
|
||||
UASSERTEQ(w.getLast(), 2);
|
||||
w.set_used(20);
|
||||
UASSERTEQ(w.size(), 20);
|
||||
w = v;
|
||||
w.sort();
|
||||
UASSERTEQ(w.size(), 5);
|
||||
UASSERTEQ(w[0], 0);
|
||||
UASSERTEQ(w[1], 1);
|
||||
UASSERTEQ(w[2], 2);
|
||||
UASSERTEQ(w[3], 3);
|
||||
UASSERTEQ(w[4], 4);
|
||||
w.erase(0);
|
||||
UASSERTEQ(w.size(), 4);
|
||||
UASSERTEQ(w[0], 1);
|
||||
UASSERTEQ(w[1], 2);
|
||||
UASSERTEQ(w[2], 3);
|
||||
UASSERTEQ(w[3], 4);
|
||||
w.erase(1, 2);
|
||||
UASSERTEQ(w.size(), 2);
|
||||
UASSERTEQ(w[0], 1);
|
||||
UASSERTEQ(w[1], 4);
|
||||
w.swap(v);
|
||||
UASSERTEQ(w.size(), 5);
|
||||
UASSERTEQ(v.size(), 2);
|
||||
}
|
||||
|
||||
static void test_linear_searches() {
|
||||
// Populate the array with 0, 1, 2, ..., 100, 100, 99, 98, 97, ..., 0
|
||||
array<int> arr;
|
||||
for (int i = 0; i <= 100; i++)
|
||||
arr.push_back(i);
|
||||
for (int i = 100; i >= 0; i--)
|
||||
arr.push_back(i);
|
||||
s32 end = arr.size() - 1;
|
||||
for (int i = 0; i <= 100; i++) {
|
||||
s32 index = arr.linear_reverse_search(i);
|
||||
UASSERTEQ(index, end - i);
|
||||
}
|
||||
for (int i = 0; i <= 100; i++) {
|
||||
s32 index = arr.linear_search(i);
|
||||
UASSERTEQ(index, i);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_binary_searches() {
|
||||
const auto& values = { 3, 5, 1, 2, 5, 10, 19, 9, 7, 1, 2, 5, 8, 15 };
|
||||
array<int> arr;
|
||||
for (int value : values) {
|
||||
arr.push_back(value);
|
||||
}
|
||||
// Test the const form first, it uses a linear search without sorting
|
||||
const array<int> & carr = arr;
|
||||
UASSERTEQ(carr.binary_search(20), -1);
|
||||
UASSERTEQ(carr.binary_search(0), -1);
|
||||
UASSERTEQ(carr.binary_search(1), 2);
|
||||
|
||||
// Sorted: 1, 1, 2, 2, 3, 5, 5, 5, 7, 8, 9, 10, 15, 19
|
||||
UASSERTEQ(arr.binary_search(20), -1);
|
||||
UASSERTEQ(arr.binary_search(0), -1);
|
||||
|
||||
for (int value : values) {
|
||||
s32 i = arr.binary_search(value);
|
||||
UASSERTNE(i, -1);
|
||||
UASSERTEQ(arr[i], value);
|
||||
}
|
||||
|
||||
s32 first, last;
|
||||
first = arr.binary_search_multi(1, last);
|
||||
UASSERTEQ(first, 0);
|
||||
UASSERTEQ(last, 1);
|
||||
|
||||
first = arr.binary_search_multi(2, last);
|
||||
UASSERTEQ(first, 2);
|
||||
UASSERTEQ(last, 3);
|
||||
|
||||
first = arr.binary_search_multi(3, last);
|
||||
UASSERTEQ(first, 4);
|
||||
UASSERTEQ(last, 4);
|
||||
|
||||
first = arr.binary_search_multi(4, last);
|
||||
UASSERTEQ(first, -1);
|
||||
|
||||
first = arr.binary_search_multi(5, last);
|
||||
UASSERTEQ(first, 5);
|
||||
UASSERTEQ(last, 7);
|
||||
|
||||
first = arr.binary_search_multi(7, last);
|
||||
UASSERTEQ(first, 8);
|
||||
UASSERTEQ(last, 8);
|
||||
|
||||
first = arr.binary_search_multi(19, last);
|
||||
UASSERTEQ(first, 13);
|
||||
UASSERTEQ(last, 13);
|
||||
}
|
||||
|
||||
void test_irr_array()
|
||||
{
|
||||
test_basics();
|
||||
test_linear_searches();
|
||||
test_binary_searches();
|
||||
std::cout << " test_irr_array PASSED" << std::endl;
|
||||
}
|
30
examples/AutomatedTest/test_helper.h
Normal file
30
examples/AutomatedTest/test_helper.h
Normal file
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include <exception>
|
||||
#include <iostream>
|
||||
|
||||
class TestFailedException : public std::exception {
|
||||
};
|
||||
|
||||
// Asserts the comparison specified by CMP is true, or fails the current unit test
|
||||
#define UASSERTCMP(CMP, actual, expected) do { \
|
||||
const auto &a = (actual); \
|
||||
const auto &e = (expected); \
|
||||
if (!CMP(a, e)) { \
|
||||
std::cout \
|
||||
<< "Test assertion failed: " << #actual << " " << #CMP << " " \
|
||||
<< #expected << std::endl \
|
||||
<< " at " << __FILE__ << ":" << __LINE__ << std::endl \
|
||||
<< " actual: " << a << std::endl << " expected: " \
|
||||
<< e << std::endl; \
|
||||
throw TestFailedException(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define CMPEQ(a, e) (a == e)
|
||||
#define CMPTRUE(a, e) (a)
|
||||
#define CMPNE(a, e) (a != e)
|
||||
|
||||
#define UASSERTEQ(actual, expected) UASSERTCMP(CMPEQ, actual, expected)
|
||||
#define UASSERTNE(actual, nexpected) UASSERTCMP(CMPNE, actual, nexpected)
|
||||
#define UASSERT(actual) UASSERTCMP(CMPTRUE, actual, true)
|
195
examples/AutomatedTest/test_string.cpp
Normal file
195
examples/AutomatedTest/test_string.cpp
Normal file
@ -0,0 +1,195 @@
|
||||
#include <irrString.h>
|
||||
#include <cstring>
|
||||
#include <clocale>
|
||||
#include <vector>
|
||||
#include "test_helper.h"
|
||||
|
||||
using namespace irr;
|
||||
using namespace irr::core;
|
||||
|
||||
#define CMPSTR(a, b) (!strcmp(a, b))
|
||||
#define UASSERTSTR(actual, expected) UASSERTCMP(CMPSTR, actual.c_str(), expected)
|
||||
|
||||
static void test_basics()
|
||||
{
|
||||
// ctor
|
||||
stringc s;
|
||||
UASSERTEQ(s.c_str()[0], '\0');
|
||||
s = stringc(0.1234567);
|
||||
UASSERTSTR(s, "0.123457");
|
||||
s = stringc(0x1p+53);
|
||||
UASSERTSTR(s, "9007199254740992.000000");
|
||||
s = stringc(static_cast<int>(-102400));
|
||||
UASSERTSTR(s, "-102400");
|
||||
s = stringc(static_cast<unsigned int>(102400));
|
||||
UASSERTSTR(s, "102400");
|
||||
s = stringc(static_cast<long>(-1024000));
|
||||
UASSERTSTR(s, "-1024000");
|
||||
s = stringc(static_cast<unsigned long>(1024000));
|
||||
UASSERTSTR(s, "1024000");
|
||||
s = stringc("YESno", 3);
|
||||
UASSERTSTR(s, "YES");
|
||||
s = stringc(L"test", 4);
|
||||
UASSERTSTR(s, "test");
|
||||
s = stringc("Hello World!");
|
||||
UASSERTSTR(s, "Hello World!");
|
||||
// operator=
|
||||
s = stringw(L"abcdef");
|
||||
UASSERTSTR(s, "abcdef");
|
||||
s = L"abcdef";
|
||||
UASSERTSTR(s, "abcdef");
|
||||
s = static_cast<const char*>(nullptr);
|
||||
UASSERTSTR(s, "");
|
||||
// operator+
|
||||
s = s + stringc("foo");
|
||||
UASSERTSTR(s, "foo");
|
||||
s = s + L"bar";
|
||||
UASSERTSTR(s, "foobar");
|
||||
// the rest
|
||||
s = "f";
|
||||
UASSERTEQ(s[0], 'f');
|
||||
const auto &sref = s;
|
||||
UASSERTEQ(sref[0], 'f');
|
||||
UASSERT(sref == "f");
|
||||
UASSERT(sref == stringc("f"));
|
||||
s = "a";
|
||||
UASSERT(sref < stringc("aa"));
|
||||
UASSERT(sref < stringc("b"));
|
||||
UASSERT(stringc("Z") < sref);
|
||||
UASSERT(!(sref < stringc("a")));
|
||||
UASSERT(sref.lower_ignore_case("AA"));
|
||||
UASSERT(sref.lower_ignore_case("B"));
|
||||
UASSERT(!sref.lower_ignore_case("A"));
|
||||
s = "dog";
|
||||
UASSERT(sref != "cat");
|
||||
UASSERT(sref != stringc("cat"));
|
||||
}
|
||||
|
||||
static void test_methods()
|
||||
{
|
||||
stringc s;
|
||||
const auto &sref = s;
|
||||
s = "irrlicht";
|
||||
UASSERTEQ(sref.size(), 8);
|
||||
UASSERT(!sref.empty());
|
||||
s.clear();
|
||||
UASSERTEQ(sref.size(), 0);
|
||||
UASSERT(sref.empty());
|
||||
UASSERT(sref[0] == 0);
|
||||
s = "\tAz#`";
|
||||
s.make_lower();
|
||||
UASSERTSTR(s, "\taz#`");
|
||||
s.make_upper();
|
||||
UASSERTSTR(s, "\tAZ#`");
|
||||
UASSERT(sref.equals_ignore_case("\taz#`"));
|
||||
UASSERT(sref.equals_substring_ignore_case("Z#`", 2));
|
||||
s = "irrlicht";
|
||||
UASSERT(sref.equalsn(stringc("irr"), 3));
|
||||
UASSERT(sref.equalsn("irr", 3));
|
||||
s = "fo";
|
||||
s.append('o');
|
||||
UASSERTSTR(s, "foo");
|
||||
s.append("bar", 1);
|
||||
UASSERTSTR(s, "foob");
|
||||
s.append("ar", 999999);
|
||||
UASSERTSTR(s, "foobar");
|
||||
s = "nyan";
|
||||
s.append(stringc("cat"));
|
||||
UASSERTSTR(s, "nyancat");
|
||||
s.append(stringc("sam"), 1);
|
||||
UASSERTSTR(s, "nyancats");
|
||||
s = "fbar";
|
||||
s.insert(1, "ooXX", 2);
|
||||
UASSERTSTR(s, "foobar");
|
||||
UASSERTEQ(sref.findFirst('o'), 1);
|
||||
UASSERTEQ(sref.findFirst('X'), -1);
|
||||
UASSERTEQ(sref.findFirstChar("abff", 2), 3);
|
||||
UASSERTEQ(sref.findFirstCharNotInList("fobb", 2), 3);
|
||||
UASSERTEQ(sref.findLast('o'), 2);
|
||||
UASSERTEQ(sref.findLast('X'), -1);
|
||||
UASSERTEQ(sref.findLastChar("abrr", 2), 4);
|
||||
UASSERTEQ(sref.findLastCharNotInList("rabb", 2), 3);
|
||||
UASSERTEQ(sref.findNext('o', 2), 2);
|
||||
UASSERTEQ(sref.findLast('o', 1), 1);
|
||||
s = "ob-oob";
|
||||
UASSERTEQ(sref.find("ob", 1), 4);
|
||||
UASSERTEQ(sref.find("ob"), 0);
|
||||
UASSERTEQ(sref.find("?"), -1);
|
||||
s = "HOMEOWNER";
|
||||
stringc s2 = sref.subString(2, 4);
|
||||
UASSERTSTR(s2, "MEOW");
|
||||
s2 = sref.subString(2, 4, true);
|
||||
UASSERTSTR(s2, "meow");
|
||||
s = "land";
|
||||
s.replace('l', 's');
|
||||
UASSERTSTR(s, "sand");
|
||||
s = ">dog<";
|
||||
s.replace("dog", "cat");
|
||||
UASSERTSTR(s, ">cat<");
|
||||
s.replace("cat", "horse");
|
||||
UASSERTSTR(s, ">horse<");
|
||||
s.replace("horse", "gnu");
|
||||
UASSERTSTR(s, ">gnu<");
|
||||
s = " h e l p ";
|
||||
s.remove(' ');
|
||||
UASSERTSTR(s, "help");
|
||||
s.remove("el");
|
||||
UASSERTSTR(s, "hp");
|
||||
s = "irrlicht";
|
||||
s.removeChars("it");
|
||||
UASSERTSTR(s, "rrlch");
|
||||
s = "\r\nfoo bar ";
|
||||
s.trim();
|
||||
UASSERTSTR(s, "foo bar");
|
||||
s = "foxo";
|
||||
s.erase(2);
|
||||
UASSERTSTR(s, "foo");
|
||||
s = "a";
|
||||
s.append('\0');
|
||||
s.append('b');
|
||||
UASSERTEQ(s.size(), 3);
|
||||
s.validate();
|
||||
UASSERTEQ(s.size(), 1);
|
||||
UASSERTEQ(s.lastChar(), 'a');
|
||||
std::vector<stringc> res;
|
||||
s = "a,,b,c";
|
||||
s.split(res, ",aa", 1, true, false);
|
||||
UASSERTEQ(res.size(), 3);
|
||||
UASSERTSTR(res[0], "a");
|
||||
UASSERTSTR(res[2], "c");
|
||||
res.clear();
|
||||
s.split(res, ",", 1, false, true);
|
||||
UASSERTEQ(res.size(), 7);
|
||||
UASSERTSTR(res[0], "a");
|
||||
UASSERTSTR(res[2], "");
|
||||
for (int i = 0; i < 3; i++)
|
||||
UASSERTSTR(res[2*i+1], ",");
|
||||
}
|
||||
|
||||
static void test_conv()
|
||||
{
|
||||
// assumes Unicode and UTF-8 locale
|
||||
setlocale(LC_CTYPE, "");
|
||||
|
||||
stringw out;
|
||||
multibyteToWString(out, "†††");
|
||||
UASSERTEQ(out.size(), 3);
|
||||
for (int i = 0; i < 3; i++)
|
||||
UASSERTEQ(static_cast<u16>(out[i]), 0x2020);
|
||||
stringc out2;
|
||||
wStringToMultibyte(out2, L"†††");
|
||||
UASSERTEQ(out2.size(), 9);
|
||||
for (int i = 0; i < 3; i++) {
|
||||
UASSERTEQ(static_cast<u8>(out2[3*i]), 0xe2);
|
||||
UASSERTEQ(static_cast<u8>(out2[3*i+1]), 0x80);
|
||||
UASSERTEQ(static_cast<u8>(out2[3*i+2]), 0xa0);
|
||||
}
|
||||
}
|
||||
|
||||
void test_irr_string()
|
||||
{
|
||||
test_basics();
|
||||
test_methods();
|
||||
test_conv();
|
||||
std::cout << " test_irr_string PASSED" << std::endl;
|
||||
}
|
@ -1,3 +1,5 @@
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(IRREXAMPLES
|
||||
# removed
|
||||
|
@ -1,133 +0,0 @@
|
||||
// Copyright (C) 2008-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __C_DYNAMIC_MESHBUFFER_H_INCLUDED__
|
||||
#define __C_DYNAMIC_MESHBUFFER_H_INCLUDED__
|
||||
|
||||
#include "IDynamicMeshBuffer.h"
|
||||
|
||||
#include "CVertexBuffer.h"
|
||||
#include "CIndexBuffer.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
class CDynamicMeshBuffer: public IDynamicMeshBuffer
|
||||
{
|
||||
public:
|
||||
//! constructor
|
||||
CDynamicMeshBuffer(video::E_VERTEX_TYPE vertexType, video::E_INDEX_TYPE indexType)
|
||||
: PrimitiveType(EPT_TRIANGLES)
|
||||
{
|
||||
VertexBuffer=new CVertexBuffer(vertexType);
|
||||
IndexBuffer=new CIndexBuffer(indexType);
|
||||
}
|
||||
|
||||
//! destructor
|
||||
virtual ~CDynamicMeshBuffer()
|
||||
{
|
||||
if (VertexBuffer)
|
||||
VertexBuffer->drop();
|
||||
if (IndexBuffer)
|
||||
IndexBuffer->drop();
|
||||
}
|
||||
|
||||
virtual IVertexBuffer& getVertexBuffer() const _IRR_OVERRIDE_
|
||||
{
|
||||
return *VertexBuffer;
|
||||
}
|
||||
|
||||
virtual IIndexBuffer& getIndexBuffer() const _IRR_OVERRIDE_
|
||||
{
|
||||
return *IndexBuffer;
|
||||
}
|
||||
|
||||
virtual void setVertexBuffer(IVertexBuffer *newVertexBuffer) _IRR_OVERRIDE_
|
||||
{
|
||||
if (newVertexBuffer)
|
||||
newVertexBuffer->grab();
|
||||
if (VertexBuffer)
|
||||
VertexBuffer->drop();
|
||||
|
||||
VertexBuffer=newVertexBuffer;
|
||||
}
|
||||
|
||||
virtual void setIndexBuffer(IIndexBuffer *newIndexBuffer) _IRR_OVERRIDE_
|
||||
{
|
||||
if (newIndexBuffer)
|
||||
newIndexBuffer->grab();
|
||||
if (IndexBuffer)
|
||||
IndexBuffer->drop();
|
||||
|
||||
IndexBuffer=newIndexBuffer;
|
||||
}
|
||||
|
||||
//! Get Material of this buffer.
|
||||
virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_
|
||||
{
|
||||
return Material;
|
||||
}
|
||||
|
||||
//! Get Material of this buffer.
|
||||
virtual video::SMaterial& getMaterial() _IRR_OVERRIDE_
|
||||
{
|
||||
return Material;
|
||||
}
|
||||
|
||||
//! Get bounding box
|
||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_
|
||||
{
|
||||
return BoundingBox;
|
||||
}
|
||||
|
||||
//! Set bounding box
|
||||
virtual void setBoundingBox( const core::aabbox3df& box) _IRR_OVERRIDE_
|
||||
{
|
||||
BoundingBox = box;
|
||||
}
|
||||
|
||||
//! Recalculate bounding box
|
||||
virtual void recalculateBoundingBox() _IRR_OVERRIDE_
|
||||
{
|
||||
if (!getVertexBuffer().size())
|
||||
BoundingBox.reset(0,0,0);
|
||||
else
|
||||
{
|
||||
BoundingBox.reset(getVertexBuffer()[0].Pos);
|
||||
for (u32 i=1; i<getVertexBuffer().size(); ++i)
|
||||
BoundingBox.addInternalPoint(getVertexBuffer()[i].Pos);
|
||||
}
|
||||
}
|
||||
|
||||
//! Describe what kind of primitive geometry is used by the meshbuffer
|
||||
virtual void setPrimitiveType(E_PRIMITIVE_TYPE type) _IRR_OVERRIDE_
|
||||
{
|
||||
PrimitiveType = type;
|
||||
}
|
||||
|
||||
//! Get the kind of primitive geometry which is used by the meshbuffer
|
||||
virtual E_PRIMITIVE_TYPE getPrimitiveType() const _IRR_OVERRIDE_
|
||||
{
|
||||
return PrimitiveType;
|
||||
}
|
||||
|
||||
video::SMaterial Material;
|
||||
core::aabbox3d<f32> BoundingBox;
|
||||
//! Primitive type used for rendering (triangles, lines, ...)
|
||||
E_PRIMITIVE_TYPE PrimitiveType;
|
||||
private:
|
||||
CDynamicMeshBuffer(const CDynamicMeshBuffer&); // = delete in c++11, prevent copying
|
||||
|
||||
IVertexBuffer *VertexBuffer;
|
||||
IIndexBuffer *IndexBuffer;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -39,46 +39,46 @@ namespace scene
|
||||
public:
|
||||
core::array<T> Indices;
|
||||
|
||||
virtual u32 stride() const _IRR_OVERRIDE_ {return sizeof(T);}
|
||||
u32 stride() const override {return sizeof(T);}
|
||||
|
||||
virtual u32 size() const _IRR_OVERRIDE_ {return Indices.size();}
|
||||
u32 size() const override {return Indices.size();}
|
||||
|
||||
virtual void push_back(const u32 &element) _IRR_OVERRIDE_
|
||||
void push_back(const u32 &element) override
|
||||
{
|
||||
// push const ref due to compiler problem with gcc 4.6, big endian
|
||||
Indices.push_back((const T&)element);
|
||||
}
|
||||
|
||||
virtual u32 operator [](u32 index) const _IRR_OVERRIDE_
|
||||
u32 operator [](u32 index) const override
|
||||
{
|
||||
return (u32)(Indices[index]);
|
||||
}
|
||||
|
||||
virtual u32 getLast() _IRR_OVERRIDE_ {return (u32)Indices.getLast();}
|
||||
u32 getLast() override {return (u32)Indices.getLast();}
|
||||
|
||||
virtual void setValue(u32 index, u32 value) _IRR_OVERRIDE_
|
||||
void setValue(u32 index, u32 value) override
|
||||
{
|
||||
Indices[index]=(T)value;
|
||||
}
|
||||
|
||||
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
|
||||
void set_used(u32 usedNow) override
|
||||
{
|
||||
Indices.set_used(usedNow);
|
||||
}
|
||||
|
||||
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
|
||||
void reallocate(u32 new_size) override
|
||||
{
|
||||
Indices.reallocate(new_size);
|
||||
}
|
||||
|
||||
virtual u32 allocated_size() const _IRR_OVERRIDE_
|
||||
u32 allocated_size() const override
|
||||
{
|
||||
return Indices.allocated_size();
|
||||
}
|
||||
|
||||
virtual void* pointer() _IRR_OVERRIDE_ {return Indices.pointer();}
|
||||
void* pointer() override {return Indices.pointer();}
|
||||
|
||||
virtual video::E_INDEX_TYPE getType() const _IRR_OVERRIDE_
|
||||
video::E_INDEX_TYPE getType() const override
|
||||
{
|
||||
if (sizeof(T)==sizeof(u16))
|
||||
return video::EIT_16BIT;
|
||||
@ -110,7 +110,7 @@ namespace scene
|
||||
}
|
||||
|
||||
//virtual void setType(video::E_INDEX_TYPE IndexType);
|
||||
virtual void setType(video::E_INDEX_TYPE IndexType) _IRR_OVERRIDE_
|
||||
void setType(video::E_INDEX_TYPE IndexType) override
|
||||
{
|
||||
IIndexList *NewIndices=0;
|
||||
|
||||
@ -141,78 +141,78 @@ namespace scene
|
||||
Indices=NewIndices;
|
||||
}
|
||||
|
||||
virtual void* getData() _IRR_OVERRIDE_ {return Indices->pointer();}
|
||||
void* getData() override {return Indices->pointer();}
|
||||
|
||||
virtual video::E_INDEX_TYPE getType() const _IRR_OVERRIDE_ {return Indices->getType();}
|
||||
video::E_INDEX_TYPE getType() const override {return Indices->getType();}
|
||||
|
||||
virtual u32 stride() const _IRR_OVERRIDE_ {return Indices->stride();}
|
||||
u32 stride() const override {return Indices->stride();}
|
||||
|
||||
virtual u32 size() const _IRR_OVERRIDE_
|
||||
u32 size() const override
|
||||
{
|
||||
return Indices->size();
|
||||
}
|
||||
|
||||
virtual void push_back(const u32 &element) _IRR_OVERRIDE_
|
||||
void push_back(const u32 &element) override
|
||||
{
|
||||
Indices->push_back(element);
|
||||
}
|
||||
|
||||
virtual u32 operator [](u32 index) const _IRR_OVERRIDE_
|
||||
u32 operator [](u32 index) const override
|
||||
{
|
||||
return (*Indices)[index];
|
||||
}
|
||||
|
||||
virtual u32 getLast() _IRR_OVERRIDE_
|
||||
u32 getLast() override
|
||||
{
|
||||
return Indices->getLast();
|
||||
}
|
||||
|
||||
virtual void setValue(u32 index, u32 value) _IRR_OVERRIDE_
|
||||
void setValue(u32 index, u32 value) override
|
||||
{
|
||||
Indices->setValue(index, value);
|
||||
}
|
||||
|
||||
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
|
||||
void set_used(u32 usedNow) override
|
||||
{
|
||||
Indices->set_used(usedNow);
|
||||
}
|
||||
|
||||
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
|
||||
void reallocate(u32 new_size) override
|
||||
{
|
||||
Indices->reallocate(new_size);
|
||||
}
|
||||
|
||||
virtual u32 allocated_size() const _IRR_OVERRIDE_
|
||||
u32 allocated_size() const override
|
||||
{
|
||||
return Indices->allocated_size();
|
||||
}
|
||||
|
||||
virtual void* pointer() _IRR_OVERRIDE_
|
||||
void* pointer() override
|
||||
{
|
||||
return Indices->pointer();
|
||||
}
|
||||
|
||||
//! get the current hardware mapping hint
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint() const _IRR_OVERRIDE_
|
||||
E_HARDWARE_MAPPING getHardwareMappingHint() const override
|
||||
{
|
||||
return MappingHint;
|
||||
}
|
||||
|
||||
//! set the hardware mapping hint, for driver
|
||||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) _IRR_OVERRIDE_
|
||||
void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) override
|
||||
{
|
||||
MappingHint=NewMappingHint;
|
||||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty() _IRR_OVERRIDE_
|
||||
void setDirty() override
|
||||
{
|
||||
++ChangedID;
|
||||
}
|
||||
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID() const _IRR_OVERRIDE_ {return ChangedID;}
|
||||
u32 getChangedID() const override {return ChangedID;}
|
||||
|
||||
E_HARDWARE_MAPPING MappingHint;
|
||||
u32 ChangedID;
|
||||
|
@ -21,6 +21,7 @@ namespace scene
|
||||
CMeshBuffer()
|
||||
: ChangedID_Vertex(1), ChangedID_Index(1)
|
||||
, MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)
|
||||
, HWBuffer(NULL)
|
||||
, PrimitiveType(EPT_TRIANGLES)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
@ -31,7 +32,7 @@ namespace scene
|
||||
|
||||
//! Get material of this meshbuffer
|
||||
/** \return Material of this buffer */
|
||||
virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_
|
||||
const video::SMaterial& getMaterial() const override
|
||||
{
|
||||
return Material;
|
||||
}
|
||||
@ -39,7 +40,7 @@ namespace scene
|
||||
|
||||
//! Get material of this meshbuffer
|
||||
/** \return Material of this buffer */
|
||||
virtual video::SMaterial& getMaterial() _IRR_OVERRIDE_
|
||||
video::SMaterial& getMaterial() override
|
||||
{
|
||||
return Material;
|
||||
}
|
||||
@ -47,7 +48,7 @@ namespace scene
|
||||
|
||||
//! Get pointer to vertices
|
||||
/** \return Pointer to vertices. */
|
||||
virtual const void* getVertices() const _IRR_OVERRIDE_
|
||||
const void* getVertices() const override
|
||||
{
|
||||
return Vertices.const_pointer();
|
||||
}
|
||||
@ -55,7 +56,7 @@ namespace scene
|
||||
|
||||
//! Get pointer to vertices
|
||||
/** \return Pointer to vertices. */
|
||||
virtual void* getVertices() _IRR_OVERRIDE_
|
||||
void* getVertices() override
|
||||
{
|
||||
return Vertices.pointer();
|
||||
}
|
||||
@ -63,21 +64,21 @@ namespace scene
|
||||
|
||||
//! Get number of vertices
|
||||
/** \return Number of vertices. */
|
||||
virtual u32 getVertexCount() const _IRR_OVERRIDE_
|
||||
u32 getVertexCount() const override
|
||||
{
|
||||
return Vertices.size();
|
||||
}
|
||||
|
||||
//! Get type of index data which is stored in this meshbuffer.
|
||||
/** \return Index type of this buffer. */
|
||||
virtual video::E_INDEX_TYPE getIndexType() const _IRR_OVERRIDE_
|
||||
video::E_INDEX_TYPE getIndexType() const override
|
||||
{
|
||||
return video::EIT_16BIT;
|
||||
}
|
||||
|
||||
//! Get pointer to indices
|
||||
/** \return Pointer to indices. */
|
||||
virtual const u16* getIndices() const _IRR_OVERRIDE_
|
||||
const u16* getIndices() const override
|
||||
{
|
||||
return Indices.const_pointer();
|
||||
}
|
||||
@ -85,7 +86,7 @@ namespace scene
|
||||
|
||||
//! Get pointer to indices
|
||||
/** \return Pointer to indices. */
|
||||
virtual u16* getIndices() _IRR_OVERRIDE_
|
||||
u16* getIndices() override
|
||||
{
|
||||
return Indices.pointer();
|
||||
}
|
||||
@ -93,7 +94,7 @@ namespace scene
|
||||
|
||||
//! Get number of indices
|
||||
/** \return Number of indices. */
|
||||
virtual u32 getIndexCount() const _IRR_OVERRIDE_
|
||||
u32 getIndexCount() const override
|
||||
{
|
||||
return Indices.size();
|
||||
}
|
||||
@ -101,7 +102,7 @@ namespace scene
|
||||
|
||||
//! Get the axis aligned bounding box
|
||||
/** \return Axis aligned bounding box of this buffer. */
|
||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_
|
||||
const core::aabbox3d<f32>& getBoundingBox() const override
|
||||
{
|
||||
return BoundingBox;
|
||||
}
|
||||
@ -110,7 +111,7 @@ namespace scene
|
||||
//! Set the axis aligned bounding box
|
||||
/** \param box New axis aligned bounding box for this buffer. */
|
||||
//! set user axis aligned bounding box
|
||||
virtual void setBoundingBox(const core::aabbox3df& box) _IRR_OVERRIDE_
|
||||
void setBoundingBox(const core::aabbox3df& box) override
|
||||
{
|
||||
BoundingBox = box;
|
||||
}
|
||||
@ -118,7 +119,7 @@ namespace scene
|
||||
|
||||
//! Recalculate the bounding box.
|
||||
/** should be called if the mesh changed. */
|
||||
virtual void recalculateBoundingBox() _IRR_OVERRIDE_
|
||||
void recalculateBoundingBox() override
|
||||
{
|
||||
if (!Vertices.empty())
|
||||
{
|
||||
@ -135,43 +136,43 @@ namespace scene
|
||||
|
||||
//! Get type of vertex data stored in this buffer.
|
||||
/** \return Type of vertex data. */
|
||||
virtual video::E_VERTEX_TYPE getVertexType() const _IRR_OVERRIDE_
|
||||
video::E_VERTEX_TYPE getVertexType() const override
|
||||
{
|
||||
return T::getType();
|
||||
}
|
||||
|
||||
//! returns position of vertex i
|
||||
virtual const core::vector3df& getPosition(u32 i) const _IRR_OVERRIDE_
|
||||
const core::vector3df& getPosition(u32 i) const override
|
||||
{
|
||||
return Vertices[i].Pos;
|
||||
}
|
||||
|
||||
//! returns position of vertex i
|
||||
virtual core::vector3df& getPosition(u32 i) _IRR_OVERRIDE_
|
||||
core::vector3df& getPosition(u32 i) override
|
||||
{
|
||||
return Vertices[i].Pos;
|
||||
}
|
||||
|
||||
//! returns normal of vertex i
|
||||
virtual const core::vector3df& getNormal(u32 i) const _IRR_OVERRIDE_
|
||||
const core::vector3df& getNormal(u32 i) const override
|
||||
{
|
||||
return Vertices[i].Normal;
|
||||
}
|
||||
|
||||
//! returns normal of vertex i
|
||||
virtual core::vector3df& getNormal(u32 i) _IRR_OVERRIDE_
|
||||
core::vector3df& getNormal(u32 i) override
|
||||
{
|
||||
return Vertices[i].Normal;
|
||||
}
|
||||
|
||||
//! returns texture coord of vertex i
|
||||
virtual const core::vector2df& getTCoords(u32 i) const _IRR_OVERRIDE_
|
||||
const core::vector2df& getTCoords(u32 i) const override
|
||||
{
|
||||
return Vertices[i].TCoords;
|
||||
}
|
||||
|
||||
//! returns texture coord of vertex i
|
||||
virtual core::vector2df& getTCoords(u32 i) _IRR_OVERRIDE_
|
||||
core::vector2df& getTCoords(u32 i) override
|
||||
{
|
||||
return Vertices[i].TCoords;
|
||||
}
|
||||
@ -182,7 +183,7 @@ namespace scene
|
||||
or the main buffer is of standard type. Otherwise, behavior is
|
||||
undefined.
|
||||
*/
|
||||
virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) _IRR_OVERRIDE_
|
||||
void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) override
|
||||
{
|
||||
if (vertices == getVertices())
|
||||
return;
|
||||
@ -193,8 +194,8 @@ namespace scene
|
||||
Vertices.reallocate(vertexCount+numVertices);
|
||||
for (i=0; i<numVertices; ++i)
|
||||
{
|
||||
Vertices.push_back(reinterpret_cast<const T*>(vertices)[i]);
|
||||
BoundingBox.addInternalPoint(reinterpret_cast<const T*>(vertices)[i].Pos);
|
||||
Vertices.push_back(static_cast<const T*>(vertices)[i]);
|
||||
BoundingBox.addInternalPoint(static_cast<const T*>(vertices)[i].Pos);
|
||||
}
|
||||
|
||||
Indices.reallocate(getIndexCount()+numIndices);
|
||||
@ -211,7 +212,7 @@ namespace scene
|
||||
undefined.
|
||||
\param other Meshbuffer to be appended to this one.
|
||||
*/
|
||||
virtual void append(const IMeshBuffer* const other) _IRR_OVERRIDE_
|
||||
void append(const IMeshBuffer* const other) override
|
||||
{
|
||||
/*
|
||||
if (this==other)
|
||||
@ -237,19 +238,19 @@ namespace scene
|
||||
|
||||
|
||||
//! get the current hardware mapping hint
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const _IRR_OVERRIDE_
|
||||
E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const override
|
||||
{
|
||||
return MappingHint_Vertex;
|
||||
}
|
||||
|
||||
//! get the current hardware mapping hint
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const _IRR_OVERRIDE_
|
||||
E_HARDWARE_MAPPING getHardwareMappingHint_Index() const override
|
||||
{
|
||||
return MappingHint_Index;
|
||||
}
|
||||
|
||||
//! set the hardware mapping hint, for driver
|
||||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) _IRR_OVERRIDE_
|
||||
void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) override
|
||||
{
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
|
||||
MappingHint_Vertex=NewMappingHint;
|
||||
@ -258,19 +259,19 @@ namespace scene
|
||||
}
|
||||
|
||||
//! Describe what kind of primitive geometry is used by the meshbuffer
|
||||
virtual void setPrimitiveType(E_PRIMITIVE_TYPE type) _IRR_OVERRIDE_
|
||||
void setPrimitiveType(E_PRIMITIVE_TYPE type) override
|
||||
{
|
||||
PrimitiveType = type;
|
||||
}
|
||||
|
||||
//! Get the kind of primitive geometry which is used by the meshbuffer
|
||||
virtual E_PRIMITIVE_TYPE getPrimitiveType() const _IRR_OVERRIDE_
|
||||
E_PRIMITIVE_TYPE getPrimitiveType() const override
|
||||
{
|
||||
return PrimitiveType;
|
||||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) _IRR_OVERRIDE_
|
||||
void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) override
|
||||
{
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
|
||||
++ChangedID_Vertex;
|
||||
@ -280,11 +281,20 @@ namespace scene
|
||||
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID_Vertex() const _IRR_OVERRIDE_ {return ChangedID_Vertex;}
|
||||
u32 getChangedID_Vertex() const override {return ChangedID_Vertex;}
|
||||
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID_Index() const _IRR_OVERRIDE_ {return ChangedID_Index;}
|
||||
u32 getChangedID_Index() const override {return ChangedID_Index;}
|
||||
|
||||
void setHWBuffer(void *ptr) const override {
|
||||
HWBuffer = ptr;
|
||||
}
|
||||
|
||||
void *getHWBuffer() const override {
|
||||
return HWBuffer;
|
||||
}
|
||||
|
||||
|
||||
u32 ChangedID_Vertex;
|
||||
u32 ChangedID_Index;
|
||||
@ -292,6 +302,7 @@ namespace scene
|
||||
//! hardware mapping hint
|
||||
E_HARDWARE_MAPPING MappingHint_Vertex;
|
||||
E_HARDWARE_MAPPING MappingHint_Index;
|
||||
mutable void *HWBuffer;
|
||||
|
||||
//! Material for this meshbuffer.
|
||||
video::SMaterial Material;
|
||||
|
@ -40,33 +40,33 @@ namespace scene
|
||||
public:
|
||||
core::array<T> Vertices;
|
||||
|
||||
virtual u32 stride() const _IRR_OVERRIDE_ {return sizeof(T);}
|
||||
u32 stride() const override {return sizeof(T);}
|
||||
|
||||
virtual u32 size() const _IRR_OVERRIDE_ {return Vertices.size();}
|
||||
u32 size() const override {return Vertices.size();}
|
||||
|
||||
virtual void push_back (const video::S3DVertex &element) _IRR_OVERRIDE_
|
||||
void push_back (const video::S3DVertex &element) override
|
||||
{Vertices.push_back((T&)element);}
|
||||
|
||||
virtual video::S3DVertex& operator [](const u32 index) const _IRR_OVERRIDE_
|
||||
video::S3DVertex& operator [](const u32 index) const override
|
||||
{return (video::S3DVertex&)Vertices[index];}
|
||||
|
||||
virtual video::S3DVertex& getLast() _IRR_OVERRIDE_
|
||||
video::S3DVertex& getLast() override
|
||||
{return (video::S3DVertex&)Vertices.getLast();}
|
||||
|
||||
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
|
||||
void set_used(u32 usedNow) override
|
||||
{Vertices.set_used(usedNow);}
|
||||
|
||||
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
|
||||
void reallocate(u32 new_size) override
|
||||
{Vertices.reallocate(new_size);}
|
||||
|
||||
virtual u32 allocated_size() const _IRR_OVERRIDE_
|
||||
u32 allocated_size() const override
|
||||
{
|
||||
return Vertices.allocated_size();
|
||||
}
|
||||
|
||||
virtual video::S3DVertex* pointer() _IRR_OVERRIDE_ {return Vertices.pointer();}
|
||||
video::S3DVertex* pointer() override {return Vertices.pointer();}
|
||||
|
||||
virtual video::E_VERTEX_TYPE getType() const _IRR_OVERRIDE_ {return T::getType();}
|
||||
video::E_VERTEX_TYPE getType() const override {return T::getType();}
|
||||
};
|
||||
|
||||
public:
|
||||
@ -75,18 +75,18 @@ namespace scene
|
||||
CVertexBuffer(video::E_VERTEX_TYPE vertexType) : Vertices(0),
|
||||
MappingHint(EHM_NEVER), ChangedID(1)
|
||||
{
|
||||
setType(vertexType);
|
||||
CVertexBuffer::setType(vertexType);
|
||||
}
|
||||
|
||||
CVertexBuffer(const IVertexBuffer &VertexBufferCopy) :
|
||||
Vertices(0), MappingHint(EHM_NEVER),
|
||||
ChangedID(1)
|
||||
{
|
||||
setType(VertexBufferCopy.getType());
|
||||
reallocate(VertexBufferCopy.size());
|
||||
CVertexBuffer::setType(VertexBufferCopy.getType());
|
||||
CVertexBuffer::reallocate(VertexBufferCopy.size());
|
||||
|
||||
for (u32 n=0;n<VertexBufferCopy.size();++n)
|
||||
push_back(VertexBufferCopy[n]);
|
||||
CVertexBuffer::push_back(VertexBufferCopy[n]);
|
||||
}
|
||||
|
||||
virtual ~CVertexBuffer()
|
||||
@ -95,8 +95,11 @@ namespace scene
|
||||
}
|
||||
|
||||
|
||||
virtual void setType(video::E_VERTEX_TYPE vertexType) _IRR_OVERRIDE_
|
||||
void setType(video::E_VERTEX_TYPE vertexType) override
|
||||
{
|
||||
if ( Vertices && Vertices->getType() == vertexType )
|
||||
return;
|
||||
|
||||
IVertexList *NewVertices=0;
|
||||
|
||||
switch (vertexType)
|
||||
@ -130,73 +133,73 @@ namespace scene
|
||||
Vertices=NewVertices;
|
||||
}
|
||||
|
||||
virtual void* getData() _IRR_OVERRIDE_ {return Vertices->pointer();}
|
||||
void* getData() override {return Vertices->pointer();}
|
||||
|
||||
virtual video::E_VERTEX_TYPE getType() const _IRR_OVERRIDE_ {return Vertices->getType();}
|
||||
video::E_VERTEX_TYPE getType() const override {return Vertices->getType();}
|
||||
|
||||
virtual u32 stride() const _IRR_OVERRIDE_ {return Vertices->stride();}
|
||||
u32 stride() const override {return Vertices->stride();}
|
||||
|
||||
virtual u32 size() const _IRR_OVERRIDE_
|
||||
u32 size() const override
|
||||
{
|
||||
return Vertices->size();
|
||||
}
|
||||
|
||||
virtual void push_back (const video::S3DVertex &element) _IRR_OVERRIDE_
|
||||
void push_back (const video::S3DVertex &element) override
|
||||
{
|
||||
Vertices->push_back(element);
|
||||
}
|
||||
|
||||
virtual video::S3DVertex& operator [](const u32 index) const _IRR_OVERRIDE_
|
||||
video::S3DVertex& operator [](const u32 index) const override
|
||||
{
|
||||
return (*Vertices)[index];
|
||||
}
|
||||
|
||||
virtual video::S3DVertex& getLast() _IRR_OVERRIDE_
|
||||
video::S3DVertex& getLast() override
|
||||
{
|
||||
return Vertices->getLast();
|
||||
}
|
||||
|
||||
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
|
||||
void set_used(u32 usedNow) override
|
||||
{
|
||||
Vertices->set_used(usedNow);
|
||||
}
|
||||
|
||||
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
|
||||
void reallocate(u32 new_size) override
|
||||
{
|
||||
Vertices->reallocate(new_size);
|
||||
}
|
||||
|
||||
virtual u32 allocated_size() const _IRR_OVERRIDE_
|
||||
u32 allocated_size() const override
|
||||
{
|
||||
return Vertices->allocated_size();
|
||||
}
|
||||
|
||||
virtual video::S3DVertex* pointer() _IRR_OVERRIDE_
|
||||
video::S3DVertex* pointer() override
|
||||
{
|
||||
return Vertices->pointer();
|
||||
}
|
||||
|
||||
//! get the current hardware mapping hint
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint() const _IRR_OVERRIDE_
|
||||
E_HARDWARE_MAPPING getHardwareMappingHint() const override
|
||||
{
|
||||
return MappingHint;
|
||||
}
|
||||
|
||||
//! set the hardware mapping hint, for driver
|
||||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) _IRR_OVERRIDE_
|
||||
void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) override
|
||||
{
|
||||
MappingHint=NewMappingHint;
|
||||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty() _IRR_OVERRIDE_
|
||||
void setDirty() override
|
||||
{
|
||||
++ChangedID;
|
||||
}
|
||||
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID() const _IRR_OVERRIDE_ {return ChangedID;}
|
||||
u32 getChangedID() const override {return ChangedID;}
|
||||
|
||||
E_HARDWARE_MAPPING MappingHint;
|
||||
u32 ChangedID;
|
||||
|
@ -28,9 +28,6 @@ namespace scene
|
||||
//! Overlays Mesh Wireframe
|
||||
EDS_MESH_WIRE_OVERLAY = 8,
|
||||
|
||||
//! Temporary use transparency Material Type
|
||||
EDS_HALF_TRANSPARENCY = 16,
|
||||
|
||||
//! Show Bounding Boxes of all MeshBuffers
|
||||
EDS_BBOX_BUFFERS = 32,
|
||||
|
||||
|
@ -16,10 +16,6 @@ namespace irr
|
||||
/** This device uses the Win32 API and works in all versions of Windows. */
|
||||
EIDT_WIN32,
|
||||
|
||||
//! A device native to Windows CE devices
|
||||
/** This device works on Windows Mobile, Pocket PC and Microsoft SmartPhone devices */
|
||||
EIDT_WINCE,
|
||||
|
||||
//! A device native to Unix style operating systems.
|
||||
/** This device uses the X11 windowing system and works in Linux, Solaris, FreeBSD, OSX and
|
||||
other operating systems which support X11. */
|
||||
@ -28,28 +24,12 @@ namespace irr
|
||||
//! A device native to Mac OSX
|
||||
/** This device uses Apple's Cocoa API and works in Mac OSX 10.2 and above. */
|
||||
EIDT_OSX,
|
||||
|
||||
//! A device native to the iOS
|
||||
/** This device should be used with the OpenGL-ES driver. */
|
||||
EIDT_IOS,
|
||||
|
||||
//! A device which uses Simple DirectMedia Layer
|
||||
/** The SDL device works under all platforms supported by SDL but first must be compiled
|
||||
in by defining the _IRR_COMPILE_WITH_SDL_DEVICE_ macro in IrrCompileConfig.h */
|
||||
in by setting the USE_SDL2 CMake option to ON */
|
||||
EIDT_SDL,
|
||||
|
||||
//! A device for raw framebuffer access
|
||||
/** Best used with embedded devices and mobile systems.
|
||||
Does not need X11 or other graphical subsystems.
|
||||
May support hw-acceleration via OpenGL-ES for FBDirect */
|
||||
EIDT_FRAMEBUFFER,
|
||||
|
||||
//! A simple text only device supported by all platforms.
|
||||
/** This device allows applications to run from the command line without opening a window.
|
||||
It can render the output of the software drivers to the console as ASCII. It only supports
|
||||
mouse and keyboard in Windows operating systems. */
|
||||
EIDT_CONSOLE,
|
||||
|
||||
//! This selection allows Irrlicht to choose the best device from the ones available.
|
||||
/** If this selection is chosen then Irrlicht will try to use the IrrlichtDevice native
|
||||
to your operating system. If this is unavailable then the X11, SDL and then console device
|
||||
|
@ -20,31 +20,11 @@ namespace video
|
||||
render and display any graphics. */
|
||||
EDT_NULL,
|
||||
|
||||
//! The Irrlicht Engine Software renderer.
|
||||
/** Runs on all platforms, with every hardware. It should only
|
||||
be used for 2d graphics, but it can also perform some primitive
|
||||
3d functions. These 3d drawing functions are quite fast, but
|
||||
very inaccurate, and don't even support clipping in 3D mode. */
|
||||
// obsolete constants to make some code happy
|
||||
// TODO delete
|
||||
EDT_SOFTWARE,
|
||||
|
||||
//! The Burning's Software Renderer, an alternative software renderer
|
||||
/** Basically it can be described as the Irrlicht Software
|
||||
renderer on steroids. It rasterizes 3D geometry perfectly: It
|
||||
is able to perform correct 3d clipping, perspective correct
|
||||
texture mapping, perspective correct color mapping, and renders
|
||||
sub pixel correct, sub texel correct primitives. In addition,
|
||||
it does bilinear texel filtering and supports more materials
|
||||
than the EDT_SOFTWARE driver. This renderer has been written
|
||||
entirely by Thomas Alten, thanks a lot for this huge
|
||||
contribution. */
|
||||
EDT_BURNINGSVIDEO,
|
||||
|
||||
//! Direct3D8 device is longer supported in Irrlicht. You have to go back to Irrlicht 1.8 if you still need that.
|
||||
DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS, // keep enum to avoid breaking enumeration order (might be used in ini-files, serialization, etc)
|
||||
|
||||
//! Direct3D 9 device, only available on Win32 platforms.
|
||||
/** Performs hardware accelerated rendering of 3D and 2D
|
||||
primitives. */
|
||||
DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS,
|
||||
EDT_DIRECT3D9,
|
||||
|
||||
//! OpenGL device, available on most platforms.
|
||||
@ -52,7 +32,7 @@ namespace video
|
||||
primitives. */
|
||||
EDT_OPENGL,
|
||||
|
||||
//! OpenGL-ES 1.x driver, for embedded and mobile systems
|
||||
//! OpenGL-ES 1.x driver, for embedded and mobile systems
|
||||
EDT_OGLES1,
|
||||
|
||||
//! OpenGL-ES 2.x driver, for embedded and mobile systems
|
||||
@ -62,38 +42,12 @@ namespace video
|
||||
//! WebGL1 friendly subset of OpenGL-ES 2.x driver for Emscripten
|
||||
EDT_WEBGL1,
|
||||
|
||||
EDT_OPENGL3,
|
||||
|
||||
//! No driver, just for counting the elements
|
||||
EDT_COUNT
|
||||
};
|
||||
|
||||
const c8* const DRIVER_TYPE_NAMES[] =
|
||||
{
|
||||
"NullDriver",
|
||||
"Software Renderer",
|
||||
"Burning's Video",
|
||||
"Direct3D 8.1",
|
||||
"Direct3D 9.0c",
|
||||
"OpenGL 1.x/2.x/3.x",
|
||||
"OpenGL ES1",
|
||||
"OpenGL ES2",
|
||||
"WebGL 1",
|
||||
0
|
||||
};
|
||||
|
||||
const c8* const DRIVER_TYPE_NAMES_SHORT[] =
|
||||
{
|
||||
"null",
|
||||
"software",
|
||||
"burning",
|
||||
"d3d8",
|
||||
"d3d9",
|
||||
"opengl",
|
||||
"ogles1",
|
||||
"ogles2",
|
||||
"webgl1",
|
||||
0
|
||||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
||||
|
@ -91,9 +91,6 @@ enum EGUI_ELEMENT_TYPE
|
||||
//! The root of the GUI
|
||||
EGUIET_ROOT,
|
||||
|
||||
//! IGUIProfiler
|
||||
EGUIET_PROFILER,
|
||||
|
||||
//! Not an element, amount of elements in there
|
||||
EGUIET_COUNT,
|
||||
|
||||
|
@ -1,101 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __E_MATERIAL_FLAGS_H_INCLUDED__
|
||||
#define __E_MATERIAL_FLAGS_H_INCLUDED__
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
//! Material flags
|
||||
enum E_MATERIAL_FLAG
|
||||
{
|
||||
//! Draw as wireframe or filled triangles? Default: false
|
||||
EMF_WIREFRAME = 0x1,
|
||||
|
||||
//! Draw as point cloud or filled triangles? Default: false
|
||||
EMF_POINTCLOUD = 0x2,
|
||||
|
||||
//! Flat or Gouraud shading? Default: true
|
||||
EMF_GOURAUD_SHADING = 0x4,
|
||||
|
||||
//! Will this material be lighted? Default: true
|
||||
EMF_LIGHTING = 0x8,
|
||||
|
||||
//! Is the ZBuffer enabled? Default: true
|
||||
EMF_ZBUFFER = 0x10,
|
||||
|
||||
//! May be written to the zbuffer or is it readonly. Default: true
|
||||
/** This flag is ignored, if the material type is a transparent type. */
|
||||
EMF_ZWRITE_ENABLE = 0x20,
|
||||
|
||||
//! Is backface culling enabled? Default: true
|
||||
EMF_BACK_FACE_CULLING = 0x40,
|
||||
|
||||
//! Is frontface culling enabled? Default: false
|
||||
/** Overrides EMF_BACK_FACE_CULLING if both are enabled. */
|
||||
EMF_FRONT_FACE_CULLING = 0x80,
|
||||
|
||||
//! Is bilinear filtering enabled? Default: true
|
||||
EMF_BILINEAR_FILTER = 0x100,
|
||||
|
||||
//! Is trilinear filtering enabled? Default: false
|
||||
/** If the trilinear filter flag is enabled,
|
||||
the bilinear filtering flag is ignored. */
|
||||
EMF_TRILINEAR_FILTER = 0x200,
|
||||
|
||||
//! Is anisotropic filtering? Default: false
|
||||
/** In Irrlicht you can use anisotropic texture filtering in
|
||||
conjunction with bilinear or trilinear texture filtering
|
||||
to improve rendering results. Primitives will look less
|
||||
blurry with this flag switched on. */
|
||||
EMF_ANISOTROPIC_FILTER = 0x400,
|
||||
|
||||
//! Is fog enabled? Default: false
|
||||
EMF_FOG_ENABLE = 0x800,
|
||||
|
||||
//! Normalizes normals. Default: false
|
||||
/** You can enable this if you need to scale a dynamic lighted
|
||||
model. Usually, its normals will get scaled too then and it
|
||||
will get darker. If you enable the EMF_NORMALIZE_NORMALS flag,
|
||||
the normals will be normalized again, and the model will look
|
||||
as bright as it should. */
|
||||
EMF_NORMALIZE_NORMALS = 0x1000,
|
||||
|
||||
//! Access to all layers texture wrap settings. Overwrites separate layer settings.
|
||||
/** Note that if you want to change TextureWrapU, TextureWrapV, TextureWrapW
|
||||
independently, then you can't work with this flag, but will have to set the variables
|
||||
directly. */
|
||||
EMF_TEXTURE_WRAP = 0x2000,
|
||||
|
||||
//! AntiAliasing mode
|
||||
EMF_ANTI_ALIASING = 0x4000,
|
||||
|
||||
//! ColorMask bits, for enabling the color planes
|
||||
EMF_COLOR_MASK = 0x8000,
|
||||
|
||||
//! ColorMaterial enum for vertex color interpretation
|
||||
EMF_COLOR_MATERIAL = 0x10000,
|
||||
|
||||
//! Flag for enabling/disabling mipmap usage
|
||||
EMF_USE_MIP_MAPS = 0x20000,
|
||||
|
||||
//! Flag for blend operation
|
||||
EMF_BLEND_OPERATION = 0x40000,
|
||||
|
||||
//! Flag for polygon offset
|
||||
EMF_POLYGON_OFFSET = 0x80000,
|
||||
|
||||
//! Flag for blend factor
|
||||
EMF_BLEND_FACTOR = 0x160000
|
||||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
||||
|
||||
#endif // __E_MATERIAL_FLAGS_H_INCLUDED__
|
||||
|
87
include/EMaterialProps.h
Normal file
87
include/EMaterialProps.h
Normal file
@ -0,0 +1,87 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __E_MATERIAL_PROPS_H_INCLUDED__
|
||||
#define __E_MATERIAL_PROPS_H_INCLUDED__
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
//! Material properties
|
||||
enum E_MATERIAL_PROP
|
||||
{
|
||||
//! Corresponds to SMaterial::Wireframe.
|
||||
EMP_WIREFRAME = 0x1,
|
||||
|
||||
//! Corresponds to SMaterial::PointCloud.
|
||||
EMP_POINTCLOUD = 0x2,
|
||||
|
||||
//! Corresponds to SMaterial::GouraudShading.
|
||||
EMP_GOURAUD_SHADING = 0x4,
|
||||
|
||||
//! Corresponds to SMaterial::Lighting.
|
||||
EMP_LIGHTING = 0x8,
|
||||
|
||||
//! Corresponds to SMaterial::ZBuffer.
|
||||
EMP_ZBUFFER = 0x10,
|
||||
|
||||
//! Corresponds to SMaterial::ZWriteEnable.
|
||||
EMP_ZWRITE_ENABLE = 0x20,
|
||||
|
||||
//! Corresponds to SMaterial::BackfaceCulling.
|
||||
EMP_BACK_FACE_CULLING = 0x40,
|
||||
|
||||
//! Corresponds to SMaterial::FrontfaceCulling.
|
||||
EMP_FRONT_FACE_CULLING = 0x80,
|
||||
|
||||
//! Corresponds to SMaterialLayer::MinFilter.
|
||||
EMP_MIN_FILTER = 0x100,
|
||||
|
||||
//! Corresponds to SMaterialLayer::MagFilter.
|
||||
EMP_MAG_FILTER = 0x200,
|
||||
|
||||
//! Corresponds to SMaterialLayer::AnisotropicFilter.
|
||||
EMP_ANISOTROPIC_FILTER = 0x400,
|
||||
|
||||
//! Corresponds to SMaterial::FogEnable.
|
||||
EMP_FOG_ENABLE = 0x800,
|
||||
|
||||
//! Corresponds to SMaterial::NormalizeNormals.
|
||||
EMP_NORMALIZE_NORMALS = 0x1000,
|
||||
|
||||
//! Corresponds to SMaterialLayer::TextureWrapU, TextureWrapV and
|
||||
//! TextureWrapW.
|
||||
EMP_TEXTURE_WRAP = 0x2000,
|
||||
|
||||
//! Corresponds to SMaterial::AntiAliasing.
|
||||
EMP_ANTI_ALIASING = 0x4000,
|
||||
|
||||
//! Corresponds to SMaterial::ColorMask.
|
||||
EMP_COLOR_MASK = 0x8000,
|
||||
|
||||
//! Corresponds to SMaterial::ColorMaterial.
|
||||
EMP_COLOR_MATERIAL = 0x10000,
|
||||
|
||||
//! Corresponds to SMaterial::UseMipMaps.
|
||||
EMP_USE_MIP_MAPS = 0x20000,
|
||||
|
||||
//! Corresponds to SMaterial::BlendOperation.
|
||||
EMP_BLEND_OPERATION = 0x40000,
|
||||
|
||||
//! Corresponds to SMaterial::PolygonOffsetFactor, PolygonOffsetDirection,
|
||||
//! PolygonOffsetDepthBias and PolygonOffsetSlopeScale.
|
||||
EMP_POLYGON_OFFSET = 0x80000,
|
||||
|
||||
//! Corresponds to SMaterial::BlendFactor.
|
||||
EMP_BLEND_FACTOR = 0x100000,
|
||||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
||||
|
||||
#endif // __E_MATERIAL_PROPS_H_INCLUDED__
|
||||
|
@ -18,75 +18,6 @@ namespace video
|
||||
diffuse material. */
|
||||
EMT_SOLID = 0,
|
||||
|
||||
//! Solid material with 2 texture layers.
|
||||
/** The second is blended onto the first using the alpha value
|
||||
of the vertex colors. This material is currently not implemented in OpenGL.
|
||||
*/
|
||||
EMT_SOLID_2_LAYER,
|
||||
|
||||
//! Material type with standard lightmap technique
|
||||
/** There should be 2 textures: The first texture layer is a
|
||||
diffuse map, the second is a light map. Dynamic light is
|
||||
ignored. */
|
||||
EMT_LIGHTMAP,
|
||||
|
||||
//! Material type with lightmap technique like EMT_LIGHTMAP.
|
||||
/** But lightmap and diffuse texture are added instead of modulated. */
|
||||
EMT_LIGHTMAP_ADD,
|
||||
|
||||
//! Material type with standard lightmap technique
|
||||
/** There should be 2 textures: The first texture layer is a
|
||||
diffuse map, the second is a light map. Dynamic light is
|
||||
ignored. The texture colors are effectively multiplied by 2
|
||||
for brightening. Like known in DirectX as D3DTOP_MODULATE2X. */
|
||||
EMT_LIGHTMAP_M2,
|
||||
|
||||
//! Material type with standard lightmap technique
|
||||
/** There should be 2 textures: The first texture layer is a
|
||||
diffuse map, the second is a light map. Dynamic light is
|
||||
ignored. The texture colors are effectively multiplied by 4
|
||||
for brightening. Like known in DirectX as D3DTOP_MODULATE4X. */
|
||||
EMT_LIGHTMAP_M4,
|
||||
|
||||
//! Like EMT_LIGHTMAP, but also supports dynamic lighting.
|
||||
EMT_LIGHTMAP_LIGHTING,
|
||||
|
||||
//! Like EMT_LIGHTMAP_M2, but also supports dynamic lighting.
|
||||
EMT_LIGHTMAP_LIGHTING_M2,
|
||||
|
||||
//! Like EMT_LIGHTMAP_M4, but also supports dynamic lighting.
|
||||
EMT_LIGHTMAP_LIGHTING_M4,
|
||||
|
||||
//! Detail mapped material.
|
||||
/** The first texture is diffuse color map, the second is added
|
||||
to this and usually displayed with a bigger scale value so that
|
||||
it adds more detail. The detail map is added to the diffuse map
|
||||
using ADD_SIGNED, so that it is possible to add and subtract
|
||||
color from the diffuse map. For example a value of
|
||||
(127,127,127) will not change the appearance of the diffuse map
|
||||
at all. Often used for terrain rendering. */
|
||||
EMT_DETAIL_MAP,
|
||||
|
||||
//! Look like a reflection of the environment around it.
|
||||
/** To make this possible, a texture called 'sphere map' is
|
||||
used, which must be set as the first texture. */
|
||||
EMT_SPHERE_MAP,
|
||||
|
||||
//! A reflecting material with an optional non reflecting texture layer.
|
||||
/** The reflection map should be set as first texture. */
|
||||
EMT_REFLECTION_2_LAYER,
|
||||
|
||||
//! A transparent material.
|
||||
/** Only the first texture is used. The new color is calculated
|
||||
by simply adding the source color and the dest color. This
|
||||
means if for example a billboard using a texture with black
|
||||
background and a red circle on it is drawn with this material,
|
||||
the result is that only the red circle will be drawn a little
|
||||
bit transparent, and everything which was black is 100%
|
||||
transparent and not visible. This material type is useful for
|
||||
particle effects. */
|
||||
EMT_TRANSPARENT_ADD_COLOR,
|
||||
|
||||
//! Makes the material transparent based on the texture alpha channel.
|
||||
/** The final color is blended together from the destination
|
||||
color and the texture color, using the alpha channel value as
|
||||
@ -115,77 +46,6 @@ namespace video
|
||||
//! Makes the material transparent based on the vertex alpha value.
|
||||
EMT_TRANSPARENT_VERTEX_ALPHA,
|
||||
|
||||
//! A transparent reflecting material with an optional additional non reflecting texture layer.
|
||||
/** The reflection map should be set as first texture. The
|
||||
transparency depends on the alpha value in the vertex colors. A
|
||||
texture which will not reflect can be set as second texture.*/
|
||||
EMT_TRANSPARENT_REFLECTION_2_LAYER,
|
||||
|
||||
//! A solid normal map renderer.
|
||||
/** First texture is the color map, the second should be the
|
||||
normal map. Note that you should use this material only when
|
||||
drawing geometry consisting of vertices of type
|
||||
S3DVertexTangents (EVT_TANGENTS). You can convert any mesh into
|
||||
this format using IMeshManipulator::createMeshWithTangents()
|
||||
(See SpecialFX2 Tutorial). This shader runs on vertex shader
|
||||
1.1 and pixel shader 1.1 capable hardware and falls back to a
|
||||
fixed function lighted material if this hardware is not
|
||||
available. Only two lights are supported by this shader, if
|
||||
there are more, the nearest two are chosen. */
|
||||
EMT_NORMAL_MAP_SOLID,
|
||||
|
||||
//! A transparent normal map renderer.
|
||||
/** First texture is the color map, the second should be the
|
||||
normal map. Note that you should use this material only when
|
||||
drawing geometry consisting of vertices of type
|
||||
S3DVertexTangents (EVT_TANGENTS). You can convert any mesh into
|
||||
this format using IMeshManipulator::createMeshWithTangents()
|
||||
(See SpecialFX2 Tutorial). This shader runs on vertex shader
|
||||
1.1 and pixel shader 1.1 capable hardware and falls back to a
|
||||
fixed function lighted material if this hardware is not
|
||||
available. Only two lights are supported by this shader, if
|
||||
there are more, the nearest two are chosen. */
|
||||
EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR,
|
||||
|
||||
//! A transparent (based on the vertex alpha value) normal map renderer.
|
||||
/** First texture is the color map, the second should be the
|
||||
normal map. Note that you should use this material only when
|
||||
drawing geometry consisting of vertices of type
|
||||
S3DVertexTangents (EVT_TANGENTS). You can convert any mesh into
|
||||
this format using IMeshManipulator::createMeshWithTangents()
|
||||
(See SpecialFX2 Tutorial). This shader runs on vertex shader
|
||||
1.1 and pixel shader 1.1 capable hardware and falls back to a
|
||||
fixed function lighted material if this hardware is not
|
||||
available. Only two lights are supported by this shader, if
|
||||
there are more, the nearest two are chosen. */
|
||||
EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA,
|
||||
|
||||
//! Just like EMT_NORMAL_MAP_SOLID, but uses parallax mapping.
|
||||
/** Looks a lot more realistic. This only works when the
|
||||
hardware supports at least vertex shader 1.1 and pixel shader
|
||||
1.4. First texture is the color map, the second should be the
|
||||
normal map. The normal map texture should contain the height
|
||||
value in the alpha component. The
|
||||
IVideoDriver::makeNormalMapTexture() method writes this value
|
||||
automatically when creating normal maps from a heightmap when
|
||||
using a 32 bit texture. The height scale of the material
|
||||
(affecting the bumpiness) is being controlled by the
|
||||
SMaterial::MaterialTypeParam member. If set to zero, the
|
||||
default value (0.02f) will be applied. Otherwise the value set
|
||||
in SMaterial::MaterialTypeParam is taken. This value depends on
|
||||
with which scale the texture is mapped on the material. Too
|
||||
high or low values of MaterialTypeParam can result in strange
|
||||
artifacts. */
|
||||
EMT_PARALLAX_MAP_SOLID,
|
||||
|
||||
//! A material like EMT_PARALLAX_MAP_SOLID, but transparent.
|
||||
/** Using EMT_TRANSPARENT_ADD_COLOR as base material. */
|
||||
EMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR,
|
||||
|
||||
//! A material like EMT_PARALLAX_MAP_SOLID, but transparent.
|
||||
/** Using EMT_TRANSPARENT_VERTEX_ALPHA as base material. */
|
||||
EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA,
|
||||
|
||||
//! BlendFunc = source * sourceFactor + dest * destFactor ( E_BLEND_FUNC )
|
||||
/** Using only first texture. Generic blending method.
|
||||
The blend function is set to SMaterial::MaterialTypeParam with
|
||||
@ -200,28 +60,9 @@ namespace video
|
||||
const char* const sBuiltInMaterialTypeNames[] =
|
||||
{
|
||||
"solid",
|
||||
"solid_2layer",
|
||||
"lightmap",
|
||||
"lightmap_add",
|
||||
"lightmap_m2",
|
||||
"lightmap_m4",
|
||||
"lightmap_light",
|
||||
"lightmap_light_m2",
|
||||
"lightmap_light_m4",
|
||||
"detail_map",
|
||||
"sphere_map",
|
||||
"reflection_2layer",
|
||||
"trans_add",
|
||||
"trans_alphach",
|
||||
"trans_alphach_ref",
|
||||
"trans_vertex_alpha",
|
||||
"trans_reflection_2layer",
|
||||
"normalmap_solid",
|
||||
"normalmap_trans_add",
|
||||
"normalmap_trans_vertexalpha",
|
||||
"parallaxmap_solid",
|
||||
"parallaxmap_trans_add",
|
||||
"parallaxmap_trans_vertexalpha",
|
||||
"onetexture_blend",
|
||||
0
|
||||
};
|
||||
|
@ -1,36 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __E_MESSAGE_BOX_FLAGS_H_INCLUDED__
|
||||
#define __E_MESSAGE_BOX_FLAGS_H_INCLUDED__
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
//! enumeration for message box layout flags
|
||||
enum EMESSAGE_BOX_FLAG
|
||||
{
|
||||
//! Flag for the OK button
|
||||
EMBF_OK = 0x1,
|
||||
|
||||
//! Flag for the cancel button
|
||||
EMBF_CANCEL = 0x2,
|
||||
|
||||
//! Flag for the yes button
|
||||
EMBF_YES = 0x4,
|
||||
|
||||
//! Flag for the no button
|
||||
EMBF_NO = 0x8,
|
||||
|
||||
//! This value is not used. It only forces this enumeration to compile in 32 bit.
|
||||
EMBF_FORCE_32BIT = 0x7fffffff
|
||||
};
|
||||
|
||||
} // namespace gui
|
||||
} // namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -1,36 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __E_TERRAIN_ELEMENTS_H__
|
||||
#define __E_TERRAIN_ELEMENTS_H__
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
//! enumeration for patch sizes specifying the size of patches in the TerrainSceneNode
|
||||
enum E_TERRAIN_PATCH_SIZE
|
||||
{
|
||||
//! patch size of 9, at most, use 4 levels of detail with this patch size.
|
||||
ETPS_9 = 9,
|
||||
|
||||
//! patch size of 17, at most, use 5 levels of detail with this patch size.
|
||||
ETPS_17 = 17,
|
||||
|
||||
//! patch size of 33, at most, use 6 levels of detail with this patch size.
|
||||
ETPS_33 = 33,
|
||||
|
||||
//! patch size of 65, at most, use 7 levels of detail with this patch size.
|
||||
ETPS_65 = 65,
|
||||
|
||||
//! patch size of 129, at most, use 8 levels of detail with this patch size.
|
||||
ETPS_129 = 129
|
||||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -61,7 +61,7 @@ namespace scene
|
||||
if getMeshType() returns EAMT_MD2 it's safe to cast the
|
||||
IAnimatedMesh to IAnimatedMeshMD2.
|
||||
\returns Type of the mesh. */
|
||||
virtual E_ANIMATED_MESH_TYPE getMeshType() const _IRR_OVERRIDE_
|
||||
E_ANIMATED_MESH_TYPE getMeshType() const override
|
||||
{
|
||||
return EAMT_UNKNOWN;
|
||||
}
|
||||
|
@ -1,71 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_ATTRIBUTE_EXCHANGING_OBJECT_H_INCLUDED__
|
||||
#define __I_ATTRIBUTE_EXCHANGING_OBJECT_H_INCLUDED__
|
||||
|
||||
#include "IReferenceCounted.h"
|
||||
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
namespace io
|
||||
{
|
||||
|
||||
class IAttributes;
|
||||
|
||||
//! Enumeration flags passed through SAttributeReadWriteOptions to the IAttributeExchangingObject object
|
||||
enum E_ATTRIBUTE_READ_WRITE_FLAGS
|
||||
{
|
||||
//! Serialization/Deserializion is done for an xml file
|
||||
EARWF_FOR_FILE = 0x00000001,
|
||||
|
||||
//! Serialization/Deserializion is done for an editor property box
|
||||
EARWF_FOR_EDITOR = 0x00000002,
|
||||
|
||||
//! When writing filenames, relative paths should be used
|
||||
EARWF_USE_RELATIVE_PATHS = 0x00000004
|
||||
};
|
||||
|
||||
|
||||
//! struct holding data describing options
|
||||
struct SAttributeReadWriteOptions
|
||||
{
|
||||
//! Constructor
|
||||
SAttributeReadWriteOptions()
|
||||
: Flags(0), Filename(0)
|
||||
{
|
||||
}
|
||||
|
||||
//! Combination of E_ATTRIBUTE_READ_WRITE_FLAGS or other, custom ones
|
||||
s32 Flags;
|
||||
|
||||
//! Optional filename
|
||||
const fschar_t* Filename;
|
||||
};
|
||||
|
||||
|
||||
//! An object which is able to serialize and deserialize its attributes into an attributes object
|
||||
class IAttributeExchangingObject : virtual public IReferenceCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Writes attributes of the object.
|
||||
/** Implement this to expose the attributes of your scene node animator for
|
||||
scripting languages, editors, debuggers or xml serialization purposes. */
|
||||
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const {}
|
||||
|
||||
//! Reads attributes of the object.
|
||||
/** Implement this to set the attributes of your scene node animator for
|
||||
scripting languages, editors, debuggers or xml deserialization purposes. */
|
||||
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) {}
|
||||
|
||||
};
|
||||
|
||||
} // end namespace io
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -125,133 +125,9 @@ public:
|
||||
//! Sets an attribute as float value
|
||||
virtual void setAttribute(s32 index, f32 value) = 0;
|
||||
|
||||
/*
|
||||
|
||||
String Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as string
|
||||
virtual void addString(const c8* attributeName, const c8* value) = 0;
|
||||
|
||||
//! Sets an attribute value as string.
|
||||
//! \param attributeName: Name for the attribute
|
||||
//! \param value: Value for the attribute. Set this to 0 to delete the attribute
|
||||
virtual void setAttribute(const c8* attributeName, const c8* value) = 0;
|
||||
|
||||
//! Gets an attribute as string.
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
//! or defaultNotFound if attribute is not set.
|
||||
virtual core::stringc getAttributeAsString(const c8* attributeName, const core::stringc& defaultNotFound=core::stringc()) const = 0;
|
||||
|
||||
//! Gets an attribute as string.
|
||||
//! \param attributeName Name of the attribute to get.
|
||||
//! \param target Buffer where the string is copied to.
|
||||
virtual void getAttributeAsString(const c8* attributeName, c8* target) const = 0;
|
||||
|
||||
//! Returns attribute value as string by index.
|
||||
//! \param index Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::stringc getAttributeAsString(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute value as string.
|
||||
//! \param index Index value, must be between 0 and getAttributeCount()-1.
|
||||
//! \param value String to which the attribute is set.
|
||||
virtual void setAttribute(s32 index, const c8* value) = 0;
|
||||
|
||||
// wide strings
|
||||
|
||||
//! Adds an attribute as string
|
||||
virtual void addString(const c8* attributeName, const wchar_t* value) = 0;
|
||||
|
||||
//! Sets an attribute value as string.
|
||||
//! \param attributeName: Name for the attribute
|
||||
//! \param value: Value for the attribute. Set this to 0 to delete the attribute
|
||||
virtual void setAttribute(const c8* attributeName, const wchar_t* value) = 0;
|
||||
|
||||
//! Gets an attribute as string.
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
//! or defaultNotFound if attribute is not set.
|
||||
virtual core::stringw getAttributeAsStringW(const c8* attributeName, const core::stringw& defaultNotFound = core::stringw()) const = 0;
|
||||
|
||||
//! Gets an attribute as string.
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param target: Buffer where the string is copied to.
|
||||
virtual void getAttributeAsStringW(const c8* attributeName, wchar_t* target) const = 0;
|
||||
|
||||
//! Returns attribute value as string by index.
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::stringw getAttributeAsStringW(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute value as string.
|
||||
//! \param index Index value, must be between 0 and getAttributeCount()-1.
|
||||
//! \param value String to which the attribute is set.
|
||||
virtual void setAttribute(s32 index, const wchar_t* value) = 0;
|
||||
|
||||
/*
|
||||
|
||||
Binary Data Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as binary data
|
||||
virtual void addBinary(const c8* attributeName, void* data, s32 dataSizeInBytes) = 0;
|
||||
|
||||
//! Sets an attribute as binary data
|
||||
virtual void setAttribute(const c8* attributeName, void* data, s32 dataSizeInBytes ) = 0;
|
||||
|
||||
//! Gets an attribute as binary data
|
||||
/** \param attributeName: Name of the attribute to get.
|
||||
\param outData Pointer to buffer where data shall be stored.
|
||||
\param maxSizeInBytes Maximum number of bytes to write into outData.
|
||||
*/
|
||||
virtual void getAttributeAsBinaryData(const c8* attributeName, void* outData, s32 maxSizeInBytes) const = 0;
|
||||
|
||||
//! Gets an attribute as binary data
|
||||
/** \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
\param outData Pointer to buffer where data shall be stored.
|
||||
\param maxSizeInBytes Maximum number of bytes to write into outData.
|
||||
*/
|
||||
virtual void getAttributeAsBinaryData(s32 index, void* outData, s32 maxSizeInBytes) const = 0;
|
||||
|
||||
//! Sets an attribute as binary data
|
||||
virtual void setAttribute(s32 index, void* data, s32 dataSizeInBytes ) = 0;
|
||||
|
||||
|
||||
/*
|
||||
Array Attribute
|
||||
*/
|
||||
|
||||
//! Adds an attribute as wide string array
|
||||
virtual void addArray(const c8* attributeName, const core::array<core::stringw>& value) = 0;
|
||||
|
||||
//! Sets an attribute value as a wide string array.
|
||||
//! \param attributeName: Name for the attribute
|
||||
//! \param value: Value for the attribute. Set this to 0 to delete the attribute
|
||||
virtual void setAttribute(const c8* attributeName, const core::array<core::stringw>& value) = 0;
|
||||
|
||||
//! Gets an attribute as an array of wide strings.
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
//! or defaultNotFound if attribute is not set.
|
||||
virtual core::array<core::stringw> getAttributeAsArray(const c8* attributeName, const core::array<core::stringw>& defaultNotFound = core::array<core::stringw>()) const = 0;
|
||||
|
||||
//! Returns attribute value as an array of wide strings by index.
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::array<core::stringw> getAttributeAsArray(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as an array of wide strings
|
||||
virtual void setAttribute(s32 index, const core::array<core::stringw>& value) = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Bool Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as bool
|
||||
@ -273,476 +149,9 @@ public:
|
||||
//! Sets an attribute as boolean value
|
||||
virtual void setAttribute(s32 index, bool value) = 0;
|
||||
|
||||
/*
|
||||
|
||||
Enumeration Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as enum
|
||||
virtual void addEnum(const c8* attributeName, const c8* enumValue, const c8* const* enumerationLiterals) = 0;
|
||||
|
||||
//! Adds an attribute as enum
|
||||
virtual void addEnum(const c8* attributeName, s32 enumValue, const c8* const* enumerationLiterals) = 0;
|
||||
|
||||
//! Sets an attribute as enumeration
|
||||
virtual void setAttribute(const c8* attributeName, const c8* enumValue, const c8* const* enumerationLiterals) = 0;
|
||||
|
||||
//! Gets an attribute as enumeration
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual const c8* getAttributeAsEnumeration(const c8* attributeName, const c8* defaultNotFound = 0) const = 0;
|
||||
|
||||
//! Gets an attribute as enumeration
|
||||
/** \param attributeName: Name of the attribute to get.
|
||||
\param enumerationLiteralsToUse: Use these enumeration literals to get
|
||||
the index value instead of the set ones. This is useful when the
|
||||
attribute list maybe was read from an xml file, and only contains the
|
||||
enumeration string, but no information about its index.
|
||||
\return Returns value of the attribute previously set by setAttribute()
|
||||
*/
|
||||
virtual s32 getAttributeAsEnumeration(const c8* attributeName, const c8* const* enumerationLiteralsToUse, s32 defaultNotFound = -1) const = 0;
|
||||
|
||||
//! Gets an attribute as enumeration
|
||||
/** \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
\param enumerationLiteralsToUse: Use these enumeration literals to get
|
||||
the index value instead of the set ones. This is useful when the
|
||||
attribute list maybe was read from an xml file, and only contains the
|
||||
enumeration string, but no information about its index.
|
||||
\param defaultNotFound Value returned when the attribute referenced by the index was not found.
|
||||
\return Returns value of the attribute previously set by setAttribute()
|
||||
*/
|
||||
virtual s32 getAttributeAsEnumeration(s32 index, const c8* const* enumerationLiteralsToUse, s32 defaultNotFound = -1) const = 0;
|
||||
|
||||
//! Gets an attribute as enumeration
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual const c8* getAttributeAsEnumeration(s32 index) const = 0;
|
||||
|
||||
//! Gets the list of enumeration literals of an enumeration attribute
|
||||
//! \param attributeName Name of the attribute to get.
|
||||
//! \param outLiterals Set of strings to choose the enum name from.
|
||||
virtual void getAttributeEnumerationLiteralsOfEnumeration(const c8* attributeName, core::array<core::stringc>& outLiterals) const = 0;
|
||||
|
||||
//! Gets the list of enumeration literals of an enumeration attribute
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
//! \param outLiterals Set of strings to choose the enum name from.
|
||||
virtual void getAttributeEnumerationLiteralsOfEnumeration(s32 index, core::array<core::stringc>& outLiterals) const = 0;
|
||||
|
||||
//! Sets an attribute as enumeration
|
||||
virtual void setAttribute(s32 index, const c8* enumValue, const c8* const* enumerationLiterals) = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
SColor Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as color
|
||||
virtual void addColor(const c8* attributeName, video::SColor value) = 0;
|
||||
|
||||
|
||||
//! Sets a attribute as color
|
||||
virtual void setAttribute(const c8* attributeName, video::SColor color) = 0;
|
||||
|
||||
//! Gets an attribute as color
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual video::SColor getAttributeAsColor(const c8* attributeName, const video::SColor& defaultNotFound = video::SColor(0)) const = 0;
|
||||
|
||||
//! Gets an attribute as color
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual video::SColor getAttributeAsColor(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as color
|
||||
virtual void setAttribute(s32 index, video::SColor color) = 0;
|
||||
|
||||
/*
|
||||
|
||||
SColorf Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as floating point color
|
||||
virtual void addColorf(const c8* attributeName, video::SColorf value) = 0;
|
||||
|
||||
//! Sets a attribute as floating point color
|
||||
virtual void setAttribute(const c8* attributeName, video::SColorf color) = 0;
|
||||
|
||||
//! Gets an attribute as floating point color
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual video::SColorf getAttributeAsColorf(const c8* attributeName, const video::SColorf& defaultNotFound = video::SColorf(0)) const = 0;
|
||||
|
||||
//! Gets an attribute as floating point color
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual video::SColorf getAttributeAsColorf(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as floating point color
|
||||
virtual void setAttribute(s32 index, video::SColorf color) = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Vector3d Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as 3d vector
|
||||
virtual void addVector3d(const c8* attributeName, const core::vector3df& value) = 0;
|
||||
|
||||
//! Sets a attribute as 3d vector
|
||||
virtual void setAttribute(const c8* attributeName, const core::vector3df& v) = 0;
|
||||
|
||||
//! Gets an attribute as 3d vector
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::vector3df getAttributeAsVector3d(const c8* attributeName, const core::vector3df& defaultNotFound=core::vector3df(0,0,0)) const = 0;
|
||||
|
||||
//! Gets an attribute as 3d vector
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::vector3df getAttributeAsVector3d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as vector
|
||||
virtual void setAttribute(s32 index, const core::vector3df& v) = 0;
|
||||
|
||||
/*
|
||||
|
||||
Vector2d Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as 2d vector
|
||||
virtual void addVector2d(const c8* attributeName, const core::vector2df& value) = 0;
|
||||
|
||||
//! Sets a attribute as 2d vector
|
||||
virtual void setAttribute(const c8* attributeName, const core::vector2df& v) = 0;
|
||||
|
||||
//! Gets an attribute as vector
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::vector2df getAttributeAsVector2d(const c8* attributeName, const core::vector2df& defaultNotFound=core::vector2df(0,0)) const = 0;
|
||||
|
||||
//! Gets an attribute as position
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::vector2df getAttributeAsVector2d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as 2d vector
|
||||
virtual void setAttribute(s32 index, const core::vector2df& v) = 0;
|
||||
|
||||
/*
|
||||
|
||||
Position2d Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as 2d position
|
||||
virtual void addPosition2d(const c8* attributeName, const core::position2di& value) = 0;
|
||||
|
||||
//! Sets a attribute as 2d position
|
||||
virtual void setAttribute(const c8* attributeName, const core::position2di& v) = 0;
|
||||
|
||||
//! Gets an attribute as position
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::position2di getAttributeAsPosition2d(const c8* attributeName, const core::position2di& defaultNotFound=core::position2di(0,0)) const = 0;
|
||||
|
||||
//! Gets an attribute as position
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::position2di getAttributeAsPosition2d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as 2d position
|
||||
virtual void setAttribute(s32 index, const core::position2di& v) = 0;
|
||||
|
||||
/*
|
||||
|
||||
Rectangle Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as rectangle
|
||||
virtual void addRect(const c8* attributeName, const core::rect<s32>& value) = 0;
|
||||
|
||||
//! Sets an attribute as rectangle
|
||||
virtual void setAttribute(const c8* attributeName, const core::rect<s32>& v) = 0;
|
||||
|
||||
//! Gets an attribute as rectangle
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::rect<s32> getAttributeAsRect(const c8* attributeName, const core::rect<s32>& defaultNotFound = core::rect<s32>()) const = 0;
|
||||
|
||||
//! Gets an attribute as rectangle
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::rect<s32> getAttributeAsRect(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as rectangle
|
||||
virtual void setAttribute(s32 index, const core::rect<s32>& v) = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Dimension2d Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as dimension2d
|
||||
virtual void addDimension2d(const c8* attributeName, const core::dimension2d<u32>& value) = 0;
|
||||
|
||||
//! Sets an attribute as dimension2d
|
||||
virtual void setAttribute(const c8* attributeName, const core::dimension2d<u32>& v) = 0;
|
||||
|
||||
//! Gets an attribute as dimension2d
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::dimension2d<u32> getAttributeAsDimension2d(const c8* attributeName, const core::dimension2d<u32>& defaultNotFound = core::dimension2d<u32>()) const = 0;
|
||||
|
||||
//! Gets an attribute as dimension2d
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::dimension2d<u32> getAttributeAsDimension2d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as dimension2d
|
||||
virtual void setAttribute(s32 index, const core::dimension2d<u32>& v) = 0;
|
||||
|
||||
|
||||
/*
|
||||
matrix attribute
|
||||
*/
|
||||
|
||||
//! Adds an attribute as matrix
|
||||
virtual void addMatrix(const c8* attributeName, const core::matrix4& v) = 0;
|
||||
|
||||
//! Sets an attribute as matrix
|
||||
virtual void setAttribute(const c8* attributeName, const core::matrix4& v) = 0;
|
||||
|
||||
//! Gets an attribute as a matrix4
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::matrix4 getAttributeAsMatrix(const c8* attributeName, const core::matrix4& defaultNotFound=core::matrix4()) const = 0;
|
||||
|
||||
//! Gets an attribute as matrix
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::matrix4 getAttributeAsMatrix(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as matrix
|
||||
virtual void setAttribute(s32 index, const core::matrix4& v) = 0;
|
||||
|
||||
/*
|
||||
quaternion attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as quaternion
|
||||
virtual void addQuaternion(const c8* attributeName, const core::quaternion& v) = 0;
|
||||
|
||||
//! Sets an attribute as quaternion
|
||||
virtual void setAttribute(const c8* attributeName, const core::quaternion& v) = 0;
|
||||
|
||||
//! Gets an attribute as a quaternion
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::quaternion getAttributeAsQuaternion(const c8* attributeName, const core::quaternion& defaultNotFound=core::quaternion(0,1,0, 0)) const = 0;
|
||||
|
||||
//! Gets an attribute as quaternion
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::quaternion getAttributeAsQuaternion(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as quaternion
|
||||
virtual void setAttribute(s32 index, const core::quaternion& v) = 0;
|
||||
|
||||
/*
|
||||
|
||||
3d bounding box
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as axis aligned bounding box
|
||||
virtual void addBox3d(const c8* attributeName, const core::aabbox3df& v) = 0;
|
||||
|
||||
//! Sets an attribute as axis aligned bounding box
|
||||
virtual void setAttribute(const c8* attributeName, const core::aabbox3df& v) = 0;
|
||||
|
||||
//! Gets an attribute as a axis aligned bounding box
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::aabbox3df getAttributeAsBox3d(const c8* attributeName, const core::aabbox3df& defaultNotFound=core::aabbox3df(0,0,0, 0,0,0)) const = 0;
|
||||
|
||||
//! Gets an attribute as axis aligned bounding box
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::aabbox3df getAttributeAsBox3d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as axis aligned bounding box
|
||||
virtual void setAttribute(s32 index, const core::aabbox3df& v) = 0;
|
||||
|
||||
/*
|
||||
|
||||
plane
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as 3d plane
|
||||
virtual void addPlane3d(const c8* attributeName, const core::plane3df& v) = 0;
|
||||
|
||||
//! Sets an attribute as 3d plane
|
||||
virtual void setAttribute(const c8* attributeName, const core::plane3df& v) = 0;
|
||||
|
||||
//! Gets an attribute as a 3d plane
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::plane3df getAttributeAsPlane3d(const c8* attributeName, const core::plane3df& defaultNotFound=core::plane3df(0,0,0, 0,1,0)) const = 0;
|
||||
|
||||
//! Gets an attribute as 3d plane
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::plane3df getAttributeAsPlane3d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as 3d plane
|
||||
virtual void setAttribute(s32 index, const core::plane3df& v) = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
3d triangle
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as 3d triangle
|
||||
virtual void addTriangle3d(const c8* attributeName, const core::triangle3df& v) = 0;
|
||||
|
||||
//! Sets an attribute as 3d trianle
|
||||
virtual void setAttribute(const c8* attributeName, const core::triangle3df& v) = 0;
|
||||
|
||||
//! Gets an attribute as a 3d triangle
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::triangle3df getAttributeAsTriangle3d(const c8* attributeName, const core::triangle3df& defaultNotFound = core::triangle3df(core::vector3df(0,0,0), core::vector3df(0,0,0), core::vector3df(0,0,0))) const = 0;
|
||||
|
||||
//! Gets an attribute as 3d triangle
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::triangle3df getAttributeAsTriangle3d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as 3d triangle
|
||||
virtual void setAttribute(s32 index, const core::triangle3df& v) = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
line 2d
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as a 2d line
|
||||
virtual void addLine2d(const c8* attributeName, const core::line2df& v) = 0;
|
||||
|
||||
//! Sets an attribute as a 2d line
|
||||
virtual void setAttribute(const c8* attributeName, const core::line2df& v) = 0;
|
||||
|
||||
//! Gets an attribute as a 2d line
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::line2df getAttributeAsLine2d(const c8* attributeName, const core::line2df& defaultNotFound = core::line2df(0,0, 0,0)) const = 0;
|
||||
|
||||
//! Gets an attribute as a 2d line
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::line2df getAttributeAsLine2d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as a 2d line
|
||||
virtual void setAttribute(s32 index, const core::line2df& v) = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
line 3d
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as a 3d line
|
||||
virtual void addLine3d(const c8* attributeName, const core::line3df& v) = 0;
|
||||
|
||||
//! Sets an attribute as a 3d line
|
||||
virtual void setAttribute(const c8* attributeName, const core::line3df& v) = 0;
|
||||
|
||||
//! Gets an attribute as a 3d line
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
//! \return Returns value of the attribute previously set by setAttribute()
|
||||
virtual core::line3df getAttributeAsLine3d(const c8* attributeName, const core::line3df& defaultNotFound=core::line3df(0,0,0, 0,0,0)) const = 0;
|
||||
|
||||
//! Gets an attribute as a 3d line
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual core::line3df getAttributeAsLine3d(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as a 3d line
|
||||
virtual void setAttribute(s32 index, const core::line3df& v) = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Texture Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as texture reference
|
||||
virtual void addTexture(const c8* attributeName, video::ITexture* texture, const io::path& filename = "") = 0;
|
||||
|
||||
//! Sets an attribute as texture reference
|
||||
virtual void setAttribute(const c8* attributeName, video::ITexture* texture, const io::path& filename = "") = 0;
|
||||
|
||||
//! Gets an attribute as texture reference
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
virtual video::ITexture* getAttributeAsTexture(const c8* attributeName, video::ITexture* defaultNotFound=0) const = 0;
|
||||
|
||||
//! Gets an attribute as texture reference
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual video::ITexture* getAttributeAsTexture(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as texture reference
|
||||
virtual void setAttribute(s32 index, video::ITexture* texture, const io::path& filename = "") = 0;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
User Pointer Attribute
|
||||
|
||||
*/
|
||||
|
||||
//! Adds an attribute as user pointer
|
||||
virtual void addUserPointer(const c8* attributeName, void* userPointer) = 0;
|
||||
|
||||
//! Sets an attribute as user pointer
|
||||
virtual void setAttribute(const c8* attributeName, void* userPointer) = 0;
|
||||
|
||||
//! Gets an attribute as user pointer
|
||||
//! \param attributeName: Name of the attribute to get.
|
||||
//! \param defaultNotFound Value returned when attributeName was not found
|
||||
virtual void* getAttributeAsUserPointer(const c8* attributeName, void* defaultNotFound = 0) const = 0;
|
||||
|
||||
//! Gets an attribute as user pointer
|
||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||
virtual void* getAttributeAsUserPointer(s32 index) const = 0;
|
||||
|
||||
//! Sets an attribute as user pointer
|
||||
virtual void setAttribute(s32 index, void* userPointer) = 0;
|
||||
|
||||
};
|
||||
|
||||
} // end namespace io
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
@ -12,6 +12,7 @@ namespace irr
|
||||
namespace scene
|
||||
{
|
||||
class ICameraSceneNode;
|
||||
class IMeshBuffer;
|
||||
|
||||
//! A billboard scene node.
|
||||
/** A billboard is like a 3d sprite: A 2d element,
|
||||
@ -74,6 +75,17 @@ public:
|
||||
That is why the usual getBoundingBox will return a "safe" boundingbox which is guaranteed
|
||||
to contain the billboard. While this function can return the real one. */
|
||||
virtual const core::aabbox3d<f32>& getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode* camera) = 0;
|
||||
|
||||
//! Get the amount of mesh buffers.
|
||||
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
|
||||
virtual u32 getMeshBufferCount() const = 0;
|
||||
|
||||
//! Get pointer to a mesh buffer.
|
||||
/** NOTE: Positions and normals of this meshbuffers are re-calculated before rendering.
|
||||
So this is mainly useful to access/modify the uv-coordinates.
|
||||
\param nr: Zero based index of the mesh buffer.
|
||||
\return Pointer to the mesh buffer or 0 if there is no such mesh buffer. */
|
||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const = 0;
|
||||
};
|
||||
|
||||
} // end namespace scene
|
||||
|
@ -74,17 +74,17 @@ namespace scene
|
||||
virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0;
|
||||
|
||||
//! Get the axis aligned bounding box of this node
|
||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_ = 0;
|
||||
const core::aabbox3d<f32>& getBoundingBox() const override = 0;
|
||||
|
||||
//! Returns the relative transformation of the scene node.
|
||||
//virtual core::matrix4 getRelativeTransformation() const = 0;
|
||||
|
||||
//! The animation method.
|
||||
virtual void OnAnimate(u32 timeMs) _IRR_OVERRIDE_ =0;
|
||||
void OnAnimate(u32 timeMs) override =0;
|
||||
|
||||
//! The render method.
|
||||
/** Does nothing as bones are not visible. */
|
||||
virtual void render() _IRR_OVERRIDE_ { }
|
||||
void render() override { }
|
||||
|
||||
//! How the relative transformation of the bone is used
|
||||
virtual void setSkinningSpace( E_BONE_SKINNING_SPACE space ) =0;
|
||||
|
@ -72,7 +72,7 @@ namespace scene
|
||||
ISceneManager::addCameraSceneNodeFPS, may want to get
|
||||
this input for changing their position, look at target or
|
||||
whatever. */
|
||||
virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_ =0;
|
||||
bool OnEvent(const SEvent& event) override =0;
|
||||
|
||||
//! Sets the look at target of the camera
|
||||
/** If the camera's target and rotation are bound ( @see
|
||||
@ -90,7 +90,7 @@ namespace scene
|
||||
bindTargetAndRotation() ) then calling this will also change
|
||||
the camera's target to match the rotation.
|
||||
\param rotation New rotation of the node in degrees. */
|
||||
virtual void setRotation(const core::vector3df& rotation) _IRR_OVERRIDE_ =0;
|
||||
void setRotation(const core::vector3df& rotation) override =0;
|
||||
|
||||
//! Gets the current look at target of the camera
|
||||
/** \return The current look at target of the camera, in world co-ordinates */
|
||||
@ -172,27 +172,6 @@ namespace scene
|
||||
/** @see bindTargetAndRotation() */
|
||||
virtual bool getTargetAndRotationBinding(void) const =0;
|
||||
|
||||
//! Writes attributes of the camera node
|
||||
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const _IRR_OVERRIDE_
|
||||
{
|
||||
ISceneNode::serializeAttributes(out, options);
|
||||
|
||||
if (!out)
|
||||
return;
|
||||
out->addBool("IsOrthogonal", IsOrthogonal);
|
||||
}
|
||||
|
||||
//! Reads attributes of the camera node
|
||||
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) _IRR_OVERRIDE_
|
||||
{
|
||||
ISceneNode::deserializeAttributes(in, options);
|
||||
if (!in)
|
||||
return;
|
||||
|
||||
if ( in->findAttribute("IsOrthogonal") )
|
||||
IsOrthogonal = in->getAttributeAsBool("IsOrthogonal");
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
void cloneMembers(const ICameraSceneNode* toCopyFrom)
|
||||
|
@ -160,6 +160,9 @@ namespace gui
|
||||
\param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/
|
||||
virtual void setReferenceRect(core::rect<s32>* rect=0) = 0;
|
||||
|
||||
//! Internally fixes the mouse position, and reports relative mouse movement compared to the old position
|
||||
/** Specific to SDL */
|
||||
virtual void setRelativeMode(bool relative) {};
|
||||
|
||||
//! Sets the active cursor icon
|
||||
/** Setting cursor icons is so far only supported on Win32 and Linux */
|
||||
|
@ -1,211 +0,0 @@
|
||||
// Copyright (C) 2008-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_DYNAMIC_MESH_BUFFER_H_INCLUDED__
|
||||
#define __I_DYNAMIC_MESH_BUFFER_H_INCLUDED__
|
||||
|
||||
#include "IMeshBuffer.h"
|
||||
#include "IVertexBuffer.h"
|
||||
#include "IIndexBuffer.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
/** a dynamic meshBuffer */
|
||||
class IDynamicMeshBuffer : public IMeshBuffer
|
||||
{
|
||||
public:
|
||||
virtual IVertexBuffer &getVertexBuffer() const =0;
|
||||
virtual IIndexBuffer &getIndexBuffer() const =0;
|
||||
|
||||
virtual void setVertexBuffer(IVertexBuffer *vertexBuffer) =0;
|
||||
virtual void setIndexBuffer(IIndexBuffer *indexBuffer) =0;
|
||||
|
||||
//! Get the material of this meshbuffer
|
||||
/** \return Material of this buffer. */
|
||||
virtual video::SMaterial& getMaterial() _IRR_OVERRIDE_ =0;
|
||||
|
||||
//! Get the material of this meshbuffer
|
||||
/** \return Material of this buffer. */
|
||||
virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_ =0;
|
||||
|
||||
//! Get the axis aligned bounding box of this meshbuffer.
|
||||
/** \return Axis aligned bounding box of this buffer. */
|
||||
virtual const core::aabbox3df& getBoundingBox() const _IRR_OVERRIDE_ =0;
|
||||
|
||||
//! Set axis aligned bounding box
|
||||
/** \param box User defined axis aligned bounding box to use
|
||||
for this buffer. */
|
||||
virtual void setBoundingBox(const core::aabbox3df& box) _IRR_OVERRIDE_ =0;
|
||||
|
||||
//! Recalculates the bounding box. Should be called if the mesh changed.
|
||||
virtual void recalculateBoundingBox() _IRR_OVERRIDE_ =0;
|
||||
|
||||
//! Append the vertices and indices to the current buffer
|
||||
/** Only works for compatible vertex types.
|
||||
\param vertices Pointer to a vertex array.
|
||||
\param numVertices Number of vertices in the array.
|
||||
\param indices Pointer to index array.
|
||||
\param numIndices Number of indices in array. */
|
||||
virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) _IRR_OVERRIDE_
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//! Append the meshbuffer to the current buffer
|
||||
/** Only works for compatible vertex types
|
||||
\param other Buffer to append to this one. */
|
||||
virtual void append(const IMeshBuffer* const other) _IRR_OVERRIDE_
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// ------------------- To be removed? ------------------- //
|
||||
|
||||
//! get the current hardware mapping hint
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer().getHardwareMappingHint();
|
||||
}
|
||||
|
||||
//! get the current hardware mapping hint
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getIndexBuffer().getHardwareMappingHint();
|
||||
}
|
||||
|
||||
//! set the hardware mapping hint, for driver
|
||||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) _IRR_OVERRIDE_
|
||||
{
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
|
||||
getVertexBuffer().setHardwareMappingHint(NewMappingHint);
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
|
||||
getIndexBuffer().setHardwareMappingHint(NewMappingHint);
|
||||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) _IRR_OVERRIDE_
|
||||
{
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
|
||||
getVertexBuffer().setDirty();
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
|
||||
getIndexBuffer().setDirty();
|
||||
}
|
||||
|
||||
virtual u32 getChangedID_Vertex() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer().getChangedID();
|
||||
}
|
||||
|
||||
virtual u32 getChangedID_Index() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getIndexBuffer().getChangedID();
|
||||
}
|
||||
|
||||
// ------------------- Old interface ------------------- //
|
||||
|
||||
//! Get type of vertex data which is stored in this meshbuffer.
|
||||
/** \return Vertex type of this buffer. */
|
||||
virtual video::E_VERTEX_TYPE getVertexType() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer().getType();
|
||||
}
|
||||
|
||||
//! Get access to vertex data. The data is an array of vertices.
|
||||
/** Which vertex type is used can be determined by getVertexType().
|
||||
\return Pointer to array of vertices. */
|
||||
virtual const void* getVertices() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer().getData();
|
||||
}
|
||||
|
||||
//! Get access to vertex data. The data is an array of vertices.
|
||||
/** Which vertex type is used can be determined by getVertexType().
|
||||
\return Pointer to array of vertices. */
|
||||
virtual void* getVertices() _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer().getData();
|
||||
}
|
||||
|
||||
//! Get amount of vertices in meshbuffer.
|
||||
/** \return Number of vertices in this buffer. */
|
||||
virtual u32 getVertexCount() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer().size();
|
||||
}
|
||||
|
||||
//! Get type of index data which is stored in this meshbuffer.
|
||||
/** \return Index type of this buffer. */
|
||||
virtual video::E_INDEX_TYPE getIndexType() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getIndexBuffer().getType();
|
||||
}
|
||||
|
||||
//! Get access to indices.
|
||||
/** \return Pointer to indices array. */
|
||||
virtual const u16* getIndices() const _IRR_OVERRIDE_
|
||||
{
|
||||
return (u16*)getIndexBuffer().getData();
|
||||
}
|
||||
|
||||
//! Get access to indices.
|
||||
/** \return Pointer to indices array. */
|
||||
virtual u16* getIndices() _IRR_OVERRIDE_
|
||||
{
|
||||
return (u16*)getIndexBuffer().getData();
|
||||
}
|
||||
|
||||
//! Get amount of indices in this meshbuffer.
|
||||
/** \return Number of indices in this buffer. */
|
||||
virtual u32 getIndexCount() const _IRR_OVERRIDE_
|
||||
{
|
||||
return getIndexBuffer().size();
|
||||
}
|
||||
|
||||
//! returns position of vertex i
|
||||
virtual const core::vector3df& getPosition(u32 i) const _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer()[i].Pos;
|
||||
}
|
||||
|
||||
//! returns position of vertex i
|
||||
virtual core::vector3df& getPosition(u32 i) _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer()[i].Pos;
|
||||
}
|
||||
|
||||
//! returns texture coords of vertex i
|
||||
virtual const core::vector2df& getTCoords(u32 i) const _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer()[i].TCoords;
|
||||
}
|
||||
|
||||
//! returns texture coords of vertex i
|
||||
virtual core::vector2df& getTCoords(u32 i) _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer()[i].TCoords;
|
||||
}
|
||||
|
||||
//! returns normal of vertex i
|
||||
virtual const core::vector3df& getNormal(u32 i) const _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer()[i].Normal;
|
||||
}
|
||||
|
||||
//! returns normal of vertex i
|
||||
virtual core::vector3df& getNormal(u32 i) _IRR_OVERRIDE_
|
||||
{
|
||||
return getVertexBuffer()[i].Normal;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -280,18 +280,6 @@ namespace irr
|
||||
//! A file open dialog has been closed without choosing a file
|
||||
EGET_FILE_CHOOSE_DIALOG_CANCELLED,
|
||||
|
||||
//! 'Yes' was clicked on a messagebox
|
||||
EGET_MESSAGEBOX_YES,
|
||||
|
||||
//! 'No' was clicked on a messagebox
|
||||
EGET_MESSAGEBOX_NO,
|
||||
|
||||
//! 'OK' was clicked on a messagebox
|
||||
EGET_MESSAGEBOX_OK,
|
||||
|
||||
//! 'Cancel' was clicked on a messagebox
|
||||
EGET_MESSAGEBOX_CANCEL,
|
||||
|
||||
//! In an editbox 'ENTER' was pressed
|
||||
EGET_EDITBOX_ENTER,
|
||||
|
||||
@ -304,36 +292,14 @@ namespace irr
|
||||
//! The tab was changed in an tab control
|
||||
EGET_TAB_CHANGED,
|
||||
|
||||
//! A menu item was selected in a (context) menu
|
||||
EGET_MENU_ITEM_SELECTED,
|
||||
|
||||
//! The selection in a combo box has been changed
|
||||
EGET_COMBO_BOX_CHANGED,
|
||||
|
||||
//! The value of a spin box has changed
|
||||
EGET_SPINBOX_CHANGED,
|
||||
|
||||
//! A table has changed
|
||||
EGET_TABLE_CHANGED,
|
||||
EGET_TABLE_HEADER_CHANGED,
|
||||
EGET_TABLE_SELECTED_AGAIN,
|
||||
|
||||
//! A tree view node lost selection. See IGUITreeView::getLastEventNode().
|
||||
EGET_TREEVIEW_NODE_DESELECT,
|
||||
|
||||
//! A tree view node was selected. See IGUITreeView::getLastEventNode().
|
||||
EGET_TREEVIEW_NODE_SELECT,
|
||||
|
||||
//! A tree view node was expanded. See IGUITreeView::getLastEventNode().
|
||||
EGET_TREEVIEW_NODE_EXPAND,
|
||||
|
||||
//! A tree view node was collapsed. See IGUITreeView::getLastEventNode().
|
||||
EGET_TREEVIEW_NODE_COLLAPSE,
|
||||
|
||||
//! deprecated - use EGET_TREEVIEW_NODE_COLLAPSE instead. This
|
||||
//! may be removed by Irrlicht 1.9
|
||||
EGET_TREEVIEW_NODE_COLLAPS = EGET_TREEVIEW_NODE_COLLAPSE,
|
||||
|
||||
//! No real event. Just for convenience to get number of events
|
||||
EGET_COUNT
|
||||
};
|
||||
@ -486,10 +452,10 @@ struct SEvent
|
||||
/** Unlike other events, joystick events represent the result of polling
|
||||
* each connected joystick once per run() of the device. Joystick events will
|
||||
* not be generated by default. If joystick support is available for the
|
||||
* active device, _IRR_COMPILE_WITH_JOYSTICK_EVENTS_ is defined, and
|
||||
* @ref irr::IrrlichtDevice::activateJoysticks() has been called, an event of
|
||||
* this type will be generated once per joystick per @ref IrrlichtDevice::run()
|
||||
* regardless of whether the state of the joystick has actually changed. */
|
||||
* active device, and @ref irr::IrrlichtDevice::activateJoysticks() has been
|
||||
* called, an event of this type will be generated once per joystick per
|
||||
* @ref IrrlichtDevice::run() regardless of whether the state of the joystick
|
||||
* has actually changed. */
|
||||
struct SJoystickEvent
|
||||
{
|
||||
enum
|
||||
|
@ -315,14 +315,6 @@ public:
|
||||
/** \param filename is the string identifying the file which should be tested for existence.
|
||||
\return True if file exists, and false if it does not exist or an error occurred. */
|
||||
virtual bool existFile(const path& filename) const =0;
|
||||
|
||||
//! Creates a new empty collection of attributes, usable for serialization and more.
|
||||
/** \param driver: Video driver to be used to load textures when specified as attribute values.
|
||||
Can be null to prevent automatic texture loading by attributes.
|
||||
\return Pointer to the created object.
|
||||
If you no longer need the object, you should call IAttributes::drop().
|
||||
See IReferenceCounted::drop() for more information. */
|
||||
virtual IAttributes* createEmptyAttributes(video::IVideoDriver* driver=0) =0;
|
||||
};
|
||||
|
||||
|
||||
|
@ -1,37 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_COLOR_SELECT_DIALOG_H_INCLUDED__
|
||||
#define __I_GUI_COLOR_SELECT_DIALOG_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
//! Standard color chooser dialog.
|
||||
class IGUIColorSelectDialog : public IGUIElement
|
||||
{
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
IGUIColorSelectDialog(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
|
||||
: IGUIElement(EGUIET_COLOR_SELECT_DIALOG, environment, parent, id, rectangle) {}
|
||||
|
||||
//! get chosen color as usual SColor struct
|
||||
virtual video::SColor getColor() =0;
|
||||
|
||||
//! get chosen color as HSL values
|
||||
virtual video::SColorHSL getColorHSL() =0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -54,9 +54,9 @@ namespace gui
|
||||
|
||||
//! Sets text justification of the text area
|
||||
/** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
|
||||
EGUIA_LOWEERRIGHT for right justified, or EGUIA_CENTER for centered text.
|
||||
EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text.
|
||||
\param vertical: EGUIA_UPPERLEFT to align with top edge,
|
||||
EGUIA_LOWEERRIGHT for bottom edge, or EGUIA_CENTER for centered text (default). */
|
||||
EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text (default). */
|
||||
virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0;
|
||||
|
||||
//! Set the maximal number of rows for the selection listbox
|
||||
|
@ -1,162 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_CONTEXT_MENU_H_INCLUDED__
|
||||
#define __I_GUI_CONTEXT_MENU_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
//! Close behavior.
|
||||
//! Default is ECMC_REMOVE
|
||||
enum ECONTEXT_MENU_CLOSE
|
||||
{
|
||||
//! do nothing - menu stays open
|
||||
ECMC_IGNORE = 0,
|
||||
|
||||
//! remove the gui element
|
||||
ECMC_REMOVE = 1,
|
||||
|
||||
//! call setVisible(false)
|
||||
ECMC_HIDE = 2
|
||||
|
||||
// note to implementers - this is planned as bitset, so continue with 4 if you need to add further flags.
|
||||
};
|
||||
|
||||
//! GUI Context menu interface.
|
||||
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
|
||||
\li EGET_ELEMENT_CLOSED
|
||||
\li EGET_MENU_ITEM_SELECTED
|
||||
*/
|
||||
class IGUIContextMenu : public IGUIElement
|
||||
{
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
IGUIContextMenu(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
|
||||
: IGUIElement(EGUIET_CONTEXT_MENU, environment, parent, id, rectangle) {}
|
||||
|
||||
//! set behavior when menus are closed
|
||||
virtual void setCloseHandling(ECONTEXT_MENU_CLOSE onClose) = 0;
|
||||
|
||||
//! get current behavior when the menu will be closed
|
||||
virtual ECONTEXT_MENU_CLOSE getCloseHandling() const = 0;
|
||||
|
||||
//! Get amount of menu items
|
||||
virtual u32 getItemCount() const = 0;
|
||||
|
||||
//! Adds a menu item.
|
||||
/** \param text: Text of menu item. Set this to 0 to create
|
||||
an separator instead of a real item, which is the same like
|
||||
calling addSeparator();
|
||||
\param commandId: Command id of menu item, a simple id you may
|
||||
set to whatever you want.
|
||||
\param enabled: Specifies if the menu item should be enabled.
|
||||
\param hasSubMenu: Set this to true if there should be a submenu
|
||||
at this item. You can access this submenu via getSubMenu().
|
||||
\param checked: Specifies if the menu item should be initially checked.
|
||||
\param autoChecking: Specifies if the item should be checked by clicking
|
||||
\return Returns the index of the new item */
|
||||
virtual u32 addItem(const wchar_t* text, s32 commandId=-1, bool enabled=true,
|
||||
bool hasSubMenu=false, bool checked=false, bool autoChecking=false) = 0;
|
||||
|
||||
//! Insert a menu item at specified position.
|
||||
/** \param idx: Position to insert the new element,
|
||||
should be smaller than itemcount otherwise the item is added to the end.
|
||||
\param text: Text of menu item. Set this to 0 to create
|
||||
an separator instead of a real item, which is the same like
|
||||
calling addSeparator();
|
||||
\param commandId: Command id of menu item, a simple id you may
|
||||
set to whatever you want.
|
||||
\param enabled: Specifies if the menu item should be enabled.
|
||||
\param hasSubMenu: Set this to true if there should be a submenu
|
||||
at this item. You can access this submenu via getSubMenu().
|
||||
\param checked: Specifies if the menu item should be initially checked.
|
||||
\param autoChecking: Specifies if the item should be checked by clicking
|
||||
\return Returns the index of the new item */
|
||||
virtual u32 insertItem(u32 idx, const wchar_t* text, s32 commandId=-1, bool enabled=true,
|
||||
bool hasSubMenu=false, bool checked=false, bool autoChecking=false) = 0;
|
||||
|
||||
//! Find an item by its CommandID
|
||||
/**
|
||||
\param commandId: We are looking for the first item which has this commandID
|
||||
\param idxStartSearch: Start searching from this index.
|
||||
\return Returns the index of the item when found or otherwise -1. */
|
||||
virtual s32 findItemWithCommandId(s32 commandId, u32 idxStartSearch=0) const = 0;
|
||||
|
||||
//! Adds a separator item to the menu
|
||||
virtual void addSeparator() = 0;
|
||||
|
||||
//! Get text of the menu item.
|
||||
/** \param idx: Zero based index of the menu item */
|
||||
virtual const wchar_t* getItemText(u32 idx) const = 0;
|
||||
|
||||
//! Sets text of the menu item.
|
||||
/** \param idx: Zero based index of the menu item
|
||||
\param text: New text of the item. */
|
||||
virtual void setItemText(u32 idx, const wchar_t* text) = 0;
|
||||
|
||||
//! Check if a menu item is enabled
|
||||
/** \param idx: Zero based index of the menu item */
|
||||
virtual bool isItemEnabled(u32 idx) const = 0;
|
||||
|
||||
//! Sets if the menu item should be enabled.
|
||||
/** \param idx: Zero based index of the menu item
|
||||
\param enabled: True if it is enabled, otherwise false. */
|
||||
virtual void setItemEnabled(u32 idx, bool enabled) = 0;
|
||||
|
||||
//! Sets if the menu item should be checked.
|
||||
/** \param idx: Zero based index of the menu item
|
||||
\param enabled: True if it is enabled, otherwise false. */
|
||||
virtual void setItemChecked(u32 idx, bool enabled) = 0;
|
||||
|
||||
//! Check if a menu item is checked
|
||||
/** \param idx: Zero based index of the menu item */
|
||||
virtual bool isItemChecked(u32 idx) const = 0;
|
||||
|
||||
//! Removes a menu item
|
||||
/** \param idx: Zero based index of the menu item */
|
||||
virtual void removeItem(u32 idx) = 0;
|
||||
|
||||
//! Removes all menu items
|
||||
virtual void removeAllItems() = 0;
|
||||
|
||||
//! Get the selected item in the menu
|
||||
/** \return Index of the selected item, -1 if none selected. */
|
||||
virtual s32 getSelectedItem() const = 0;
|
||||
|
||||
//! Get the command id of a menu item
|
||||
/** \param idx: Zero based index of the menu item */
|
||||
virtual s32 getItemCommandId(u32 idx) const = 0;
|
||||
|
||||
//! Sets the command id of a menu item
|
||||
/** \param idx: Zero based index of the menu item
|
||||
\param id: Command id of menu item, a simple id you may
|
||||
set to whatever you want. */
|
||||
virtual void setItemCommandId(u32 idx, s32 id) = 0;
|
||||
|
||||
//! Get a pointer to the submenu of an item.
|
||||
/** 0 is returned if there is no submenu
|
||||
\param idx: Zero based index of the menu item
|
||||
\return Returns a pointer to the submenu of an item. */
|
||||
virtual IGUIContextMenu* getSubMenu(u32 idx) const = 0;
|
||||
|
||||
//! should the element change the checked status on clicking
|
||||
virtual void setItemAutoChecking(u32 idx, bool autoChecking) = 0;
|
||||
|
||||
//! does the element change the checked status on clicking
|
||||
virtual bool getItemAutoChecking(u32 idx) const = 0;
|
||||
|
||||
//! When an eventparent is set it receives events instead of the usual parent element
|
||||
virtual void setEventParent(IGUIElement *parent) = 0;
|
||||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -5,8 +5,7 @@
|
||||
#ifndef __I_GUI_ELEMENT_H_INCLUDED__
|
||||
#define __I_GUI_ELEMENT_H_INCLUDED__
|
||||
|
||||
#include "IAttributeExchangingObject.h"
|
||||
#include "irrList.h"
|
||||
#include "IReferenceCounted.h"
|
||||
#include "rect.h"
|
||||
#include "irrString.h"
|
||||
#include "IEventReceiver.h"
|
||||
@ -14,13 +13,17 @@
|
||||
#include "EGUIAlignment.h"
|
||||
#include "IAttributes.h"
|
||||
#include "IGUIEnvironment.h"
|
||||
#include <cassert>
|
||||
#include <algorithm>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
//! Base class of all GUI elements.
|
||||
class IGUIElement : public virtual io::IAttributeExchangingObject, public IEventReceiver
|
||||
class IGUIElement : virtual public IReferenceCounted, public IEventReceiver
|
||||
{
|
||||
public:
|
||||
|
||||
@ -50,12 +53,9 @@ public:
|
||||
//! Destructor
|
||||
virtual ~IGUIElement()
|
||||
{
|
||||
// delete all children
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
{
|
||||
(*it)->Parent = 0;
|
||||
(*it)->drop();
|
||||
for (auto child : Children) {
|
||||
child->Parent = nullptr;
|
||||
child->drop();
|
||||
}
|
||||
}
|
||||
|
||||
@ -210,25 +210,25 @@ public:
|
||||
}
|
||||
|
||||
//! How left element border is aligned when parent is resized
|
||||
EGUI_ALIGNMENT getAlignLeft() const
|
||||
EGUI_ALIGNMENT getAlignLeft() const
|
||||
{
|
||||
return AlignLeft;
|
||||
}
|
||||
|
||||
//! How right element border is aligned when parent is resized
|
||||
EGUI_ALIGNMENT getAlignRight() const
|
||||
EGUI_ALIGNMENT getAlignRight() const
|
||||
{
|
||||
return AlignRight;
|
||||
}
|
||||
|
||||
//! How top element border is aligned when parent is resized
|
||||
EGUI_ALIGNMENT getAlignTop() const
|
||||
EGUI_ALIGNMENT getAlignTop() const
|
||||
{
|
||||
return AlignTop;
|
||||
}
|
||||
|
||||
//! How bottom element border is aligned when parent is resized
|
||||
EGUI_ALIGNMENT getAlignBottom() const
|
||||
EGUI_ALIGNMENT getAlignBottom() const
|
||||
{
|
||||
return AlignBottom;
|
||||
}
|
||||
@ -239,10 +239,9 @@ public:
|
||||
recalculateAbsolutePosition(false);
|
||||
|
||||
// update all children
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
for (auto child : Children)
|
||||
{
|
||||
(*it)->updateAbsolutePosition();
|
||||
child->updateAbsolutePosition();
|
||||
}
|
||||
}
|
||||
|
||||
@ -263,20 +262,19 @@ public:
|
||||
{
|
||||
IGUIElement* target = 0;
|
||||
|
||||
// we have to search from back to front, because later children
|
||||
// might be drawn over the top of earlier ones.
|
||||
|
||||
core::list<IGUIElement*>::ConstIterator it = Children.getLast();
|
||||
|
||||
if (isVisible())
|
||||
{
|
||||
while(it != Children.end())
|
||||
// we have to search from back to front, because later children
|
||||
// might be drawn over the top of earlier ones.
|
||||
auto it = Children.rbegin();
|
||||
auto ie = Children.rend();
|
||||
while (it != ie)
|
||||
{
|
||||
target = (*it)->getElementFromPoint(point);
|
||||
if (target)
|
||||
return target;
|
||||
|
||||
--it;
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
@ -308,17 +306,19 @@ public:
|
||||
//! Removes a child.
|
||||
virtual void removeChild(IGUIElement* child)
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
if ((*it) == child)
|
||||
{
|
||||
(*it)->Parent = 0;
|
||||
(*it)->drop();
|
||||
Children.erase(it);
|
||||
return;
|
||||
}
|
||||
assert(child->Parent == this);
|
||||
Children.erase(child->ParentPos);
|
||||
child->Parent = nullptr;
|
||||
child->drop();
|
||||
}
|
||||
|
||||
//! Removes all children.
|
||||
virtual void removeAllChildren() {
|
||||
while (!Children.empty()) {
|
||||
auto child = Children.back();
|
||||
child->remove();
|
||||
}
|
||||
}
|
||||
|
||||
//! Removes this element from its parent.
|
||||
virtual void remove()
|
||||
@ -333,9 +333,8 @@ public:
|
||||
{
|
||||
if ( isVisible() )
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->draw();
|
||||
for (auto child : Children)
|
||||
child->draw();
|
||||
}
|
||||
}
|
||||
|
||||
@ -345,9 +344,8 @@ public:
|
||||
{
|
||||
if ( isVisible() )
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->OnPostRender( timeMs );
|
||||
for (auto child : Children)
|
||||
child->OnPostRender( timeMs );
|
||||
}
|
||||
}
|
||||
|
||||
@ -435,7 +433,7 @@ public:
|
||||
if (el)
|
||||
{
|
||||
// find the highest element number
|
||||
el->getNextElement(-1, true, IsTabGroup, first, closest, true);
|
||||
el->getNextElement(-1, true, IsTabGroup, first, closest, true, true);
|
||||
if (first)
|
||||
{
|
||||
TabOrder = first->getTabOrder() + 1;
|
||||
@ -547,7 +545,7 @@ public:
|
||||
|
||||
|
||||
//! Called if an event happened.
|
||||
virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_
|
||||
bool OnEvent(const SEvent& event) override
|
||||
{
|
||||
return Parent ? Parent->OnEvent(event) : false;
|
||||
}
|
||||
@ -555,20 +553,15 @@ public:
|
||||
|
||||
//! Brings a child to front
|
||||
/** \return True if successful, false if not. */
|
||||
virtual bool bringToFront(IGUIElement* element)
|
||||
virtual bool bringToFront(IGUIElement* child)
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
{
|
||||
if (element == (*it))
|
||||
{
|
||||
Children.erase(it);
|
||||
Children.push_back(element);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
if (child->Parent != this)
|
||||
return false;
|
||||
if (std::next(child->ParentPos) == Children.end()) // already there
|
||||
return true;
|
||||
Children.erase(child->ParentPos);
|
||||
child->ParentPos = Children.insert(Children.end(), child);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -576,24 +569,17 @@ public:
|
||||
/** \return True if successful, false if not. */
|
||||
virtual bool sendToBack(IGUIElement* child)
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
if (child == (*it)) // already there
|
||||
if (child->Parent != this)
|
||||
return false;
|
||||
if (child->ParentPos == Children.begin()) // already there
|
||||
return true;
|
||||
for (; it != Children.end(); ++it)
|
||||
{
|
||||
if (child == (*it))
|
||||
{
|
||||
Children.erase(it);
|
||||
Children.push_front(child);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
Children.erase(child->ParentPos);
|
||||
child->ParentPos = Children.insert(Children.begin(), child);
|
||||
return true;
|
||||
}
|
||||
|
||||
//! Returns list with children of this element
|
||||
virtual const core::list<IGUIElement*>& getChildren() const
|
||||
virtual const std::list<IGUIElement*>& getChildren() const
|
||||
{
|
||||
return Children;
|
||||
}
|
||||
@ -610,14 +596,13 @@ public:
|
||||
{
|
||||
IGUIElement* e = 0;
|
||||
|
||||
core::list<IGUIElement*>::ConstIterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
for (auto child : Children)
|
||||
{
|
||||
if ((*it)->getID() == id)
|
||||
return (*it);
|
||||
if (child->getID() == id)
|
||||
return child;
|
||||
|
||||
if (searchchildren)
|
||||
e = (*it)->getElementFromId(id, true);
|
||||
e = child->getElementFromId(id, true);
|
||||
|
||||
if (e)
|
||||
return e;
|
||||
@ -663,7 +648,7 @@ public:
|
||||
if (wanted==-2)
|
||||
wanted = 1073741824; // maximum s32
|
||||
|
||||
core::list<IGUIElement*>::ConstIterator it = Children.begin();
|
||||
auto it = Children.begin();
|
||||
|
||||
s32 closestOrder, currentOrder;
|
||||
|
||||
@ -721,7 +706,7 @@ public:
|
||||
}
|
||||
}
|
||||
// search within children
|
||||
if ((*it)->getNextElement(startOrder, reverse, group, first, closest))
|
||||
if ((*it)->getNextElement(startOrder, reverse, group, first, closest, includeInvisible, includeDisabled))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -758,8 +743,7 @@ public:
|
||||
|
||||
|
||||
//! Returns the type name of the gui element.
|
||||
/** This is needed serializing elements. For serializing your own elements, override this function
|
||||
and return your own type name which is created by your IGUIElementFactory */
|
||||
/** This is needed serializing elements. */
|
||||
virtual const c8* getTypeName() const
|
||||
{
|
||||
return GUIElementTypeNames[Type];
|
||||
@ -796,62 +780,6 @@ public:
|
||||
}
|
||||
|
||||
|
||||
//! Writes attributes of the scene node.
|
||||
/** Implement this to expose the attributes of your scene node for
|
||||
scripting languages, editors, debuggers or xml serialization purposes. */
|
||||
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const _IRR_OVERRIDE_
|
||||
{
|
||||
out->addString("Name", Name.c_str());
|
||||
out->addInt("Id", ID );
|
||||
out->addString("Caption", getText());
|
||||
out->addString("ToolTip", getToolTipText().c_str());
|
||||
out->addRect("Rect", DesiredRect);
|
||||
out->addPosition2d("MinSize", core::position2di(MinSize.Width, MinSize.Height));
|
||||
out->addPosition2d("MaxSize", core::position2di(MaxSize.Width, MaxSize.Height));
|
||||
out->addEnum("LeftAlign", AlignLeft, GUIAlignmentNames);
|
||||
out->addEnum("RightAlign", AlignRight, GUIAlignmentNames);
|
||||
out->addEnum("TopAlign", AlignTop, GUIAlignmentNames);
|
||||
out->addEnum("BottomAlign", AlignBottom, GUIAlignmentNames);
|
||||
out->addBool("Visible", IsVisible);
|
||||
out->addBool("Enabled", IsEnabled);
|
||||
out->addBool("TabStop", IsTabStop);
|
||||
out->addBool("TabGroup", IsTabGroup);
|
||||
out->addInt("TabOrder", TabOrder);
|
||||
out->addBool("NoClip", NoClip);
|
||||
}
|
||||
|
||||
|
||||
//! Reads attributes of the scene node.
|
||||
/** Implement this to set the attributes of your scene node for
|
||||
scripting languages, editors, debuggers or xml deserialization purposes. */
|
||||
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) _IRR_OVERRIDE_
|
||||
{
|
||||
setName(in->getAttributeAsString("Name", Name));
|
||||
setID(in->getAttributeAsInt("Id", ID));
|
||||
setText(in->getAttributeAsStringW("Caption", Text).c_str());
|
||||
setToolTipText(in->getAttributeAsStringW("ToolTip").c_str());
|
||||
setVisible(in->getAttributeAsBool("Visible", IsVisible));
|
||||
setEnabled(in->getAttributeAsBool("Enabled", IsEnabled));
|
||||
IsTabStop = in->getAttributeAsBool("TabStop", IsTabStop);
|
||||
IsTabGroup = in->getAttributeAsBool("TabGroup", IsTabGroup);
|
||||
TabOrder = in->getAttributeAsInt("TabOrder", TabOrder);
|
||||
|
||||
core::position2di p = in->getAttributeAsPosition2d("MaxSize", core::position2di(MaxSize.Width, MaxSize.Height));
|
||||
setMaxSize(core::dimension2du(p.X,p.Y));
|
||||
|
||||
p = in->getAttributeAsPosition2d("MinSize", core::position2di(MinSize.Width, MinSize.Height));
|
||||
setMinSize(core::dimension2du(p.X,p.Y));
|
||||
|
||||
setAlignment((EGUI_ALIGNMENT) in->getAttributeAsEnumeration("LeftAlign", GUIAlignmentNames, AlignLeft),
|
||||
(EGUI_ALIGNMENT)in->getAttributeAsEnumeration("RightAlign", GUIAlignmentNames, AlignRight),
|
||||
(EGUI_ALIGNMENT)in->getAttributeAsEnumeration("TopAlign", GUIAlignmentNames, AlignTop),
|
||||
(EGUI_ALIGNMENT)in->getAttributeAsEnumeration("BottomAlign", GUIAlignmentNames, AlignBottom));
|
||||
|
||||
setRelativePosition(in->getAttributeAsRect("Rect", DesiredRect));
|
||||
|
||||
setNotClipped(in->getAttributeAsBool("NoClip", NoClip));
|
||||
}
|
||||
|
||||
protected:
|
||||
// not virtual because needed in constructor
|
||||
void addChildToEnd(IGUIElement* child)
|
||||
@ -862,10 +790,40 @@ protected:
|
||||
child->remove(); // remove from old parent
|
||||
child->LastParentRect = getAbsolutePosition();
|
||||
child->Parent = this;
|
||||
Children.push_back(child);
|
||||
child->ParentPos = Children.insert(Children.end(), child);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
template<typename Iterator>
|
||||
static size_t _fastSetChecksum(Iterator begin, Iterator end) {
|
||||
std::hash<typename Iterator::value_type> hasher;
|
||||
size_t checksum = 0;
|
||||
for (Iterator it = begin; it != end; ++it) {
|
||||
size_t h = hasher(*it);
|
||||
checksum ^= 966073049 + (h * 3432918353) + ((h >> 16) * 461845907);
|
||||
}
|
||||
return checksum;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Reorder children [from, to) to the order given by `neworder`
|
||||
void reorderChildren(
|
||||
std::list<IGUIElement*>::iterator from,
|
||||
std::list<IGUIElement*>::iterator to,
|
||||
const std::vector<IGUIElement*> &neworder)
|
||||
{
|
||||
assert(_fastSetChecksum(from, to) == _fastSetChecksum(neworder.begin(), neworder.end()));
|
||||
for (auto e : neworder)
|
||||
{
|
||||
*from = e;
|
||||
e->ParentPos = from;
|
||||
++from;
|
||||
}
|
||||
assert(from == to);
|
||||
}
|
||||
|
||||
|
||||
// not virtual because needed in constructor
|
||||
void recalculateAbsolutePosition(bool recursive)
|
||||
{
|
||||
@ -987,10 +945,9 @@ protected:
|
||||
if ( recursive )
|
||||
{
|
||||
// update all children
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
for (auto child : Children)
|
||||
{
|
||||
(*it)->recalculateAbsolutePosition(recursive);
|
||||
child->recalculateAbsolutePosition(recursive);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -998,11 +955,14 @@ protected:
|
||||
protected:
|
||||
|
||||
//! List of all children of this element
|
||||
core::list<IGUIElement*> Children;
|
||||
std::list<IGUIElement*> Children;
|
||||
|
||||
//! Pointer to the parent
|
||||
IGUIElement* Parent;
|
||||
|
||||
//! Our position in the parent list. Only valid when Parent != nullptr
|
||||
std::list<IGUIElement*>::iterator ParentPos;
|
||||
|
||||
//! relative rect of element
|
||||
core::rect<s32> RelativeRect;
|
||||
|
||||
|
@ -1,66 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
||||
#define __I_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
||||
|
||||
#include "IReferenceCounted.h"
|
||||
#include "EGUIElementTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
namespace gui
|
||||
{
|
||||
class IGUIElement;
|
||||
|
||||
//! Interface making it possible to dynamically create GUI elements
|
||||
/** To be able to add custom elements to Irrlicht and to make it possible for the
|
||||
scene manager to save and load them, simply implement this interface and register it
|
||||
in your gui environment via IGUIEnvironment::registerGUIElementFactory.
|
||||
Note: When implementing your own element factory, don't call IGUIEnvironment::grab() to
|
||||
increase the reference counter of the environment. This is not necessary because the
|
||||
it will grab() the factory anyway, and otherwise cyclic references will be created.
|
||||
*/
|
||||
class IGUIElementFactory : public virtual IReferenceCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! adds an element to the gui environment based on its type id
|
||||
/** \param type: Type of the element to add.
|
||||
\param parent: Parent scene node of the new element, can be null to add to the root.
|
||||
\return Pointer to the new element or null if not successful. */
|
||||
virtual IGUIElement* addGUIElement(EGUI_ELEMENT_TYPE type, IGUIElement* parent=0) = 0;
|
||||
|
||||
//! adds a GUI element to the GUI Environment based on its type name
|
||||
/** \param typeName: Type name of the element to add.
|
||||
\param parent: Parent scene node of the new element, can be null to add it to the root.
|
||||
\return Pointer to the new element or null if not successful. */
|
||||
virtual IGUIElement* addGUIElement(const c8* typeName, IGUIElement* parent=0) = 0;
|
||||
|
||||
//! Get amount of GUI element types this factory is able to create
|
||||
virtual s32 getCreatableGUIElementTypeCount() const = 0;
|
||||
|
||||
//! Get type of a creatable element type
|
||||
/** \param idx: Index of the element type in this factory. Must be a value between 0 and
|
||||
getCreatableGUIElementTypeCount() */
|
||||
virtual EGUI_ELEMENT_TYPE getCreateableGUIElementType(s32 idx) const = 0;
|
||||
|
||||
//! Get type name of a creatable GUI element type by index
|
||||
/** \param idx: Index of the type in this factory. Must be a value between 0 and
|
||||
getCreatableGUIElementTypeCount() */
|
||||
virtual const c8* getCreateableGUIElementTypeName(s32 idx) const = 0;
|
||||
|
||||
//! returns type name of a creatable GUI element
|
||||
/** \param type: Type of GUI element.
|
||||
\return Name of the type if this factory can create the type, otherwise 0. */
|
||||
virtual const c8* getCreateableGUIElementTypeName(EGUI_ELEMENT_TYPE type) const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif // __I_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
||||
|
@ -8,7 +8,6 @@
|
||||
#include "IReferenceCounted.h"
|
||||
#include "IGUISkin.h"
|
||||
#include "rect.h"
|
||||
#include "EMessageBoxFlags.h"
|
||||
#include "EFocusFlags.h"
|
||||
#include "IEventReceiver.h"
|
||||
#include "path.h"
|
||||
@ -38,27 +37,17 @@ class IGUIFont;
|
||||
class IGUISpriteBank;
|
||||
class IGUIScrollBar;
|
||||
class IGUIImage;
|
||||
class IGUIMeshViewer;
|
||||
class IGUICheckBox;
|
||||
class IGUIListBox;
|
||||
class IGUITreeView;
|
||||
class IGUIImageList;
|
||||
class IGUIFileOpenDialog;
|
||||
class IGUIColorSelectDialog;
|
||||
class IGUIInOutFader;
|
||||
class IGUIStaticText;
|
||||
class IGUIEditBox;
|
||||
class IGUISpinBox;
|
||||
class IGUITabControl;
|
||||
class IGUITab;
|
||||
class IGUITable;
|
||||
class IGUIContextMenu;
|
||||
class IGUIComboBox;
|
||||
class IGUIToolBar;
|
||||
class IGUIButton;
|
||||
class IGUIWindow;
|
||||
class IGUIProfiler;
|
||||
class IGUIElementFactory;
|
||||
|
||||
//! GUI Environment. Used as factory and manager of all other GUI elements.
|
||||
/** \par This element can create the following events of type EGUI_EVENT_TYPE (which are passed on to focused sub-elements):
|
||||
@ -235,55 +224,6 @@ public:
|
||||
virtual IGUIButton* addButton(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0, const wchar_t* tooltiptext = 0) = 0;
|
||||
|
||||
//! Adds an empty window element.
|
||||
/** \param rectangle Rectangle specifying the borders of the window.
|
||||
\param modal Defines if the dialog is modal. This means, that all other
|
||||
gui elements which were created before the window cannot be used until
|
||||
it is removed.
|
||||
\param text Text displayed as the window title.
|
||||
\param parent Parent gui element of the window.
|
||||
\param id Id with which the gui element can be identified.
|
||||
\return Pointer to the created window. Returns 0 if an error occurred.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for
|
||||
more information. */
|
||||
virtual IGUIWindow* addWindow(const core::rect<s32>& rectangle, bool modal = false,
|
||||
const wchar_t* text=0, IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a modal screen.
|
||||
/** Input focus stays with children of the modal screen.
|
||||
If you have some window x which should keep the input focus you
|
||||
do something like: addModalScreen()->addChild(x). And x will then get the focus
|
||||
and not lose it anymore.
|
||||
The modal screen removes itself when it no longer has any children.
|
||||
Note that it usually works badly to pass the modal screen already as parent when creating
|
||||
a new element. It's better to add that new element later to the modal screen with addChild.
|
||||
\param parent Parent gui element of the modal.
|
||||
\param blinkMode Bitset of when to blink (can be combined)
|
||||
0 = never
|
||||
1 = focus changes
|
||||
2 = Left mouse button pressed down
|
||||
\return Pointer to the created modal. Returns 0 if an error occurred.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for
|
||||
more information. */
|
||||
virtual IGUIElement* addModalScreen(IGUIElement* parent, int blinkMode = 3) = 0;
|
||||
|
||||
//! Adds a message box.
|
||||
/** \param caption Text to be displayed the title of the message box.
|
||||
\param text Text to be displayed in the body of the message box.
|
||||
\param modal Defines if the dialog is modal. This means, that all other
|
||||
gui elements which were created before the message box cannot be used
|
||||
until this messagebox is removed.
|
||||
\param flags Flags specifying the layout of the message box using ::EMESSAGE_BOX_FLAG.
|
||||
Create a message box with an OK and CANCEL button for example with (EMBF_OK | EMBF_CANCEL).
|
||||
\param parent Parent gui element of the message box.
|
||||
\param id Id with which the gui element can be identified.
|
||||
\param image Optional texture which will be displayed beside the text as an image
|
||||
\return Pointer to the created message box. Returns 0 if an error
|
||||
occurred. This pointer should not be dropped. See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IGUIWindow* addMessageBox(const wchar_t* caption, const wchar_t* text=0,
|
||||
bool modal = true, s32 flags = EMBF_OK, IGUIElement* parent=0, s32 id=-1, video::ITexture* image=0) = 0;
|
||||
|
||||
//! Adds a scrollbar.
|
||||
/** \param horizontal Specifies if the scroll bar is drawn horizontal
|
||||
or vertical.
|
||||
@ -348,31 +288,6 @@ public:
|
||||
virtual IGUIListBox* addListBox(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) = 0;
|
||||
|
||||
//! Adds a tree view element.
|
||||
/** \param rectangle Position and dimension of list box.
|
||||
\param parent Parent gui element of the list box.
|
||||
\param id Id to identify the gui element.
|
||||
\param drawBackground Flag whether the background should be drawn.
|
||||
\param scrollBarVertical Flag whether a vertical scrollbar should be used
|
||||
\param scrollBarHorizontal Flag whether a horizontal scrollbar should be used
|
||||
\return Pointer to the created list box. Returns 0 if an error occurred.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for
|
||||
more information. */
|
||||
virtual IGUITreeView* addTreeView(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1, bool drawBackground=false,
|
||||
bool scrollBarVertical = true, bool scrollBarHorizontal = false) = 0;
|
||||
|
||||
//! Adds a mesh viewer. Not 100% implemented yet.
|
||||
/** \param rectangle Rectangle specifying the borders of the mesh viewer.
|
||||
\param parent Parent gui element of the mesh viewer.
|
||||
\param id Id to identify the gui element.
|
||||
\param text Title text of the mesh viewer.
|
||||
\return Pointer to the created mesh viewer. Returns 0 if an error
|
||||
occurred. This pointer should not be dropped. See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IGUIMeshViewer* addMeshViewer(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0) = 0;
|
||||
|
||||
//! Adds a file open dialog.
|
||||
/** \param title Text to be displayed as the title of the dialog.
|
||||
\param modal Defines if the dialog is modal. This means, that all other
|
||||
@ -391,19 +306,6 @@ public:
|
||||
bool modal=true, IGUIElement* parent=0, s32 id=-1,
|
||||
bool restoreCWD=false, io::path::char_type* startDir=0) = 0;
|
||||
|
||||
//! Adds a color select dialog.
|
||||
/** \param title The title of the dialog.
|
||||
\param modal Defines if the dialog is modal. This means, that all other
|
||||
gui elements which were created before the dialog cannot be used
|
||||
until it is removed.
|
||||
\param parent The parent of the dialog.
|
||||
\param id The ID of the dialog.
|
||||
\return Pointer to the created file open dialog. Returns 0 if an error
|
||||
occurred. This pointer should not be dropped. See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IGUIColorSelectDialog* addColorSelectDialog(const wchar_t* title = 0,
|
||||
bool modal=true, IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a static text.
|
||||
/** \param text Text to be displayed. Can be altered after creation by SetText().
|
||||
\param rectangle Rectangle specifying the borders of the static text
|
||||
@ -438,30 +340,6 @@ public:
|
||||
virtual IGUIEditBox* addEditBox(const wchar_t* text, const core::rect<s32>& rectangle,
|
||||
bool border=true, IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a spin box.
|
||||
/** An edit box with up and down buttons
|
||||
\param text Text to be displayed. Can be altered after creation by setText().
|
||||
\param rectangle Rectangle specifying the borders of the spin box.
|
||||
\param border Set to true if the spin box should have a 3d border.
|
||||
\param parent Parent item of the element, e.g. a window.
|
||||
Set it to 0 to place the spin box directly in the environment.
|
||||
\param id The ID of the element.
|
||||
\return Pointer to the created spin box. Returns 0 if an error occurred.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for
|
||||
more information. */
|
||||
virtual IGUISpinBox* addSpinBox(const wchar_t* text, const core::rect<s32>& rectangle,
|
||||
bool border=true,IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds an element for fading in or out.
|
||||
/** \param rectangle Rectangle specifying the borders of the fader.
|
||||
If the pointer is NULL, the whole screen is used.
|
||||
\param parent Parent item of the element, e.g. a window.
|
||||
\param id An identifier for the fader.
|
||||
\return Pointer to the created in-out-fader. Returns 0 if an error
|
||||
occurred. This pointer should not be dropped. See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IGUIInOutFader* addInOutFader(const core::rect<s32>* rectangle=0, IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a tab control to the environment.
|
||||
/** \param rectangle Rectangle specifying the borders of the tab control.
|
||||
\param parent Parent item of the element, e.g. a window.
|
||||
@ -493,40 +371,6 @@ public:
|
||||
virtual IGUITab* addTab(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a context menu to the environment.
|
||||
/** \param rectangle Rectangle specifying the borders of the menu.
|
||||
Note that the menu is resizing itself based on what items you add.
|
||||
\param parent Parent item of the element, e.g. a window.
|
||||
Set it to 0 to place the menu directly in the environment.
|
||||
\param id An identifier for the menu.
|
||||
\return Pointer to the created context menu. Returns 0 if an
|
||||
error occurred. This pointer should not be dropped. See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IGUIContextMenu* addContextMenu(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a menu to the environment.
|
||||
/** This is like the menu you can find on top of most windows in modern
|
||||
graphical user interfaces.
|
||||
\param parent Parent item of the element, e.g. a window.
|
||||
Set it to 0 to place the menu directly in the environment.
|
||||
\param id An identifier for the menu.
|
||||
\return Pointer to the created menu. Returns 0 if an
|
||||
error occurred. This pointer should not be dropped. See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IGUIContextMenu* addMenu(IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a toolbar to the environment.
|
||||
/** It is like a menu that is always placed on top of its parent, and
|
||||
contains buttons.
|
||||
\param parent Parent item of the element, e.g. a window.
|
||||
Set it to 0 to place the tool bar directly in the environment.
|
||||
\param id An identifier for the tool bar.
|
||||
\return Pointer to the created tool bar. Returns 0 if an
|
||||
error occurred. This pointer should not be dropped. See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IGUIToolBar* addToolBar(IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a combo box to the environment.
|
||||
/** \param rectangle Rectangle specifying the borders of the combo box.
|
||||
\param parent Parent item of the element, e.g. a window.
|
||||
@ -538,92 +382,6 @@ public:
|
||||
virtual IGUIComboBox* addComboBox(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Adds a table to the environment
|
||||
/** \param rectangle Rectangle specifying the borders of the table.
|
||||
\param parent Parent item of the element, e.g. a window. Set it to 0
|
||||
to place the element directly in the environment.
|
||||
\param id An identifier for the table.
|
||||
\param drawBackground Flag whether the background should be drawn.
|
||||
\return Pointer to the created table. Returns 0 if an error occurred.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for
|
||||
more information. */
|
||||
virtual IGUITable* addTable(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) =0;
|
||||
|
||||
//! Adds an element to display the information from the Irrlicht profiler
|
||||
/** \param rectangle Rectangle specifying the borders of the element.
|
||||
\param parent Parent of the element. When 0 the environment itself will
|
||||
be the parent.
|
||||
\param id An identifier for the element. */
|
||||
virtual IGUIProfiler* addProfilerDisplay(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1) = 0;
|
||||
|
||||
//! Get the default element factory which can create all built-in elements
|
||||
/** \return Pointer to the factory.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for
|
||||
more information. */
|
||||
virtual IGUIElementFactory* getDefaultGUIElementFactory() const = 0;
|
||||
|
||||
//! Adds an element factory to the gui environment.
|
||||
/** Use this to extend the gui environment with new element types which
|
||||
it should be able to create automatically, for example when loading
|
||||
data from xml files.
|
||||
\param factoryToAdd Pointer to new factory. */
|
||||
virtual void registerGUIElementFactory(IGUIElementFactory* factoryToAdd) = 0;
|
||||
|
||||
//! Get amount of registered gui element factories.
|
||||
/** \return Amount of registered gui element factories. */
|
||||
virtual u32 getRegisteredGUIElementFactoryCount() const = 0;
|
||||
|
||||
//! Get a gui element factory by index
|
||||
/** \param index Index of the factory.
|
||||
\return Factory at given index, or 0 if no such factory exists. */
|
||||
virtual IGUIElementFactory* getGUIElementFactory(u32 index) const = 0;
|
||||
|
||||
//! Adds a GUI element by its name
|
||||
/** Each factory is checked if it can create an element of the given
|
||||
name. The first match will be created.
|
||||
\param elementName Name of the element to be created.
|
||||
\param parent Parent of the new element, if not 0.
|
||||
\return New GUI element, or 0 if no such element exists. */
|
||||
virtual IGUIElement* addGUIElement(const c8* elementName, IGUIElement* parent=0) = 0;
|
||||
|
||||
//! Saves the current gui into a file.
|
||||
/** \param filename Name of the file.
|
||||
\param start The GUIElement to start with. Root if 0.
|
||||
\return True if saving succeeded, else false. */
|
||||
virtual bool saveGUI(const io::path& filename, IGUIElement* start=0) = 0;
|
||||
|
||||
//! Saves the current gui into a file.
|
||||
/** \param file The file to write to.
|
||||
\param start The GUIElement to start with. Root if 0.
|
||||
\return True if saving succeeded, else false. */
|
||||
virtual bool saveGUI(io::IWriteFile* file, IGUIElement* start=0) = 0;
|
||||
|
||||
//! Loads the gui. Note that the current gui is not cleared before.
|
||||
/** When a parent is set the elements will be added below the parent, the parent itself does not deserialize.
|
||||
When the file contains skin-settings from the gui-environment those are always serialized into the
|
||||
guienvironment independent of the parent setting.
|
||||
\param filename Name of the file.
|
||||
\param parent Parent for the loaded GUI, root if 0.
|
||||
\return True if loading succeeded, else false. */
|
||||
virtual bool loadGUI(const io::path& filename, IGUIElement* parent=0) = 0;
|
||||
|
||||
//! Loads the gui. Note that the current gui is not cleared before.
|
||||
/** When a parent is set the elements will be added below the parent, the parent itself does not deserialize.
|
||||
When the file contains skin-settings from the gui-environment those are always serialized into the
|
||||
guienvironment independent of the parent setting.
|
||||
\param file The file to load from.
|
||||
\param parent Parent for the loaded GUI, root if 0.
|
||||
\return True if loading succeeded, else false. */
|
||||
virtual bool loadGUI(io::IReadFile* file, IGUIElement* parent=0) = 0;
|
||||
|
||||
//! Writes attributes of the gui environment
|
||||
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const =0;
|
||||
|
||||
//! Reads attributes of the gui environment
|
||||
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)=0;
|
||||
|
||||
//! Find the next element which would be selected when pressing the tab-key
|
||||
/** If you set the focus for the result you can manually force focus-changes like they
|
||||
would happen otherwise by the tab-keys.
|
||||
|
@ -19,7 +19,7 @@ class IGUIFontBitmap : public IGUIFont
|
||||
public:
|
||||
|
||||
//! Returns the type of this font
|
||||
virtual EGUI_FONT_TYPE getType() const _IRR_OVERRIDE_ { return EGFT_BITMAP; }
|
||||
EGUI_FONT_TYPE getType() const override { return EGFT_BITMAP; }
|
||||
|
||||
//! returns the parsed Symbol Information
|
||||
virtual IGUISpriteBank* getSpriteBank() const = 0;
|
||||
@ -36,7 +36,7 @@ public:
|
||||
kerning value. For example, EGFT_BITMAP will add the right kerning value of previousLetter to the
|
||||
left side kerning value of thisLetter, then add the global value.
|
||||
*/
|
||||
virtual s32 getKerningWidth(const wchar_t* thisLetter=0, const wchar_t* previousLetter=0) const _IRR_OVERRIDE_ = 0;
|
||||
s32 getKerningWidth(const wchar_t* thisLetter=0, const wchar_t* previousLetter=0) const override = 0;
|
||||
};
|
||||
|
||||
} // end namespace gui
|
||||
|
@ -1,67 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_IN_OUT_FADER_H_INCLUDED__
|
||||
#define __I_GUI_IN_OUT_FADER_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
#include "SColor.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
//! Element for fading out or in
|
||||
/** Here is a small example on how the class is used. In this example we fade
|
||||
in from a total red screen in the beginning. As you can see, the fader is not
|
||||
only useful for dramatic in and out fading, but also to show that the player
|
||||
is hit in a first person shooter game for example.
|
||||
\code
|
||||
gui::IGUIInOutFader* fader = device->getGUIEnvironment()->addInOutFader();
|
||||
fader->setColor(video::SColor(0,255,0,0));
|
||||
fader->fadeIn(4000);
|
||||
\endcode
|
||||
*/
|
||||
class IGUIInOutFader : public IGUIElement
|
||||
{
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
IGUIInOutFader(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
|
||||
: IGUIElement(EGUIET_IN_OUT_FADER, environment, parent, id, rectangle) {}
|
||||
|
||||
//! Gets the color to fade out to or to fade in from.
|
||||
virtual video::SColor getColor() const = 0;
|
||||
|
||||
//! Sets the color to fade out to or to fade in from.
|
||||
/** \param color: Color to where it is faded out od from it is faded in. */
|
||||
virtual void setColor(video::SColor color) = 0;
|
||||
virtual void setColor(video::SColor source, video::SColor dest) = 0;
|
||||
|
||||
//! Starts the fade in process.
|
||||
/** In the beginning the whole rect is drawn by the set color
|
||||
(black by default) and at the end of the overgiven time the
|
||||
color has faded out.
|
||||
\param time: Time specifying how long it should need to fade in,
|
||||
in milliseconds. */
|
||||
virtual void fadeIn(u32 time) = 0;
|
||||
|
||||
//! Starts the fade out process.
|
||||
/** In the beginning everything is visible, and at the end of
|
||||
the time only the set color (black by the fault) will be drawn.
|
||||
\param time: Time specifying how long it should need to fade out,
|
||||
in milliseconds. */
|
||||
virtual void fadeOut(u32 time) = 0;
|
||||
|
||||
//! Returns if the fade in or out process is done.
|
||||
virtual bool isReady() const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -1,53 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_MESH_VIEWER_H_INCLUDED__
|
||||
#define __I_GUI_MESH_VIEWER_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
namespace video
|
||||
{
|
||||
class SMaterial;
|
||||
} // end namespace video
|
||||
|
||||
namespace scene
|
||||
{
|
||||
class IAnimatedMesh;
|
||||
} // end namespace scene
|
||||
|
||||
namespace gui
|
||||
{
|
||||
|
||||
//! 3d mesh viewing GUI element.
|
||||
class IGUIMeshViewer : public IGUIElement
|
||||
{
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
IGUIMeshViewer(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
|
||||
: IGUIElement(EGUIET_MESH_VIEWER, environment, parent, id, rectangle) {}
|
||||
|
||||
//! Sets the mesh to be shown
|
||||
virtual void setMesh(scene::IAnimatedMesh* mesh) = 0;
|
||||
|
||||
//! Gets the displayed mesh
|
||||
virtual scene::IAnimatedMesh* getMesh() const = 0;
|
||||
|
||||
//! Sets the material
|
||||
virtual void setMaterial(const video::SMaterial& material) = 0;
|
||||
|
||||
//! Gets the material
|
||||
virtual const video::SMaterial& getMaterial() const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -1,82 +0,0 @@
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
// Written by Michael Zeilfelder
|
||||
|
||||
#ifndef I_GUI_PROFILER_H_INCLUDED__
|
||||
#define I_GUI_PROFILER_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
class IProfiler;
|
||||
|
||||
namespace gui
|
||||
{
|
||||
class IGUIFont;
|
||||
|
||||
//! Element to display profiler information
|
||||
class IGUIProfiler : public IGUIElement
|
||||
{
|
||||
public:
|
||||
//! constructor
|
||||
/** \param profiler You can pass a custom profiler, but typically you can pass 0 in which cases it takes the global profiler from Irrlicht */
|
||||
IGUIProfiler(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle, IProfiler* profiler = NULL)
|
||||
: IGUIElement(EGUIET_PROFILER, environment, parent, id, rectangle)
|
||||
{}
|
||||
|
||||
//! Show first page of profile data
|
||||
/** \param includeOverview When true show the group-overview page, when false show the profile data of the first group */
|
||||
virtual void firstPage(bool includeOverview=true) = 0;
|
||||
|
||||
//! Show next page of profile data
|
||||
/** \param includeOverview Include the group-overview page */
|
||||
virtual void nextPage(bool includeOverview=true) = 0;
|
||||
|
||||
//! Show previous page of profile data
|
||||
/** \param includeOverview Include the group-overview page */
|
||||
virtual void previousPage(bool includeOverview=true) = 0;
|
||||
|
||||
//! Try to show as many group-pages together as possible instead of showing at most one group per page.
|
||||
/** \param groupsTogether When true show several groups on one page, when false show max. one group per page. Default is false. */
|
||||
virtual void setShowGroupsTogether(bool groupsTogether) = 0;
|
||||
|
||||
//! Can several groups be displayed per page?
|
||||
virtual bool getShowGroupsTogether() const = 0;
|
||||
|
||||
//! Sets another skin independent font.
|
||||
/** If this is set to zero, the button uses the font of the skin.
|
||||
\param font: New font to set. */
|
||||
virtual void setOverrideFont(IGUIFont* font=0) = 0;
|
||||
|
||||
//! Gets the override font (if any)
|
||||
/** \return The override font (may be 0) */
|
||||
virtual IGUIFont* getOverrideFont(void) const = 0;
|
||||
|
||||
//! Get the font which is used right now for drawing
|
||||
/** Currently this is the override font when one is set and the
|
||||
font of the active skin otherwise */
|
||||
virtual IGUIFont* getActiveFont() const = 0;
|
||||
|
||||
//! Sets whether to draw the background. By default disabled,
|
||||
virtual void setDrawBackground(bool draw) = 0;
|
||||
|
||||
//! Checks if background drawing is enabled
|
||||
/** \return true if background drawing is enabled, false otherwise */
|
||||
virtual bool isDrawBackgroundEnabled() const = 0;
|
||||
|
||||
//! Allows to freeze updates which makes it easier to read the numbers
|
||||
/** Numbers are updated once when you switch pages. */
|
||||
virtual void setFrozen(bool freeze) = 0;
|
||||
|
||||
//! Are updates currently frozen
|
||||
virtual bool getFrozen() const = 0;
|
||||
|
||||
//! Filters prevents data that doesn't achieve the conditions from being displayed
|
||||
virtual void setFilters(irr::u32 minCalls = 0, irr::u32 minTimeSum = 0, irr::f32 minTimeAverage = 0.f, irr::u32 minTimeMax = 0) = 0;
|
||||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
@ -5,7 +5,7 @@
|
||||
#ifndef __I_GUI_SKIN_H_INCLUDED__
|
||||
#define __I_GUI_SKIN_H_INCLUDED__
|
||||
|
||||
#include "IAttributeExchangingObject.h"
|
||||
#include "IReferenceCounted.h"
|
||||
#include "EGUIAlignment.h"
|
||||
#include "SColor.h"
|
||||
#include "rect.h"
|
||||
@ -381,7 +381,7 @@ namespace gui
|
||||
};
|
||||
|
||||
//! A skin modifies the look of the GUI elements.
|
||||
class IGUISkin : public virtual io::IAttributeExchangingObject
|
||||
class IGUISkin : virtual public IReferenceCounted
|
||||
{
|
||||
public:
|
||||
|
||||
|
@ -1,92 +0,0 @@
|
||||
// Copyright (C) 2006-2012 Michael Zeilfelder
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_SPIN_BOX_H_INCLUDED__
|
||||
#define __I_GUI_SPIN_BOX_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIEditBox;
|
||||
|
||||
//! Enumeration bitflag for when to validate the text typed into the spinbox
|
||||
//! Default used by Irrlicht is: (EGUI_SBV_ENTER|EGUI_SBV_LOSE_FOCUS)
|
||||
enum EGUI_SPINBOX_VALIDATION
|
||||
{
|
||||
//! Does not validate typed text, probably a bad idea setting this usually.
|
||||
EGUI_SBV_NEVER = 0,
|
||||
//! Validate on each change. Was default up to Irrlicht 1.8
|
||||
EGUI_SBV_CHANGE = 1,
|
||||
//! Validate when enter was pressed
|
||||
EGUI_SBV_ENTER = 2,
|
||||
//! Validate when the editbox loses the focus
|
||||
EGUI_SBV_LOSE_FOCUS = 4
|
||||
};
|
||||
|
||||
|
||||
//! Single line edit box + spin buttons
|
||||
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
|
||||
\li EGET_SPINBOX_CHANGED
|
||||
*/
|
||||
class IGUISpinBox : public IGUIElement
|
||||
{
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
IGUISpinBox(IGUIEnvironment* environment, IGUIElement* parent,
|
||||
s32 id, core::rect<s32> rectangle)
|
||||
: IGUIElement(EGUIET_SPIN_BOX, environment, parent, id, rectangle) {}
|
||||
|
||||
//! Access the edit box used in the spin control
|
||||
virtual IGUIEditBox* getEditBox() const = 0;
|
||||
|
||||
//! set the current value of the spinbox
|
||||
/** \param val: value to be set in the spinbox */
|
||||
virtual void setValue(f32 val) = 0;
|
||||
|
||||
//! Get the current value of the spinbox
|
||||
virtual f32 getValue() const = 0;
|
||||
|
||||
//! set the range of values which can be used in the spinbox
|
||||
/** \param min: minimum value
|
||||
\param max: maximum value */
|
||||
virtual void setRange(f32 min, f32 max) = 0;
|
||||
|
||||
//! get the minimum value which can be used in the spinbox
|
||||
virtual f32 getMin() const = 0;
|
||||
|
||||
//! get the maximum value which can be used in the spinbox
|
||||
virtual f32 getMax() const = 0;
|
||||
|
||||
//! Step size by which values are changed when pressing the spinbuttons
|
||||
/** The step size also determines the number of decimal places to display
|
||||
\param step: stepsize used for value changes when pressing spinbuttons */
|
||||
virtual void setStepSize(f32 step=1.f) = 0;
|
||||
|
||||
//! Sets the number of decimal places to display.
|
||||
//! Note that this also rounds the range to the same number of decimal places.
|
||||
/** \param places: The number of decimal places to display, use -1 to reset */
|
||||
virtual void setDecimalPlaces(s32 places) = 0;
|
||||
|
||||
//! get the current step size
|
||||
virtual f32 getStepSize() const = 0;
|
||||
|
||||
//! Sets when the spinbox has to validate entered text.
|
||||
/** \param validateOn Can be any combination of EGUI_SPINBOX_VALIDATION bit flags */
|
||||
virtual void setValidateOn(u32 validateOn) = 0;
|
||||
|
||||
//! Gets when the spinbox has to validate entered text.
|
||||
/** \return A combination of EGUI_SPINBOX_VALIDATION bit flags */
|
||||
virtual u32 getValidateOn() const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif // __I_GUI_SPIN_BOX_H_INCLUDED__
|
||||
|
@ -88,9 +88,9 @@ namespace gui
|
||||
|
||||
//! Sets text justification mode
|
||||
/** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
|
||||
EGUIA_LOWEERRIGHT for right justified, or EGUIA_CENTER for centered text.
|
||||
EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text.
|
||||
\param vertical: EGUIA_UPPERLEFT to align with top edge (default),
|
||||
EGUIA_LOWEERRIGHT for bottom edge, or EGUIA_CENTER for centered text. */
|
||||
EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text. */
|
||||
virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0;
|
||||
|
||||
//! Enables or disables word wrap for using the static text as multiline text control.
|
||||
|
@ -1,235 +0,0 @@
|
||||
// Copyright (C) 2003-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_TABLE_H_INCLUDED__
|
||||
#define __I_GUI_TABLE_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
#include "SColor.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIFont;
|
||||
class IGUIScrollBar;
|
||||
|
||||
//! modes for ordering used when a column header is clicked
|
||||
enum EGUI_COLUMN_ORDERING
|
||||
{
|
||||
//! Do not use ordering
|
||||
EGCO_NONE,
|
||||
|
||||
//! Send a EGET_TABLE_HEADER_CHANGED message when a column header is clicked.
|
||||
EGCO_CUSTOM,
|
||||
|
||||
//! Sort it ascending by it's ascii value like: a,b,c,...
|
||||
EGCO_ASCENDING,
|
||||
|
||||
//! Sort it descending by it's ascii value like: z,x,y,...
|
||||
EGCO_DESCENDING,
|
||||
|
||||
//! Sort it ascending on first click, descending on next, etc
|
||||
EGCO_FLIP_ASCENDING_DESCENDING,
|
||||
|
||||
//! Not used as mode, only to get maximum value for this enum
|
||||
EGCO_COUNT
|
||||
};
|
||||
|
||||
//! Names for EGUI_COLUMN_ORDERING types
|
||||
const c8* const GUIColumnOrderingNames[] =
|
||||
{
|
||||
"none",
|
||||
"custom",
|
||||
"ascend",
|
||||
"descend",
|
||||
"ascend_descend",
|
||||
0,
|
||||
};
|
||||
|
||||
enum EGUI_ORDERING_MODE
|
||||
{
|
||||
//! No element ordering
|
||||
EGOM_NONE,
|
||||
|
||||
//! Elements are ordered from the smallest to the largest.
|
||||
EGOM_ASCENDING,
|
||||
|
||||
//! Elements are ordered from the largest to the smallest.
|
||||
EGOM_DESCENDING,
|
||||
|
||||
//! this value is not used, it only specifies the amount of default ordering types
|
||||
//! available.
|
||||
EGOM_COUNT
|
||||
};
|
||||
|
||||
const c8* const GUIOrderingModeNames[] =
|
||||
{
|
||||
"none",
|
||||
"ascending",
|
||||
"descending",
|
||||
0
|
||||
};
|
||||
|
||||
enum EGUI_TABLE_DRAW_FLAGS
|
||||
{
|
||||
EGTDF_ROWS = 1,
|
||||
EGTDF_COLUMNS = 2,
|
||||
EGTDF_ACTIVE_ROW = 4,
|
||||
EGTDF_COUNT
|
||||
};
|
||||
|
||||
//! Default list box GUI element.
|
||||
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
|
||||
\li EGET_TABLE_CHANGED
|
||||
\li EGET_TABLE_SELECTED_AGAIN
|
||||
\li EGET_TABLE_HEADER_CHANGED
|
||||
*/
|
||||
class IGUITable : public IGUIElement
|
||||
{
|
||||
public:
|
||||
//! constructor
|
||||
IGUITable(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
|
||||
: IGUIElement(EGUIET_TABLE, environment, parent, id, rectangle) {}
|
||||
|
||||
//! Adds a column
|
||||
/** If columnIndex is outside the current range, do push new column at the end */
|
||||
virtual void addColumn(const wchar_t* caption, s32 columnIndex=-1) = 0;
|
||||
|
||||
//! remove a column from the table
|
||||
virtual void removeColumn(u32 columnIndex) = 0;
|
||||
|
||||
//! Returns the number of columns in the table control
|
||||
virtual s32 getColumnCount() const = 0;
|
||||
|
||||
//! Makes a column active. This will trigger an ordering process.
|
||||
/** \param idx: The id of the column to make active or a negative number to make non active.
|
||||
\param doOrder: Do also the ordering which depending on mode for active column
|
||||
\return True when the column could be set active (aka - it did exist). */
|
||||
virtual bool setActiveColumn(s32 idx, bool doOrder=false) = 0;
|
||||
|
||||
//! Returns which header is currently active
|
||||
virtual s32 getActiveColumn() const = 0;
|
||||
|
||||
//! Returns the ordering used by the currently active column
|
||||
virtual EGUI_ORDERING_MODE getActiveColumnOrdering() const = 0;
|
||||
|
||||
//! Set the width of a column
|
||||
virtual void setColumnWidth(u32 columnIndex, u32 width) = 0;
|
||||
|
||||
//! Get the width of a column
|
||||
virtual u32 getColumnWidth(u32 columnIndex) const = 0;
|
||||
|
||||
//! columns can be resized by drag 'n drop
|
||||
virtual void setResizableColumns(bool resizable) = 0;
|
||||
|
||||
//! can columns be resized by drag 'n drop?
|
||||
virtual bool hasResizableColumns() const = 0;
|
||||
|
||||
//! This tells the table control which ordering mode should be used when a column header is clicked.
|
||||
/** \param columnIndex The index of the column header.
|
||||
\param mode: One of the modes defined in EGUI_COLUMN_ORDERING */
|
||||
virtual void setColumnOrdering(u32 columnIndex, EGUI_COLUMN_ORDERING mode) = 0;
|
||||
|
||||
//! Returns which row is currently selected
|
||||
virtual s32 getSelected() const = 0;
|
||||
|
||||
//! set which row is currently selected
|
||||
virtual void setSelected( s32 index ) = 0;
|
||||
|
||||
//! Get amount of rows in the tabcontrol
|
||||
virtual s32 getRowCount() const = 0;
|
||||
|
||||
//! adds a row to the table
|
||||
/** \param rowIndex Zero based index of rows. The row will be
|
||||
inserted at this position, if a row already exist there, it
|
||||
will be placed after it. If the row is larger than the actual
|
||||
number of row by more than one, it won't be created. Note that
|
||||
if you create a row that's not at the end, there might be
|
||||
performance issues.
|
||||
\return index of inserted row. */
|
||||
virtual u32 addRow(u32 rowIndex) = 0;
|
||||
|
||||
//! Remove a row from the table
|
||||
virtual void removeRow(u32 rowIndex) = 0;
|
||||
|
||||
//! clears the table rows, but keeps the columns intact
|
||||
virtual void clearRows() = 0;
|
||||
|
||||
//! Swap two row positions.
|
||||
virtual void swapRows(u32 rowIndexA, u32 rowIndexB) = 0;
|
||||
|
||||
//! This tells the table to start ordering all the rows.
|
||||
/** You need to explicitly tell the table to re order the rows
|
||||
when a new row is added or the cells data is changed. This
|
||||
makes the system more flexible and doesn't make you pay the
|
||||
cost of ordering when adding a lot of rows.
|
||||
\param columnIndex: When set to -1 the active column is used.
|
||||
\param mode Ordering mode of the rows. */
|
||||
virtual void orderRows(s32 columnIndex=-1, EGUI_ORDERING_MODE mode=EGOM_NONE) = 0;
|
||||
|
||||
//! Set the text of a cell
|
||||
virtual void setCellText(u32 rowIndex, u32 columnIndex, const core::stringw& text) = 0;
|
||||
|
||||
//! Set the text of a cell, and set a color of this cell.
|
||||
virtual void setCellText(u32 rowIndex, u32 columnIndex, const core::stringw& text, video::SColor color) = 0;
|
||||
|
||||
//! Set the data of a cell
|
||||
virtual void setCellData(u32 rowIndex, u32 columnIndex, void *data) = 0;
|
||||
|
||||
//! Set the color of a cell text
|
||||
virtual void setCellColor(u32 rowIndex, u32 columnIndex, video::SColor color) = 0;
|
||||
|
||||
//! Get the text of a cell
|
||||
virtual const wchar_t* getCellText(u32 rowIndex, u32 columnIndex ) const = 0;
|
||||
|
||||
//! Get the data of a cell
|
||||
virtual void* getCellData(u32 rowIndex, u32 columnIndex ) const = 0;
|
||||
|
||||
//! clears the table, deletes all items in the table
|
||||
virtual void clear() = 0;
|
||||
|
||||
//! Set flags, as defined in ::EGUI_TABLE_DRAW_FLAGS, which influence the layout
|
||||
virtual void setDrawFlags(s32 flags) = 0;
|
||||
|
||||
//! Get the flags, as defined in ::EGUI_TABLE_DRAW_FLAGS, which influence the layout
|
||||
virtual s32 getDrawFlags() const = 0;
|
||||
|
||||
//! Sets another skin independent font.
|
||||
/** If this is set to zero, the button uses the font of the skin.
|
||||
\param font: New font to set. */
|
||||
virtual void setOverrideFont(IGUIFont* font=0) = 0;
|
||||
|
||||
//! Gets the override font (if any)
|
||||
/** \return The override font (may be 0) */
|
||||
virtual IGUIFont* getOverrideFont(void) const = 0;
|
||||
|
||||
//! Get the font which is used right now for drawing
|
||||
/** Currently this is the override font when one is set and the
|
||||
font of the active skin otherwise */
|
||||
virtual IGUIFont* getActiveFont() const = 0;
|
||||
|
||||
//! Get the height of items/rows
|
||||
virtual s32 getItemHeight() const = 0;
|
||||
|
||||
//! Access the vertical scrollbar
|
||||
virtual IGUIScrollBar* getVerticalScrollBar() const = 0;
|
||||
|
||||
//! Access the horizontal scrollbar
|
||||
virtual IGUIScrollBar* getHorizontalScrollBar() const = 0;
|
||||
|
||||
//! Sets whether to draw the background.
|
||||
virtual void setDrawBackground(bool draw) = 0;
|
||||
|
||||
//! Checks if background drawing is enabled
|
||||
/** \return true if background drawing is enabled, false otherwise */
|
||||
virtual bool isDrawBackgroundEnabled() const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -1,298 +0,0 @@
|
||||
// written by Reinhard Ostermeier, reinhard@nospam.r-ostermeier.de
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_TREE_VIEW_H_INCLUDED__
|
||||
#define __I_GUI_TREE_VIEW_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
#include "IGUIImageList.h"
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIFont;
|
||||
class IGUITreeView;
|
||||
class IGUIScrollBar;
|
||||
|
||||
|
||||
//! Node for gui tree view
|
||||
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
|
||||
\li EGET_TREEVIEW_NODE_EXPAND
|
||||
\li EGET_TREEVIEW_NODE_COLLAPS
|
||||
\li EGET_TREEVIEW_NODE_DESELECT
|
||||
\li EGET_TREEVIEW_NODE_SELECT
|
||||
*/
|
||||
class IGUITreeViewNode : public IReferenceCounted
|
||||
{
|
||||
public:
|
||||
//! returns the owner (tree view) of this node
|
||||
virtual IGUITreeView* getOwner() const = 0;
|
||||
|
||||
//! Returns the parent node of this node.
|
||||
/** For the root node this will return 0. */
|
||||
virtual IGUITreeViewNode* getParent() const = 0;
|
||||
|
||||
//! returns the text of the node
|
||||
virtual const wchar_t* getText() const = 0;
|
||||
|
||||
//! sets the text of the node
|
||||
virtual void setText( const wchar_t* text ) = 0;
|
||||
|
||||
//! returns the icon text of the node
|
||||
virtual const wchar_t* getIcon() const = 0;
|
||||
|
||||
//! sets the icon text of the node
|
||||
virtual void setIcon( const wchar_t* icon ) = 0;
|
||||
|
||||
//! returns the image index of the node
|
||||
virtual u32 getImageIndex() const = 0;
|
||||
|
||||
//! sets the image index of the node
|
||||
virtual void setImageIndex( u32 imageIndex ) = 0;
|
||||
|
||||
//! returns the image index of the node
|
||||
virtual u32 getSelectedImageIndex() const = 0;
|
||||
|
||||
//! sets the image index of the node
|
||||
virtual void setSelectedImageIndex( u32 imageIndex ) = 0;
|
||||
|
||||
//! returns the user data (void*) of this node
|
||||
virtual void* getData() const = 0;
|
||||
|
||||
//! sets the user data (void*) of this node
|
||||
virtual void setData( void* data ) = 0;
|
||||
|
||||
//! returns the user data2 (IReferenceCounted) of this node
|
||||
virtual IReferenceCounted* getData2() const = 0;
|
||||
|
||||
//! sets the user data2 (IReferenceCounted) of this node
|
||||
virtual void setData2( IReferenceCounted* data ) = 0;
|
||||
|
||||
//! returns the child item count
|
||||
virtual u32 getChildCount() const = 0;
|
||||
|
||||
//! removes all children (recursive) from this node
|
||||
virtual void clearChildren() = 0;
|
||||
|
||||
//! removes all children (recursive) from this node
|
||||
/** \deprecated Deprecated in 1.8, use clearChildren() instead.
|
||||
This method may be removed by Irrlicht 1.9 */
|
||||
_IRR_DEPRECATED_ void clearChilds()
|
||||
{
|
||||
return clearChildren();
|
||||
}
|
||||
|
||||
//! returns true if this node has child nodes
|
||||
virtual bool hasChildren() const = 0;
|
||||
|
||||
//! returns true if this node has child nodes
|
||||
/** \deprecated Deprecated in 1.8, use hasChildren() instead.
|
||||
This method may be removed by Irrlicht 1.9 */
|
||||
_IRR_DEPRECATED_ bool hasChilds() const
|
||||
{
|
||||
return hasChildren();
|
||||
}
|
||||
|
||||
//! Adds a new node behind the last child node.
|
||||
/** \param text text of the new node
|
||||
\param icon icon text of the new node
|
||||
\param imageIndex index of the image for the new node (-1 = none)
|
||||
\param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex)
|
||||
\param data user data (void*) of the new node
|
||||
\param data2 user data2 (IReferenceCounted*) of the new node
|
||||
\return The new node
|
||||
*/
|
||||
virtual IGUITreeViewNode* addChildBack(
|
||||
const wchar_t* text, const wchar_t* icon = 0,
|
||||
s32 imageIndex=-1, s32 selectedImageIndex=-1,
|
||||
void* data=0, IReferenceCounted* data2=0) =0;
|
||||
|
||||
//! Adds a new node before the first child node.
|
||||
/** \param text text of the new node
|
||||
\param icon icon text of the new node
|
||||
\param imageIndex index of the image for the new node (-1 = none)
|
||||
\param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex)
|
||||
\param data user data (void*) of the new node
|
||||
\param data2 user data2 (IReferenceCounted*) of the new node
|
||||
\return The new node
|
||||
*/
|
||||
virtual IGUITreeViewNode* addChildFront(
|
||||
const wchar_t* text, const wchar_t* icon = 0,
|
||||
s32 imageIndex=-1, s32 selectedImageIndex=-1,
|
||||
void* data=0, IReferenceCounted* data2=0 ) =0;
|
||||
|
||||
//! Adds a new node behind the other node.
|
||||
/** The other node has also to be a child node from this node.
|
||||
\param other Node to insert after
|
||||
\param text text of the new node
|
||||
\param icon icon text of the new node
|
||||
\param imageIndex index of the image for the new node (-1 = none)
|
||||
\param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex)
|
||||
\param data user data (void*) of the new node
|
||||
\param data2 user data2 (IReferenceCounted*) of the new node
|
||||
\return The new node or 0 if other is no child node from this
|
||||
*/
|
||||
virtual IGUITreeViewNode* insertChildAfter(
|
||||
IGUITreeViewNode* other,
|
||||
const wchar_t* text, const wchar_t* icon = 0,
|
||||
s32 imageIndex=-1, s32 selectedImageIndex=-1,
|
||||
void* data=0, IReferenceCounted* data2=0) =0;
|
||||
|
||||
//! Adds a new node before the other node.
|
||||
/** The other node has also to be a child node from this node.
|
||||
\param other Node to insert before
|
||||
\param text text of the new node
|
||||
\param icon icon text of the new node
|
||||
\param imageIndex index of the image for the new node (-1 = none)
|
||||
\param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex)
|
||||
\param data user data (void*) of the new node
|
||||
\param data2 user data2 (IReferenceCounted*) of the new node
|
||||
\return The new node or 0 if other is no child node from this
|
||||
*/
|
||||
virtual IGUITreeViewNode* insertChildBefore(
|
||||
IGUITreeViewNode* other,
|
||||
const wchar_t* text, const wchar_t* icon = 0,
|
||||
s32 imageIndex=-1, s32 selectedImageIndex=-1,
|
||||
void* data=0, IReferenceCounted* data2=0) = 0;
|
||||
|
||||
//! Return the first child node from this node.
|
||||
/** \return The first child node or 0 if this node has no children. */
|
||||
virtual IGUITreeViewNode* getFirstChild() const = 0;
|
||||
|
||||
//! Return the last child node from this node.
|
||||
/** \return The last child node or 0 if this node has no children. */
|
||||
virtual IGUITreeViewNode* getLastChild() const = 0;
|
||||
|
||||
//! Returns the previous sibling node from this node.
|
||||
/** \return The previous sibling node from this node or 0 if this is
|
||||
the first node from the parent node.
|
||||
*/
|
||||
virtual IGUITreeViewNode* getPrevSibling() const = 0;
|
||||
|
||||
//! Returns the next sibling node from this node.
|
||||
/** \return The next sibling node from this node or 0 if this is
|
||||
the last node from the parent node.
|
||||
*/
|
||||
virtual IGUITreeViewNode* getNextSibling() const = 0;
|
||||
|
||||
//! Returns the next visible (expanded, may be out of scrolling) node from this node.
|
||||
/** \return The next visible node from this node or 0 if this is
|
||||
the last visible node. */
|
||||
virtual IGUITreeViewNode* getNextVisible() const = 0;
|
||||
|
||||
//! Deletes a child node.
|
||||
/** \return Returns true if the node was found as a child and is deleted. */
|
||||
virtual bool deleteChild( IGUITreeViewNode* child ) = 0;
|
||||
|
||||
//! Moves a child node one position up.
|
||||
/** \return True if the node was found as a child node and was not already the first child. */
|
||||
virtual bool moveChildUp( IGUITreeViewNode* child ) = 0;
|
||||
|
||||
//! Moves a child node one position down.
|
||||
/** \return True if the node was found as a child node and was not already the last child. */
|
||||
virtual bool moveChildDown( IGUITreeViewNode* child ) = 0;
|
||||
|
||||
//! Returns true if the node is expanded (children are visible).
|
||||
virtual bool getExpanded() const = 0;
|
||||
|
||||
//! Sets if the node is expanded.
|
||||
virtual void setExpanded( bool expanded ) = 0;
|
||||
|
||||
//! Returns true if the node is currently selected.
|
||||
virtual bool getSelected() const = 0;
|
||||
|
||||
//! Sets this node as selected.
|
||||
virtual void setSelected( bool selected ) = 0;
|
||||
|
||||
//! Returns true if this node is the root node.
|
||||
virtual bool isRoot() const = 0;
|
||||
|
||||
//! Returns the level of this node.
|
||||
/** The root node has level 0. Direct children of the root has level 1 ... */
|
||||
virtual s32 getLevel() const = 0;
|
||||
|
||||
//! Returns true if this node is visible (all parents are expanded).
|
||||
virtual bool isVisible() const = 0;
|
||||
};
|
||||
|
||||
|
||||
//! Default tree view GUI element.
|
||||
/** Displays a windows like tree buttons to expand/collapse the child
|
||||
nodes of an node and optional tree lines. Each node consists of an
|
||||
text, an icon text and a void pointer for user data. */
|
||||
class IGUITreeView : public IGUIElement
|
||||
{
|
||||
public:
|
||||
//! constructor
|
||||
IGUITreeView(IGUIEnvironment* environment, IGUIElement* parent,
|
||||
s32 id, core::rect<s32> rectangle)
|
||||
: IGUIElement( EGUIET_TREE_VIEW, environment, parent, id, rectangle ) {}
|
||||
|
||||
//! returns the root node (not visible) from the tree.
|
||||
virtual IGUITreeViewNode* getRoot() const = 0;
|
||||
|
||||
//! returns the selected node of the tree or 0 if none is selected
|
||||
virtual IGUITreeViewNode* getSelected() const = 0;
|
||||
|
||||
//! returns true if the tree lines are visible
|
||||
virtual bool getLinesVisible() const = 0;
|
||||
|
||||
//! sets if the tree lines are visible
|
||||
/** \param visible true for visible, false for invisible */
|
||||
virtual void setLinesVisible( bool visible ) = 0;
|
||||
|
||||
//! Sets the font which should be used as icon font.
|
||||
/** This font is set to the Irrlicht engine built-in-font by
|
||||
default. Icons can be displayed in front of every list item.
|
||||
An icon is a string, displayed with the icon font. When using
|
||||
the build-in-font of the Irrlicht engine as icon font, the icon
|
||||
strings defined in GUIIcons.h can be used.
|
||||
*/
|
||||
virtual void setIconFont( IGUIFont* font ) = 0;
|
||||
|
||||
//! Sets a skin independent font.
|
||||
/** \param font: New font to set or 0 to use the skin-font. */
|
||||
virtual void setOverrideFont(IGUIFont* font=0) = 0;
|
||||
|
||||
//! Gets the override font (if any)
|
||||
/** \return The override font (may be 0) */
|
||||
virtual IGUIFont* getOverrideFont(void) const = 0;
|
||||
|
||||
//! Get the font which is used for drawing
|
||||
/** This is the override font when one is set and the
|
||||
font of the skin otherwise. */
|
||||
virtual IGUIFont* getActiveFont() const = 0;
|
||||
|
||||
//! Sets the image list which should be used for the image and selected image of every node.
|
||||
/** The default is 0 (no images). */
|
||||
virtual void setImageList( IGUIImageList* imageList ) = 0;
|
||||
|
||||
//! Returns the image list which is used for the nodes.
|
||||
virtual IGUIImageList* getImageList() const = 0;
|
||||
|
||||
//! Sets if the image is left of the icon. Default is true.
|
||||
virtual void setImageLeftOfIcon( bool bLeftOf ) = 0;
|
||||
|
||||
//! Returns if the Image is left of the icon. Default is true.
|
||||
virtual bool getImageLeftOfIcon() const = 0;
|
||||
|
||||
//! Returns the node which is associated to the last event.
|
||||
/** This pointer is only valid inside the OnEvent call! */
|
||||
virtual IGUITreeViewNode* getLastEventNode() const = 0;
|
||||
|
||||
//! Access the vertical scrollbar
|
||||
virtual IGUIScrollBar* getVerticalScrollBar() const = 0;
|
||||
|
||||
//! Access the horizontal scrollbar
|
||||
virtual IGUIScrollBar* getHorizontalScrollBar() const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -1,74 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_GUI_WINDOW_H_INCLUDED__
|
||||
#define __I_GUI_WINDOW_H_INCLUDED__
|
||||
|
||||
#include "IGUIElement.h"
|
||||
#include "EMessageBoxFlags.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIButton;
|
||||
|
||||
//! Default moveable window GUI element with border, caption and close icons.
|
||||
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
|
||||
\li EGET_ELEMENT_CLOSED
|
||||
*/
|
||||
class IGUIWindow : public IGUIElement
|
||||
{
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
IGUIWindow(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
|
||||
: IGUIElement(EGUIET_WINDOW, environment, parent, id, rectangle) {}
|
||||
|
||||
//! Returns pointer to the close button
|
||||
/** You can hide the button by calling setVisible(false) on the result. */
|
||||
virtual IGUIButton* getCloseButton() const = 0;
|
||||
|
||||
//! Returns pointer to the minimize button
|
||||
/** You can hide the button by calling setVisible(false) on the result. */
|
||||
virtual IGUIButton* getMinimizeButton() const = 0;
|
||||
|
||||
//! Returns pointer to the maximize button
|
||||
/** You can hide the button by calling setVisible(false) on the result. */
|
||||
virtual IGUIButton* getMaximizeButton() const = 0;
|
||||
|
||||
//! Returns true if the window can be dragged with the mouse, false if not
|
||||
virtual bool isDraggable() const = 0;
|
||||
|
||||
//! Sets whether the window can be dragged by the mouse
|
||||
virtual void setDraggable(bool draggable) = 0;
|
||||
|
||||
//! Set if the window background will be drawn
|
||||
virtual void setDrawBackground(bool draw) = 0;
|
||||
|
||||
//! Get if the window background will be drawn
|
||||
virtual bool getDrawBackground() const = 0;
|
||||
|
||||
//! Set if the window titlebar will be drawn
|
||||
//! Note: If the background is not drawn, then the titlebar is automatically also not drawn
|
||||
virtual void setDrawTitlebar(bool draw) = 0;
|
||||
|
||||
//! Get if the window titlebar will be drawn
|
||||
virtual bool getDrawTitlebar() const = 0;
|
||||
|
||||
//! Returns the rectangle of the drawable area (without border and without titlebar)
|
||||
/** The coordinates are given relative to the top-left position of the gui element.<br>
|
||||
So to get absolute positions you have to add the resulting rectangle to getAbsolutePosition().UpperLeftCorner.<br>
|
||||
To get it relative to the parent element you have to add the resulting rectangle to getRelativePosition().UpperLeftCorner.
|
||||
Beware that adding a menu will not change the clientRect as menus are own gui elements, so in that case you might want to subtract
|
||||
the menu area additionally. */
|
||||
virtual core::rect<s32> getClientRect() const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include "position2d.h"
|
||||
#include "rect.h"
|
||||
#include "SColor.h"
|
||||
#include "irrAllocator.h"
|
||||
#include <string.h>
|
||||
|
||||
namespace irr
|
||||
@ -44,7 +43,7 @@ public:
|
||||
delete[] Data;
|
||||
|
||||
if (DeleteMipMapsMemory)
|
||||
Allocator.deallocate(MipMapsData);
|
||||
delete[] MipMapsData;
|
||||
}
|
||||
|
||||
//! Returns the color format
|
||||
@ -275,13 +274,13 @@ public:
|
||||
will by copied internally.
|
||||
\param deleteMemory Whether the memory is deallocated upon
|
||||
destruction. */
|
||||
void setMipMapsData(void* data, bool ownForeignMemory, bool deleteMemory)
|
||||
void setMipMapsData(void* data, bool ownForeignMemory)
|
||||
{
|
||||
if (data != MipMapsData)
|
||||
{
|
||||
if (DeleteMipMapsMemory)
|
||||
{
|
||||
Allocator.deallocate(MipMapsData);
|
||||
delete[] MipMapsData;
|
||||
|
||||
DeleteMipMapsMemory = false;
|
||||
}
|
||||
@ -292,7 +291,7 @@ public:
|
||||
{
|
||||
MipMapsData = static_cast<u8*>(data);
|
||||
|
||||
DeleteMipMapsMemory = deleteMemory;
|
||||
DeleteMipMapsMemory = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -311,7 +310,7 @@ public:
|
||||
dataSize += getDataSizeFromFormat(Format, width, height);
|
||||
} while (width != 1 || height != 1);
|
||||
|
||||
MipMapsData = Allocator.allocate(dataSize);
|
||||
MipMapsData = new u8[dataSize];
|
||||
memcpy(MipMapsData, data, dataSize);
|
||||
|
||||
DeleteMipMapsMemory = true;
|
||||
@ -330,6 +329,12 @@ public:
|
||||
//! Sets a pixel
|
||||
virtual void setPixel(u32 x, u32 y, const SColor &color, bool blend = false ) = 0;
|
||||
|
||||
//! Copies this surface into another, if it has the exact same size and format.
|
||||
/** NOTE: mipmaps are ignored
|
||||
\return True if it was copied, false otherwise.
|
||||
*/
|
||||
virtual bool copyToNoScaling(void *target, u32 width, u32 height, ECOLOR_FORMAT format=ECF_A8R8G8B8, u32 pitch=0) const = 0;
|
||||
|
||||
//! Copies the image into the target, scaling the image to fit
|
||||
/** NOTE: mipmaps are ignored */
|
||||
virtual void copyToScaling(void* target, u32 width, u32 height, ECOLOR_FORMAT format=ECF_A8R8G8B8, u32 pitch=0) =0;
|
||||
@ -578,7 +583,6 @@ protected:
|
||||
bool DeleteMemory;
|
||||
bool DeleteMipMapsMemory;
|
||||
|
||||
core::irrAllocator<u8> Allocator;
|
||||
#if defined(IRRLICHT_sRGB)
|
||||
int Format_sRGB;
|
||||
#endif
|
||||
|
@ -45,17 +45,6 @@ public:
|
||||
/** \param file File handle to check.
|
||||
\return Pointer to newly created image, or 0 upon error. */
|
||||
virtual IImage* loadImage(io::IReadFile* file) const = 0;
|
||||
|
||||
//! Creates a multiple surfaces from the file eg. whole cube map.
|
||||
/** \param file File handle to check.
|
||||
\param type Pointer to E_TEXTURE_TYPE where a recommended type of the texture will be stored.
|
||||
\return Array of pointers to newly created images. */
|
||||
virtual core::array<IImage*> loadImages(io::IReadFile* file, E_TEXTURE_TYPE* type) const
|
||||
{
|
||||
core::array<IImage*> image;
|
||||
|
||||
return image;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -97,11 +97,6 @@ namespace scene
|
||||
/** \param box New bounding box to use for the mesh. */
|
||||
virtual void setBoundingBox( const core::aabbox3df& box) = 0;
|
||||
|
||||
//! Sets a flag of all contained materials to a new value.
|
||||
/** \param flag: Flag to set in all materials.
|
||||
\param newvalue: New value to set in all materials. */
|
||||
virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) = 0;
|
||||
|
||||
//! Set the hardware mapping hint
|
||||
/** This methods allows to define optimization hints for the
|
||||
hardware. This enables, e.g., the use of hardware buffers on
|
||||
|
@ -145,6 +145,10 @@ namespace scene
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID_Index() const = 0;
|
||||
|
||||
//! Used by the VideoDriver to remember the buffer link.
|
||||
virtual void setHWBuffer(void *ptr) const = 0;
|
||||
virtual void *getHWBuffer() const = 0;
|
||||
|
||||
//! Describe what kind of primitive geometry is used by the meshbuffer
|
||||
/** Note: Default is EPT_TRIANGLES. Using other types is fine for rendering.
|
||||
But meshbuffer manipulation functions might expect type EPT_TRIANGLES
|
||||
|
@ -30,44 +30,6 @@ namespace scene
|
||||
{
|
||||
public:
|
||||
|
||||
//! Flips the direction of surfaces.
|
||||
/** Changes backfacing triangles to frontfacing
|
||||
triangles and vice versa.
|
||||
\param mesh Mesh on which the operation is performed. */
|
||||
virtual void flipSurfaces(IMesh* mesh) const = 0;
|
||||
|
||||
//! Sets the alpha vertex color value of the whole mesh to a new value.
|
||||
/** \param mesh Mesh on which the operation is performed.
|
||||
\param alpha New alpha value. Must be a value between 0 and 255. */
|
||||
void setVertexColorAlpha(IMesh* mesh, s32 alpha) const
|
||||
{
|
||||
apply(scene::SVertexColorSetAlphaManipulator(alpha), mesh);
|
||||
}
|
||||
|
||||
//! Sets the alpha vertex color value of the whole mesh to a new value.
|
||||
/** \param buffer Meshbuffer on which the operation is performed.
|
||||
\param alpha New alpha value. Must be a value between 0 and 255. */
|
||||
void setVertexColorAlpha(IMeshBuffer* buffer, s32 alpha) const
|
||||
{
|
||||
apply(scene::SVertexColorSetAlphaManipulator(alpha), buffer);
|
||||
}
|
||||
|
||||
//! Sets the colors of all vertices to one color
|
||||
/** \param mesh Mesh on which the operation is performed.
|
||||
\param color New color. */
|
||||
void setVertexColors(IMesh* mesh, video::SColor color) const
|
||||
{
|
||||
apply(scene::SVertexColorSetManipulator(color), mesh);
|
||||
}
|
||||
|
||||
//! Sets the colors of all vertices to one color
|
||||
/** \param buffer Meshbuffer on which the operation is performed.
|
||||
\param color New color. */
|
||||
void setVertexColors(IMeshBuffer* buffer, video::SColor color) const
|
||||
{
|
||||
apply(scene::SVertexColorSetManipulator(color), buffer);
|
||||
}
|
||||
|
||||
//! Recalculates all normals of the mesh.
|
||||
/** \param mesh: Mesh on which the operation is performed.
|
||||
\param smooth: If the normals shall be smoothed.
|
||||
@ -82,26 +44,6 @@ namespace scene
|
||||
virtual void recalculateNormals(IMeshBuffer* buffer,
|
||||
bool smooth = false, bool angleWeighted = false) const=0;
|
||||
|
||||
//! Recalculates tangents, requires a tangent mesh
|
||||
/** \param mesh Mesh on which the operation is performed.
|
||||
\param recalculateNormals If the normals shall be recalculated, otherwise original normals of the mesh are used unchanged.
|
||||
\param smooth If the normals shall be smoothed.
|
||||
\param angleWeighted If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision.
|
||||
*/
|
||||
virtual void recalculateTangents(IMesh* mesh,
|
||||
bool recalculateNormals=false, bool smooth=false,
|
||||
bool angleWeighted=false) const=0;
|
||||
|
||||
//! Recalculates tangents, requires a tangent mesh buffer
|
||||
/** \param buffer Meshbuffer on which the operation is performed.
|
||||
\param recalculateNormals If the normals shall be recalculated, otherwise original normals of the buffer are used unchanged.
|
||||
\param smooth If the normals shall be smoothed.
|
||||
\param angleWeighted If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision.
|
||||
*/
|
||||
virtual void recalculateTangents(IMeshBuffer* buffer,
|
||||
bool recalculateNormals=false, bool smooth=false,
|
||||
bool angleWeighted=false) const=0;
|
||||
|
||||
//! Scales the actual mesh, not a scene node.
|
||||
/** \param mesh Mesh on which the operation is performed.
|
||||
\param factor Scale factor for each axis. */
|
||||
@ -118,116 +60,6 @@ namespace scene
|
||||
apply(SVertexPositionScaleManipulator(factor), buffer, true);
|
||||
}
|
||||
|
||||
//! Scales the actual mesh, not a scene node.
|
||||
/** \deprecated Use scale() instead. This method may be removed by Irrlicht 1.9
|
||||
\param mesh Mesh on which the operation is performed.
|
||||
\param factor Scale factor for each axis. */
|
||||
_IRR_DEPRECATED_ void scaleMesh(IMesh* mesh, const core::vector3df& factor) const {return scale(mesh,factor);}
|
||||
|
||||
//! Scale the texture coords of a mesh.
|
||||
/** \param mesh Mesh on which the operation is performed.
|
||||
\param factor Vector which defines the scale for each axis.
|
||||
\param level Number of texture coord, starting from 1. Support for level 2 exists for LightMap buffers. */
|
||||
void scaleTCoords(scene::IMesh* mesh, const core::vector2df& factor, u32 level=1) const
|
||||
{
|
||||
apply(SVertexTCoordsScaleManipulator(factor, level), mesh);
|
||||
}
|
||||
|
||||
//! Scale the texture coords of a meshbuffer.
|
||||
/** \param buffer Meshbuffer on which the operation is performed.
|
||||
\param factor Vector which defines the scale for each axis.
|
||||
\param level Number of texture coord, starting from 1. Support for level 2 exists for LightMap buffers. */
|
||||
void scaleTCoords(scene::IMeshBuffer* buffer, const core::vector2df& factor, u32 level=1) const
|
||||
{
|
||||
apply(SVertexTCoordsScaleManipulator(factor, level), buffer);
|
||||
}
|
||||
|
||||
//! Applies a transformation to a mesh
|
||||
/** \param mesh Mesh on which the operation is performed.
|
||||
\param m transformation matrix.
|
||||
\param normalsUpdate When 0 - don't update normals.
|
||||
When 1 - update normals with inverse transposed of the transformation matrix
|
||||
*/
|
||||
void transform(IMesh* mesh, const core::matrix4& m, u32 normalsUpdate = 0) const
|
||||
{
|
||||
apply(SVertexPositionTransformManipulator(m), mesh, true);
|
||||
|
||||
if ( normalsUpdate == 1 )
|
||||
{
|
||||
core::matrix4 invT;
|
||||
if ( m.getInverse(invT) )
|
||||
{
|
||||
invT = invT.getTransposed();
|
||||
apply(SVertexNormalTransformManipulator(invT), mesh, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//! Applies a transformation to a meshbuffer
|
||||
/** \param buffer Meshbuffer on which the operation is performed.
|
||||
\param m transformation matrix.
|
||||
\param normalsUpdate When 0 - don't update normals.
|
||||
When 1 - update normals with inverse transposed of the transformation matrix
|
||||
*/
|
||||
void transform(IMeshBuffer* buffer, const core::matrix4& m, u32 normalsUpdate = 0) const
|
||||
{
|
||||
apply(SVertexPositionTransformManipulator(m), buffer, true);
|
||||
|
||||
if ( normalsUpdate == 1 )
|
||||
{
|
||||
core::matrix4 invT;
|
||||
if ( m.getInverse(invT) )
|
||||
{
|
||||
invT = invT.getTransposed();
|
||||
apply(SVertexNormalTransformManipulator(invT), buffer, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//! Applies a transformation to a mesh
|
||||
/** \deprecated Use transform() instead. This method may be removed by Irrlicht 1.9
|
||||
\param mesh Mesh on which the operation is performed.
|
||||
\param m transformation matrix. */
|
||||
_IRR_DEPRECATED_ virtual void transformMesh(IMesh* mesh, const core::matrix4& m) const {return transform(mesh,m);}
|
||||
|
||||
//! Creates a planar texture mapping on the mesh
|
||||
/** \param mesh: Mesh on which the operation is performed.
|
||||
\param resolution: resolution of the planar mapping. This is
|
||||
the value specifying which is the relation between world space
|
||||
and texture coordinate space. */
|
||||
virtual void makePlanarTextureMapping(IMesh* mesh, f32 resolution=0.001f) const=0;
|
||||
|
||||
//! Creates a planar texture mapping on the meshbuffer
|
||||
/** \param meshbuffer: Buffer on which the operation is performed.
|
||||
\param resolution: resolution of the planar mapping. This is
|
||||
the value specifying which is the relation between world space
|
||||
and texture coordinate space. */
|
||||
virtual void makePlanarTextureMapping(scene::IMeshBuffer* meshbuffer, f32 resolution=0.001f) const=0;
|
||||
|
||||
//! Creates a planar texture mapping on the buffer
|
||||
/** This method is currently implemented towards the LWO planar mapping. A more general biasing might be required.
|
||||
\param mesh Mesh on which the operation is performed.
|
||||
\param resolutionS Resolution of the planar mapping in horizontal direction. This is the ratio between object space and texture space.
|
||||
\param resolutionT Resolution of the planar mapping in vertical direction. This is the ratio between object space and texture space.
|
||||
\param axis The axis along which the texture is projected. The allowed values are 0 (X), 1(Y), and 2(Z).
|
||||
\param offset Vector added to the vertex positions (in object coordinates).
|
||||
*/
|
||||
virtual void makePlanarTextureMapping(scene::IMesh* mesh,
|
||||
f32 resolutionS, f32 resolutionT,
|
||||
u8 axis, const core::vector3df& offset) const=0;
|
||||
|
||||
//! Creates a planar texture mapping on the meshbuffer
|
||||
/** This method is currently implemented towards the LWO planar mapping. A more general biasing might be required.
|
||||
\param buffer Buffer on which the operation is performed.
|
||||
\param resolutionS Resolution of the planar mapping in horizontal direction. This is the ratio between object space and texture space.
|
||||
\param resolutionT Resolution of the planar mapping in vertical direction. This is the ratio between object space and texture space.
|
||||
\param axis The axis along which the texture is projected. The allowed values are 0 (X), 1(Y), and 2(Z).
|
||||
\param offset Vector added to the vertex positions (in object coordinates).
|
||||
*/
|
||||
virtual void makePlanarTextureMapping(scene::IMeshBuffer* buffer,
|
||||
f32 resolutionS, f32 resolutionT,
|
||||
u8 axis, const core::vector3df& offset) const=0;
|
||||
|
||||
//! Clones a static IMesh into a modifiable SMesh.
|
||||
/** All meshbuffers in the returned SMesh
|
||||
are of type SMeshBuffer or SMeshBufferLightMap.
|
||||
@ -237,59 +69,6 @@ namespace scene
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual SMesh* createMeshCopy(IMesh* mesh) const = 0;
|
||||
|
||||
//! Creates a copy of the mesh, which will only consist of S3DVertexTangents vertices.
|
||||
/** This is useful if you want to draw tangent space normal
|
||||
mapped geometry because it calculates the tangent and binormal
|
||||
data which is needed there.
|
||||
\param mesh Input mesh
|
||||
\param recalculateNormals The normals are recalculated if set,
|
||||
otherwise the original ones are kept. Note that keeping the
|
||||
normals may introduce inaccurate tangents if the normals are
|
||||
very different to those calculated from the faces.
|
||||
\param smooth The normals/tangents are smoothed across the
|
||||
meshbuffer's faces if this flag is set.
|
||||
\param angleWeighted Improved smoothing calculation used
|
||||
\param recalculateTangents Whether are actually calculated, or just the mesh with proper type is created.
|
||||
\return Mesh consisting only of S3DVertexTangents vertices. If
|
||||
you no longer need the cloned mesh, you should call
|
||||
IMesh::drop(). See IReferenceCounted::drop() for more
|
||||
information. */
|
||||
virtual IMesh* createMeshWithTangents(IMesh* mesh,
|
||||
bool recalculateNormals=false, bool smooth=false,
|
||||
bool angleWeighted=false, bool recalculateTangents=true) const=0;
|
||||
|
||||
//! Creates a copy of the mesh, which will only consist of S3DVertex2TCoord vertices.
|
||||
/** \param mesh Input mesh
|
||||
\return Mesh consisting only of S3DVertex2TCoord vertices. If
|
||||
you no longer need the cloned mesh, you should call
|
||||
IMesh::drop(). See IReferenceCounted::drop() for more
|
||||
information. */
|
||||
virtual IMesh* createMeshWith2TCoords(IMesh* mesh) const = 0;
|
||||
|
||||
//! Creates a copy of the mesh, which will only consist of S3DVertex vertices.
|
||||
/** \param mesh Input mesh
|
||||
\return Mesh consisting only of S3DVertex vertices. If
|
||||
you no longer need the cloned mesh, you should call
|
||||
IMesh::drop(). See IReferenceCounted::drop() for more
|
||||
information. */
|
||||
virtual IMesh* createMeshWith1TCoords(IMesh* mesh) const = 0;
|
||||
|
||||
//! Creates a copy of a mesh with all vertices unwelded
|
||||
/** \param mesh Input mesh
|
||||
\return Mesh consisting only of unique faces. All vertices
|
||||
which were previously shared are now duplicated. If you no
|
||||
longer need the cloned mesh, you should call IMesh::drop(). See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IMesh* createMeshUniquePrimitives(IMesh* mesh) const = 0;
|
||||
|
||||
//! Creates a copy of a mesh with vertices welded
|
||||
/** \param mesh Input mesh
|
||||
\param tolerance The threshold for vertex comparisons.
|
||||
\return Mesh without redundant vertices. If you no longer need
|
||||
the cloned mesh, you should call IMesh::drop(). See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IMesh* createMeshWelded(IMesh* mesh, f32 tolerance=core::ROUNDING_ERROR_f32) const = 0;
|
||||
|
||||
//! Get amount of polygons in mesh.
|
||||
/** \param mesh Input mesh
|
||||
\return Number of polygons in mesh. */
|
||||
@ -310,43 +89,6 @@ namespace scene
|
||||
virtual IAnimatedMesh * createAnimatedMesh(IMesh* mesh,
|
||||
scene::E_ANIMATED_MESH_TYPE type = scene::EAMT_UNKNOWN) const = 0;
|
||||
|
||||
//! Vertex cache optimization according to the Forsyth paper
|
||||
/** More information can be found at
|
||||
http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html
|
||||
|
||||
The function is thread-safe (read: you can optimize several
|
||||
meshes in different threads).
|
||||
|
||||
\param mesh Source mesh for the operation.
|
||||
\return A new mesh optimized for the vertex cache. */
|
||||
virtual IMesh* createForsythOptimizedMesh(const IMesh *mesh) const = 0;
|
||||
|
||||
//! Optimize the mesh with an algorithm tuned for heightmaps.
|
||||
/**
|
||||
This differs from usual simplification methods in two ways:
|
||||
- it's intended to be lossless
|
||||
- it has special care for the borders, which are useful with heightmap tiles
|
||||
|
||||
This function is thread-safe. Remember to weld afterwards - this
|
||||
function only moves vertices, it does not weld.
|
||||
|
||||
\param mesh Mesh to operate on.
|
||||
*/
|
||||
virtual void heightmapOptimizeMesh(IMesh * const mesh, const f32 tolerance = core::ROUNDING_ERROR_f32) const = 0;
|
||||
|
||||
//! Optimize the meshbuffer with an algorithm tuned for heightmaps.
|
||||
/**
|
||||
This differs from usual simplification methods in two ways:
|
||||
- it's intended to be lossless
|
||||
- it has special care for the borders, which are useful with heightmap tiles
|
||||
|
||||
This function is thread-safe. Remember to weld afterward - this
|
||||
function only moves vertices, it does not weld.
|
||||
|
||||
\param mb Meshbuffer to operate on.
|
||||
*/
|
||||
virtual void heightmapOptimizeMesh(IMeshBuffer * const mb, const f32 tolerance = core::ROUNDING_ERROR_f32) const = 0;
|
||||
|
||||
//! Apply a manipulator on the Meshbuffer
|
||||
/** \param func A functor defining the mesh manipulation.
|
||||
\param buffer The Meshbuffer to apply the manipulator to.
|
||||
|
@ -26,15 +26,26 @@ public:
|
||||
}
|
||||
|
||||
//! Copies text to the clipboard
|
||||
//! \param text: text in utf-8
|
||||
virtual void copyToClipboard(const c8* text) const = 0;
|
||||
|
||||
//! Copies text to the primary selection
|
||||
//! This is a no-op on some platforms.
|
||||
//! \param text: text in utf-8
|
||||
virtual void copyToPrimarySelection(const c8* text) const = 0;
|
||||
|
||||
//! Get text from the clipboard
|
||||
/** \return Returns 0 if no string is in there. */
|
||||
//! \return Returns 0 if no string is in there, otherwise an utf-8 string.
|
||||
virtual const c8* getTextFromClipboard() const = 0;
|
||||
|
||||
//! Get text from the primary selection
|
||||
//! This is a no-op on some platforms.
|
||||
//! \return Returns 0 if no string is in there, otherwise an utf-8 string.
|
||||
virtual const c8* getTextFromPrimarySelection() const = 0;
|
||||
|
||||
//! Get the total and available system RAM
|
||||
/** \param totalBytes: will contain the total system memory in bytes
|
||||
\param availableBytes: will contain the available memory in bytes
|
||||
/** \param totalBytes: will contain the total system memory in Kilobytes (1024 B)
|
||||
\param availableBytes: will contain the available memory in Kilobytes (1024 B)
|
||||
\return True if successful, false if not */
|
||||
virtual bool getSystemMemory(u32* totalBytes, u32* availableBytes) const = 0;
|
||||
|
||||
|
@ -1,480 +0,0 @@
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
// Written by Michael Zeilfelder
|
||||
|
||||
#ifndef __I_PROFILER_H_INCLUDED__
|
||||
#define __I_PROFILER_H_INCLUDED__
|
||||
|
||||
#include "IrrCompileConfig.h"
|
||||
#include "irrString.h"
|
||||
#include "irrArray.h"
|
||||
#include "ITimer.h"
|
||||
#include <limits.h> // for INT_MAX (we should have a S32_MAX...)
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
class ITimer;
|
||||
|
||||
//! Used to store the profile data (and also used for profile group data).
|
||||
struct SProfileData
|
||||
{
|
||||
friend class IProfiler;
|
||||
|
||||
SProfileData()
|
||||
{
|
||||
GroupIndex = 0;
|
||||
reset();
|
||||
}
|
||||
|
||||
bool operator<(const SProfileData& pd) const
|
||||
{
|
||||
return Id < pd.Id;
|
||||
}
|
||||
|
||||
bool operator==(const SProfileData& pd) const
|
||||
{
|
||||
return Id == pd.Id;
|
||||
}
|
||||
|
||||
u32 getGroupIndex() const
|
||||
{
|
||||
return GroupIndex;
|
||||
}
|
||||
|
||||
const core::stringw& getName() const
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
|
||||
//! Each time profiling for this data is stopped it increases the counter by 1.
|
||||
u32 getCallsCounter() const
|
||||
{
|
||||
return CountCalls;
|
||||
}
|
||||
|
||||
//! Longest time a profile call for this id took from start until it was stopped again.
|
||||
u32 getLongestTime() const
|
||||
{
|
||||
return LongestTime;
|
||||
}
|
||||
|
||||
//! Time spend between start/stop
|
||||
u32 getTimeSum() const
|
||||
{
|
||||
return TimeSum;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// just to be used for searching as it does no initialization besides id
|
||||
SProfileData(u32 id) : Id(id) {}
|
||||
|
||||
void reset()
|
||||
{
|
||||
CountCalls = 0;
|
||||
LongestTime = 0;
|
||||
TimeSum = 0;
|
||||
LastTimeStarted = 0;
|
||||
StartStopCounter = 0;
|
||||
}
|
||||
|
||||
s32 Id;
|
||||
u32 GroupIndex;
|
||||
core::stringw Name;
|
||||
|
||||
s32 StartStopCounter; // 0 means stopped > 0 means it runs.
|
||||
u32 CountCalls;
|
||||
u32 LongestTime;
|
||||
u32 TimeSum;
|
||||
|
||||
u32 LastTimeStarted;
|
||||
};
|
||||
|
||||
//! Code-profiler. Please check the example in the Irrlicht examples folder about how to use it.
|
||||
// Implementer notes:
|
||||
// The design is all about allowing to use the central start/stop mechanism with minimal time overhead.
|
||||
// This is why the class works without a virtual functions interface contrary to the usual Irrlicht design.
|
||||
// And also why it works with id's instead of strings in the start/stop functions even if it makes using
|
||||
// the class slightly harder.
|
||||
// The class comes without reference-counting because the profiler instance is never released (TBD).
|
||||
class IProfiler
|
||||
{
|
||||
public:
|
||||
//! Constructor. You could use this to create a new profiler, but usually getProfiler() is used to access the global instance.
|
||||
IProfiler() : Timer(0), NextAutoId(INT_MAX)
|
||||
{}
|
||||
|
||||
virtual ~IProfiler()
|
||||
{}
|
||||
|
||||
//! Add an id with given name and group which can be used for profiling with start/stop
|
||||
/** After calling this once you can start/stop profiling for the given id.
|
||||
\param id: Should be >= 0 as negative id's are reserved for Irrlicht. Also very large numbers (near INT_MAX) might
|
||||
have been added automatically by the other add function.
|
||||
\param name: Name for displaying profile data.
|
||||
\param groupName: Each id belongs into a group - this helps on displaying profile data. */
|
||||
inline void add(s32 id, const core::stringw &name, const core::stringw &groupName);
|
||||
|
||||
//! Add an automatically generated for the given name and group which can be used for profiling with start/stop.
|
||||
/** After calling this once you can start/stop profiling with the returned id.
|
||||
\param name: Name for displaying profile data.
|
||||
\param groupName: Each id belongs into a group - this helps on displaying profile data.
|
||||
\return Automatic id's start at INT_MAX and count down for each new id. If the name already has an id then that id will be returned. */
|
||||
inline s32 add(const core::stringw &name, const core::stringw &groupName);
|
||||
|
||||
//! Return the number of profile data blocks. There is one for each id.
|
||||
u32 getProfileDataCount() const
|
||||
{
|
||||
return ProfileDatas.size();
|
||||
}
|
||||
|
||||
//! Search for the index of the profile data by name
|
||||
/** \param result Receives the resulting data index when one was found.
|
||||
\param name String with name to search for
|
||||
\return true when found, false when not found */
|
||||
inline bool findDataIndex(u32 & result, const core::stringw &name) const;
|
||||
|
||||
//! Get the profile data
|
||||
/** \param index A value between 0 and getProfileDataCount()-1. Indices can change when new id's are added.*/
|
||||
const SProfileData& getProfileDataByIndex(u32 index) const
|
||||
{
|
||||
return ProfileDatas[index];
|
||||
}
|
||||
|
||||
//! Get the profile data
|
||||
/** \param id Same value as used in ::add
|
||||
\return Profile data for the given id or 0 when it does not exist. */
|
||||
inline const SProfileData* getProfileDataById(u32 id);
|
||||
|
||||
//! Get the number of profile groups. Will be at least 1.
|
||||
/** NOTE: The first groups is always L"overview" which is an overview for all existing groups */
|
||||
inline u32 getGroupCount() const
|
||||
{
|
||||
return ProfileGroups.size();
|
||||
}
|
||||
|
||||
//! Get profile data for a group.
|
||||
/** NOTE: The first groups is always L"overview" which is an overview for all existing groups */
|
||||
inline const SProfileData& getGroupData(u32 index) const
|
||||
{
|
||||
return ProfileGroups[index];
|
||||
}
|
||||
|
||||
//! Find the group index by the group-name
|
||||
/** \param result Receives the resulting group index when one was found.
|
||||
\param name String with name to search for
|
||||
\return true when found, false when not found */
|
||||
inline bool findGroupIndex(u32 & result, const core::stringw &name) const;
|
||||
|
||||
|
||||
//! Start profile-timing for the given id
|
||||
/** This increases an internal run-counter for the given id. It will profile as long as that counter is > 0.
|
||||
NOTE: you have to add the id first with one of the ::add functions
|
||||
*/
|
||||
inline void start(s32 id);
|
||||
|
||||
//! Stop profile-timing for the given id
|
||||
/** This increases an internal run-counter for the given id. If it reaches 0 the time since start is recorded.
|
||||
You should have the same amount of start and stop calls. If stop is called more often than start
|
||||
then the additional stop calls will be ignored (counter never goes below 0)
|
||||
*/
|
||||
inline void stop(s32 id);
|
||||
|
||||
//! Reset profile data for the given id
|
||||
inline void resetDataById(s32 id);
|
||||
|
||||
//! Reset profile data for the given index
|
||||
inline void resetDataByIndex(u32 index);
|
||||
|
||||
//! Reset profile data for a whole group
|
||||
inline void resetGroup(u32 index);
|
||||
|
||||
//! Reset all profile data
|
||||
/** NOTE: This is not deleting id's or groups, just resetting all timers to 0. */
|
||||
inline void resetAll();
|
||||
|
||||
//! Write all profile-data into a string
|
||||
/** \param result Receives the result string.
|
||||
\param includeOverview When true a group-overview is attached first
|
||||
\param suppressUncalled When true elements which got never called are not printed */
|
||||
virtual void printAll(core::stringw &result, bool includeOverview=false,bool suppressUncalled=true) const = 0;
|
||||
|
||||
//! Write the profile data of one group into a string
|
||||
/** \param result Receives the result string.
|
||||
\param groupIndex_ */
|
||||
virtual void printGroup(core::stringw &result, u32 groupIndex, bool suppressUncalled) const = 0;
|
||||
|
||||
protected:
|
||||
|
||||
inline u32 addGroup(const core::stringw &name);
|
||||
|
||||
// I would prefer using os::Timer, but os.h is not in the public interface so far.
|
||||
// Timer must be initialized by the implementation.
|
||||
ITimer * Timer;
|
||||
core::array<SProfileData> ProfileDatas;
|
||||
core::array<SProfileData> ProfileGroups;
|
||||
|
||||
private:
|
||||
s32 NextAutoId; // for giving out id's automatically
|
||||
};
|
||||
|
||||
//! Access the Irrlicht profiler object.
|
||||
/** Profiler is always accessible, except in destruction of global objects.
|
||||
If you want to get internal profiling information about the engine itself
|
||||
you will have to re-compile the engine with _IRR_COMPILE_WITH_PROFILING_ enabled.
|
||||
But you can use the profiler for profiling your own projects without that. */
|
||||
IRRLICHT_API IProfiler& IRRCALLCONV getProfiler();
|
||||
|
||||
//! Class where the objects profile their own life-time.
|
||||
/** This is a comfort wrapper around the IProfiler start/stop mechanism which is easier to use
|
||||
when you want to profile a scope. You only have to create an object and it will profile it's own lifetime
|
||||
for the given id. */
|
||||
class CProfileScope
|
||||
{
|
||||
public:
|
||||
//! Construct with an known id.
|
||||
/** This is the fastest scope constructor, but the id must have been added before.
|
||||
\param id Any id which you did add to the profiler before. */
|
||||
CProfileScope(s32 id)
|
||||
: Id(id), Profiler(getProfiler())
|
||||
{
|
||||
Profiler.start(Id);
|
||||
}
|
||||
|
||||
//! Object will create the given name, groupName combination for the id if it doesn't exist already
|
||||
/** \param id: Should be >= 0 as negative id's are reserved for Irrlicht. Also very large numbers (near INT_MAX) might
|
||||
have been created already by the automatic add function of ::IProfiler.
|
||||
\param name: Name for displaying profile data.
|
||||
\param groupName: Each id belongs into a group - this helps on displaying profile data. */
|
||||
CProfileScope(s32 id, const core::stringw &name, const core::stringw &groupName)
|
||||
: Id(id), Profiler(getProfiler())
|
||||
{
|
||||
Profiler.add(Id, name, groupName);
|
||||
Profiler.start(Id);
|
||||
}
|
||||
|
||||
//! Object will create an id for the given name, groupName combination if they don't exist already
|
||||
/** Slowest scope constructor, but usually still fine unless speed is very critical.
|
||||
\param name: Name for displaying profile data.
|
||||
\param groupName: Each id belongs into a group - this helps on displaying profile data. */
|
||||
CProfileScope(const core::stringw &name, const core::stringw &groupName)
|
||||
: Profiler(getProfiler())
|
||||
{
|
||||
Id = Profiler.add(name, groupName);
|
||||
Profiler.start(Id);
|
||||
}
|
||||
|
||||
~CProfileScope()
|
||||
{
|
||||
Profiler.stop(Id);
|
||||
}
|
||||
|
||||
protected:
|
||||
s32 Id;
|
||||
IProfiler& Profiler;
|
||||
};
|
||||
|
||||
|
||||
// IMPLEMENTATION for in-line stuff
|
||||
|
||||
void IProfiler::start(s32 id)
|
||||
{
|
||||
s32 idx = ProfileDatas.binary_search(SProfileData(id));
|
||||
if ( idx >= 0 && Timer )
|
||||
{
|
||||
++ProfileDatas[idx].StartStopCounter;
|
||||
if (ProfileDatas[idx].StartStopCounter == 1 )
|
||||
ProfileDatas[idx].LastTimeStarted = Timer->getRealTime();
|
||||
}
|
||||
}
|
||||
|
||||
void IProfiler::stop(s32 id)
|
||||
{
|
||||
if ( Timer )
|
||||
{
|
||||
u32 timeNow = Timer->getRealTime();
|
||||
s32 idx = ProfileDatas.binary_search(SProfileData(id));
|
||||
if ( idx >= 0 )
|
||||
{
|
||||
SProfileData &data = ProfileDatas[idx];
|
||||
--ProfileDatas[idx].StartStopCounter;
|
||||
if ( data.LastTimeStarted != 0 && ProfileDatas[idx].StartStopCounter == 0)
|
||||
{
|
||||
// update data for this id
|
||||
++data.CountCalls;
|
||||
u32 diffTime = timeNow - data.LastTimeStarted;
|
||||
data.TimeSum += diffTime;
|
||||
if ( diffTime > data.LongestTime )
|
||||
data.LongestTime = diffTime;
|
||||
data.LastTimeStarted = 0;
|
||||
|
||||
// update data of it's group
|
||||
SProfileData & group = ProfileGroups[data.GroupIndex];
|
||||
++group.CountCalls;
|
||||
group.TimeSum += diffTime;
|
||||
if ( diffTime > group.LongestTime )
|
||||
group.LongestTime = diffTime;
|
||||
group.LastTimeStarted = 0;
|
||||
}
|
||||
else if ( ProfileDatas[idx].StartStopCounter < 0 )
|
||||
{
|
||||
// ignore additional stop calls
|
||||
ProfileDatas[idx].StartStopCounter = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
s32 IProfiler::add(const core::stringw &name, const core::stringw &groupName)
|
||||
{
|
||||
u32 index;
|
||||
if ( findDataIndex(index, name) )
|
||||
{
|
||||
add( ProfileDatas[index].Id, name, groupName );
|
||||
return ProfileDatas[index].Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
s32 id = NextAutoId;
|
||||
--NextAutoId;
|
||||
add( id, name, groupName );
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
||||
void IProfiler::add(s32 id, const core::stringw &name, const core::stringw &groupName)
|
||||
{
|
||||
u32 groupIdx;
|
||||
if ( !findGroupIndex(groupIdx, groupName) )
|
||||
{
|
||||
groupIdx = addGroup(groupName);
|
||||
}
|
||||
|
||||
SProfileData data(id);
|
||||
s32 idx = ProfileDatas.binary_search(data);
|
||||
if ( idx < 0 )
|
||||
{
|
||||
data.reset();
|
||||
data.GroupIndex = groupIdx;
|
||||
data.Name = name;
|
||||
|
||||
ProfileDatas.push_back(data);
|
||||
ProfileDatas.sort();
|
||||
}
|
||||
else
|
||||
{
|
||||
// only reset on group changes, otherwise we want to keep the data or coding CProfileScope would become tricky.
|
||||
if ( groupIdx != ProfileDatas[idx].GroupIndex )
|
||||
{
|
||||
resetDataByIndex((u32)idx);
|
||||
ProfileDatas[idx].GroupIndex = groupIdx;
|
||||
}
|
||||
ProfileDatas[idx].Name = name;
|
||||
}
|
||||
}
|
||||
|
||||
u32 IProfiler::addGroup(const core::stringw &name)
|
||||
{
|
||||
SProfileData group;
|
||||
group.Id = -1; // Id for groups doesn't matter so far
|
||||
group.Name = name;
|
||||
ProfileGroups.push_back(group);
|
||||
return ProfileGroups.size()-1;
|
||||
}
|
||||
|
||||
bool IProfiler::findDataIndex(u32 & result, const core::stringw &name) const
|
||||
{
|
||||
for ( u32 i=0; i < ProfileDatas.size(); ++i )
|
||||
{
|
||||
if ( ProfileDatas[i].Name == name )
|
||||
{
|
||||
result = i;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const SProfileData* IProfiler::getProfileDataById(u32 id)
|
||||
{
|
||||
SProfileData data(id);
|
||||
s32 idx = ProfileDatas.binary_search(data);
|
||||
if ( idx >= 0 )
|
||||
return &ProfileDatas[idx];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool IProfiler::findGroupIndex(u32 & result, const core::stringw &name) const
|
||||
{
|
||||
for ( u32 i=0; i < ProfileGroups.size(); ++i )
|
||||
{
|
||||
if ( ProfileGroups[i].Name == name )
|
||||
{
|
||||
result = i;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void IProfiler::resetDataById(s32 id)
|
||||
{
|
||||
s32 idx = ProfileDatas.binary_search(SProfileData(id));
|
||||
if ( idx >= 0 )
|
||||
{
|
||||
resetDataByIndex((u32)idx);
|
||||
}
|
||||
}
|
||||
|
||||
void IProfiler::resetDataByIndex(u32 index)
|
||||
{
|
||||
SProfileData &data = ProfileDatas[index];
|
||||
|
||||
SProfileData & group = ProfileGroups[data.GroupIndex];
|
||||
group.CountCalls -= data.CountCalls;
|
||||
group.TimeSum -= data.TimeSum;
|
||||
|
||||
data.reset();
|
||||
}
|
||||
|
||||
//! Reset profile data for a whole group
|
||||
void IProfiler::resetGroup(u32 index)
|
||||
{
|
||||
for ( u32 i=0; i<ProfileDatas.size(); ++i )
|
||||
{
|
||||
if ( ProfileDatas[i].GroupIndex == index )
|
||||
ProfileDatas[i].reset();
|
||||
}
|
||||
if ( index < ProfileGroups.size() )
|
||||
ProfileGroups[index].reset();
|
||||
}
|
||||
|
||||
void IProfiler::resetAll()
|
||||
{
|
||||
for ( u32 i=0; i<ProfileDatas.size(); ++i )
|
||||
{
|
||||
ProfileDatas[i].reset();
|
||||
}
|
||||
|
||||
for ( u32 i=0; i<ProfileGroups.size(); ++i )
|
||||
{
|
||||
ProfileGroups[i].reset();
|
||||
}
|
||||
}
|
||||
|
||||
//! For internal engine use:
|
||||
//! Code inside IRR_PROFILE is only executed when _IRR_COMPILE_WITH_PROFILING_ is set
|
||||
//! This allows disabling all profiler code completely by changing that define.
|
||||
//! It's generally useful to wrap profiler-calls in application code with a similar macro.
|
||||
#ifdef _IRR_COMPILE_WITH_PROFILING_
|
||||
#define IRR_PROFILE(X) X
|
||||
#else
|
||||
#define IRR_PROFILE(X)
|
||||
#endif // IRR_PROFILE
|
||||
|
||||
} // namespace irr
|
||||
|
||||
#endif // __I_PROFILER_H_INCLUDED__
|
@ -1,33 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_RANDOMIZER_H_INCLUDED__
|
||||
#define __I_RANDOMIZER_H_INCLUDED__
|
||||
|
||||
#include "IReferenceCounted.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
//! Interface for generating random numbers
|
||||
class IRandomizer : public virtual IReferenceCounted
|
||||
{
|
||||
public:
|
||||
//! resets the randomizer
|
||||
/** \param value Initialization value (seed) */
|
||||
virtual void reset(s32 value=0x0f0f0f0f) =0;
|
||||
|
||||
//! generates a pseudo random number in the range 0..randMax()
|
||||
virtual s32 rand() const =0;
|
||||
|
||||
//! generates a pseudo random number in the range 0..1
|
||||
virtual f32 frand() const =0;
|
||||
|
||||
//! get maxmimum number generated by rand()
|
||||
virtual s32 randMax() const =0;
|
||||
};
|
||||
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
@ -7,10 +7,6 @@
|
||||
|
||||
#include "irrTypes.h"
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_LEAK_HUNTER_
|
||||
#include "leakHunter.h"
|
||||
#endif
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
@ -50,17 +46,11 @@ namespace irr
|
||||
IReferenceCounted()
|
||||
: DebugName(0), ReferenceCounter(1)
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_LEAK_HUNTER_
|
||||
LeakHunter::addObject(this);
|
||||
#endif
|
||||
}
|
||||
|
||||
//! Destructor.
|
||||
virtual ~IReferenceCounted()
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_LEAK_HUNTER_
|
||||
LeakHunter::removeObject(this);
|
||||
#endif
|
||||
}
|
||||
|
||||
//! Grabs the object. Increments the reference counter by one.
|
||||
|
@ -1,62 +0,0 @@
|
||||
// Copyright (C) 2010-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_SCENE_LOADER_H_INCLUDED__
|
||||
#define __I_SCENE_LOADER_H_INCLUDED__
|
||||
|
||||
#include "IReferenceCounted.h"
|
||||
#include "path.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
class IReadFile;
|
||||
} // end namespace io
|
||||
namespace scene
|
||||
{
|
||||
class ISceneNode;
|
||||
class ISceneUserDataSerializer;
|
||||
|
||||
//! Class which can load a scene into the scene manager.
|
||||
/** If you want Irrlicht to be able to load currently unsupported
|
||||
scene file formats (e.g. .vrml), then implement this and add your
|
||||
new Sceneloader to the engine with ISceneManager::addExternalSceneLoader(). */
|
||||
class ISceneLoader : public virtual IReferenceCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Returns true if the class might be able to load this file.
|
||||
/** This decision should be based on the file extension (e.g. ".vrml")
|
||||
only.
|
||||
\param filename Name of the file to test.
|
||||
\return True if the extension is a recognised type. */
|
||||
virtual bool isALoadableFileExtension(const io::path& filename) const = 0;
|
||||
|
||||
//! Returns true if the class might be able to load this file.
|
||||
/** This decision will be based on a quick look at the contents of the file.
|
||||
\param file The file to test.
|
||||
\return True if the extension is a recognised type. */
|
||||
virtual bool isALoadableFileFormat(io::IReadFile* file) const = 0;
|
||||
|
||||
//! Loads the scene into the scene manager.
|
||||
/** \param file File which contains the scene.
|
||||
\param userDataSerializer: If you want to load user data which may be attached
|
||||
to some some scene nodes in the file, implement the ISceneUserDataSerializer
|
||||
interface and provide it as parameter here. Otherwise, simply specify 0 as this
|
||||
parameter.
|
||||
\param rootNode The node to load the scene into, if none is provided then the
|
||||
scene will be loaded into the root node.
|
||||
\return Returns true on success, false on failure. Returns 0 if loading failed. */
|
||||
virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0,
|
||||
ISceneNode* rootNode=0) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include "vector3d.h"
|
||||
#include "dimension2d.h"
|
||||
#include "SColor.h"
|
||||
#include "ETerrainElements.h"
|
||||
#include "ESceneNodeTypes.h"
|
||||
#include "EMeshWriterEnums.h"
|
||||
#include "SceneParameters.h"
|
||||
@ -111,10 +110,8 @@ namespace scene
|
||||
class IMeshManipulator;
|
||||
class IMeshSceneNode;
|
||||
class IMeshWriter;
|
||||
class ISceneLoader;
|
||||
class ISceneNode;
|
||||
class ISceneNodeFactory;
|
||||
class ISceneUserDataSerializer;
|
||||
|
||||
//! The Scene Manager manages scene nodes, mesh resources, cameras and all the other stuff.
|
||||
/** All Scene nodes can be created only here.
|
||||
@ -321,20 +318,10 @@ namespace scene
|
||||
* \endcode
|
||||
* If you would like to implement and add your own file format loader to Irrlicht,
|
||||
* see addExternalMeshLoader().
|
||||
* \param filename: Filename of the mesh to load.
|
||||
* \param alternativeCacheName: In case you want to have the mesh under another name in the cache (to create real copies)
|
||||
* \param file File handle of the mesh to load.
|
||||
* \return Null if failed, otherwise pointer to the mesh.
|
||||
* This pointer should not be dropped. See IReferenceCounted::drop() for more information.
|
||||
**/
|
||||
virtual IAnimatedMesh* getMesh(const io::path& filename, const io::path& alternativeCacheName=io::path("")) = 0;
|
||||
|
||||
//! Get pointer to an animateable mesh. Loads the file if not loaded already.
|
||||
/** Works just as getMesh(const char* filename). If you want to
|
||||
remove a loaded mesh from the cache again, use removeMesh().
|
||||
\param file File handle of the mesh to load.
|
||||
\return NULL if failed and pointer to the mesh if successful.
|
||||
This pointer should not be dropped. See
|
||||
IReferenceCounted::drop() for more information. */
|
||||
virtual IAnimatedMesh* getMesh(io::IReadFile* file) = 0;
|
||||
|
||||
//! Get interface to the mesh cache which is shared between all existing scene managers.
|
||||
@ -348,16 +335,6 @@ namespace scene
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
virtual video::IVideoDriver* getVideoDriver() = 0;
|
||||
|
||||
//! Get the active GUIEnvironment
|
||||
/** \return Pointer to the GUIEnvironment
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
virtual gui::IGUIEnvironment* getGUIEnvironment() = 0;
|
||||
|
||||
//! Get the active FileSystem
|
||||
/** \return Pointer to the FileSystem
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
virtual io::IFileSystem* getFileSystem() = 0;
|
||||
|
||||
//! Adds a scene node for rendering an animated mesh model.
|
||||
/** \param mesh: Pointer to the loaded animated mesh to be displayed.
|
||||
\param parent: Parent of the scene node. Can be NULL if no parent.
|
||||
@ -561,24 +538,6 @@ namespace scene
|
||||
\return A pointer to the specified loader, 0 if the index is incorrect. */
|
||||
virtual IMeshLoader* getMeshLoader(u32 index) const = 0;
|
||||
|
||||
//! Adds an external scene loader for extending the engine with new file formats.
|
||||
/** If you want the engine to be extended with
|
||||
file formats it currently is not able to load (e.g. .vrml), just implement
|
||||
the ISceneLoader interface in your loading class and add it with this method.
|
||||
Using this method it is also possible to override the built-in scene loaders
|
||||
with newer or updated versions without the need to recompile the engine.
|
||||
\param externalLoader: Implementation of a new mesh loader. */
|
||||
virtual void addExternalSceneLoader(ISceneLoader* externalLoader) = 0;
|
||||
|
||||
//! Returns the number of scene loaders supported by Irrlicht at this time
|
||||
virtual u32 getSceneLoaderCount() const = 0;
|
||||
|
||||
//! Retrieve the given scene loader
|
||||
/** \param index The index of the loader to retrieve. This parameter is an 0-based
|
||||
array index.
|
||||
\return A pointer to the specified loader, 0 if the index is incorrect. */
|
||||
virtual ISceneLoader* getSceneLoader(u32 index) const = 0;
|
||||
|
||||
//! Get pointer to the scene collision manager.
|
||||
/** \return Pointer to the collision manager
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
@ -623,32 +582,6 @@ namespace scene
|
||||
pass currently is active they can render the correct part of their geometry. */
|
||||
virtual E_SCENE_NODE_RENDER_PASS getSceneNodeRenderPass() const = 0;
|
||||
|
||||
//! Get the default scene node factory which can create all built in scene nodes
|
||||
/** \return Pointer to the default scene node factory
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
virtual ISceneNodeFactory* getDefaultSceneNodeFactory() = 0;
|
||||
|
||||
//! Adds a scene node factory to the scene manager.
|
||||
/** Use this to extend the scene manager with new scene node types which it should be
|
||||
able to create automatically, for example when loading data from xml files. */
|
||||
virtual void registerSceneNodeFactory(ISceneNodeFactory* factoryToAdd) = 0;
|
||||
|
||||
//! Get amount of registered scene node factories.
|
||||
virtual u32 getRegisteredSceneNodeFactoryCount() const = 0;
|
||||
|
||||
//! Get a scene node factory by index
|
||||
/** \return Pointer to the requested scene node factory, or 0 if it does not exist.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
virtual ISceneNodeFactory* getSceneNodeFactory(u32 index) = 0;
|
||||
|
||||
//! Get typename from a scene node type or null if not found
|
||||
virtual const c8* getSceneNodeTypeName(ESCENE_NODE_TYPE type) = 0;
|
||||
|
||||
//! Adds a scene node to the scene by name
|
||||
/** \return Pointer to the scene node added by a factory
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
virtual ISceneNode* addSceneNode(const char* sceneNodeTypeName, ISceneNode* parent=0) = 0;
|
||||
|
||||
//! Creates a new scene manager.
|
||||
/** This can be used to easily draw and/or store two
|
||||
independent scenes at the same time. The mesh cache will be
|
||||
@ -670,80 +603,6 @@ namespace scene
|
||||
See IReferenceCounted::drop() for more information. */
|
||||
virtual ISceneManager* createNewSceneManager(bool cloneContent=false) = 0;
|
||||
|
||||
//! Saves the current scene into a file.
|
||||
/** Scene nodes with the option isDebugObject set to true are
|
||||
not being saved. The scene is usually written to an .irr file,
|
||||
an xml based format. .irr files can Be edited with the Irrlicht
|
||||
Engine Editor, irrEdit (http://www.ambiera.com/irredit/). To
|
||||
load .irr files again, see ISceneManager::loadScene().
|
||||
\param filename Name of the file.
|
||||
\param userDataSerializer If you want to save some user data
|
||||
for every scene node into the file, implement the
|
||||
ISceneUserDataSerializer interface and provide it as parameter
|
||||
here. Otherwise, simply specify 0 as this parameter.
|
||||
\param node Node which is taken as the top node of the scene.
|
||||
This node and all of its descendants are saved into the scene
|
||||
file. Pass 0 or the scene manager to save the full scene (which
|
||||
is also the default).
|
||||
\return True if successful. */
|
||||
virtual bool saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0;
|
||||
|
||||
//! Saves the current scene into a file.
|
||||
/** Scene nodes with the option isDebugObject set to true are
|
||||
not being saved. The scene is usually written to an .irr file,
|
||||
an xml based format. .irr files can Be edited with the Irrlicht
|
||||
Engine Editor, irrEdit (http://www.ambiera.com/irredit/). To
|
||||
load .irr files again, see ISceneManager::loadScene().
|
||||
\param file File where the scene is saved into.
|
||||
\param userDataSerializer If you want to save some user data
|
||||
for every scene node into the file, implement the
|
||||
ISceneUserDataSerializer interface and provide it as parameter
|
||||
here. Otherwise, simply specify 0 as this parameter.
|
||||
\param node Node which is taken as the top node of the scene.
|
||||
This node and all of its descendants are saved into the scene
|
||||
file. Pass 0 or the scene manager to save the full scene (which
|
||||
is also the default).
|
||||
\return True if successful. */
|
||||
virtual bool saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0;
|
||||
|
||||
//! Loads a scene. Note that the current scene is not cleared before.
|
||||
/** The scene is usually loaded from an .irr file, an xml based
|
||||
format, but other scene formats can be added to the engine via
|
||||
ISceneManager::addExternalSceneLoader. .irr files can Be edited
|
||||
with the Irrlicht Engine Editor, irrEdit
|
||||
(http://www.ambiera.com/irredit/) or saved directly by the engine
|
||||
using ISceneManager::saveScene().
|
||||
\param filename Name of the file to load from.
|
||||
\param userDataSerializer If you want to load user data
|
||||
possibily saved in that file for some scene nodes in the file,
|
||||
implement the ISceneUserDataSerializer interface and provide it
|
||||
as parameter here. Otherwise, simply specify 0 as this
|
||||
parameter.
|
||||
\param rootNode Node which is taken as the root node of the
|
||||
scene. Pass 0 to add the scene directly to the scene manager
|
||||
(which is also the default).
|
||||
\return True if successful. */
|
||||
virtual bool loadScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* rootNode=0) = 0;
|
||||
|
||||
//! Loads a scene. Note that the current scene is not cleared before.
|
||||
/** The scene is usually loaded from an .irr file, an xml based
|
||||
format, but other scene formats can be added to the engine via
|
||||
ISceneManager::addExternalSceneLoader. .irr files can Be edited
|
||||
with the Irrlicht Engine Editor, irrEdit
|
||||
(http://www.ambiera.com/irredit/) or saved directly by the engine
|
||||
using ISceneManager::saveScene().
|
||||
\param file File where the scene is loaded from.
|
||||
\param userDataSerializer If you want to load user data
|
||||
saved in that file for some scene nodes in the file,
|
||||
implement the ISceneUserDataSerializer interface and provide it
|
||||
as parameter here. Otherwise, simply specify 0 as this
|
||||
parameter.
|
||||
\param rootNode Node which is taken as the root node of the
|
||||
scene. Pass 0 to add the scene directly to the scene manager
|
||||
(which is also the default).
|
||||
\return True if successful. */
|
||||
virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* rootNode=0) = 0;
|
||||
|
||||
//! Get a mesh writer implementation if available
|
||||
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
|
||||
for details. */
|
||||
|
@ -5,7 +5,7 @@
|
||||
#ifndef __I_SCENE_NODE_H_INCLUDED__
|
||||
#define __I_SCENE_NODE_H_INCLUDED__
|
||||
|
||||
#include "IAttributeExchangingObject.h"
|
||||
#include "IReferenceCounted.h"
|
||||
#include "ESceneNodeTypes.h"
|
||||
#include "ECullingTypes.h"
|
||||
#include "EDebugSceneTypes.h"
|
||||
@ -13,8 +13,8 @@
|
||||
#include "irrString.h"
|
||||
#include "aabbox3d.h"
|
||||
#include "matrix4.h"
|
||||
#include "irrList.h"
|
||||
#include "IAttributes.h"
|
||||
#include <list>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -24,7 +24,7 @@ namespace scene
|
||||
class ISceneManager;
|
||||
|
||||
//! Typedef for list of scene nodes
|
||||
typedef core::list<ISceneNode*> ISceneNodeList;
|
||||
typedef std::list<ISceneNode*> ISceneNodeList;
|
||||
|
||||
//! Scene node interface.
|
||||
/** A scene node is a node in the hierarchical scene graph. Every scene
|
||||
@ -34,7 +34,7 @@ namespace scene
|
||||
example easily possible to attach a light to a moving car, or to place
|
||||
a walking character on a moving platform on a moving ship.
|
||||
*/
|
||||
class ISceneNode : virtual public io::IAttributeExchangingObject
|
||||
class ISceneNode : virtual public IReferenceCounted
|
||||
{
|
||||
public:
|
||||
|
||||
@ -81,7 +81,7 @@ namespace scene
|
||||
{
|
||||
if (IsVisible)
|
||||
{
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->OnRegisterSceneNode();
|
||||
}
|
||||
@ -103,7 +103,7 @@ namespace scene
|
||||
|
||||
// perform the post render process on all children
|
||||
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->OnAnimate(timeMs);
|
||||
}
|
||||
@ -289,7 +289,7 @@ namespace scene
|
||||
e.g. because it couldn't be found in the children list. */
|
||||
virtual bool removeChild(ISceneNode* child)
|
||||
{
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
if ((*it) == child)
|
||||
{
|
||||
@ -309,7 +309,7 @@ namespace scene
|
||||
*/
|
||||
virtual void removeAll()
|
||||
{
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
{
|
||||
(*it)->Parent = 0;
|
||||
@ -352,38 +352,14 @@ namespace scene
|
||||
}
|
||||
|
||||
|
||||
//! Sets all material flags at once to a new value.
|
||||
/** Useful, for example, if you want the whole mesh to be
|
||||
affected by light.
|
||||
\param flag Which flag of all materials to be set.
|
||||
\param newvalue New value of that flag. */
|
||||
void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue)
|
||||
{
|
||||
for (u32 i=0; i<getMaterialCount(); ++i)
|
||||
getMaterial(i).setFlag(flag, newvalue);
|
||||
}
|
||||
|
||||
|
||||
//! Sets the texture of the specified layer in all materials of this scene node to the new texture.
|
||||
/** \param textureLayer Layer of texture to be set. Must be a
|
||||
value smaller than MATERIAL_MAX_TEXTURES.
|
||||
\param texture New texture to be used. */
|
||||
void setMaterialTexture(u32 textureLayer, video::ITexture* texture)
|
||||
{
|
||||
if (textureLayer >= video::MATERIAL_MAX_TEXTURES)
|
||||
return;
|
||||
|
||||
for (u32 i=0; i<getMaterialCount(); ++i)
|
||||
getMaterial(i).setTexture(textureLayer, texture);
|
||||
}
|
||||
|
||||
|
||||
//! Sets the material type of all materials in this scene node to a new material type.
|
||||
/** \param newType New type of material to be set. */
|
||||
void setMaterialType(video::E_MATERIAL_TYPE newType)
|
||||
{
|
||||
for (u32 i=0; i<getMaterialCount(); ++i)
|
||||
getMaterial(i).MaterialType = newType;
|
||||
//! Execute a function on all materials of this scene node.
|
||||
/** Useful for setting material properties, e.g. if you want the whole
|
||||
mesh to be affected by light. */
|
||||
template <typename F>
|
||||
void forEachMaterial(F &&fn) {
|
||||
for (u32 i = 0; i < getMaterialCount(); i++) {
|
||||
fn(getMaterial(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -519,7 +495,7 @@ namespace scene
|
||||
|
||||
//! Returns a const reference to the list of all children.
|
||||
/** \return The list of all children of this node. */
|
||||
const core::list<ISceneNode*>& getChildren() const
|
||||
const std::list<ISceneNode*>& getChildren() const
|
||||
{
|
||||
return Children;
|
||||
}
|
||||
@ -571,67 +547,6 @@ namespace scene
|
||||
return ESNT_UNKNOWN;
|
||||
}
|
||||
|
||||
|
||||
//! Writes attributes of the scene node.
|
||||
/** Implement this to expose the attributes of your scene node
|
||||
for scripting languages, editors, debuggers or xml
|
||||
serialization purposes.
|
||||
\param out The attribute container to write into.
|
||||
\param options Additional options which might influence the
|
||||
serialization. */
|
||||
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const _IRR_OVERRIDE_
|
||||
{
|
||||
if (!out)
|
||||
return;
|
||||
out->addString("Name", Name.c_str());
|
||||
out->addInt("Id", ID );
|
||||
|
||||
out->addVector3d("Position", getPosition() );
|
||||
out->addVector3d("Rotation", getRotation() );
|
||||
out->addVector3d("Scale", getScale() );
|
||||
|
||||
out->addBool("Visible", IsVisible );
|
||||
out->addInt("AutomaticCulling", AutomaticCullingState);
|
||||
out->addInt("DebugDataVisible", DebugDataVisible );
|
||||
out->addBool("IsDebugObject", IsDebugObject );
|
||||
}
|
||||
|
||||
|
||||
//! Reads attributes of the scene node.
|
||||
/** Implement this to set the attributes of your scene node for
|
||||
scripting languages, editors, debuggers or xml deserialization
|
||||
purposes.
|
||||
\param in The attribute container to read from.
|
||||
\param options Additional options which might influence the
|
||||
deserialization. */
|
||||
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) _IRR_OVERRIDE_
|
||||
{
|
||||
if (!in)
|
||||
return;
|
||||
Name = in->getAttributeAsString("Name", Name);
|
||||
ID = in->getAttributeAsInt("Id", ID);
|
||||
|
||||
setPosition(in->getAttributeAsVector3d("Position", RelativeTranslation));
|
||||
setRotation(in->getAttributeAsVector3d("Rotation", RelativeRotation));
|
||||
setScale(in->getAttributeAsVector3d("Scale", RelativeScale));
|
||||
|
||||
IsVisible = in->getAttributeAsBool("Visible", IsVisible);
|
||||
if (in->existsAttribute("AutomaticCulling"))
|
||||
{
|
||||
s32 tmpState = in->getAttributeAsEnumeration("AutomaticCulling",
|
||||
scene::AutomaticCullingNames);
|
||||
if (tmpState != -1)
|
||||
AutomaticCullingState = (u32)tmpState;
|
||||
else
|
||||
AutomaticCullingState = in->getAttributeAsInt("AutomaticCulling");
|
||||
}
|
||||
|
||||
DebugDataVisible = in->getAttributeAsInt("DebugDataVisible", DebugDataVisible);
|
||||
IsDebugObject = in->getAttributeAsBool("IsDebugObject", IsDebugObject);
|
||||
|
||||
updateAbsolutePosition();
|
||||
}
|
||||
|
||||
//! Creates a clone of this scene node and its children.
|
||||
/** \param newParent An optional new parent.
|
||||
\param newManager An optional new scene manager.
|
||||
@ -672,7 +587,7 @@ namespace scene
|
||||
|
||||
// clone children
|
||||
|
||||
ISceneNodeList::Iterator it = toCopyFrom->Children.begin();
|
||||
ISceneNodeList::iterator it = toCopyFrom->Children.begin();
|
||||
for (; it != toCopyFrom->Children.end(); ++it)
|
||||
(*it)->clone(this, newManager);
|
||||
}
|
||||
@ -683,7 +598,7 @@ namespace scene
|
||||
{
|
||||
SceneManager = newManager;
|
||||
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->setSceneManager(newManager);
|
||||
}
|
||||
@ -707,7 +622,7 @@ namespace scene
|
||||
ISceneNode* Parent;
|
||||
|
||||
//! List of all children of this node
|
||||
core::list<ISceneNode*> Children;
|
||||
std::list<ISceneNode*> Children;
|
||||
|
||||
//! Pointer to the scene manager
|
||||
ISceneManager* SceneManager;
|
||||
|
@ -1,68 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_SCENE_NODE_FACTORY_H_INCLUDED__
|
||||
#define __I_SCENE_NODE_FACTORY_H_INCLUDED__
|
||||
|
||||
#include "IReferenceCounted.h"
|
||||
#include "ESceneNodeTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
namespace scene
|
||||
{
|
||||
class ISceneNode;
|
||||
|
||||
//! Interface for dynamic creation of scene nodes
|
||||
/** To be able to add custom scene nodes to Irrlicht and to make it possible for the
|
||||
scene manager to save and load those external scene nodes, simply implement this
|
||||
interface and register it in you scene manager via ISceneManager::registerSceneNodeFactory.
|
||||
Note: When implementing your own scene node factory, don't call ISceneNodeManager::grab() to
|
||||
increase the reference counter of the scene node manager. This is not necessary because the
|
||||
scene node manager will grab() the factory anyway, and otherwise cyclic references will
|
||||
be created and the scene manager and all its nodes won't get deallocated.
|
||||
*/
|
||||
class ISceneNodeFactory : public virtual IReferenceCounted
|
||||
{
|
||||
public:
|
||||
//! adds a scene node to the scene graph based on its type id
|
||||
/** \param type: Type of the scene node to add.
|
||||
\param parent: Parent scene node of the new node, can be null to add the scene node to the root.
|
||||
\return Returns pointer to the new scene node or null if not successful.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
virtual ISceneNode* addSceneNode(ESCENE_NODE_TYPE type, ISceneNode* parent=0) = 0;
|
||||
|
||||
//! adds a scene node to the scene graph based on its type name
|
||||
/** \param typeName: Type name of the scene node to add.
|
||||
\param parent: Parent scene node of the new node, can be null to add the scene node to the root.
|
||||
\return Returns pointer to the new scene node or null if not successful.
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
virtual ISceneNode* addSceneNode(const c8* typeName, ISceneNode* parent=0) = 0;
|
||||
|
||||
//! returns amount of scene node types this factory is able to create
|
||||
virtual u32 getCreatableSceneNodeTypeCount() const = 0;
|
||||
|
||||
//! returns type of a creatable scene node type
|
||||
/** \param idx: Index of scene node type in this factory. Must be a value between 0 and
|
||||
getCreatableSceneNodeTypeCount() */
|
||||
virtual ESCENE_NODE_TYPE getCreateableSceneNodeType(u32 idx) const = 0;
|
||||
|
||||
//! returns type name of a creatable scene node type by index
|
||||
/** \param idx: Index of scene node type in this factory. Must be a value between 0 and
|
||||
getCreatableSceneNodeTypeCount() */
|
||||
virtual const c8* getCreateableSceneNodeTypeName(u32 idx) const = 0;
|
||||
|
||||
//! returns type name of a creatable scene node type
|
||||
/** \param type: Type of scene node.
|
||||
\return: Returns name of scene node type if this factory can create the type, otherwise 0. */
|
||||
virtual const c8* getCreateableSceneNodeTypeName(ESCENE_NODE_TYPE type) const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -1,51 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __I_SCENE_USER_DATA_SERIALIZER_H_INCLUDED__
|
||||
#define __I_SCENE_USER_DATA_SERIALIZER_H_INCLUDED__
|
||||
|
||||
#include "IReferenceCounted.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
class IAttributes;
|
||||
} // end namespace io
|
||||
namespace scene
|
||||
{
|
||||
class ISceneNode;
|
||||
|
||||
//! Interface to read and write user data to and from .irr files.
|
||||
/** This interface is to be implemented by the user, to make it possible to read
|
||||
and write user data when reading or writing .irr files via ISceneManager.
|
||||
To be used with ISceneManager::loadScene() and ISceneManager::saveScene() */
|
||||
class ISceneUserDataSerializer
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~ISceneUserDataSerializer() {}
|
||||
|
||||
//! Called when the scene manager create a scene node while loading a file.
|
||||
virtual void OnCreateNode(ISceneNode* node) = 0;
|
||||
|
||||
//! Called when the scene manager read a scene node while loading a file.
|
||||
/** The userData pointer contains a list of attributes with userData which
|
||||
were attached to the scene node in the read scene file.*/
|
||||
virtual void OnReadUserData(ISceneNode* forSceneNode, io::IAttributes* userData) = 0;
|
||||
|
||||
//! Called when the scene manager is writing a scene node to an xml file for example.
|
||||
/** Implement this method and return a list of attributes containing the user data
|
||||
you want to be saved together with the scene node. Return 0 if no user data should
|
||||
be added. Please note that the scene manager will call drop() to the returned pointer
|
||||
after it no longer needs it, so if you didn't create a new object for the return value
|
||||
and returning a longer existing IAttributes object, simply call grab() before returning it. */
|
||||
virtual io::IAttributes* createUserData(ISceneNode* forSceneNode) = 0;
|
||||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -79,6 +79,12 @@ namespace scene
|
||||
/* This feature is not implemented in Irrlicht yet */
|
||||
virtual bool setHardwareSkinning(bool on) = 0;
|
||||
|
||||
//! Refreshes vertex data cached in joints such as positions and normals
|
||||
virtual void refreshJointCache() = 0;
|
||||
|
||||
//! Moves the mesh into static position.
|
||||
virtual void resetAnimation() = 0;
|
||||
|
||||
//! A vertex weight
|
||||
struct SWeight
|
||||
{
|
||||
@ -94,7 +100,7 @@ namespace scene
|
||||
private:
|
||||
//! Internal members used by CSkinnedMesh
|
||||
friend class CSkinnedMesh;
|
||||
bool *Moved;
|
||||
char *Moved;
|
||||
core::vector3df StaticPos;
|
||||
core::vector3df StaticNormal;
|
||||
};
|
||||
|
@ -25,7 +25,6 @@ namespace irr
|
||||
namespace io
|
||||
{
|
||||
class IAttributes;
|
||||
struct SAttributeReadWriteOptions;
|
||||
class IReadFile;
|
||||
class IWriteFile;
|
||||
} // end namespace io
|
||||
@ -42,7 +41,6 @@ namespace video
|
||||
struct S3DVertex;
|
||||
struct S3DVertex2TCoords;
|
||||
struct S3DVertexTangents;
|
||||
struct SLight;
|
||||
class IImageLoader;
|
||||
class IImageWriter;
|
||||
class IMaterialRenderer;
|
||||
@ -58,32 +56,11 @@ namespace video
|
||||
ETS_WORLD,
|
||||
//! Projection transformation
|
||||
ETS_PROJECTION,
|
||||
//! Texture transformation
|
||||
//! Texture 0 transformation
|
||||
//! Use E_TRANSFORMATION_STATE(ETS_TEXTURE_0 + texture_number) to access other texture transformations
|
||||
ETS_TEXTURE_0,
|
||||
//! Texture transformation
|
||||
ETS_TEXTURE_1,
|
||||
//! Texture transformation
|
||||
ETS_TEXTURE_2,
|
||||
//! Texture transformation
|
||||
ETS_TEXTURE_3,
|
||||
#if _IRR_MATERIAL_MAX_TEXTURES_>4
|
||||
//! Texture transformation
|
||||
ETS_TEXTURE_4,
|
||||
#if _IRR_MATERIAL_MAX_TEXTURES_>5
|
||||
//! Texture transformation
|
||||
ETS_TEXTURE_5,
|
||||
#if _IRR_MATERIAL_MAX_TEXTURES_>6
|
||||
//! Texture transformation
|
||||
ETS_TEXTURE_6,
|
||||
#if _IRR_MATERIAL_MAX_TEXTURES_>7
|
||||
//! Texture transformation
|
||||
ETS_TEXTURE_7,
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
//! Only used internally
|
||||
ETS_COUNT = ETS_TEXTURE_0 + _IRR_MATERIAL_MAX_TEXTURES_
|
||||
ETS_COUNT = ETS_TEXTURE_0 + MATERIAL_MAX_TEXTURES
|
||||
};
|
||||
|
||||
//! Special render targets, which usually map to dedicated hardware
|
||||
@ -333,7 +310,7 @@ namespace video
|
||||
_IRR_DEPRECATED_ ITexture* addTexture(const io::path& name, IImage* image, void* mipmapData)
|
||||
{
|
||||
if (image)
|
||||
image->setMipMapsData(mipmapData, false, true);
|
||||
image->setMipMapsData(mipmapData, false);
|
||||
|
||||
return addTexture(name, image);
|
||||
}
|
||||
@ -509,20 +486,6 @@ namespace video
|
||||
core::position2d<s32> colorKeyPixelPos,
|
||||
bool zeroTexels = false) const =0;
|
||||
|
||||
//! Creates a normal map from a height map texture.
|
||||
/** As input is considered to be a height map the texture is read like:
|
||||
- For a 32-bit texture only the red channel is regarded
|
||||
- For a 16-bit texture the rgb-values are averaged.
|
||||
Output channels red/green for X/Y and blue for up (Z).
|
||||
For a 32-bit texture we store additionally the height value in the
|
||||
alpha channel. This value is used by the video::EMT_PARALLAX_MAP_SOLID
|
||||
material and similar materials.
|
||||
On the borders the texture is considered to repeat.
|
||||
\param texture Height map texture which is converted to a normal map.
|
||||
\param amplitude Constant value by which the height
|
||||
information is multiplied.*/
|
||||
virtual void makeNormalMapTexture(video::ITexture* texture, f32 amplitude=1.0f) const =0;
|
||||
|
||||
//! Set a render target.
|
||||
/** This will only work if the driver supports the
|
||||
EVDF_RENDER_TO_TARGET feature, which can be queried with
|
||||
@ -754,23 +717,6 @@ namespace video
|
||||
virtual void draw3DLine(const core::vector3df& start,
|
||||
const core::vector3df& end, SColor color = SColor(255,255,255,255)) =0;
|
||||
|
||||
//! Draws a 3d triangle.
|
||||
/** This method calls drawVertexPrimitiveList for some triangles.
|
||||
This method works with all drivers because it simply calls
|
||||
drawVertexPrimitiveList, but it is hence not very fast.
|
||||
Note that the triangle is drawn using the current
|
||||
transformation matrix and material. So if you need to draw it
|
||||
independently of the current transformation, use
|
||||
\code
|
||||
driver->setMaterial(someMaterial);
|
||||
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
|
||||
\endcode
|
||||
for some properly set up material before drawing the triangle.
|
||||
\param triangle The triangle to draw.
|
||||
\param color Color of the line. */
|
||||
virtual void draw3DTriangle(const core::triangle3df& triangle,
|
||||
SColor color = SColor(255,255,255,255)) =0;
|
||||
|
||||
//! Draws a 3d axis aligned box.
|
||||
/** This method simply calls draw3DLine for the edges of the
|
||||
box. Note that the box is drawn using the current transformation
|
||||
@ -801,7 +747,7 @@ namespace video
|
||||
\param texture Texture to be drawn.
|
||||
\param destPos Upper left 2d destination position where the
|
||||
image will be drawn.
|
||||
\param sourceRect Source rectangle in the image.
|
||||
\param sourceRect Source rectangle in the texture (based on it's OriginalSize)
|
||||
\param clipRect Pointer to rectangle on the screen where the
|
||||
image is clipped to.
|
||||
If this pointer is NULL the image is not clipped.
|
||||
@ -815,35 +761,6 @@ namespace video
|
||||
const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect =0,
|
||||
SColor color=SColor(255,255,255,255), bool useAlphaChannelOfTexture=false) =0;
|
||||
|
||||
//! Draws a set of 2d images, using a color and the alpha channel of the texture.
|
||||
/** The images are drawn beginning at pos and concatenated in
|
||||
one line. All drawings are clipped against clipRect (if != 0).
|
||||
The subtextures are defined by the array of sourceRects and are
|
||||
chosen by the indices given.
|
||||
\param texture Texture to be drawn.
|
||||
\param pos Upper left 2d destination position where the image
|
||||
will be drawn.
|
||||
\param sourceRects Source rectangles of the image.
|
||||
\param indices List of indices which choose the actual
|
||||
rectangle used each time.
|
||||
\param kerningWidth Offset to Position on X
|
||||
\param clipRect Pointer to rectangle on the screen where the
|
||||
image is clipped to.
|
||||
If this pointer is 0 then the image is not clipped.
|
||||
\param color Color with which the image is drawn.
|
||||
Note that the alpha component is used. If alpha is other than
|
||||
255, the image will be transparent.
|
||||
\param useAlphaChannelOfTexture: If true, the alpha channel of
|
||||
the texture is used to draw the image. */
|
||||
virtual void draw2DImageBatch(const video::ITexture* texture,
|
||||
const core::position2d<s32>& pos,
|
||||
const core::array<core::rect<s32> >& sourceRects,
|
||||
const core::array<s32>& indices,
|
||||
s32 kerningWidth=0,
|
||||
const core::rect<s32>* clipRect=0,
|
||||
SColor color=SColor(255,255,255,255),
|
||||
bool useAlphaChannelOfTexture=false) =0;
|
||||
|
||||
//! Draws a set of 2d images, using a color and the alpha channel of the texture.
|
||||
/** All drawings are clipped against clipRect (if != 0).
|
||||
The subtextures are defined by the array of sourceRects and are
|
||||
@ -851,7 +768,7 @@ namespace video
|
||||
\param texture Texture to be drawn.
|
||||
\param positions Array of upper left 2d destinations where the
|
||||
images will be drawn.
|
||||
\param sourceRects Source rectangles of the image.
|
||||
\param sourceRects Source rectangles of the texture (based on it's OriginalSize)
|
||||
\param clipRect Pointer to rectangle on the screen where the
|
||||
images are clipped to.
|
||||
If this pointer is 0 then the image is not clipped.
|
||||
@ -871,7 +788,7 @@ namespace video
|
||||
/** Suggested and first implemented by zola.
|
||||
\param texture The texture to draw from
|
||||
\param destRect The rectangle to draw into
|
||||
\param sourceRect The rectangle denoting a part of the texture
|
||||
\param sourceRect The rectangle denoting a part of the texture (based on it's OriginalSize)
|
||||
\param clipRect Clips the destination rectangle (may be 0)
|
||||
\param colors Array of 4 colors denoting the color values of
|
||||
the corners of the destRect
|
||||
@ -914,13 +831,6 @@ namespace video
|
||||
SColor colorLeftDown, SColor colorRightDown,
|
||||
const core::rect<s32>* clip =0) =0;
|
||||
|
||||
//! Draws the outline of a 2D rectangle.
|
||||
/** \param pos Position of the rectangle.
|
||||
\param color Color of the rectangle to draw. The alpha component
|
||||
specifies how transparent the rectangle outline will be. */
|
||||
virtual void draw2DRectangleOutline(const core::recti& pos,
|
||||
SColor color=SColor(255,255,255,255)) =0;
|
||||
|
||||
//! Draws a 2d line.
|
||||
/** In theory both start and end will be included in coloring.
|
||||
BUG: Currently d3d ignores the last pixel
|
||||
@ -934,72 +844,6 @@ namespace video
|
||||
const core::position2d<s32>& end,
|
||||
SColor color=SColor(255,255,255,255)) =0;
|
||||
|
||||
//! Draws a pixel.
|
||||
/** \param x The x-position of the pixel.
|
||||
\param y The y-position of the pixel.
|
||||
\param color Color of the pixel to draw. */
|
||||
virtual void drawPixel(u32 x, u32 y, const SColor& color) =0;
|
||||
|
||||
//! Draws a non filled concyclic regular 2d polygon.
|
||||
/** This method can be used to draw circles, but also
|
||||
triangles, tetragons, pentagons, hexagons, heptagons, octagons,
|
||||
enneagons, decagons, hendecagons, dodecagon, triskaidecagons,
|
||||
etc. I think you'll got it now. And all this by simply
|
||||
specifying the vertex count. Welcome to the wonders of
|
||||
geometry.
|
||||
\param center Position of center of circle (pixels).
|
||||
\param radius Radius of circle in pixels.
|
||||
\param color Color of the circle.
|
||||
\param vertexCount Amount of vertices of the polygon. Specify 2
|
||||
to draw a line, 3 to draw a triangle, 4 for tetragons and a lot
|
||||
(>10) for nearly a circle. */
|
||||
virtual void draw2DPolygon(core::position2d<s32> center,
|
||||
f32 radius,
|
||||
video::SColor color=SColor(100,255,255,255),
|
||||
s32 vertexCount=10) =0;
|
||||
|
||||
//! Draws a shadow volume into the stencil buffer.
|
||||
/** To draw a stencil shadow, do this: First, draw all geometry.
|
||||
Then use this method, to draw the shadow volume. Then, use
|
||||
IVideoDriver::drawStencilShadow() to visualize the shadow.
|
||||
Please note that the code for the opengl version of the method
|
||||
is based on free code sent in by Philipp Dortmann, lots of
|
||||
thanks go to him!
|
||||
\param triangles Array of 3d vectors, specifying the shadow
|
||||
volume.
|
||||
\param zfail If set to true, zfail method is used, otherwise
|
||||
zpass.
|
||||
\param debugDataVisible The debug data that is enabled for this
|
||||
shadow node
|
||||
*/
|
||||
virtual void drawStencilShadowVolume(const core::array<core::vector3df>& triangles, bool zfail=true, u32 debugDataVisible=0) =0;
|
||||
|
||||
//! Fills the stencil shadow with color.
|
||||
/** After the shadow volume has been drawn into the stencil
|
||||
buffer using IVideoDriver::drawStencilShadowVolume(), use this
|
||||
to draw the color of the shadow.
|
||||
Please note that the code for the opengl version of the method
|
||||
is based on free code sent in by Philipp Dortmann, lots of
|
||||
thanks go to him!
|
||||
\param clearStencilBuffer Set this to false, if you want to
|
||||
draw every shadow with the same color, and only want to call
|
||||
drawStencilShadow() once after all shadow volumes have been
|
||||
drawn. Set this to true, if you want to paint every shadow with
|
||||
its own color.
|
||||
\param leftUpEdge Color of the shadow in the upper left corner
|
||||
of screen.
|
||||
\param rightUpEdge Color of the shadow in the upper right
|
||||
corner of screen.
|
||||
\param leftDownEdge Color of the shadow in the lower left
|
||||
corner of screen.
|
||||
\param rightDownEdge Color of the shadow in the lower right
|
||||
corner of screen. */
|
||||
virtual void drawStencilShadow(bool clearStencilBuffer=false,
|
||||
video::SColor leftUpEdge = video::SColor(255,0,0,0),
|
||||
video::SColor rightUpEdge = video::SColor(255,0,0,0),
|
||||
video::SColor leftDownEdge = video::SColor(255,0,0,0),
|
||||
video::SColor rightDownEdge = video::SColor(255,0,0,0)) =0;
|
||||
|
||||
//! Draws a mesh buffer
|
||||
/** \param mb Buffer to draw */
|
||||
virtual void drawMeshBuffer(const scene::IMeshBuffer* mb) =0;
|
||||
@ -1068,33 +912,6 @@ namespace video
|
||||
\return Amount of primitives drawn in the last frame. */
|
||||
virtual u32 getPrimitiveCountDrawn( u32 mode =0 ) const =0;
|
||||
|
||||
//! Deletes all dynamic lights which were previously added with addDynamicLight().
|
||||
virtual void deleteAllDynamicLights() =0;
|
||||
|
||||
//! adds a dynamic light, returning an index to the light
|
||||
//! \param light: the light data to use to create the light
|
||||
//! \return An index to the light, or -1 if an error occurs
|
||||
virtual s32 addDynamicLight(const SLight& light) =0;
|
||||
|
||||
//! Returns the maximal amount of dynamic lights the device can handle
|
||||
/** \return Maximal amount of dynamic lights. */
|
||||
virtual u32 getMaximalDynamicLightAmount() const =0;
|
||||
|
||||
//! Returns amount of dynamic lights currently set
|
||||
/** \return Amount of dynamic lights currently set */
|
||||
virtual u32 getDynamicLightCount() const =0;
|
||||
|
||||
//! Returns light data which was previously set by IVideoDriver::addDynamicLight().
|
||||
/** \param idx Zero based index of the light. Must be 0 or
|
||||
greater and smaller than IVideoDriver::getDynamicLightCount.
|
||||
\return Light data. */
|
||||
virtual const SLight& getDynamicLight(u32 idx) const =0;
|
||||
|
||||
//! Turns a dynamic light on or off
|
||||
//! \param lightIndex: the index returned by addDynamicLight
|
||||
//! \param turnOn: true to turn the light on, false to turn it off
|
||||
virtual void turnLightOn(s32 lightIndex, bool turnOn) =0;
|
||||
|
||||
//! Gets name of this video driver.
|
||||
/** \return Returns the name of the video driver, e.g. in case
|
||||
of the Direct3D8 driver, it would return "Direct3D 8.1". */
|
||||
@ -1142,28 +959,6 @@ namespace video
|
||||
\return The current texture creation flag enabled mode. */
|
||||
virtual bool getTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag) const =0;
|
||||
|
||||
//! Creates a software images from a file.
|
||||
/** No hardware texture will be created for those images. This
|
||||
method is useful for example if you want to read a heightmap
|
||||
for a terrain renderer.
|
||||
\param filename Name of the file from which the images are created.
|
||||
\param type Pointer to E_TEXTURE_TYPE where a recommended type of the texture will be stored.
|
||||
\return The array of created images.
|
||||
If you no longer need those images, you should call IImage::drop() on each of them.
|
||||
See IReferenceCounted::drop() for more information. */
|
||||
virtual core::array<IImage*> createImagesFromFile(const io::path& filename, E_TEXTURE_TYPE* type = 0) = 0;
|
||||
|
||||
//! Creates a software images from a file.
|
||||
/** No hardware texture will be created for those images. This
|
||||
method is useful for example if you want to read a heightmap
|
||||
for a terrain renderer.
|
||||
\param file File from which the image is created.
|
||||
\param type Pointer to E_TEXTURE_TYPE where a recommended type of the texture will be stored.
|
||||
\return The array of created images.
|
||||
If you no longer need those images, you should call IImage::drop() on each of them.
|
||||
See IReferenceCounted::drop() for more information. */
|
||||
virtual core::array<IImage*> createImagesFromFile(io::IReadFile* file, E_TEXTURE_TYPE* type = 0) = 0;
|
||||
|
||||
//! Creates a software image from a file.
|
||||
/** No hardware texture will be created for this image. This
|
||||
method is useful for example if you want to read a heightmap
|
||||
@ -1173,15 +968,7 @@ namespace video
|
||||
\return The created image.
|
||||
If you no longer need the image, you should call IImage::drop().
|
||||
See IReferenceCounted::drop() for more information. */
|
||||
IImage* createImageFromFile(const io::path& filename)
|
||||
{
|
||||
core::array<IImage*> imageArray = createImagesFromFile(filename);
|
||||
|
||||
for (u32 i = 1; i < imageArray.size(); ++i)
|
||||
imageArray[i]->drop();
|
||||
|
||||
return (imageArray.size() > 0) ? imageArray[0] : 0;
|
||||
}
|
||||
virtual IImage* createImageFromFile(const io::path& filename) = 0;
|
||||
|
||||
//! Creates a software image from a file.
|
||||
/** No hardware texture will be created for this image. This
|
||||
@ -1191,15 +978,7 @@ namespace video
|
||||
\return The created image.
|
||||
If you no longer need the image, you should call IImage::drop().
|
||||
See IReferenceCounted::drop() for more information. */
|
||||
IImage* createImageFromFile(io::IReadFile* file)
|
||||
{
|
||||
core::array<IImage*> imageArray = createImagesFromFile(file);
|
||||
|
||||
for (u32 i = 1; i < imageArray.size(); ++i)
|
||||
imageArray[i]->drop();
|
||||
|
||||
return (imageArray.size() > 0) ? imageArray[0] : 0;
|
||||
}
|
||||
virtual IImage* createImageFromFile(io::IReadFile* file) = 0;
|
||||
|
||||
//! Writes the provided image to a file.
|
||||
/** Requires that there is a suitable image writer registered
|
||||
@ -1343,7 +1122,7 @@ namespace video
|
||||
E_MATERIAL_TYPE enum or a value which was returned by
|
||||
addMaterialRenderer().
|
||||
\param name: New name of the material renderer. */
|
||||
virtual void setMaterialRendererName(s32 idx, const c8* name) =0;
|
||||
virtual void setMaterialRendererName(u32 idx, const c8* name) =0;
|
||||
|
||||
//! Swap the material renderers used for certain id's
|
||||
/** Swap the IMaterialRenderers responsible for rendering specific
|
||||
@ -1355,28 +1134,6 @@ namespace video
|
||||
When false the names will stay at the original index */
|
||||
virtual void swapMaterialRenderers(u32 idx1, u32 idx2, bool swapNames=true) = 0;
|
||||
|
||||
//! Creates material attributes list from a material
|
||||
/** This method is useful for serialization and more.
|
||||
Please note that the video driver will use the material
|
||||
renderer names from getMaterialRendererName() to write out the
|
||||
material type name, so they should be set before.
|
||||
\param material The material to serialize.
|
||||
\param options Additional options which might influence the
|
||||
serialization.
|
||||
\return The io::IAttributes container holding the material
|
||||
properties. */
|
||||
virtual io::IAttributes* createAttributesFromMaterial(const video::SMaterial& material,
|
||||
io::SAttributeReadWriteOptions* options=0) =0;
|
||||
|
||||
//! Fills an SMaterial structure from attributes.
|
||||
/** Please note that for setting material types of the
|
||||
material, the video driver will need to query the material
|
||||
renderers for their names, so all non built-in materials must
|
||||
have been created before calling this method.
|
||||
\param outMaterial The material to set the properties for.
|
||||
\param attributes The attributes to read from. */
|
||||
virtual void fillMaterialStructureFromAttributes(video::SMaterial& outMaterial, io::IAttributes* attributes) =0;
|
||||
|
||||
//! Returns driver and operating system specific data about the IVideoDriver.
|
||||
/** This method should only be used if the engine should be
|
||||
extended without having to modify the source of the engine.
|
||||
@ -1423,7 +1180,7 @@ namespace video
|
||||
you have to render some special things, you can clear the
|
||||
zbuffer during the rendering process with this method any time.
|
||||
*/
|
||||
_IRR_DEPRECATED_ void clearZBuffer()
|
||||
void clearZBuffer()
|
||||
{
|
||||
clearBuffers(ECBF_DEPTH, SColor(255,0,0,0), 1.f, 0);
|
||||
}
|
||||
|
@ -1,58 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __IRR_I_VIDEO_MODE_LIST_H_INCLUDED__
|
||||
#define __IRR_I_VIDEO_MODE_LIST_H_INCLUDED__
|
||||
|
||||
#include "IReferenceCounted.h"
|
||||
#include "dimension2d.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
//! A list of all available video modes.
|
||||
/** You can get a list via IrrlichtDevice::getVideoModeList().
|
||||
You only need the null device (EDT_NULL) to get the video-modes. */
|
||||
class IVideoModeList : public virtual IReferenceCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Gets amount of video modes in the list.
|
||||
/** \return Returns amount of video modes. */
|
||||
virtual s32 getVideoModeCount() const = 0;
|
||||
|
||||
//! Get the screen size of a video mode in pixels.
|
||||
/** \param modeNumber: zero based index of the video mode.
|
||||
\return Size of screen in pixels of the specified video mode. */
|
||||
virtual core::dimension2d<u32> getVideoModeResolution(s32 modeNumber) const = 0;
|
||||
|
||||
//! Get a supported screen size with certain constraints.
|
||||
/** \param minSize: Minimum dimensions required.
|
||||
\param maxSize: Maximum dimensions allowed.
|
||||
\return Size of screen in pixels which matches the requirements.
|
||||
as good as possible. */
|
||||
virtual core::dimension2d<u32> getVideoModeResolution(const core::dimension2d<u32>& minSize, const core::dimension2d<u32>& maxSize) const = 0;
|
||||
|
||||
//! Get the pixel depth of a video mode in bits.
|
||||
/** \param modeNumber: zero based index of the video mode.
|
||||
\return Size of each pixel of the specified video mode in bits. */
|
||||
virtual s32 getVideoModeDepth(s32 modeNumber) const = 0;
|
||||
|
||||
//! Get current desktop screen resolution.
|
||||
/** \return Size of screen in pixels of the current desktop video mode. */
|
||||
virtual const core::dimension2d<u32>& getDesktopResolution() const = 0;
|
||||
|
||||
//! Get the pixel depth of a video mode in bits.
|
||||
/** \return Size of each pixel of the current desktop video mode in bits. */
|
||||
virtual s32 getDesktopDepth() const = 0;
|
||||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -6,8 +6,8 @@
|
||||
#define __IRR_COMPILE_CONFIG_H_INCLUDED__
|
||||
|
||||
//! Identifies the IrrlichtMt fork customized for the Minetest engine
|
||||
#define IRRLICHT_VERSION_MT_REVISION 3
|
||||
#define IRRLICHT_VERSION_MT "mt3"
|
||||
#define IRRLICHT_VERSION_MT_REVISION 12
|
||||
#define IRRLICHT_VERSION_MT "mt12"
|
||||
|
||||
//! Irrlicht SDK Version
|
||||
#define IRRLICHT_VERSION_MAJOR 1
|
||||
@ -20,500 +20,14 @@
|
||||
|
||||
#include <stdio.h> // TODO: Although included elsewhere this is required at least for mingw
|
||||
|
||||
//! The defines for different operating system are:
|
||||
//! _IRR_WINDOWS_ for all irrlicht supported Windows versions
|
||||
//! _IRR_WINDOWS_API_ for Windows or XBox
|
||||
//! _IRR_LINUX_PLATFORM_ for Linux (it is defined here if no other os is defined)
|
||||
//! _IRR_SOLARIS_PLATFORM_ for Solaris
|
||||
//! _IRR_OSX_PLATFORM_ for Apple systems running OSX
|
||||
//! _IRR_IOS_PLATFORM_ for Apple devices running iOS
|
||||
//! _IRR_ANDROID_PLATFORM_ for devices running Android
|
||||
//! _IRR_POSIX_API_ for Posix compatible systems
|
||||
//! Note: PLATFORM defines the OS specific layer, API can group several platforms
|
||||
|
||||
//! DEVICE is the windowing system used, several PLATFORMs support more than one DEVICE
|
||||
//! Irrlicht can be compiled with more than one device
|
||||
//! _IRR_COMPILE_WITH_WINDOWS_DEVICE_ for Windows API based device
|
||||
//! _IRR_COMPILE_WITH_OSX_DEVICE_ for Cocoa native windowing on OSX
|
||||
//! _IRR_COMPILE_WITH_X11_DEVICE_ for Linux X11 based device
|
||||
//! _IRR_COMPILE_WITH_SDL_DEVICE_ for platform independent SDL framework
|
||||
//! _IRR_COMPILE_WITH_CONSOLE_DEVICE_ for no windowing system, used as a fallback
|
||||
//! _IRR_COMPILE_WITH_FB_DEVICE_ for framebuffer systems
|
||||
|
||||
//! Passing defines to the compiler which have NO in front of the _IRR definename is an alternative
|
||||
//! way which can be used to disable defines (instead of outcommenting them in this header).
|
||||
//! So defines can be controlled from Makefiles or Projectfiles which allows building
|
||||
//! different library versions without having to change the sources.
|
||||
//! Example: NO_IRR_COMPILE_WITH_X11_ would disable X11
|
||||
|
||||
//! Uncomment this line to compile with the SDL device
|
||||
//#define _IRR_COMPILE_WITH_SDL_DEVICE_
|
||||
#ifdef NO_IRR_COMPILE_WITH_SDL_DEVICE_
|
||||
#undef _IRR_COMPILE_WITH_SDL_DEVICE_
|
||||
#endif
|
||||
|
||||
//! Comment this line to compile without the fallback console device.
|
||||
#define _IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
#ifdef NO_IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
#undef _IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
#endif
|
||||
|
||||
//! WIN32 for Windows32
|
||||
//! WIN64 for Windows64
|
||||
// The windows platform and API support SDL and WINDOW device
|
||||
#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
|
||||
#define _IRR_WINDOWS_
|
||||
#define _IRR_WINDOWS_API_
|
||||
#define _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER < 1500)
|
||||
# error "Only Microsoft Visual Studio 9.0 and later are supported."
|
||||
#endif
|
||||
|
||||
// XBox is deprecated (as DX8 is removed). Use Irrlicht 1.8 if you still want to work on this.
|
||||
#if defined(_XBOX)
|
||||
#undef _IRR_WINDOWS_
|
||||
#define _IRR_XBOX_PLATFORM_ // deprecated
|
||||
#define _IRR_WINDOWS_API_
|
||||
//#define _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||
#undef _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||
//#define _IRR_COMPILE_WITH_SDL_DEVICE_
|
||||
|
||||
#include <xtl.h>
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) || defined(MACOSX)
|
||||
#if !defined(MACOSX)
|
||||
#define MACOSX // legacy support
|
||||
#endif
|
||||
#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) || defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
|
||||
#define _IRR_IOS_PLATFORM_
|
||||
#define _IRR_COMPILE_WITH_IOS_DEVICE_
|
||||
#define NO_IRR_COMPILE_WITH_OPENGL_
|
||||
// The application state events and following methods: IrrlichtDevice::isWindowActive, IrrlichtDevice::isWindowFocused,
|
||||
// IrrlichtDevice::isWindowMinimized works out of box only if you'll use built-in CIrrDelegateiOS,
|
||||
// so _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_ must be enabled in this case. If you need a custom UIApplicationDelegate
|
||||
// you must disable _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_ definition and handle all application events yourself.
|
||||
#define _IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_
|
||||
#else
|
||||
#define _IRR_OSX_PLATFORM_
|
||||
#define _IRR_COMPILE_WITH_OSX_DEVICE_
|
||||
#define NO_IRR_COMPILE_WITH_OGLES1_
|
||||
#define NO_IRR_COMPILE_WITH_OGLES2_
|
||||
#define NO_IRR_COMPILE_WITH_WEBGL1_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
#define _IRR_EMSCRIPTEN_PLATFORM_
|
||||
#define NO_IRR_COMPILE_WITH_JOYSTICK_EVENTS_
|
||||
#define NO_IRR_COMPILE_WITH_OPENGL_
|
||||
#define NO_IRR_COMPILE_WITH_OGLES1_
|
||||
#define _IRR_COMPILE_WITH_OGLES2_
|
||||
#define _IRR_COMPILE_WITH_WEBGL1_
|
||||
#define _IRR_COMPILE_WITH_EGL_MANAGER_
|
||||
#define _IRR_COMPILE_WITH_SDL_DEVICE_
|
||||
#define NO_IRR_COMPILE_WITH_X11_DEVICE_
|
||||
#define _IRR_LINUX_PLATFORM_ // emscripten basically working like a unix
|
||||
#endif // __EMSCRIPTEN__
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
#define _IRR_ANDROID_PLATFORM_
|
||||
#define _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
||||
#define _IRR_COMPILE_ANDROID_ASSET_READER_
|
||||
#define NO_IRR_COMPILE_WITH_OPENGL_
|
||||
#endif
|
||||
|
||||
#if defined(__SVR4) && defined(__sun)
|
||||
#define _IRR_SOLARIS_PLATFORM_
|
||||
#if defined(__sparc)
|
||||
#define __BIG_ENDIAN__
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(_IRR_WINDOWS_API_) && !defined(_IRR_OSX_PLATFORM_) && !defined(_IRR_IOS_PLATFORM_) && !defined(_IRR_ANDROID_PLATFORM_) && !defined(_IRR_EMSCRIPTEN_PLATFORM_)
|
||||
#ifndef _IRR_SOLARIS_PLATFORM_
|
||||
#define _IRR_LINUX_PLATFORM_
|
||||
#endif
|
||||
#define _IRR_POSIX_API_
|
||||
#define _IRR_COMPILE_WITH_X11_DEVICE_
|
||||
#endif
|
||||
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_JOYSTICK_SUPPORT_ if you want joystick events.
|
||||
#if !(defined(__FreeBSD__) || defined(__OpenBSD__))
|
||||
#define _IRR_COMPILE_WITH_JOYSTICK_EVENTS_
|
||||
#endif
|
||||
#ifdef NO_IRR_COMPILE_WITH_JOYSTICK_EVENTS_
|
||||
#undef _IRR_COMPILE_WITH_JOYSTICK_EVENTS_
|
||||
#endif
|
||||
|
||||
|
||||
//! Maximum number of texture an SMaterial can have, up to 8 are supported by Irrlicht.
|
||||
#define _IRR_MATERIAL_MAX_TEXTURES_ 8
|
||||
|
||||
//! Add a leak-hunter to Irrlicht which helps finding unreleased reference counted objects.
|
||||
//! NOTE: This is slow and should only be used for debugging
|
||||
//#define _IRR_COMPILE_WITH_LEAK_HUNTER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_LEAK_HUNTER_
|
||||
#undef _IRR_COMPILE_WITH_LEAK_HUNTER_
|
||||
#endif
|
||||
|
||||
//! Enable profiling information in the engine
|
||||
/** NOTE: The profiler itself always exists and can be used by applications.
|
||||
This define is about the engine creating profile data
|
||||
while it runs and enabling it will slow down the engine. */
|
||||
//#define _IRR_COMPILE_WITH_PROFILING_
|
||||
#ifdef NO_IRR_COMPILE_WITH_PROFILING_
|
||||
#undef _IRR_COMPILE_WITH_PROFILING_
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_DIRECT3D_9_ to compile the Irrlicht engine with DIRECT3D9.
|
||||
/** If you only want to use the software device or opengl you can disable those defines.
|
||||
This switch is mostly disabled because people do not get the g++ compiler compile
|
||||
directX header files, and directX is only available on Windows platforms. If you
|
||||
are using Dev-Cpp, and want to compile this using a DX dev pack, you can define
|
||||
_IRR_COMPILE_WITH_DX9_DEV_PACK_. So you simply need to add something like this
|
||||
to the compiler settings: -DIRR_COMPILE_WITH_DX9_DEV_PACK
|
||||
and this to the linker settings: -ld3dx9
|
||||
*/
|
||||
#if defined(_IRR_WINDOWS_API_) && defined(IRR_COMPILE_WITH_DX9_DEV_PACK)
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_ if you want to use DirectInput for joystick handling.
|
||||
/** This only applies to Windows devices, currently only supported under Win32 device.
|
||||
If not defined, Windows Multimedia library is used, which offers also broad support for joystick devices. */
|
||||
#define _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
|
||||
#ifdef NO_IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
|
||||
#undef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
|
||||
#endif
|
||||
// can't get this to compile currently under borland, can be removed if someone has a better solution
|
||||
#if defined(__BORLANDC__)
|
||||
#undef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_OPENGL_ to compile the Irrlicht engine with OpenGL.
|
||||
/** If you do not wish the engine to be compiled with OpenGL, comment this
|
||||
define out. */
|
||||
#define _IRR_COMPILE_WITH_OPENGL_
|
||||
#ifdef NO_IRR_COMPILE_WITH_OPENGL_
|
||||
#undef _IRR_COMPILE_WITH_OPENGL_
|
||||
#endif
|
||||
|
||||
//! Define required options for OpenGL drivers.
|
||||
#if defined(_IRR_COMPILE_WITH_OPENGL_)
|
||||
#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)
|
||||
#define _IRR_OPENGL_USE_EXTPOINTER_
|
||||
#define _IRR_COMPILE_WITH_WGL_MANAGER_
|
||||
#elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)
|
||||
#define _IRR_OPENGL_USE_EXTPOINTER_
|
||||
#define _IRR_COMPILE_WITH_GLX_MANAGER_
|
||||
#elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)
|
||||
#define _IRR_COMPILE_WITH_NSOGL_MANAGER_
|
||||
#elif defined(_IRR_SOLARIS_PLATFORM_)
|
||||
#define _IRR_COMPILE_WITH_GLX_MANAGER_
|
||||
#elif defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
|
||||
#define _IRR_OPENGL_USE_EXTPOINTER_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_OGLES1_ to compile the Irrlicht engine with OpenGL ES 1.1.
|
||||
/** If you do not wish the engine to be compiled with OpenGL ES 1.1, comment this
|
||||
define out.
|
||||
Depending on platform you may have to enable _IRR_OGLES1_USE_KHRONOS_API_HEADERS_ as well when using it.
|
||||
*/
|
||||
#if defined(_IRR_ANDROID_PLATFORM_) || defined(_IRR_IOS_PLATFORM_)
|
||||
#define _IRR_COMPILE_WITH_OGLES1_
|
||||
#endif
|
||||
#ifdef NO_IRR_COMPILE_WITH_OGLES1_
|
||||
#undef _IRR_COMPILE_WITH_OGLES1_
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES1_
|
||||
//! Define _IRR_OGLES1_USE_KHRONOS_API_HEADERS_ to use the OpenGL ES headers from the Debian Khronos-api package
|
||||
//#define _IRR_OGLES1_USE_KHRONOS_API_HEADERS_
|
||||
#endif
|
||||
|
||||
//! Define required options for OpenGL ES 1.1 drivers.
|
||||
#if defined(_IRR_COMPILE_WITH_OGLES1_)
|
||||
#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_) || defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_)
|
||||
#define _IRR_OGLES1_USE_EXTPOINTER_
|
||||
#ifndef _IRR_COMPILE_WITH_EGL_MANAGER_
|
||||
#define _IRR_COMPILE_WITH_EGL_MANAGER_
|
||||
#endif
|
||||
#elif defined(_IRR_COMPILE_WITH_IOS_DEVICE_)
|
||||
#ifndef _IRR_COMPILE_WITH_EAGL_MANAGER_
|
||||
#define _IRR_COMPILE_WITH_EAGL_MANAGER_
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_OGLES2_ to compile the Irrlicht engine with OpenGL ES 2.0.
|
||||
/** If you do not wish the engine to be compiled with OpenGL ES 2.0, comment this
|
||||
define out. */
|
||||
#if defined(_IRR_ANDROID_PLATFORM_) || defined(_IRR_IOS_PLATFORM_)
|
||||
#define _IRR_COMPILE_WITH_OGLES2_
|
||||
#else
|
||||
//#define _IRR_COMPILE_WITH_OGLES2_
|
||||
#endif
|
||||
#ifdef NO_IRR_COMPILE_WITH_OGLES2_
|
||||
#undef _IRR_COMPILE_WITH_OGLES2_
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_WEBGL1_ to compile Irrlicht engine with a WebGL friendly
|
||||
//! subset of the OpenGL ES 2.0 driver.
|
||||
//#define _IRR_COMPILE_WITH_WEBGL1_
|
||||
#ifdef NO_IRR_COMPILE_WITH_WEBGL1_
|
||||
#undef _IRR_COMPILE_WITH_WEBGL1_
|
||||
#endif
|
||||
#ifdef _IRR_COMPILE_WITH_WEBGL1_
|
||||
#define _IRR_COMPILE_WITH_OGLES2_ // it's a subset of OGL ES2, so always needed when using WebGL
|
||||
#endif
|
||||
|
||||
//! Define required options for OpenGL ES 2.0 drivers.
|
||||
#if defined(_IRR_COMPILE_WITH_OGLES2_)
|
||||
#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_) || defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_) || defined(__EMSCRIPTEN__)
|
||||
#define _IRR_OGLES2_USE_EXTPOINTER_
|
||||
#ifndef _IRR_COMPILE_WITH_EGL_MANAGER_
|
||||
#define _IRR_COMPILE_WITH_EGL_MANAGER_
|
||||
#endif
|
||||
#elif defined(_IRR_COMPILE_WITH_IOS_DEVICE_)
|
||||
#ifndef _IRR_COMPILE_WITH_EAGL_MANAGER_
|
||||
#define _IRR_COMPILE_WITH_EAGL_MANAGER_
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_X11_ to compile the Irrlicht engine with X11 support.
|
||||
/** If you do not wish the engine to be compiled with X11, comment this
|
||||
define out. */
|
||||
// Only used in LinuxDevice.
|
||||
#define _IRR_COMPILE_WITH_X11_
|
||||
#ifdef NO_IRR_COMPILE_WITH_X11_
|
||||
#undef _IRR_COMPILE_WITH_X11_
|
||||
#endif
|
||||
|
||||
//! On some Linux systems the XF86 vidmode extension, X11 RandR, or XInput2 are missing.
|
||||
//! Use these defines to add/remove support for those dependencies as needed.
|
||||
//! XInput2 (library called Xi) is currently only used to support touch-input.
|
||||
#if defined(_IRR_LINUX_PLATFORM_) && defined(_IRR_COMPILE_WITH_X11_)
|
||||
#define _IRR_LINUX_X11_VIDMODE_
|
||||
//#define _IRR_LINUX_X11_RANDR_
|
||||
//#define _IRR_LINUX_X11_XINPUT2_
|
||||
#ifdef NO_IRR_LINUX_X11_VIDMODE_
|
||||
#undef _IRR_LINUX_X11_VIDMODE_
|
||||
#endif
|
||||
#ifdef NO_IRR_LINUX_X11_RANDR_
|
||||
#undef _IRR_LINUX_X11_RANDR_
|
||||
#endif
|
||||
#ifdef NO_IRR_LINUX_X11_XINPUT2_
|
||||
#undef _IRR_LINUX_X11_XINPUT2_
|
||||
#endif
|
||||
|
||||
//! X11 has by default only monochrome cursors, but using the Xcursor library we can also get color cursor support.
|
||||
//! If you have the need for custom color cursors on X11 then enable this and make sure you also link
|
||||
//! to the Xcursor library in your Makefile/Projectfile.
|
||||
//#define _IRR_LINUX_XCURSOR_
|
||||
#ifdef NO_IRR_LINUX_XCURSOR_
|
||||
#undef _IRR_LINUX_XCURSOR_
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_GUI_ to compile the engine with the built-in GUI
|
||||
/** Disable this if you are using an external library to draw the GUI. If you disable this then
|
||||
you will not be able to use anything provided by the GUI Environment, including loading fonts. */
|
||||
#define _IRR_COMPILE_WITH_GUI_
|
||||
#ifdef NO_IRR_COMPILE_WITH_GUI_
|
||||
#undef _IRR_COMPILE_WITH_GUI_
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_LIBJPEG_ to enable compiling the engine using libjpeg.
|
||||
/** This enables the engine to read jpeg images. If you comment this out,
|
||||
the engine will no longer read .jpeg images. */
|
||||
#define _IRR_COMPILE_WITH_LIBJPEG_
|
||||
#ifdef NO_IRR_COMPILE_WITH_LIBJPEG_
|
||||
#undef _IRR_COMPILE_WITH_LIBJPEG_
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_LIBPNG_ to enable compiling the engine using libpng.
|
||||
/** This enables the engine to read png images. If you comment this out,
|
||||
the engine will no longer read .png images. */
|
||||
#define _IRR_COMPILE_WITH_LIBPNG_
|
||||
#ifdef NO_IRR_COMPILE_WITH_LIBPNG_
|
||||
#undef _IRR_COMPILE_WITH_LIBPNG_
|
||||
#endif
|
||||
|
||||
//! Uncomment the following line if you want to ignore the deprecated warnings
|
||||
//#define IGNORE_DEPRECATED_WARNING
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ to support BillboardSceneNodes
|
||||
#define _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_
|
||||
#ifdef NO_IRR_COMPILE_WITH_BILLBOARD_SCENENODE_
|
||||
#undef _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ if you want to use bone based
|
||||
/** animated meshes. If you compile without this, you will be unable to load
|
||||
B3D, MS3D or X meshes */
|
||||
#define _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
||||
#ifdef NO_IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
||||
#undef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
||||
//! Define _IRR_COMPILE_WITH_B3D_LOADER_ if you want to use Blitz3D files
|
||||
#define _IRR_COMPILE_WITH_B3D_LOADER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_B3D_LOADER_
|
||||
#undef _IRR_COMPILE_WITH_B3D_LOADER_
|
||||
#endif
|
||||
//! Define _IRR_COMPILE_WITH_X_LOADER_ if you want to use Microsoft X files
|
||||
#define _IRR_COMPILE_WITH_X_LOADER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_X_LOADER_
|
||||
#undef _IRR_COMPILE_WITH_X_LOADER_
|
||||
#endif
|
||||
#endif // _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_OBJ_LOADER_ if you want to load Wavefront OBJ files
|
||||
#define _IRR_COMPILE_WITH_OBJ_LOADER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_OBJ_LOADER_
|
||||
#undef _IRR_COMPILE_WITH_OBJ_LOADER_
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_BMP_LOADER_ if you want to load .bmp files
|
||||
//! Disabling this loader will also disable the built-in font
|
||||
#define _IRR_COMPILE_WITH_BMP_LOADER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_BMP_LOADER_
|
||||
#undef _IRR_COMPILE_WITH_BMP_LOADER_
|
||||
#endif
|
||||
//! Define _IRR_COMPILE_WITH_JPG_LOADER_ if you want to load .jpg files
|
||||
#define _IRR_COMPILE_WITH_JPG_LOADER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_JPG_LOADER_
|
||||
#undef _IRR_COMPILE_WITH_JPG_LOADER_
|
||||
#endif
|
||||
//! Define _IRR_COMPILE_WITH_PNG_LOADER_ if you want to load .png files
|
||||
#define _IRR_COMPILE_WITH_PNG_LOADER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_PNG_LOADER_
|
||||
#undef _IRR_COMPILE_WITH_PNG_LOADER_
|
||||
#endif
|
||||
|
||||
//! Define _IRR_COMPILE_WITH_JPG_WRITER_ if you want to write .jpg files
|
||||
#define _IRR_COMPILE_WITH_JPG_WRITER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_JPG_WRITER_
|
||||
#undef _IRR_COMPILE_WITH_JPG_WRITER_
|
||||
#endif
|
||||
//! Define _IRR_COMPILE_WITH_PNG_WRITER_ if you want to write .png files
|
||||
#define _IRR_COMPILE_WITH_PNG_WRITER_
|
||||
#ifdef NO_IRR_COMPILE_WITH_PNG_WRITER_
|
||||
#undef _IRR_COMPILE_WITH_PNG_WRITER_
|
||||
#endif
|
||||
|
||||
//! Define __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_ if you want to open ZIP and GZIP archives
|
||||
/** ZIP reading has several more options below to configure. */
|
||||
#define __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_
|
||||
#ifdef NO__IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_
|
||||
#undef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_
|
||||
#endif
|
||||
#ifdef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_
|
||||
//! Define _IRR_COMPILE_WITH_ZLIB_ to enable compiling the engine using zlib.
|
||||
/** This enables the engine to read from compressed .zip archives. If you
|
||||
disable this feature, the engine can still read archives, but only uncompressed
|
||||
ones. */
|
||||
#define _IRR_COMPILE_WITH_ZLIB_
|
||||
#ifdef NO_IRR_COMPILE_WITH_ZLIB_
|
||||
#undef _IRR_COMPILE_WITH_ZLIB_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//! Define __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ if you want to mount folders as archives
|
||||
#define __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
|
||||
#ifdef NO__IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
|
||||
#undef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
|
||||
#endif
|
||||
|
||||
// Some cleanup and standard stuff
|
||||
|
||||
#ifdef _IRR_WINDOWS_API_
|
||||
|
||||
// To build Irrlicht as a static library, you must define _IRR_STATIC_LIB_ in both the
|
||||
// Irrlicht build, *and* in the user application, before #including <irrlicht.h>
|
||||
#ifndef _IRR_STATIC_LIB_
|
||||
#ifdef IRRLICHT_EXPORTS
|
||||
#define IRRLICHT_API __declspec(dllexport)
|
||||
#else
|
||||
#define IRRLICHT_API __declspec(dllimport)
|
||||
#endif // IRRLICHT_EXPORT
|
||||
#else
|
||||
#define IRRLICHT_API
|
||||
#endif // _IRR_STATIC_LIB_
|
||||
|
||||
// Declare the calling convention.
|
||||
#if defined(_STDCALL_SUPPORTED)
|
||||
#ifdef _WIN32
|
||||
#define IRRCALLCONV __stdcall
|
||||
#else
|
||||
#define IRRCALLCONV __cdecl
|
||||
#endif // STDCALL_SUPPORTED
|
||||
|
||||
#else // _IRR_WINDOWS_API_
|
||||
|
||||
// Force symbol export in shared libraries built with gcc.
|
||||
#if (__GNUC__ >= 4) && !defined(_IRR_STATIC_LIB_) && defined(IRRLICHT_EXPORTS)
|
||||
#define IRRLICHT_API __attribute__ ((visibility("default")))
|
||||
#else
|
||||
#define IRRLICHT_API
|
||||
#endif
|
||||
|
||||
#define IRRCALLCONV
|
||||
|
||||
#endif // _IRR_WINDOWS_API_
|
||||
|
||||
#if defined(_IRR_SOLARIS_PLATFORM_)
|
||||
#undef _IRR_COMPILE_WITH_JOYSTICK_EVENTS_
|
||||
#endif
|
||||
|
||||
//! Define __IRR_HAS_S64 if the irr::s64 type should be enable (needs long long, available on most platforms, but not part of ISO C++ 98)
|
||||
#define __IRR_HAS_S64
|
||||
#ifdef NO__IRR_HAS_S64
|
||||
#undef __IRR_HAS_S64
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
#include <tchar.h>
|
||||
|
||||
// Borland 5.5.1
|
||||
#if __BORLANDC__ == 0x551
|
||||
#undef _tfinddata_t
|
||||
#undef _tfindfirst
|
||||
#undef _tfindnext
|
||||
|
||||
#define _tfinddata_t __tfinddata_t
|
||||
#define _tfindfirst __tfindfirst
|
||||
#define _tfindnext __tfindnext
|
||||
typedef long intptr_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __has_feature
|
||||
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
//! A few attributes are written in CSceneManager when _IRR_SCENEMANAGER_DEBUG is enabled
|
||||
// NOTE: Those attributes were used always until 1.8.0 and became a global define for 1.8.1
|
||||
// which is only enabled in debug because it had a large (sometimes >5%) impact on speed.
|
||||
// A better solution in the long run is to break the interface and remove _all_ attribute
|
||||
// access in functions like CSceneManager::drawAll and instead put that information in some
|
||||
// own struct/class or in CSceneManager.
|
||||
// See http://irrlicht.sourceforge.net/forum/viewtopic.php?f=2&t=48211 for the discussion.
|
||||
#define _IRR_SCENEMANAGER_DEBUG
|
||||
#ifdef NO_IRR_SCENEMANAGER_DEBUG
|
||||
#undef _IRR_SCENEMANAGER_DEBUG
|
||||
#endif
|
||||
#ifndef IRRLICHT_API
|
||||
#define IRRLICHT_API
|
||||
#endif
|
||||
|
||||
#endif // __IRR_COMPILE_CONFIG_H_INCLUDED__
|
||||
|
||||
|
@ -12,15 +12,14 @@
|
||||
#include "EDeviceTypes.h"
|
||||
#include "IEventReceiver.h"
|
||||
#include "ICursorControl.h"
|
||||
#include "IVideoModeList.h"
|
||||
#include "ITimer.h"
|
||||
#include "IOSOperator.h"
|
||||
#include "IrrCompileConfig.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
class ILogger;
|
||||
class IEventReceiver;
|
||||
class IRandomizer;
|
||||
|
||||
namespace io {
|
||||
class IFileSystem;
|
||||
@ -36,6 +35,7 @@ namespace irr
|
||||
|
||||
namespace video {
|
||||
class IContextManager;
|
||||
extern "C" IRRLICHT_API bool IRRCALLCONV isDriverSupported(E_DRIVER_TYPE driver);
|
||||
} // end namespace video
|
||||
|
||||
//! The Irrlicht device. You can create it with createDevice() or createDeviceEx().
|
||||
@ -111,14 +111,6 @@ namespace irr
|
||||
/** \return Pointer to the logger. */
|
||||
virtual ILogger* getLogger() = 0;
|
||||
|
||||
//! Gets a list with all video modes available.
|
||||
/** You only need a null driver (ED_NULL) to access
|
||||
those video modes. So you can get the available modes
|
||||
before starting any other video driver.
|
||||
\return Pointer to a list with all video modes supported
|
||||
by the gfx adapter. */
|
||||
virtual video::IVideoModeList* getVideoModeList() = 0;
|
||||
|
||||
//! Get context manager
|
||||
virtual video::IContextManager* getContextManager() = 0;
|
||||
|
||||
@ -136,26 +128,15 @@ namespace irr
|
||||
\return Pointer to the ITimer object. */
|
||||
virtual ITimer* getTimer() = 0;
|
||||
|
||||
//! Provides access to the engine's currently set randomizer.
|
||||
/** \return Pointer to the IRandomizer object. */
|
||||
virtual IRandomizer* getRandomizer() const =0;
|
||||
|
||||
//! Sets a new randomizer.
|
||||
/** \param r Pointer to the new IRandomizer object. This object is
|
||||
grab()'ed by the engine and will be released upon the next setRandomizer
|
||||
call or upon device destruction. */
|
||||
virtual void setRandomizer(IRandomizer* r) =0;
|
||||
|
||||
//! Creates a new default randomizer.
|
||||
/** The default randomizer provides the random sequence known from previous
|
||||
Irrlicht versions and is the initial randomizer set on device creation.
|
||||
\return Pointer to the default IRandomizer object. */
|
||||
virtual IRandomizer* createDefaultRandomizer() const =0;
|
||||
|
||||
//! Sets the caption of the window.
|
||||
/** \param text: New text of the window caption. */
|
||||
virtual void setWindowCaption(const wchar_t* text) = 0;
|
||||
|
||||
//! Sets the window icon.
|
||||
/** \param img The icon texture.
|
||||
\return False if no icon was set. */
|
||||
virtual bool setWindowIcon(const video::IImage *img) = 0;
|
||||
|
||||
//! Returns if the window is active.
|
||||
/** If the window is inactive,
|
||||
nothing needs to be drawn. So if you don't want to draw anything
|
||||
@ -182,6 +163,12 @@ namespace irr
|
||||
/** \return True if window is minimized. */
|
||||
virtual bool isWindowMinimized() const = 0;
|
||||
|
||||
//! Checks if the Irrlicht window is maximized
|
||||
//! Only fully works on SDL. Returns false, or the last value set via
|
||||
//! maximizeWindow() and restoreWindow(), on other backends.
|
||||
/** \return True if window is maximized. */
|
||||
virtual bool isWindowMaximized() const = 0;
|
||||
|
||||
//! Checks if the Irrlicht window is running in fullscreen mode
|
||||
/** \return True if window is fullscreen. */
|
||||
virtual bool isFullscreen() const = 0;
|
||||
@ -255,8 +242,8 @@ namespace irr
|
||||
as this would consume joystick info that 3rd party libraries might rely on. Call this method to
|
||||
activate joystick support in Irrlicht and to receive irr::SJoystickEvent events.
|
||||
\param joystickInfo On return, this will contain an array of each joystick that was found and activated.
|
||||
\return true if joysticks are supported on this device and _IRR_COMPILE_WITH_JOYSTICK_EVENTS_
|
||||
is defined, false if joysticks are not supported or support is compiled out.
|
||||
\return true if joysticks are supported on this device, false if joysticks are not
|
||||
supported or support is compiled out.
|
||||
*/
|
||||
virtual bool activateJoysticks(core::array<SJoystickInfo>& joystickInfo) =0;
|
||||
|
||||
@ -296,14 +283,6 @@ namespace irr
|
||||
//! Is device motion available.
|
||||
virtual bool isDeviceMotionAvailable() = 0;
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
virtual bool setGammaRamp(f32 red, f32 green, f32 blue,
|
||||
f32 relativebrightness, f32 relativecontrast) =0;
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
virtual bool getGammaRamp(f32 &red, f32 &green, f32 &blue,
|
||||
f32 &brightness, f32 &contrast) =0;
|
||||
|
||||
//! Set the maximal elapsed time between 2 clicks to generate doubleclicks for the mouse. It also affects tripleclick behavior.
|
||||
/** When set to 0 no double- and tripleclicks will be generated.
|
||||
\param timeMs maximal time in milliseconds for two consecutive clicks to be recognized as double click
|
||||
@ -333,60 +312,16 @@ namespace irr
|
||||
used. */
|
||||
virtual E_DEVICE_TYPE getType() const = 0;
|
||||
|
||||
//! Get the display density in dots per inch.
|
||||
//! Returns 0.0f on failure.
|
||||
virtual float getDisplayDensity() const = 0;
|
||||
|
||||
//! Check if a driver type is supported by the engine.
|
||||
/** Even if true is returned the driver may not be available
|
||||
for a configuration requested when creating the device. */
|
||||
static bool isDriverSupported(video::E_DRIVER_TYPE driver)
|
||||
{
|
||||
switch (driver)
|
||||
{
|
||||
case video::EDT_NULL:
|
||||
return true;
|
||||
case video::EDT_SOFTWARE:
|
||||
#ifdef _IRR_COMPILE_WITH_SOFTWARE_
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
case video::EDT_BURNINGSVIDEO:
|
||||
#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
case video::EDT_DIRECT3D9:
|
||||
#ifdef _IRR_COMPILE_WITH_DIRECT3D_9_
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
case video::EDT_OPENGL:
|
||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
case video::EDT_OGLES1:
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES1_
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
case video::EDT_OGLES2:
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
case video::EDT_WEBGL1:
|
||||
#ifdef _IRR_COMPILE_WITH_WEBGL1_
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return video::isDriverSupported(driver);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -25,7 +25,7 @@ enum E_VERTEX_TYPE
|
||||
EVT_2TCOORDS,
|
||||
|
||||
//! Vertex with a tangent and binormal vector, video::S3DVertexTangents.
|
||||
/** Usually used for tangent space normal mapping.
|
||||
/** Usually used for tangent space normal mapping.
|
||||
Usually tangent and binormal get send to shaders as texture coordinate sets 1 and 2.
|
||||
*/
|
||||
EVT_TANGENTS
|
||||
@ -44,7 +44,7 @@ const char* const sBuiltInVertexTypeNames[] =
|
||||
struct S3DVertex
|
||||
{
|
||||
//! default constructor
|
||||
S3DVertex() {}
|
||||
S3DVertex() : Color(0xffffffff) {}
|
||||
|
||||
//! constructor
|
||||
S3DVertex(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv)
|
||||
@ -142,7 +142,7 @@ struct S3DVertex2TCoords : public S3DVertex
|
||||
: S3DVertex(pos, normal, color, tcoords), TCoords2(tcoords) {}
|
||||
|
||||
//! constructor from S3DVertex
|
||||
S3DVertex2TCoords(S3DVertex& o) : S3DVertex(o) {}
|
||||
S3DVertex2TCoords(const S3DVertex& o) : S3DVertex(o) {}
|
||||
|
||||
//! Second set of texture coordinates
|
||||
core::vector2d<f32> TCoords2;
|
||||
@ -150,21 +150,21 @@ struct S3DVertex2TCoords : public S3DVertex
|
||||
//! Equality operator
|
||||
bool operator==(const S3DVertex2TCoords& other) const
|
||||
{
|
||||
return ((static_cast<S3DVertex>(*this)==other) &&
|
||||
return ((static_cast<S3DVertex>(*this)==static_cast<const S3DVertex&>(other)) &&
|
||||
(TCoords2 == other.TCoords2));
|
||||
}
|
||||
|
||||
//! Inequality operator
|
||||
bool operator!=(const S3DVertex2TCoords& other) const
|
||||
{
|
||||
return ((static_cast<S3DVertex>(*this)!=other) ||
|
||||
return ((static_cast<S3DVertex>(*this)!=static_cast<const S3DVertex&>(other)) ||
|
||||
(TCoords2 != other.TCoords2));
|
||||
}
|
||||
|
||||
bool operator<(const S3DVertex2TCoords& other) const
|
||||
{
|
||||
return ((static_cast<S3DVertex>(*this) < other) ||
|
||||
((static_cast<S3DVertex>(*this) == other) && (TCoords2 < other.TCoords2)));
|
||||
((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (TCoords2 < other.TCoords2)));
|
||||
}
|
||||
|
||||
static E_VERTEX_TYPE getType()
|
||||
@ -186,7 +186,7 @@ struct S3DVertex2TCoords : public S3DVertex
|
||||
|
||||
|
||||
//! Vertex with a tangent and binormal vector.
|
||||
/** Usually used for tangent space normal mapping.
|
||||
/** Usually used for tangent space normal mapping.
|
||||
Usually tangent and binormal get send to shaders as texture coordinate sets 1 and 2.
|
||||
*/
|
||||
struct S3DVertexTangents : public S3DVertex
|
||||
@ -214,6 +214,9 @@ struct S3DVertexTangents : public S3DVertex
|
||||
const core::vector3df& binormal=core::vector3df())
|
||||
: S3DVertex(pos, normal, c, tcoords), Tangent(tangent), Binormal(binormal) { }
|
||||
|
||||
//! constructor from S3DVertex
|
||||
S3DVertexTangents(const S3DVertex& o) : S3DVertex(o) {}
|
||||
|
||||
//! Tangent vector along the x-axis of the texture
|
||||
core::vector3df Tangent;
|
||||
|
||||
@ -222,14 +225,14 @@ struct S3DVertexTangents : public S3DVertex
|
||||
|
||||
bool operator==(const S3DVertexTangents& other) const
|
||||
{
|
||||
return ((static_cast<S3DVertex>(*this)==other) &&
|
||||
return ((static_cast<S3DVertex>(*this)==static_cast<const S3DVertex&>(other)) &&
|
||||
(Tangent == other.Tangent) &&
|
||||
(Binormal == other.Binormal));
|
||||
}
|
||||
|
||||
bool operator!=(const S3DVertexTangents& other) const
|
||||
{
|
||||
return ((static_cast<S3DVertex>(*this)!=other) ||
|
||||
return ((static_cast<S3DVertex>(*this)!=static_cast<const S3DVertex&>(other)) ||
|
||||
(Tangent != other.Tangent) ||
|
||||
(Binormal != other.Binormal));
|
||||
}
|
||||
@ -237,8 +240,8 @@ struct S3DVertexTangents : public S3DVertex
|
||||
bool operator<(const S3DVertexTangents& other) const
|
||||
{
|
||||
return ((static_cast<S3DVertex>(*this) < other) ||
|
||||
((static_cast<S3DVertex>(*this) == other) && (Tangent < other.Tangent)) ||
|
||||
((static_cast<S3DVertex>(*this) == other) && (Tangent == other.Tangent) && (Binormal < other.Binormal)));
|
||||
((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (Tangent < other.Tangent)) ||
|
||||
((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (Tangent == other.Tangent) && (Binormal < other.Binormal)));
|
||||
}
|
||||
|
||||
static E_VERTEX_TYPE getType()
|
||||
|
@ -38,14 +38,14 @@ namespace scene
|
||||
|
||||
//! Gets the frame count of the animated mesh.
|
||||
/** \return Amount of frames. If the amount is 1, it is a static, non animated mesh. */
|
||||
virtual u32 getFrameCount() const _IRR_OVERRIDE_
|
||||
u32 getFrameCount() const override
|
||||
{
|
||||
return Meshes.size();
|
||||
}
|
||||
|
||||
//! Gets the default animation speed of the animated mesh.
|
||||
/** \return Amount of frames per second. If the amount is 0, it is a static, non animated mesh. */
|
||||
virtual f32 getAnimationSpeed() const _IRR_OVERRIDE_
|
||||
f32 getAnimationSpeed() const override
|
||||
{
|
||||
return FramesPerSecond;
|
||||
}
|
||||
@ -53,7 +53,7 @@ namespace scene
|
||||
//! Gets the frame count of the animated mesh.
|
||||
/** \param fps Frames per second to play the animation with. If the amount is 0, it is not animated.
|
||||
The actual speed is set in the scene node the mesh is instantiated in.*/
|
||||
virtual void setAnimationSpeed(f32 fps) _IRR_OVERRIDE_
|
||||
void setAnimationSpeed(f32 fps) override
|
||||
{
|
||||
FramesPerSecond=fps;
|
||||
}
|
||||
@ -66,7 +66,7 @@ namespace scene
|
||||
\param startFrameLoop: start frame
|
||||
\param endFrameLoop: end frame
|
||||
\return The animated mesh based on a detail level. */
|
||||
virtual IMesh* getMesh(s32 frame, s32 detailLevel=255, s32 startFrameLoop=-1, s32 endFrameLoop=-1) _IRR_OVERRIDE_
|
||||
IMesh* getMesh(s32 frame, s32 detailLevel=255, s32 startFrameLoop=-1, s32 endFrameLoop=-1) override
|
||||
{
|
||||
if (Meshes.empty())
|
||||
return 0;
|
||||
@ -86,13 +86,13 @@ namespace scene
|
||||
|
||||
//! Returns an axis aligned bounding box of the mesh.
|
||||
/** \return A bounding box of this mesh is returned. */
|
||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_
|
||||
const core::aabbox3d<f32>& getBoundingBox() const override
|
||||
{
|
||||
return Box;
|
||||
}
|
||||
|
||||
//! set user axis aligned bounding box
|
||||
virtual void setBoundingBox(const core::aabbox3df& box) _IRR_OVERRIDE_
|
||||
void setBoundingBox(const core::aabbox3df& box) override
|
||||
{
|
||||
Box = box;
|
||||
}
|
||||
@ -112,13 +112,13 @@ namespace scene
|
||||
}
|
||||
|
||||
//! Returns the type of the animated mesh.
|
||||
virtual E_ANIMATED_MESH_TYPE getMeshType() const _IRR_OVERRIDE_
|
||||
E_ANIMATED_MESH_TYPE getMeshType() const override
|
||||
{
|
||||
return Type;
|
||||
}
|
||||
|
||||
//! returns amount of mesh buffers.
|
||||
virtual u32 getMeshBufferCount() const _IRR_OVERRIDE_
|
||||
u32 getMeshBufferCount() const override
|
||||
{
|
||||
if (Meshes.empty())
|
||||
return 0;
|
||||
@ -127,7 +127,7 @@ namespace scene
|
||||
}
|
||||
|
||||
//! returns pointer to a mesh buffer
|
||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const _IRR_OVERRIDE_
|
||||
IMeshBuffer* getMeshBuffer(u32 nr) const override
|
||||
{
|
||||
if (Meshes.empty())
|
||||
return 0;
|
||||
@ -139,7 +139,7 @@ namespace scene
|
||||
/** \param material: material to search for
|
||||
\return Returns the pointer to the mesh buffer or
|
||||
NULL if there is no such mesh buffer. */
|
||||
virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const _IRR_OVERRIDE_
|
||||
IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const override
|
||||
{
|
||||
if (Meshes.empty())
|
||||
return 0;
|
||||
@ -147,22 +147,15 @@ namespace scene
|
||||
return Meshes[0]->getMeshBuffer(material);
|
||||
}
|
||||
|
||||
//! Set a material flag for all meshbuffers of this mesh.
|
||||
virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) _IRR_OVERRIDE_
|
||||
{
|
||||
for (u32 i=0; i<Meshes.size(); ++i)
|
||||
Meshes[i]->setMaterialFlag(flag, newvalue);
|
||||
}
|
||||
|
||||
//! set the hardware mapping hint, for driver
|
||||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) _IRR_OVERRIDE_
|
||||
void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) override
|
||||
{
|
||||
for (u32 i=0; i<Meshes.size(); ++i)
|
||||
Meshes[i]->setHardwareMappingHint(newMappingHint, buffer);
|
||||
}
|
||||
|
||||
//! flags the meshbuffer as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) _IRR_OVERRIDE_
|
||||
void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) override
|
||||
{
|
||||
for (u32 i=0; i<Meshes.size(); ++i)
|
||||
Meshes[i]->setDirty(buffer);
|
||||
|
@ -78,21 +78,6 @@ struct SExposedVideoData
|
||||
//! The EGLNativeWindowType object.
|
||||
void* Window;
|
||||
};
|
||||
|
||||
struct SOpenGLiOS
|
||||
{
|
||||
//! The EAGLContext object.
|
||||
void* Context;
|
||||
|
||||
//! The subview UIView object where the drawing happens.
|
||||
void* View;
|
||||
|
||||
//! The UIViewController object.
|
||||
void* ViewController;
|
||||
|
||||
//! The UIWindow object.
|
||||
void* Window;
|
||||
};
|
||||
|
||||
struct SOGLESAndroid
|
||||
{
|
||||
@ -107,7 +92,6 @@ struct SExposedVideoData
|
||||
SOpenGLLinux OpenGLLinux;
|
||||
SOpenGLOSX OpenGLOSX;
|
||||
SOpenGLFB OpenGLFB;
|
||||
SOpenGLiOS OpenGLiOS;
|
||||
SOGLESAndroid OGLESAndroid;
|
||||
};
|
||||
};
|
||||
|
@ -11,7 +11,7 @@
|
||||
#include "ILogger.h"
|
||||
#include "position2d.h"
|
||||
#include "path.h"
|
||||
#include "IrrCompileConfig.h"
|
||||
#include "IrrCompileConfig.h" // for IRRLICHT_SDK_VERSION
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -24,12 +24,13 @@ namespace irr
|
||||
//! Constructs a SIrrlichtCreationParameters structure with default values.
|
||||
SIrrlichtCreationParameters() :
|
||||
DeviceType(EIDT_BEST),
|
||||
DriverType(video::EDT_BURNINGSVIDEO),
|
||||
DriverType(video::EDT_OPENGL),
|
||||
WindowSize(core::dimension2d<u32>(800, 600)),
|
||||
WindowPosition(core::position2di(-1,-1)),
|
||||
Bits(32),
|
||||
ZBufferBits(24),
|
||||
Fullscreen(false),
|
||||
WindowMaximized(false),
|
||||
WindowResizable(2),
|
||||
Stencilbuffer(true),
|
||||
Vsync(false),
|
||||
@ -52,7 +53,7 @@ namespace irr
|
||||
UsePerformanceTimer(true),
|
||||
SDK_version_do_not_use(IRRLICHT_SDK_VERSION),
|
||||
PrivateData(0),
|
||||
#if defined(_IRR_COMPILE_WITH_IOS_DEVICE_) || defined(_IRR_ANDROID_PLATFORM_) || defined(_IRR_EMSCRIPTEN_PLATFORM_)
|
||||
#ifdef IRR_MOBILE_PATHS
|
||||
OGLES2ShaderPath("media/Shaders/")
|
||||
#else
|
||||
OGLES2ShaderPath("../../media/Shaders/")
|
||||
@ -73,6 +74,7 @@ namespace irr
|
||||
Bits = other.Bits;
|
||||
ZBufferBits = other.ZBufferBits;
|
||||
Fullscreen = other.Fullscreen;
|
||||
WindowMaximized = other.WindowMaximized;
|
||||
WindowResizable = other.WindowResizable;
|
||||
Stencilbuffer = other.Stencilbuffer;
|
||||
Vsync = other.Vsync;
|
||||
@ -98,11 +100,9 @@ namespace irr
|
||||
/** This setting decides the windowing system used by the device, most device types are native
|
||||
to a specific operating system and so may not be available.
|
||||
EIDT_WIN32 is only available on Windows desktops,
|
||||
EIDT_WINCE is only available on Windows mobile devices,
|
||||
EIDT_COCOA is only available on Mac OSX,
|
||||
EIDT_X11 is available on Linux, Solaris, BSD and other operating systems which use X11,
|
||||
EIDT_SDL is available on most systems if compiled in,
|
||||
EIDT_CONSOLE is usually available but can only render to text,
|
||||
EIDT_BEST will select the best available device for your operating system.
|
||||
Default: EIDT_BEST. */
|
||||
E_DEVICE_TYPE DeviceType;
|
||||
@ -129,6 +129,9 @@ namespace irr
|
||||
/** Otherwise the device runs in windowed mode. Default: false. */
|
||||
bool Fullscreen;
|
||||
|
||||
//! Maximised window. (Only supported on SDL.) Default: false
|
||||
bool WindowMaximized;
|
||||
|
||||
//! Should a non-fullscreen window be resizable.
|
||||
/** Might not be supported by all devices. Ignored when Fullscreen is true.
|
||||
Values: 0 = not resizable, 1 = resizable, 2 = system decides default itself
|
||||
@ -232,7 +235,6 @@ namespace irr
|
||||
/** If this is set to a value other than 0, the Irrlicht Engine
|
||||
will be created in an already existing window.
|
||||
For Windows, set this to the HWND of the window you want.
|
||||
For iOS, assign UIView to this variable.
|
||||
The windowSize and FullScreen options will be ignored when using
|
||||
the WindowId parameter. Default this is set to 0.
|
||||
To make Irrlicht run inside the custom window, you still will
|
||||
|
@ -1,43 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __S_KEY_MAP_H_INCLUDED__
|
||||
#define __S_KEY_MAP_H_INCLUDED__
|
||||
|
||||
#include "Keycodes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
//! enumeration for key actions. Used for example in the FPS Camera.
|
||||
enum EKEY_ACTION
|
||||
{
|
||||
EKA_MOVE_FORWARD = 0,
|
||||
EKA_MOVE_BACKWARD,
|
||||
EKA_STRAFE_LEFT,
|
||||
EKA_STRAFE_RIGHT,
|
||||
EKA_JUMP_UP,
|
||||
EKA_CROUCH,
|
||||
EKA_ROTATE_LEFT,
|
||||
EKA_ROTATE_RIGHT,
|
||||
EKA_COUNT,
|
||||
|
||||
//! This value is not used. It only forces this enumeration to compile in 32 bit.
|
||||
EKA_FORCE_32BIT = 0x7fffffff
|
||||
};
|
||||
|
||||
//! Struct storing which key belongs to which action.
|
||||
struct SKeyMap
|
||||
{
|
||||
SKeyMap() {}
|
||||
SKeyMap(EKEY_ACTION action, EKEY_CODE keyCode) : Action(action), KeyCode(keyCode) {}
|
||||
|
||||
EKEY_ACTION Action;
|
||||
EKEY_CODE KeyCode;
|
||||
};
|
||||
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
101
include/SLight.h
101
include/SLight.h
@ -1,101 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __S_LIGHT_H_INCLUDED__
|
||||
#define __S_LIGHT_H_INCLUDED__
|
||||
|
||||
#include "SColor.h"
|
||||
#include "vector3d.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
//! Enumeration for different types of lights
|
||||
enum E_LIGHT_TYPE
|
||||
{
|
||||
//! point light, it has a position in space and radiates light in all directions
|
||||
ELT_POINT,
|
||||
//! spot light, it has a position in space, a direction, and a limited cone of influence
|
||||
ELT_SPOT,
|
||||
//! directional light, coming from a direction from an infinite distance
|
||||
ELT_DIRECTIONAL,
|
||||
|
||||
//! Only used for counting the elements of this enum
|
||||
ELT_COUNT
|
||||
};
|
||||
|
||||
//! Names for light types
|
||||
const c8* const LightTypeNames[] =
|
||||
{
|
||||
"Point",
|
||||
"Spot",
|
||||
"Directional",
|
||||
0
|
||||
};
|
||||
|
||||
//! structure for holding data describing a dynamic point light.
|
||||
/** Irrlicht supports point lights, spot lights, and directional lights.
|
||||
*/
|
||||
struct SLight
|
||||
{
|
||||
SLight() : AmbientColor(0.f,0.f,0.f), DiffuseColor(1.f,1.f,1.f),
|
||||
SpecularColor(1.f,1.f,1.f), Attenuation(1.f,0.f,0.f),
|
||||
OuterCone(45.f), InnerCone(0.f), Falloff(2.f),
|
||||
Position(0.f,0.f,0.f), Direction(0.f,0.f,1.f),
|
||||
Radius(100.f), Type(ELT_POINT), CastShadows(true)
|
||||
{}
|
||||
|
||||
//! Ambient color emitted by the light
|
||||
SColorf AmbientColor;
|
||||
|
||||
//! Diffuse color emitted by the light.
|
||||
/** This is the primary color you want to set. */
|
||||
SColorf DiffuseColor;
|
||||
|
||||
//! Specular color emitted by the light.
|
||||
/** For details how to use specular highlights, see SMaterial::Shininess */
|
||||
SColorf SpecularColor;
|
||||
|
||||
//! Attenuation factors (constant, linear, quadratic)
|
||||
/** Changes the light strength fading over distance.
|
||||
Can also be altered by setting the radius, Attenuation will change to
|
||||
(0,1.f/radius,0). Can be overridden after radius was set. */
|
||||
core::vector3df Attenuation;
|
||||
|
||||
//! The angle of the spot's outer cone. Ignored for other lights.
|
||||
f32 OuterCone;
|
||||
|
||||
//! The angle of the spot's inner cone. Ignored for other lights.
|
||||
f32 InnerCone;
|
||||
|
||||
//! The light strength's decrease between Outer and Inner cone. Only for spot lights
|
||||
f32 Falloff;
|
||||
|
||||
//! Read-ONLY! Position of the light.
|
||||
/** If Type is ELT_DIRECTIONAL, it is ignored. Changed via light scene node's position. */
|
||||
core::vector3df Position;
|
||||
|
||||
//! Read-ONLY! Direction of the light.
|
||||
/** If Type is ELT_POINT, it is ignored. Changed via light scene node's rotation. */
|
||||
core::vector3df Direction;
|
||||
|
||||
//! Read-ONLY! Radius of light. Everything within this radius will be lighted.
|
||||
/** On OpenGL light doesn't stop at radius. To get same light as in OpenGL in other drivers
|
||||
do set the radius to a large value like sqrt(FLT_MAX) and then set the Attenuation afterwards.
|
||||
*/
|
||||
f32 Radius;
|
||||
|
||||
//! Read-ONLY! Type of the light. Default: ELT_POINT
|
||||
E_LIGHT_TYPE Type;
|
||||
|
||||
//! Read-ONLY! Does the light cast shadows?
|
||||
bool CastShadows:1;
|
||||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
@ -10,8 +10,9 @@
|
||||
#include "irrArray.h"
|
||||
#include "irrMath.h"
|
||||
#include "EMaterialTypes.h"
|
||||
#include "EMaterialFlags.h"
|
||||
#include "EMaterialProps.h"
|
||||
#include "SMaterialLayer.h"
|
||||
#include "IrrCompileConfig.h" // for IRRLICHT_API
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -255,7 +256,7 @@ namespace video
|
||||
EZW_OFF = 0,
|
||||
|
||||
//! This is the default setting for SMaterial and tries to handle things automatically.
|
||||
//! This is also the value which is set when SMaterial::setFlag(EMF_ZWRITE_ENABLE) is enabled.
|
||||
//! This is what you want to set to enable zwriting.
|
||||
//! Usually zwriting is enabled non-transparent materials - as far as Irrlicht can recognize those.
|
||||
//! Basically Irrlicht tries to handle the zwriting for you and assumes transparent materials don't need it.
|
||||
//! This is addionally affected by IVideoDriver::setAllowZWriteOnTransparent
|
||||
@ -280,24 +281,7 @@ namespace video
|
||||
/** SMaterial might ignore some textures in most function, like assignment and comparison,
|
||||
when SIrrlichtCreationParameters::MaxTextureUnits is set to a lower number.
|
||||
*/
|
||||
const u32 MATERIAL_MAX_TEXTURES = _IRR_MATERIAL_MAX_TEXTURES_;
|
||||
|
||||
//! By default this is identical to MATERIAL_MAX_TEXTURES
|
||||
/** Users can modify this value if they are certain they don't need all
|
||||
available textures per material in their application. For example if you
|
||||
never need more than 2 textures per material you can set this to 2.
|
||||
|
||||
We (mostly) avoid dynamic memory in SMaterial, so the extra memory
|
||||
will still be allocated. But by lowering MATERIAL_MAX_TEXTURES_USED the
|
||||
material comparisons and assignments can be faster. Also several other
|
||||
places in the engine can be faster when reducing this value to the limit
|
||||
you need.
|
||||
|
||||
NOTE: This should only be changed once and before any call to createDevice.
|
||||
NOTE: Do not set it below 1 or above the value of _IRR_MATERIAL_MAX_TEXTURES_.
|
||||
NOTE: Going below 4 is usually not worth it.
|
||||
*/
|
||||
IRRLICHT_API extern u32 MATERIAL_MAX_TEXTURES_USED;
|
||||
const u32 MATERIAL_MAX_TEXTURES = 4;
|
||||
|
||||
//! Struct for holding parameters for a material renderer
|
||||
// Note for implementors: Serialization is in CNullDriver
|
||||
@ -308,7 +292,7 @@ namespace video
|
||||
SMaterial()
|
||||
: MaterialType(EMT_SOLID), AmbientColor(255,255,255,255), DiffuseColor(255,255,255,255),
|
||||
EmissiveColor(0,0,0,0), SpecularColor(255,255,255,255),
|
||||
Shininess(0.0f), MaterialTypeParam(0.0f), MaterialTypeParam2(0.0f), Thickness(1.0f),
|
||||
Shininess(0.0f), MaterialTypeParam(0.0f), Thickness(1.0f),
|
||||
ZBuffer(ECFN_LESSEQUAL), AntiAliasing(EAAM_SIMPLE), ColorMask(ECP_ALL),
|
||||
ColorMaterial(ECM_DIFFUSE), BlendOperation(EBO_NONE), BlendFactor(0.0f),
|
||||
PolygonOffsetFactor(0), PolygonOffsetDirection(EPO_FRONT),
|
||||
@ -318,18 +302,8 @@ namespace video
|
||||
FogEnable(false), NormalizeNormals(false), UseMipMaps(true)
|
||||
{ }
|
||||
|
||||
//! Copy constructor
|
||||
/** \param other Material to copy from. */
|
||||
SMaterial(const SMaterial& other)
|
||||
{
|
||||
// These pointers are checked during assignment
|
||||
for (u32 i=0; i<MATERIAL_MAX_TEXTURES_USED; ++i)
|
||||
TextureLayer[i].TextureMatrix = 0;
|
||||
*this = other;
|
||||
}
|
||||
|
||||
//! Texture layer array.
|
||||
SMaterialLayer TextureLayer[MATERIAL_MAX_TEXTURES];
|
||||
SMaterialLayer TextureLayers[MATERIAL_MAX_TEXTURES];
|
||||
|
||||
//! Type of the material. Specifies how everything is blended together
|
||||
E_MATERIAL_TYPE MaterialType;
|
||||
@ -372,14 +346,10 @@ namespace video
|
||||
f32 Shininess;
|
||||
|
||||
//! Free parameter, dependent on the material type.
|
||||
/** Mostly ignored, used for example in EMT_PARALLAX_MAP_SOLID,
|
||||
/** Mostly ignored, used for example in
|
||||
EMT_TRANSPARENT_ALPHA_CHANNEL and EMT_ONETEXTURE_BLEND. */
|
||||
f32 MaterialTypeParam;
|
||||
|
||||
//! Second free parameter, dependent on the material type.
|
||||
/** Mostly ignored. */
|
||||
f32 MaterialTypeParam2;
|
||||
|
||||
//! Thickness of non-3dimensional elements such as lines and points.
|
||||
f32 Thickness;
|
||||
|
||||
@ -456,9 +426,6 @@ namespace video
|
||||
f32 PolygonOffsetSlopeScale;
|
||||
|
||||
//! Draw as wireframe or filled triangles? Default: false
|
||||
/** The user can access a material flag using
|
||||
\code material.Wireframe=true \endcode
|
||||
or \code material.setFlag(EMF_WIREFRAME, true); \endcode */
|
||||
bool Wireframe:1;
|
||||
|
||||
//! Draw as point cloud or filled triangles? Default: false
|
||||
@ -492,12 +459,22 @@ namespace video
|
||||
/** Sometimes, disabling mipmap usage can be useful. Default: true */
|
||||
bool UseMipMaps:1;
|
||||
|
||||
//! Execute a function on all texture layers.
|
||||
/** Useful for setting properties which are not per material, but per
|
||||
texture layer, e.g. bilinear filtering. */
|
||||
template <typename F>
|
||||
void forEachTexture(F &&fn) {
|
||||
for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; i++) {
|
||||
fn(TextureLayers[i]);
|
||||
}
|
||||
}
|
||||
|
||||
//! Gets the texture transformation matrix for level i
|
||||
/** \param i The desired level. Must not be larger than MATERIAL_MAX_TEXTURES
|
||||
\return Texture matrix for texture level i. */
|
||||
core::matrix4& getTextureMatrix(u32 i)
|
||||
{
|
||||
return TextureLayer[i].getTextureMatrix();
|
||||
return TextureLayers[i].getTextureMatrix();
|
||||
}
|
||||
|
||||
//! Gets the immutable texture transformation matrix for level i
|
||||
@ -506,7 +483,7 @@ namespace video
|
||||
const core::matrix4& getTextureMatrix(u32 i) const
|
||||
{
|
||||
if (i<MATERIAL_MAX_TEXTURES)
|
||||
return TextureLayer[i].getTextureMatrix();
|
||||
return TextureLayers[i].getTextureMatrix();
|
||||
else
|
||||
return core::IdentityMatrix;
|
||||
}
|
||||
@ -518,7 +495,7 @@ namespace video
|
||||
{
|
||||
if (i>=MATERIAL_MAX_TEXTURES)
|
||||
return;
|
||||
TextureLayer[i].setTextureMatrix(mat);
|
||||
TextureLayers[i].setTextureMatrix(mat);
|
||||
}
|
||||
|
||||
//! Gets the i-th texture
|
||||
@ -526,7 +503,7 @@ namespace video
|
||||
\return Texture for texture level i, if defined, else 0. */
|
||||
ITexture* getTexture(u32 i) const
|
||||
{
|
||||
return i < MATERIAL_MAX_TEXTURES ? TextureLayer[i].Texture : 0;
|
||||
return i < MATERIAL_MAX_TEXTURES ? TextureLayers[i].Texture : 0;
|
||||
}
|
||||
|
||||
//! Sets the i-th texture
|
||||
@ -537,144 +514,7 @@ namespace video
|
||||
{
|
||||
if (i>=MATERIAL_MAX_TEXTURES)
|
||||
return;
|
||||
TextureLayer[i].Texture = tex;
|
||||
}
|
||||
|
||||
//! Sets the Material flag to the given value
|
||||
/** \param flag The flag to be set.
|
||||
\param value The new value for the flag. */
|
||||
void setFlag(E_MATERIAL_FLAG flag, bool value)
|
||||
{
|
||||
switch (flag)
|
||||
{
|
||||
case EMF_WIREFRAME:
|
||||
Wireframe = value; break;
|
||||
case EMF_POINTCLOUD:
|
||||
PointCloud = value; break;
|
||||
case EMF_GOURAUD_SHADING:
|
||||
GouraudShading = value; break;
|
||||
case EMF_LIGHTING:
|
||||
Lighting = value; break;
|
||||
case EMF_ZBUFFER:
|
||||
ZBuffer = value; break;
|
||||
case EMF_ZWRITE_ENABLE:
|
||||
ZWriteEnable = value ? EZW_AUTO : EZW_OFF; break;
|
||||
case EMF_BACK_FACE_CULLING:
|
||||
BackfaceCulling = value; break;
|
||||
case EMF_FRONT_FACE_CULLING:
|
||||
FrontfaceCulling = value; break;
|
||||
case EMF_BILINEAR_FILTER:
|
||||
{
|
||||
for (u32 i=0; i<MATERIAL_MAX_TEXTURES_USED; ++i)
|
||||
TextureLayer[i].BilinearFilter = value;
|
||||
}
|
||||
break;
|
||||
case EMF_TRILINEAR_FILTER:
|
||||
{
|
||||
for (u32 i=0; i<MATERIAL_MAX_TEXTURES_USED; ++i)
|
||||
TextureLayer[i].TrilinearFilter = value;
|
||||
}
|
||||
break;
|
||||
case EMF_ANISOTROPIC_FILTER:
|
||||
{
|
||||
if (value)
|
||||
for (u32 i=0; i<MATERIAL_MAX_TEXTURES_USED; ++i)
|
||||
TextureLayer[i].AnisotropicFilter = 0xFF;
|
||||
else
|
||||
for (u32 i=0; i<MATERIAL_MAX_TEXTURES_USED; ++i)
|
||||
TextureLayer[i].AnisotropicFilter = 0;
|
||||
}
|
||||
break;
|
||||
case EMF_FOG_ENABLE:
|
||||
FogEnable = value; break;
|
||||
case EMF_NORMALIZE_NORMALS:
|
||||
NormalizeNormals = value; break;
|
||||
case EMF_TEXTURE_WRAP:
|
||||
{
|
||||
for (u32 i=0; i<MATERIAL_MAX_TEXTURES_USED; ++i)
|
||||
{
|
||||
TextureLayer[i].TextureWrapU = (E_TEXTURE_CLAMP)value;
|
||||
TextureLayer[i].TextureWrapV = (E_TEXTURE_CLAMP)value;
|
||||
TextureLayer[i].TextureWrapW = (E_TEXTURE_CLAMP)value;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EMF_ANTI_ALIASING:
|
||||
AntiAliasing = value?EAAM_SIMPLE:EAAM_OFF; break;
|
||||
case EMF_COLOR_MASK:
|
||||
ColorMask = value?ECP_ALL:ECP_NONE; break;
|
||||
case EMF_COLOR_MATERIAL:
|
||||
ColorMaterial = value?ECM_DIFFUSE:ECM_NONE; break;
|
||||
case EMF_USE_MIP_MAPS:
|
||||
UseMipMaps = value; break;
|
||||
case EMF_BLEND_OPERATION:
|
||||
BlendOperation = value?EBO_ADD:EBO_NONE; break;
|
||||
case EMF_BLEND_FACTOR:
|
||||
break;
|
||||
case EMF_POLYGON_OFFSET:
|
||||
PolygonOffsetFactor = value?1:0;
|
||||
PolygonOffsetDirection = EPO_BACK;
|
||||
PolygonOffsetSlopeScale = value?1.f:0.f;
|
||||
PolygonOffsetDepthBias = value?1.f:0.f;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//! Gets the Material flag
|
||||
/** \param flag The flag to query.
|
||||
\return The current value of the flag. */
|
||||
bool getFlag(E_MATERIAL_FLAG flag) const
|
||||
{
|
||||
switch (flag)
|
||||
{
|
||||
case EMF_WIREFRAME:
|
||||
return Wireframe;
|
||||
case EMF_POINTCLOUD:
|
||||
return PointCloud;
|
||||
case EMF_GOURAUD_SHADING:
|
||||
return GouraudShading;
|
||||
case EMF_LIGHTING:
|
||||
return Lighting;
|
||||
case EMF_ZBUFFER:
|
||||
return ZBuffer!=ECFN_DISABLED;
|
||||
case EMF_ZWRITE_ENABLE:
|
||||
return ZWriteEnable != EZW_OFF;
|
||||
case EMF_BACK_FACE_CULLING:
|
||||
return BackfaceCulling;
|
||||
case EMF_FRONT_FACE_CULLING:
|
||||
return FrontfaceCulling;
|
||||
case EMF_BILINEAR_FILTER:
|
||||
return TextureLayer[0].BilinearFilter;
|
||||
case EMF_TRILINEAR_FILTER:
|
||||
return TextureLayer[0].TrilinearFilter;
|
||||
case EMF_ANISOTROPIC_FILTER:
|
||||
return TextureLayer[0].AnisotropicFilter!=0;
|
||||
case EMF_FOG_ENABLE:
|
||||
return FogEnable;
|
||||
case EMF_NORMALIZE_NORMALS:
|
||||
return NormalizeNormals;
|
||||
case EMF_TEXTURE_WRAP:
|
||||
return !(TextureLayer[0].TextureWrapU ||
|
||||
TextureLayer[0].TextureWrapV ||
|
||||
TextureLayer[0].TextureWrapW);
|
||||
case EMF_ANTI_ALIASING:
|
||||
return (AntiAliasing==1);
|
||||
case EMF_COLOR_MASK:
|
||||
return (ColorMask!=ECP_NONE);
|
||||
case EMF_COLOR_MATERIAL:
|
||||
return (ColorMaterial != ECM_NONE);
|
||||
case EMF_USE_MIP_MAPS:
|
||||
return UseMipMaps;
|
||||
case EMF_BLEND_OPERATION:
|
||||
return BlendOperation != EBO_NONE;
|
||||
case EMF_BLEND_FACTOR:
|
||||
return BlendFactor != 0.f;
|
||||
case EMF_POLYGON_OFFSET:
|
||||
return PolygonOffsetFactor != 0 || PolygonOffsetDepthBias != 0.f;
|
||||
}
|
||||
|
||||
return false;
|
||||
TextureLayers[i].Texture = tex;
|
||||
}
|
||||
|
||||
//! Inequality operator
|
||||
@ -690,7 +530,6 @@ namespace video
|
||||
SpecularColor != b.SpecularColor ||
|
||||
Shininess != b.Shininess ||
|
||||
MaterialTypeParam != b.MaterialTypeParam ||
|
||||
MaterialTypeParam2 != b.MaterialTypeParam2 ||
|
||||
Thickness != b.Thickness ||
|
||||
Wireframe != b.Wireframe ||
|
||||
PointCloud != b.PointCloud ||
|
||||
@ -713,9 +552,9 @@ namespace video
|
||||
PolygonOffsetSlopeScale != b.PolygonOffsetSlopeScale ||
|
||||
UseMipMaps != b.UseMipMaps
|
||||
;
|
||||
for (u32 i=0; (i<MATERIAL_MAX_TEXTURES_USED) && !different; ++i)
|
||||
for (u32 i=0; (i<MATERIAL_MAX_TEXTURES) && !different; ++i)
|
||||
{
|
||||
different |= (TextureLayer[i] != b.TextureLayer[i]);
|
||||
different |= (TextureLayers[i] != b.TextureLayers[i]);
|
||||
}
|
||||
return different;
|
||||
}
|
||||
@ -754,10 +593,8 @@ namespace video
|
||||
//! as it asks the material renders directly what they do with the material.
|
||||
bool isTransparent() const
|
||||
{
|
||||
if ( MaterialType==EMT_TRANSPARENT_ADD_COLOR ||
|
||||
MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL ||
|
||||
MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA ||
|
||||
MaterialType==EMT_TRANSPARENT_REFLECTION_2_LAYER )
|
||||
if ( MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL ||
|
||||
MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -6,7 +6,6 @@
|
||||
#define __S_MATERIAL_LAYER_H_INCLUDED__
|
||||
|
||||
#include "matrix4.h"
|
||||
#include "irrAllocator.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -44,6 +43,32 @@ namespace video
|
||||
"texture_clamp_mirror_clamp_to_edge",
|
||||
"texture_clamp_mirror_clamp_to_border", 0};
|
||||
|
||||
|
||||
//! Texture minification filter.
|
||||
/** Used when scaling textures down. See the documentation on OpenGL's
|
||||
`GL_TEXTURE_MIN_FILTER` for more information. */
|
||||
enum E_TEXTURE_MIN_FILTER {
|
||||
//! Aka nearest-neighbor.
|
||||
ETMINF_NEAREST_MIPMAP_NEAREST = 0,
|
||||
//! Aka bilinear.
|
||||
ETMINF_LINEAR_MIPMAP_NEAREST,
|
||||
//! Isn't known by any other name.
|
||||
ETMINF_NEAREST_MIPMAP_LINEAR,
|
||||
//! Aka trilinear.
|
||||
ETMINF_LINEAR_MIPMAP_LINEAR,
|
||||
};
|
||||
|
||||
//! Texture magnification filter.
|
||||
/** Used when scaling textures up. See the documentation on OpenGL's
|
||||
`GL_TEXTURE_MAG_FILTER` for more information.
|
||||
Note that mipmaps are only used for minification, not for magnification. */
|
||||
enum E_TEXTURE_MAG_FILTER {
|
||||
//! Aka nearest-neighbor.
|
||||
ETMAGF_NEAREST = 0,
|
||||
//! Aka bilinear.
|
||||
ETMAGF_LINEAR,
|
||||
};
|
||||
|
||||
//! Struct for holding material parameters which exist per texture layer
|
||||
// Note for implementors: Serialization is in CNullDriver
|
||||
class SMaterialLayer
|
||||
@ -51,7 +76,7 @@ namespace video
|
||||
public:
|
||||
//! Default constructor
|
||||
SMaterialLayer() : Texture(0), TextureWrapU(ETC_REPEAT), TextureWrapV(ETC_REPEAT), TextureWrapW(ETC_REPEAT),
|
||||
BilinearFilter(true), TrilinearFilter(false), AnisotropicFilter(0), LODBias(0), TextureMatrix(0)
|
||||
MinFilter(ETMINF_LINEAR_MIPMAP_NEAREST), MagFilter(ETMAGF_LINEAR), AnisotropicFilter(0), LODBias(0), TextureMatrix(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -69,8 +94,7 @@ namespace video
|
||||
{
|
||||
if ( TextureMatrix )
|
||||
{
|
||||
MatrixAllocator.destruct(TextureMatrix);
|
||||
MatrixAllocator.deallocate(TextureMatrix);
|
||||
delete TextureMatrix;
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,8 +114,7 @@ namespace video
|
||||
*TextureMatrix = *other.TextureMatrix;
|
||||
else
|
||||
{
|
||||
MatrixAllocator.destruct(TextureMatrix);
|
||||
MatrixAllocator.deallocate(TextureMatrix);
|
||||
delete TextureMatrix;
|
||||
TextureMatrix = 0;
|
||||
}
|
||||
}
|
||||
@ -99,8 +122,7 @@ namespace video
|
||||
{
|
||||
if (other.TextureMatrix)
|
||||
{
|
||||
TextureMatrix = MatrixAllocator.allocate(1);
|
||||
MatrixAllocator.construct(TextureMatrix,*other.TextureMatrix);
|
||||
TextureMatrix = new core::matrix4(*other.TextureMatrix);
|
||||
}
|
||||
else
|
||||
TextureMatrix = 0;
|
||||
@ -108,8 +130,8 @@ namespace video
|
||||
TextureWrapU = other.TextureWrapU;
|
||||
TextureWrapV = other.TextureWrapV;
|
||||
TextureWrapW = other.TextureWrapW;
|
||||
BilinearFilter = other.BilinearFilter;
|
||||
TrilinearFilter = other.TrilinearFilter;
|
||||
MinFilter = other.MinFilter;
|
||||
MagFilter = other.MagFilter;
|
||||
AnisotropicFilter = other.AnisotropicFilter;
|
||||
LODBias = other.LODBias;
|
||||
|
||||
@ -122,8 +144,7 @@ namespace video
|
||||
{
|
||||
if (!TextureMatrix)
|
||||
{
|
||||
TextureMatrix = MatrixAllocator.allocate(1);
|
||||
MatrixAllocator.construct(TextureMatrix,core::IdentityMatrix);
|
||||
TextureMatrix = new core::matrix4();
|
||||
}
|
||||
return *TextureMatrix;
|
||||
}
|
||||
@ -146,8 +167,7 @@ namespace video
|
||||
{
|
||||
if (!TextureMatrix)
|
||||
{
|
||||
TextureMatrix = MatrixAllocator.allocate(1);
|
||||
MatrixAllocator.construct(TextureMatrix,mat);
|
||||
TextureMatrix = new core::matrix4(mat);
|
||||
}
|
||||
else
|
||||
*TextureMatrix = mat;
|
||||
@ -163,8 +183,8 @@ namespace video
|
||||
TextureWrapU != b.TextureWrapU ||
|
||||
TextureWrapV != b.TextureWrapV ||
|
||||
TextureWrapW != b.TextureWrapW ||
|
||||
BilinearFilter != b.BilinearFilter ||
|
||||
TrilinearFilter != b.TrilinearFilter ||
|
||||
MinFilter != b.MinFilter ||
|
||||
MagFilter != b.MagFilter ||
|
||||
AnisotropicFilter != b.AnisotropicFilter ||
|
||||
LODBias != b.LODBias;
|
||||
if (different)
|
||||
@ -190,13 +210,11 @@ namespace video
|
||||
u8 TextureWrapV:4;
|
||||
u8 TextureWrapW:4;
|
||||
|
||||
//! Is bilinear filtering enabled? Default: true
|
||||
bool BilinearFilter:1;
|
||||
//! Minification (downscaling) filter
|
||||
E_TEXTURE_MIN_FILTER MinFilter;
|
||||
|
||||
//! Is trilinear filtering enabled? Default: false
|
||||
/** If the trilinear filter flag is enabled,
|
||||
the bilinear filtering flag is ignored. */
|
||||
bool TrilinearFilter:1;
|
||||
//! Magnification (upscaling) filter
|
||||
E_TEXTURE_MAG_FILTER MagFilter;
|
||||
|
||||
//! Is anisotropic filtering enabled? Default: 0, disabled
|
||||
/** In Irrlicht you can use anisotropic texture filtering
|
||||
@ -214,9 +232,18 @@ namespace video
|
||||
if the value is positive. */
|
||||
s8 LODBias;
|
||||
|
||||
//! Sets the MinFilter, MagFilter and AnisotropicFilter properties according
|
||||
//! to the three relevant boolean values found in the Minetest settings.
|
||||
/** The value of `trilinear` takes precedence over the value of `bilinear`. */
|
||||
void setFiltersMinetest(bool bilinear, bool trilinear, bool anisotropic) {
|
||||
MinFilter = trilinear ? ETMINF_LINEAR_MIPMAP_LINEAR :
|
||||
(bilinear ? ETMINF_LINEAR_MIPMAP_NEAREST : ETMINF_NEAREST_MIPMAP_NEAREST);
|
||||
MagFilter = (trilinear || bilinear) ? ETMAGF_LINEAR : ETMAGF_NEAREST;
|
||||
AnisotropicFilter = anisotropic ? 0xFF : 0;
|
||||
}
|
||||
|
||||
private:
|
||||
friend class SMaterial;
|
||||
irr::core::irrAllocator<irr::core::matrix4> MatrixAllocator;
|
||||
|
||||
//! Texture Matrix
|
||||
/** Do not access this element directly as the internal
|
||||
|
@ -44,20 +44,20 @@ namespace scene
|
||||
|
||||
|
||||
//! returns amount of mesh buffers.
|
||||
virtual u32 getMeshBufferCount() const _IRR_OVERRIDE_
|
||||
u32 getMeshBufferCount() const override
|
||||
{
|
||||
return MeshBuffers.size();
|
||||
}
|
||||
|
||||
//! returns pointer to a mesh buffer
|
||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const _IRR_OVERRIDE_
|
||||
IMeshBuffer* getMeshBuffer(u32 nr) const override
|
||||
{
|
||||
return MeshBuffers[nr];
|
||||
}
|
||||
|
||||
//! returns a meshbuffer which fits a material
|
||||
/** reverse search */
|
||||
virtual IMeshBuffer* getMeshBuffer( const video::SMaterial & material) const _IRR_OVERRIDE_
|
||||
IMeshBuffer* getMeshBuffer( const video::SMaterial & material) const override
|
||||
{
|
||||
for (s32 i = (s32)MeshBuffers.size()-1; i >= 0; --i)
|
||||
{
|
||||
@ -69,13 +69,13 @@ namespace scene
|
||||
}
|
||||
|
||||
//! returns an axis aligned bounding box
|
||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_
|
||||
const core::aabbox3d<f32>& getBoundingBox() const override
|
||||
{
|
||||
return BoundingBox;
|
||||
}
|
||||
|
||||
//! set user axis aligned bounding box
|
||||
virtual void setBoundingBox( const core::aabbox3df& box) _IRR_OVERRIDE_
|
||||
void setBoundingBox( const core::aabbox3df& box) override
|
||||
{
|
||||
BoundingBox = box;
|
||||
}
|
||||
@ -117,22 +117,15 @@ namespace scene
|
||||
}
|
||||
}
|
||||
|
||||
//! sets a flag of all contained materials to a new value
|
||||
virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) _IRR_OVERRIDE_
|
||||
{
|
||||
for (u32 i=0; i<MeshBuffers.size(); ++i)
|
||||
MeshBuffers[i]->getMaterial().setFlag(flag, newvalue);
|
||||
}
|
||||
|
||||
//! set the hardware mapping hint, for driver
|
||||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) _IRR_OVERRIDE_
|
||||
void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) override
|
||||
{
|
||||
for (u32 i=0; i<MeshBuffers.size(); ++i)
|
||||
MeshBuffers[i]->setHardwareMappingHint(newMappingHint, buffer);
|
||||
}
|
||||
|
||||
//! flags the meshbuffer as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) _IRR_OVERRIDE_
|
||||
void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) override
|
||||
{
|
||||
for (u32 i=0; i<MeshBuffers.size(); ++i)
|
||||
MeshBuffers[i]->setDirty(buffer);
|
||||
|
@ -18,16 +18,16 @@ namespace video
|
||||
SMaterial Material;
|
||||
|
||||
//! Which values are overridden
|
||||
/** OR'ed values from E_MATERIAL_FLAGS. */
|
||||
u32 EnableFlags;
|
||||
/** OR'ed values from E_MATERIAL_PROPS. */
|
||||
u32 EnableProps;
|
||||
|
||||
//! For those flags in EnableFlags which affect layers, set which of the layers are affected
|
||||
bool EnableLayerFlags[MATERIAL_MAX_TEXTURES];
|
||||
//! For those properties in EnableProps which affect layers, set which of the layers are affected
|
||||
bool EnableLayerProps[MATERIAL_MAX_TEXTURES];
|
||||
|
||||
//! Which textures are overridden
|
||||
bool EnableTextures[MATERIAL_MAX_TEXTURES];
|
||||
|
||||
//! Overwrite complete layers (settings of EnableLayerFlags and EnableTextures don't matter then for layer data)
|
||||
//! Overwrite complete layers (settings of EnableLayerProps and EnableTextures don't matter then for layer data)
|
||||
bool EnableLayers[MATERIAL_MAX_TEXTURES];
|
||||
|
||||
//! Set in which render passes the material override is active.
|
||||
@ -59,19 +59,19 @@ namespace video
|
||||
core::array<SMaterialTypeReplacement> MaterialTypes;
|
||||
|
||||
//! Default constructor
|
||||
SOverrideMaterial() : EnableFlags(0), EnablePasses(0), Enabled(false)
|
||||
SOverrideMaterial() : EnableProps(0), EnablePasses(0), Enabled(false)
|
||||
{
|
||||
}
|
||||
|
||||
//! disable overrides and reset all flags
|
||||
//! disable overrides and reset all properties
|
||||
void reset()
|
||||
{
|
||||
EnableFlags = 0;
|
||||
EnableProps = 0;
|
||||
EnablePasses = 0;
|
||||
Enabled = false;
|
||||
for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; ++i)
|
||||
{
|
||||
EnableLayerFlags[i] = true; // doesn't do anything unless EnableFlags is set, just saying by default all texture layers are affected by flags
|
||||
EnableLayerProps[i] = true; // doesn't do anything unless EnableProps is set, just saying by default all texture layers are affected by properties
|
||||
EnableTextures[i] = false;
|
||||
EnableLayers[i] = false;
|
||||
}
|
||||
@ -92,65 +92,65 @@ namespace video
|
||||
for (u32 f=0; f<32; ++f)
|
||||
{
|
||||
const u32 num=(1<<f);
|
||||
if (EnableFlags & num)
|
||||
if (EnableProps & num)
|
||||
{
|
||||
switch (num)
|
||||
{
|
||||
case EMF_WIREFRAME: material.Wireframe = Material.Wireframe; break;
|
||||
case EMF_POINTCLOUD: material.PointCloud = Material.PointCloud; break;
|
||||
case EMF_GOURAUD_SHADING: material.GouraudShading = Material.GouraudShading; break;
|
||||
case EMF_LIGHTING: material.Lighting = Material.Lighting; break;
|
||||
case EMF_ZBUFFER: material.ZBuffer = Material.ZBuffer; break;
|
||||
case EMF_ZWRITE_ENABLE: material.ZWriteEnable = Material.ZWriteEnable; break;
|
||||
case EMF_BACK_FACE_CULLING: material.BackfaceCulling = Material.BackfaceCulling; break;
|
||||
case EMF_FRONT_FACE_CULLING: material.FrontfaceCulling = Material.FrontfaceCulling; break;
|
||||
case EMF_BILINEAR_FILTER:
|
||||
case EMP_WIREFRAME: material.Wireframe = Material.Wireframe; break;
|
||||
case EMP_POINTCLOUD: material.PointCloud = Material.PointCloud; break;
|
||||
case EMP_GOURAUD_SHADING: material.GouraudShading = Material.GouraudShading; break;
|
||||
case EMP_LIGHTING: material.Lighting = Material.Lighting; break;
|
||||
case EMP_ZBUFFER: material.ZBuffer = Material.ZBuffer; break;
|
||||
case EMP_ZWRITE_ENABLE: material.ZWriteEnable = Material.ZWriteEnable; break;
|
||||
case EMP_BACK_FACE_CULLING: material.BackfaceCulling = Material.BackfaceCulling; break;
|
||||
case EMP_FRONT_FACE_CULLING: material.FrontfaceCulling = Material.FrontfaceCulling; break;
|
||||
case EMP_MIN_FILTER:
|
||||
for ( u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
|
||||
{
|
||||
if ( EnableLayerFlags[i] )
|
||||
if ( EnableLayerProps[i] )
|
||||
{
|
||||
material.TextureLayer[i].BilinearFilter = Material.TextureLayer[i].BilinearFilter;
|
||||
material.TextureLayers[i].MinFilter = Material.TextureLayers[i].MinFilter;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EMF_TRILINEAR_FILTER:
|
||||
case EMP_MAG_FILTER:
|
||||
for ( u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
|
||||
{
|
||||
if ( EnableLayerFlags[i] )
|
||||
if ( EnableLayerProps[i] )
|
||||
{
|
||||
material.TextureLayer[i].TrilinearFilter = Material.TextureLayer[i].TrilinearFilter;
|
||||
material.TextureLayers[i].MagFilter = Material.TextureLayers[i].MagFilter;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EMF_ANISOTROPIC_FILTER:
|
||||
case EMP_ANISOTROPIC_FILTER:
|
||||
for ( u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
|
||||
{
|
||||
if ( EnableLayerFlags[i] )
|
||||
if ( EnableLayerProps[i] )
|
||||
{
|
||||
material.TextureLayer[i].AnisotropicFilter = Material.TextureLayer[i].AnisotropicFilter;
|
||||
material.TextureLayers[i].AnisotropicFilter = Material.TextureLayers[i].AnisotropicFilter;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EMF_FOG_ENABLE: material.FogEnable = Material.FogEnable; break;
|
||||
case EMF_NORMALIZE_NORMALS: material.NormalizeNormals = Material.NormalizeNormals; break;
|
||||
case EMF_TEXTURE_WRAP:
|
||||
case EMP_FOG_ENABLE: material.FogEnable = Material.FogEnable; break;
|
||||
case EMP_NORMALIZE_NORMALS: material.NormalizeNormals = Material.NormalizeNormals; break;
|
||||
case EMP_TEXTURE_WRAP:
|
||||
for ( u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
|
||||
{
|
||||
if ( EnableLayerFlags[i] )
|
||||
if ( EnableLayerProps[i] )
|
||||
{
|
||||
material.TextureLayer[i].TextureWrapU = Material.TextureLayer[i].TextureWrapU;
|
||||
material.TextureLayer[i].TextureWrapV = Material.TextureLayer[i].TextureWrapV;
|
||||
material.TextureLayer[i].TextureWrapW = Material.TextureLayer[i].TextureWrapW;
|
||||
material.TextureLayers[i].TextureWrapU = Material.TextureLayers[i].TextureWrapU;
|
||||
material.TextureLayers[i].TextureWrapV = Material.TextureLayers[i].TextureWrapV;
|
||||
material.TextureLayers[i].TextureWrapW = Material.TextureLayers[i].TextureWrapW;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EMF_ANTI_ALIASING: material.AntiAliasing = Material.AntiAliasing; break;
|
||||
case EMF_COLOR_MASK: material.ColorMask = Material.ColorMask; break;
|
||||
case EMF_COLOR_MATERIAL: material.ColorMaterial = Material.ColorMaterial; break;
|
||||
case EMF_USE_MIP_MAPS: material.UseMipMaps = Material.UseMipMaps; break;
|
||||
case EMF_BLEND_OPERATION: material.BlendOperation = Material.BlendOperation; break;
|
||||
case EMF_BLEND_FACTOR: material.BlendFactor = Material.BlendFactor; break;
|
||||
case EMF_POLYGON_OFFSET:
|
||||
case EMP_ANTI_ALIASING: material.AntiAliasing = Material.AntiAliasing; break;
|
||||
case EMP_COLOR_MASK: material.ColorMask = Material.ColorMask; break;
|
||||
case EMP_COLOR_MATERIAL: material.ColorMaterial = Material.ColorMaterial; break;
|
||||
case EMP_USE_MIP_MAPS: material.UseMipMaps = Material.UseMipMaps; break;
|
||||
case EMP_BLEND_OPERATION: material.BlendOperation = Material.BlendOperation; break;
|
||||
case EMP_BLEND_FACTOR: material.BlendFactor = Material.BlendFactor; break;
|
||||
case EMP_POLYGON_OFFSET:
|
||||
material.PolygonOffsetDirection = Material.PolygonOffsetDirection;
|
||||
material.PolygonOffsetFactor = Material.PolygonOffsetFactor;
|
||||
material.PolygonOffsetDepthBias = Material.PolygonOffsetDepthBias;
|
||||
@ -163,11 +163,11 @@ namespace video
|
||||
{
|
||||
if ( EnableLayers[i] )
|
||||
{
|
||||
material.TextureLayer[i] = Material.TextureLayer[i];
|
||||
material.TextureLayers[i] = Material.TextureLayers[i];
|
||||
}
|
||||
else if ( EnableTextures[i] )
|
||||
{
|
||||
material.TextureLayer[i].Texture = Material.TextureLayer[i].Texture;
|
||||
material.TextureLayers[i].Texture = Material.TextureLayers[i].Texture;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,260 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __S_SHARED_MESH_BUFFER_H_INCLUDED__
|
||||
#define __S_SHARED_MESH_BUFFER_H_INCLUDED__
|
||||
|
||||
#include "irrArray.h"
|
||||
#include "IMeshBuffer.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
//! Implementation of the IMeshBuffer interface with shared vertex list
|
||||
struct SSharedMeshBuffer : public IMeshBuffer
|
||||
{
|
||||
//! constructor
|
||||
SSharedMeshBuffer()
|
||||
: IMeshBuffer()
|
||||
, Vertices(0), ChangedID_Vertex(1), ChangedID_Index(1)
|
||||
, MappingHintVertex(EHM_NEVER), MappingHintIndex(EHM_NEVER)
|
||||
, PrimitiveType(EPT_TRIANGLES)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("SSharedMeshBuffer");
|
||||
#endif
|
||||
}
|
||||
|
||||
//! constructor
|
||||
SSharedMeshBuffer(core::array<video::S3DVertex> *vertices) : IMeshBuffer(), Vertices(vertices), ChangedID_Vertex(1), ChangedID_Index(1), MappingHintVertex(EHM_NEVER), MappingHintIndex(EHM_NEVER)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("SSharedMeshBuffer");
|
||||
#endif
|
||||
}
|
||||
|
||||
//! returns the material of this meshbuffer
|
||||
virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_
|
||||
{
|
||||
return Material;
|
||||
}
|
||||
|
||||
//! returns the material of this meshbuffer
|
||||
virtual video::SMaterial& getMaterial() _IRR_OVERRIDE_
|
||||
{
|
||||
return Material;
|
||||
}
|
||||
|
||||
//! returns pointer to vertices
|
||||
virtual const void* getVertices() const _IRR_OVERRIDE_
|
||||
{
|
||||
if (Vertices)
|
||||
return Vertices->const_pointer();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
//! returns pointer to vertices
|
||||
virtual void* getVertices() _IRR_OVERRIDE_
|
||||
{
|
||||
if (Vertices)
|
||||
return Vertices->pointer();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
//! returns amount of vertices
|
||||
virtual u32 getVertexCount() const _IRR_OVERRIDE_
|
||||
{
|
||||
if (Vertices)
|
||||
return Vertices->size();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
//! returns pointer to indices
|
||||
virtual const u16* getIndices() const _IRR_OVERRIDE_
|
||||
{
|
||||
return Indices.const_pointer();
|
||||
}
|
||||
|
||||
//! returns pointer to indices
|
||||
virtual u16* getIndices() _IRR_OVERRIDE_
|
||||
{
|
||||
return Indices.pointer();
|
||||
}
|
||||
|
||||
//! returns amount of indices
|
||||
virtual u32 getIndexCount() const _IRR_OVERRIDE_
|
||||
{
|
||||
return Indices.size();
|
||||
}
|
||||
|
||||
//! Get type of index data which is stored in this meshbuffer.
|
||||
virtual video::E_INDEX_TYPE getIndexType() const _IRR_OVERRIDE_
|
||||
{
|
||||
return video::EIT_16BIT;
|
||||
}
|
||||
|
||||
//! returns an axis aligned bounding box
|
||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_
|
||||
{
|
||||
return BoundingBox;
|
||||
}
|
||||
|
||||
//! set user axis aligned bounding box
|
||||
virtual void setBoundingBox( const core::aabbox3df& box) _IRR_OVERRIDE_
|
||||
{
|
||||
BoundingBox = box;
|
||||
}
|
||||
|
||||
//! returns which type of vertex data is stored.
|
||||
virtual video::E_VERTEX_TYPE getVertexType() const _IRR_OVERRIDE_
|
||||
{
|
||||
return video::EVT_STANDARD;
|
||||
}
|
||||
|
||||
//! recalculates the bounding box. should be called if the mesh changed.
|
||||
virtual void recalculateBoundingBox() _IRR_OVERRIDE_
|
||||
{
|
||||
if (!Vertices || Vertices->empty() || Indices.empty())
|
||||
BoundingBox.reset(0,0,0);
|
||||
else
|
||||
{
|
||||
BoundingBox.reset((*Vertices)[Indices[0]].Pos);
|
||||
for (u32 i=1; i<Indices.size(); ++i)
|
||||
BoundingBox.addInternalPoint((*Vertices)[Indices[i]].Pos);
|
||||
}
|
||||
}
|
||||
|
||||
//! returns position of vertex i
|
||||
virtual const core::vector3df& getPosition(u32 i) const _IRR_OVERRIDE_
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!Vertices);
|
||||
return (*Vertices)[Indices[i]].Pos;
|
||||
}
|
||||
|
||||
//! returns position of vertex i
|
||||
virtual core::vector3df& getPosition(u32 i) _IRR_OVERRIDE_
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!Vertices);
|
||||
return (*Vertices)[Indices[i]].Pos;
|
||||
}
|
||||
|
||||
//! returns normal of vertex i
|
||||
virtual const core::vector3df& getNormal(u32 i) const _IRR_OVERRIDE_
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!Vertices);
|
||||
return (*Vertices)[Indices[i]].Normal;
|
||||
}
|
||||
|
||||
//! returns normal of vertex i
|
||||
virtual core::vector3df& getNormal(u32 i) _IRR_OVERRIDE_
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!Vertices);
|
||||
return (*Vertices)[Indices[i]].Normal;
|
||||
}
|
||||
|
||||
//! returns texture coord of vertex i
|
||||
virtual const core::vector2df& getTCoords(u32 i) const _IRR_OVERRIDE_
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!Vertices);
|
||||
return (*Vertices)[Indices[i]].TCoords;
|
||||
}
|
||||
|
||||
//! returns texture coord of vertex i
|
||||
virtual core::vector2df& getTCoords(u32 i) _IRR_OVERRIDE_
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!Vertices);
|
||||
return (*Vertices)[Indices[i]].TCoords;
|
||||
}
|
||||
|
||||
//! append the vertices and indices to the current buffer
|
||||
virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) _IRR_OVERRIDE_ {}
|
||||
//! append the meshbuffer to the current buffer
|
||||
virtual void append(const IMeshBuffer* const other) _IRR_OVERRIDE_ {}
|
||||
|
||||
//! get the current hardware mapping hint
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const _IRR_OVERRIDE_
|
||||
{
|
||||
return MappingHintVertex;
|
||||
}
|
||||
|
||||
//! get the current hardware mapping hint
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const _IRR_OVERRIDE_
|
||||
{
|
||||
return MappingHintIndex;
|
||||
}
|
||||
|
||||
//! set the hardware mapping hint, for driver
|
||||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) _IRR_OVERRIDE_
|
||||
{
|
||||
if (buffer==EBT_VERTEX_AND_INDEX || buffer==EBT_VERTEX)
|
||||
MappingHintVertex=NewMappingHint;
|
||||
if (buffer==EBT_VERTEX_AND_INDEX || buffer==EBT_INDEX)
|
||||
MappingHintIndex=NewMappingHint;
|
||||
}
|
||||
|
||||
//! Describe what kind of primitive geometry is used by the meshbuffer
|
||||
virtual void setPrimitiveType(E_PRIMITIVE_TYPE type) _IRR_OVERRIDE_
|
||||
{
|
||||
PrimitiveType = type;
|
||||
}
|
||||
|
||||
//! Get the kind of primitive geometry which is used by the meshbuffer
|
||||
virtual E_PRIMITIVE_TYPE getPrimitiveType() const _IRR_OVERRIDE_
|
||||
{
|
||||
return PrimitiveType;
|
||||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) _IRR_OVERRIDE_
|
||||
{
|
||||
if (buffer==EBT_VERTEX_AND_INDEX || buffer==EBT_VERTEX)
|
||||
++ChangedID_Vertex;
|
||||
if (buffer==EBT_VERTEX_AND_INDEX || buffer==EBT_INDEX)
|
||||
++ChangedID_Index;
|
||||
}
|
||||
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID_Vertex() const _IRR_OVERRIDE_ {return ChangedID_Vertex;}
|
||||
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID_Index() const _IRR_OVERRIDE_ {return ChangedID_Index;}
|
||||
|
||||
//! Material of this meshBuffer
|
||||
video::SMaterial Material;
|
||||
|
||||
//! Shared Array of vertices
|
||||
core::array<video::S3DVertex> *Vertices;
|
||||
|
||||
//! Array of indices
|
||||
core::array<u16> Indices;
|
||||
|
||||
//! ID used for hardware buffer management
|
||||
u32 ChangedID_Vertex;
|
||||
|
||||
//! ID used for hardware buffer management
|
||||
u32 ChangedID_Index;
|
||||
|
||||
//! Bounding box
|
||||
core::aabbox3df BoundingBox;
|
||||
|
||||
//! hardware mapping hint
|
||||
E_HARDWARE_MAPPING MappingHintVertex;
|
||||
E_HARDWARE_MAPPING MappingHintIndex;
|
||||
|
||||
//! Primitive type used for rendering (triangles, lines, ...)
|
||||
E_PRIMITIVE_TYPE PrimitiveType;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -23,6 +23,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
ChangedID_Vertex(1), ChangedID_Index(1), VertexType(vt),
|
||||
PrimitiveType(EPT_TRIANGLES),
|
||||
MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER),
|
||||
HWBuffer(NULL),
|
||||
BoundingBoxNeedsRecalculated(true)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
@ -31,13 +32,13 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! Get Material of this buffer.
|
||||
virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_
|
||||
const video::SMaterial& getMaterial() const override
|
||||
{
|
||||
return Material;
|
||||
}
|
||||
|
||||
//! Get Material of this buffer.
|
||||
virtual video::SMaterial& getMaterial() _IRR_OVERRIDE_
|
||||
video::SMaterial& getMaterial() override
|
||||
{
|
||||
return Material;
|
||||
}
|
||||
@ -57,7 +58,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! Get pointer to vertex array
|
||||
virtual const void* getVertices() const _IRR_OVERRIDE_
|
||||
const void* getVertices() const override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -71,7 +72,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! Get pointer to vertex array
|
||||
virtual void* getVertices() _IRR_OVERRIDE_
|
||||
void* getVertices() override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -85,7 +86,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! Get vertex count
|
||||
virtual u32 getVertexCount() const _IRR_OVERRIDE_
|
||||
u32 getVertexCount() const override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -100,43 +101,43 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
|
||||
//! Get type of index data which is stored in this meshbuffer.
|
||||
/** \return Index type of this buffer. */
|
||||
virtual video::E_INDEX_TYPE getIndexType() const _IRR_OVERRIDE_
|
||||
video::E_INDEX_TYPE getIndexType() const override
|
||||
{
|
||||
return video::EIT_16BIT;
|
||||
}
|
||||
|
||||
//! Get pointer to index array
|
||||
virtual const u16* getIndices() const _IRR_OVERRIDE_
|
||||
const u16* getIndices() const override
|
||||
{
|
||||
return Indices.const_pointer();
|
||||
}
|
||||
|
||||
//! Get pointer to index array
|
||||
virtual u16* getIndices() _IRR_OVERRIDE_
|
||||
u16* getIndices() override
|
||||
{
|
||||
return Indices.pointer();
|
||||
}
|
||||
|
||||
//! Get index count
|
||||
virtual u32 getIndexCount() const _IRR_OVERRIDE_
|
||||
u32 getIndexCount() const override
|
||||
{
|
||||
return Indices.size();
|
||||
}
|
||||
|
||||
//! Get bounding box
|
||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_
|
||||
const core::aabbox3d<f32>& getBoundingBox() const override
|
||||
{
|
||||
return BoundingBox;
|
||||
}
|
||||
|
||||
//! Set bounding box
|
||||
virtual void setBoundingBox( const core::aabbox3df& box) _IRR_OVERRIDE_
|
||||
void setBoundingBox( const core::aabbox3df& box) override
|
||||
{
|
||||
BoundingBox = box;
|
||||
}
|
||||
|
||||
//! Recalculate bounding box
|
||||
virtual void recalculateBoundingBox() _IRR_OVERRIDE_
|
||||
void recalculateBoundingBox() override
|
||||
{
|
||||
if(!BoundingBoxNeedsRecalculated)
|
||||
return;
|
||||
@ -185,7 +186,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! Get vertex type
|
||||
virtual video::E_VERTEX_TYPE getVertexType() const _IRR_OVERRIDE_
|
||||
video::E_VERTEX_TYPE getVertexType() const override
|
||||
{
|
||||
return VertexType;
|
||||
}
|
||||
@ -243,7 +244,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! returns position of vertex i
|
||||
virtual const core::vector3df& getPosition(u32 i) const _IRR_OVERRIDE_
|
||||
const core::vector3df& getPosition(u32 i) const override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -257,7 +258,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! returns position of vertex i
|
||||
virtual core::vector3df& getPosition(u32 i) _IRR_OVERRIDE_
|
||||
core::vector3df& getPosition(u32 i) override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -271,7 +272,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! returns normal of vertex i
|
||||
virtual const core::vector3df& getNormal(u32 i) const _IRR_OVERRIDE_
|
||||
const core::vector3df& getNormal(u32 i) const override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -285,7 +286,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! returns normal of vertex i
|
||||
virtual core::vector3df& getNormal(u32 i) _IRR_OVERRIDE_
|
||||
core::vector3df& getNormal(u32 i) override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -299,7 +300,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! returns texture coords of vertex i
|
||||
virtual const core::vector2df& getTCoords(u32 i) const _IRR_OVERRIDE_
|
||||
const core::vector2df& getTCoords(u32 i) const override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -313,7 +314,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! returns texture coords of vertex i
|
||||
virtual core::vector2df& getTCoords(u32 i) _IRR_OVERRIDE_
|
||||
core::vector2df& getTCoords(u32 i) override
|
||||
{
|
||||
switch (VertexType)
|
||||
{
|
||||
@ -327,25 +328,25 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! append the vertices and indices to the current buffer
|
||||
virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) _IRR_OVERRIDE_ {}
|
||||
void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) override {}
|
||||
|
||||
//! append the meshbuffer to the current buffer
|
||||
virtual void append(const IMeshBuffer* const other) _IRR_OVERRIDE_ {}
|
||||
void append(const IMeshBuffer* const other) override {}
|
||||
|
||||
//! get the current hardware mapping hint for vertex buffers
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const _IRR_OVERRIDE_
|
||||
E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const override
|
||||
{
|
||||
return MappingHint_Vertex;
|
||||
}
|
||||
|
||||
//! get the current hardware mapping hint for index buffers
|
||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const _IRR_OVERRIDE_
|
||||
E_HARDWARE_MAPPING getHardwareMappingHint_Index() const override
|
||||
{
|
||||
return MappingHint_Index;
|
||||
}
|
||||
|
||||
//! set the hardware mapping hint, for driver
|
||||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) _IRR_OVERRIDE_
|
||||
void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) override
|
||||
{
|
||||
if (Buffer==EBT_VERTEX)
|
||||
MappingHint_Vertex=NewMappingHint;
|
||||
@ -359,19 +360,19 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
}
|
||||
|
||||
//! Describe what kind of primitive geometry is used by the meshbuffer
|
||||
virtual void setPrimitiveType(E_PRIMITIVE_TYPE type) _IRR_OVERRIDE_
|
||||
void setPrimitiveType(E_PRIMITIVE_TYPE type) override
|
||||
{
|
||||
PrimitiveType = type;
|
||||
}
|
||||
|
||||
//! Get the kind of primitive geometry which is used by the meshbuffer
|
||||
virtual E_PRIMITIVE_TYPE getPrimitiveType() const _IRR_OVERRIDE_
|
||||
E_PRIMITIVE_TYPE getPrimitiveType() const override
|
||||
{
|
||||
return PrimitiveType;
|
||||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) _IRR_OVERRIDE_
|
||||
void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) override
|
||||
{
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
|
||||
++ChangedID_Vertex;
|
||||
@ -379,9 +380,18 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
++ChangedID_Index;
|
||||
}
|
||||
|
||||
virtual u32 getChangedID_Vertex() const _IRR_OVERRIDE_ {return ChangedID_Vertex;}
|
||||
u32 getChangedID_Vertex() const override {return ChangedID_Vertex;}
|
||||
|
||||
u32 getChangedID_Index() const override {return ChangedID_Index;}
|
||||
|
||||
void setHWBuffer(void *ptr) const override {
|
||||
HWBuffer = ptr;
|
||||
}
|
||||
|
||||
void *getHWBuffer() const override {
|
||||
return HWBuffer;
|
||||
}
|
||||
|
||||
virtual u32 getChangedID_Index() const _IRR_OVERRIDE_ {return ChangedID_Index;}
|
||||
|
||||
//! Call this after changing the positions of any vertex.
|
||||
void boundingBoxNeedsRecalculated(void) { BoundingBoxNeedsRecalculated = true; }
|
||||
@ -409,6 +419,8 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
E_HARDWARE_MAPPING MappingHint_Vertex:3;
|
||||
E_HARDWARE_MAPPING MappingHint_Index:3;
|
||||
|
||||
mutable void *HWBuffer;
|
||||
|
||||
bool BoundingBoxNeedsRecalculated:1;
|
||||
};
|
||||
|
||||
|
@ -24,199 +24,6 @@ namespace scene
|
||||
struct IVertexManipulator
|
||||
{
|
||||
};
|
||||
//! Vertex manipulator to set color to a fixed color for all vertices
|
||||
class SVertexColorSetManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorSetManipulator(video::SColor color) : Color(color) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color=Color;
|
||||
}
|
||||
private:
|
||||
video::SColor Color;
|
||||
};
|
||||
//! Vertex manipulator to set the alpha value of the vertex color to a fixed value
|
||||
class SVertexColorSetAlphaManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorSetAlphaManipulator(u32 alpha) : Alpha(alpha) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color.setAlpha(Alpha);
|
||||
}
|
||||
private:
|
||||
u32 Alpha;
|
||||
};
|
||||
//! Vertex manipulator which inverts the RGB values
|
||||
class SVertexColorInvertManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color.setRed(255-vertex.Color.getRed());
|
||||
vertex.Color.setGreen(255-vertex.Color.getGreen());
|
||||
vertex.Color.setBlue(255-vertex.Color.getBlue());
|
||||
}
|
||||
};
|
||||
//! Vertex manipulator to set vertex color to one of two values depending on a given threshold
|
||||
/** If average of the color value is >Threshold the High color is chosen, else Low. */
|
||||
class SVertexColorThresholdManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorThresholdManipulator(u8 threshold, video::SColor low,
|
||||
video::SColor high) : Threshold(threshold), Low(low), High(high) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color = ((u8)vertex.Color.getAverage()>Threshold)?High:Low;
|
||||
}
|
||||
private:
|
||||
u8 Threshold;
|
||||
video::SColor Low;
|
||||
video::SColor High;
|
||||
};
|
||||
//! Vertex manipulator which adjusts the brightness by the given amount
|
||||
/** A positive value increases brightness, a negative value darkens the colors. */
|
||||
class SVertexColorBrightnessManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorBrightnessManipulator(s32 amount) : Amount(amount) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color.setRed(core::clamp(vertex.Color.getRed()+Amount, 0u, 255u));
|
||||
vertex.Color.setGreen(core::clamp(vertex.Color.getGreen()+Amount, 0u, 255u));
|
||||
vertex.Color.setBlue(core::clamp(vertex.Color.getBlue()+Amount, 0u, 255u));
|
||||
}
|
||||
private:
|
||||
s32 Amount;
|
||||
};
|
||||
//! Vertex manipulator which adjusts the contrast by the given factor
|
||||
/** Factors over 1 increase contrast, below 1 reduce it. */
|
||||
class SVertexColorContrastManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorContrastManipulator(f32 factor) : Factor(factor) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color.setRed(core::clamp(core::round32((vertex.Color.getRed()-128)*Factor)+128, 0, 255));
|
||||
vertex.Color.setGreen(core::clamp(core::round32((vertex.Color.getGreen()-128)*Factor)+128, 0, 255));
|
||||
vertex.Color.setBlue(core::clamp(core::round32((vertex.Color.getBlue()-128)*Factor)+128, 0, 255));
|
||||
}
|
||||
private:
|
||||
f32 Factor;
|
||||
};
|
||||
//! Vertex manipulator which adjusts the contrast by the given factor and brightness by a signed amount.
|
||||
/** Factors over 1 increase contrast, below 1 reduce it.
|
||||
A positive amount increases brightness, a negative one darkens the colors. */
|
||||
class SVertexColorContrastBrightnessManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorContrastBrightnessManipulator(f32 factor, s32 amount) : Factor(factor), Amount(amount+128) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color.setRed(core::clamp(core::round32((vertex.Color.getRed()-128)*Factor)+Amount, 0, 255));
|
||||
vertex.Color.setGreen(core::clamp(core::round32((vertex.Color.getGreen()-128)*Factor)+Amount, 0, 255));
|
||||
vertex.Color.setBlue(core::clamp(core::round32((vertex.Color.getBlue()-128)*Factor)+Amount, 0, 255));
|
||||
}
|
||||
private:
|
||||
f32 Factor;
|
||||
s32 Amount;
|
||||
};
|
||||
//! Vertex manipulator which adjusts the brightness by a gamma operation
|
||||
/** A value over one increases brightness, one below darkens the colors. */
|
||||
class SVertexColorGammaManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorGammaManipulator(f32 gamma) : Gamma(1.f)
|
||||
{
|
||||
if (gamma != 0.f)
|
||||
Gamma = 1.f/gamma;
|
||||
}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color.setRed(core::clamp(core::round32(powf((f32)(vertex.Color.getRed()),Gamma)), 0, 255));
|
||||
vertex.Color.setGreen(core::clamp(core::round32(powf((f32)(vertex.Color.getGreen()),Gamma)), 0, 255));
|
||||
vertex.Color.setBlue(core::clamp(core::round32(powf((f32)(vertex.Color.getBlue()),Gamma)), 0, 255));
|
||||
}
|
||||
private:
|
||||
f32 Gamma;
|
||||
};
|
||||
//! Vertex manipulator which scales the color values
|
||||
/** Can e.g be used for white balance, factor would be 255.f/brightest color. */
|
||||
class SVertexColorScaleManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorScaleManipulator(f32 factor) : Factor(factor) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color.setRed(core::clamp(core::round32(vertex.Color.getRed()*Factor), 0, 255));
|
||||
vertex.Color.setGreen(core::clamp(core::round32(vertex.Color.getGreen()*Factor), 0, 255));
|
||||
vertex.Color.setBlue(core::clamp(core::round32(vertex.Color.getBlue()*Factor), 0, 255));
|
||||
}
|
||||
private:
|
||||
f32 Factor;
|
||||
};
|
||||
//! Vertex manipulator which desaturates the color values
|
||||
/** Uses the lightness value of the color. */
|
||||
class SVertexColorDesaturateToLightnessManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color=core::round32(vertex.Color.getLightness());
|
||||
}
|
||||
};
|
||||
//! Vertex manipulator which desaturates the color values
|
||||
/** Uses the average value of the color. */
|
||||
class SVertexColorDesaturateToAverageManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color=vertex.Color.getAverage();
|
||||
}
|
||||
};
|
||||
//! Vertex manipulator which desaturates the color values
|
||||
/** Uses the luminance value of the color. */
|
||||
class SVertexColorDesaturateToLuminanceManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color=core::round32(vertex.Color.getLuminance());
|
||||
}
|
||||
};
|
||||
//! Vertex manipulator which interpolates the color values
|
||||
/** Uses linear interpolation. */
|
||||
class SVertexColorInterpolateLinearManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorInterpolateLinearManipulator(video::SColor color, f32 factor) :
|
||||
Color(color), Factor(factor) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color=vertex.Color.getInterpolated(Color, Factor);
|
||||
}
|
||||
private:
|
||||
video::SColor Color;
|
||||
f32 Factor;
|
||||
};
|
||||
//! Vertex manipulator which interpolates the color values
|
||||
/** Uses linear interpolation. */
|
||||
class SVertexColorInterpolateQuadraticManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexColorInterpolateQuadraticManipulator(video::SColor color1, video::SColor color2, f32 factor) :
|
||||
Color1(color1), Color2(color2), Factor(factor) {}
|
||||
void operator()(video::S3DVertex& vertex) const
|
||||
{
|
||||
vertex.Color=vertex.Color.getInterpolated_quadratic(Color1, Color2, Factor);
|
||||
}
|
||||
private:
|
||||
video::SColor Color1;
|
||||
video::SColor Color2;
|
||||
f32 Factor;
|
||||
};
|
||||
|
||||
//! Vertex manipulator which scales the position of the vertex
|
||||
class SVertexPositionScaleManipulator : public IVertexManipulator
|
||||
@ -232,74 +39,6 @@ namespace scene
|
||||
core::vector3df Factor;
|
||||
};
|
||||
|
||||
//! Vertex manipulator which scales the position of the vertex along the normals
|
||||
/** This can look more pleasing than the usual Scale operator, but
|
||||
depends on the mesh geometry.
|
||||
*/
|
||||
class SVertexPositionScaleAlongNormalsManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexPositionScaleAlongNormalsManipulator(const core::vector3df& factor) : Factor(factor) {}
|
||||
template <typename VType>
|
||||
void operator()(VType& vertex) const
|
||||
{
|
||||
vertex.Pos += vertex.Normal*Factor;
|
||||
}
|
||||
private:
|
||||
core::vector3df Factor;
|
||||
};
|
||||
|
||||
//! Vertex manipulator which transforms the position of the vertex
|
||||
class SVertexPositionTransformManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexPositionTransformManipulator(const core::matrix4& m) : Transformation(m) {}
|
||||
template <typename VType>
|
||||
void operator()(VType& vertex) const
|
||||
{
|
||||
Transformation.transformVect(vertex.Pos);
|
||||
}
|
||||
private:
|
||||
core::matrix4 Transformation;
|
||||
};
|
||||
|
||||
//! Vertex manipulator which transforms the normal of the vertex
|
||||
class SVertexNormalTransformManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexNormalTransformManipulator(const core::matrix4& m) : Transformation(m) {}
|
||||
template <typename VType>
|
||||
void operator()(VType& vertex) const
|
||||
{
|
||||
Transformation.transformVect(vertex.Normal);
|
||||
}
|
||||
private:
|
||||
core::matrix4 Transformation;
|
||||
};
|
||||
|
||||
//! Vertex manipulator which scales the TCoords of the vertex
|
||||
class SVertexTCoordsScaleManipulator : public IVertexManipulator
|
||||
{
|
||||
public:
|
||||
SVertexTCoordsScaleManipulator(const core::vector2df& factor, u32 uvSet=1) : Factor(factor), UVSet(uvSet) {}
|
||||
void operator()(video::S3DVertex2TCoords& vertex) const
|
||||
{
|
||||
if (1==UVSet)
|
||||
vertex.TCoords *= Factor;
|
||||
else if (2==UVSet)
|
||||
vertex.TCoords2 *= Factor;
|
||||
}
|
||||
template <typename VType>
|
||||
void operator()(VType& vertex) const
|
||||
{
|
||||
if (1==UVSet)
|
||||
vertex.TCoords *= Factor;
|
||||
}
|
||||
private:
|
||||
core::vector2df Factor;
|
||||
u32 UVSet;
|
||||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
|
@ -48,32 +48,6 @@ namespace scene
|
||||
**/
|
||||
const c8* const OBJ_LOADER_IGNORE_MATERIAL_FILES = "OBJ_IgnoreMaterialFiles";
|
||||
|
||||
|
||||
//! Flag to ignore the b3d file's mipmapping flag
|
||||
/** Instead Irrlicht's texture creation flag is used. Use it like this:
|
||||
\code
|
||||
SceneManager->getParameters()->setAttribute(scene::B3D_LOADER_IGNORE_MIPMAP_FLAG, true);
|
||||
\endcode
|
||||
**/
|
||||
const c8* const B3D_LOADER_IGNORE_MIPMAP_FLAG = "B3D_IgnoreMipmapFlag";
|
||||
|
||||
//! Name of the parameter for setting the length of debug normals.
|
||||
/** Use it like this:
|
||||
\code
|
||||
SceneManager->getParameters()->setAttribute(scene::DEBUG_NORMAL_LENGTH, 1.5f);
|
||||
\endcode
|
||||
**/
|
||||
const c8* const DEBUG_NORMAL_LENGTH = "DEBUG_Normal_Length";
|
||||
|
||||
//! Name of the parameter for setting the color of debug normals.
|
||||
/** Use it like this:
|
||||
\code
|
||||
SceneManager->getParameters()->setAttributeAsColor(scene::DEBUG_NORMAL_COLOR, video::SColor(255, 255, 255, 255));
|
||||
\endcode
|
||||
**/
|
||||
const c8* const DEBUG_NORMAL_COLOR = "DEBUG_Normal_Color";
|
||||
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
|
@ -1,55 +0,0 @@
|
||||
// Copyright (C) 2009-2012 Christian Stehno
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __E_DRIVER_CHOICE_H_INCLUDED__
|
||||
#define __E_DRIVER_CHOICE_H_INCLUDED__
|
||||
|
||||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include "EDriverTypes.h"
|
||||
#include "IrrlichtDevice.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
//! ask user for driver
|
||||
static irr::video::E_DRIVER_TYPE driverChoiceConsole(bool allDrivers=false)
|
||||
{
|
||||
#if defined (_IRR_IPHONE_PLATFORM_) || defined (_IRR_ANDROID_PLATFORM_)
|
||||
return irr::video::EDT_OGLES2;
|
||||
#else
|
||||
printf("Please select the driver you want:\n");
|
||||
irr::u32 i=0;
|
||||
char c = 'a';
|
||||
|
||||
for (i=irr::video::EDT_COUNT; i>0; --i)
|
||||
{
|
||||
if ( allDrivers || irr::IrrlichtDevice::isDriverSupported(irr::video::E_DRIVER_TYPE(i-1)) )
|
||||
{
|
||||
printf(" (%c) %s\n", c, irr::video::DRIVER_TYPE_NAMES[i-1]);
|
||||
++c;
|
||||
}
|
||||
}
|
||||
|
||||
char userSelection;
|
||||
std::cin >> userSelection;
|
||||
c = 'a';
|
||||
|
||||
for (i=irr::video::EDT_COUNT; i>0; --i)
|
||||
{
|
||||
if ( allDrivers || irr::IrrlichtDevice::isDriverSupported(irr::video::E_DRIVER_TYPE(i-1)) )
|
||||
{
|
||||
if (userSelection == c)
|
||||
return irr::video::E_DRIVER_TYPE(i-1);
|
||||
++c;
|
||||
}
|
||||
}
|
||||
|
||||
return irr::video::EDT_COUNT;
|
||||
#endif
|
||||
}
|
||||
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
@ -5,7 +5,6 @@
|
||||
#ifndef __EXAMPLE_HELPER_H_INCLUDED__
|
||||
#define __EXAMPLE_HELPER_H_INCLUDED__
|
||||
|
||||
#include "IrrCompileConfig.h"
|
||||
#include "path.h"
|
||||
|
||||
namespace irr
|
||||
@ -13,7 +12,7 @@ namespace irr
|
||||
|
||||
static io::path getExampleMediaPath()
|
||||
{
|
||||
#if defined (_IRR_IOS_PLATFORM_) || defined (_IRR_ANDROID_PLATFORM_) || defined (_IRR_OSX_PLATFORM_) || defined (_IRR_EMSCRIPTEN_PLATFORM_)
|
||||
#ifdef IRR_MOBILE_PATHS
|
||||
return io::path("media/");
|
||||
#else
|
||||
return io::path("../../media/");
|
||||
|
@ -1,70 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __IRR_HEAPSORT_H_INCLUDED__
|
||||
#define __IRR_HEAPSORT_H_INCLUDED__
|
||||
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace core
|
||||
{
|
||||
|
||||
//! Sinks an element into the heap.
|
||||
template<class T>
|
||||
inline void heapsink(T*array, s32 element, s32 max)
|
||||
{
|
||||
while ((element<<1) < max) // there is a left child
|
||||
{
|
||||
s32 j = (element<<1);
|
||||
|
||||
if (j+1 < max && array[j] < array[j+1])
|
||||
j = j+1; // take right child
|
||||
|
||||
if (array[element] < array[j])
|
||||
{
|
||||
T t = array[j]; // swap elements
|
||||
array[j] = array[element];
|
||||
array[element] = t;
|
||||
element = j;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! Sorts an array with size 'size' using heapsort.
|
||||
template<class T>
|
||||
inline void heapsort(T* array_, s32 size)
|
||||
{
|
||||
// for heapsink we pretend this is not c++, where
|
||||
// arrays start with index 0. So we decrease the array pointer,
|
||||
// the maximum always +2 and the element always +1
|
||||
|
||||
T* virtualArray = array_ - 1;
|
||||
s32 virtualSize = size + 2;
|
||||
s32 i;
|
||||
|
||||
// build heap
|
||||
|
||||
for (i=((size-1)/2); i>=0; --i)
|
||||
heapsink(virtualArray, i+1, virtualSize-1);
|
||||
|
||||
// sort array, leave out the last element (0)
|
||||
for (i=size-1; i>0; --i)
|
||||
{
|
||||
T t = array_[0];
|
||||
array_[0] = array_[i];
|
||||
array_[i] = t;
|
||||
heapsink(virtualArray, 1, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
} // end namespace core
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -1,124 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine" and the "irrXML" project.
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h
|
||||
|
||||
#ifndef __IRR_ALLOCATOR_H_INCLUDED__
|
||||
#define __IRR_ALLOCATOR_H_INCLUDED__
|
||||
|
||||
#include "irrTypes.h"
|
||||
#include <new>
|
||||
// necessary for older compilers
|
||||
#include <memory.h>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace core
|
||||
{
|
||||
|
||||
#ifdef DEBUG_CLIENTBLOCK
|
||||
#undef DEBUG_CLIENTBLOCK
|
||||
#define DEBUG_CLIENTBLOCK new
|
||||
#endif
|
||||
|
||||
//! Very simple allocator implementation, containers using it can be used across dll boundaries
|
||||
template<typename T>
|
||||
class irrAllocator
|
||||
{
|
||||
public:
|
||||
|
||||
//! Destructor
|
||||
virtual ~irrAllocator() {}
|
||||
|
||||
//! Allocate memory for an array of objects
|
||||
T* allocate(size_t cnt)
|
||||
{
|
||||
return (T*)internal_new(cnt* sizeof(T));
|
||||
}
|
||||
|
||||
//! Deallocate memory for an array of objects
|
||||
void deallocate(T* ptr)
|
||||
{
|
||||
internal_delete(ptr);
|
||||
}
|
||||
|
||||
//! Construct an element
|
||||
void construct(T* ptr, const T&e)
|
||||
{
|
||||
new ((void*)ptr) T(e);
|
||||
}
|
||||
|
||||
//! Destruct an element
|
||||
void destruct(T* ptr)
|
||||
{
|
||||
ptr->~T();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
virtual void* internal_new(size_t cnt)
|
||||
{
|
||||
return operator new(cnt);
|
||||
}
|
||||
|
||||
virtual void internal_delete(void* ptr)
|
||||
{
|
||||
operator delete(ptr);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
//! Fast allocator, only to be used in containers inside the same memory heap.
|
||||
/** Containers using it are NOT able to be used it across dll boundaries. Use this
|
||||
when using in an internal class or function or when compiled into a static lib */
|
||||
template<typename T>
|
||||
class irrAllocatorFast
|
||||
{
|
||||
public:
|
||||
|
||||
//! Allocate memory for an array of objects
|
||||
T* allocate(size_t cnt)
|
||||
{
|
||||
return (T*)operator new(cnt* sizeof(T));
|
||||
}
|
||||
|
||||
//! Deallocate memory for an array of objects
|
||||
void deallocate(T* ptr)
|
||||
{
|
||||
operator delete(ptr);
|
||||
}
|
||||
|
||||
//! Construct an element
|
||||
void construct(T* ptr, const T&e)
|
||||
{
|
||||
new ((void*)ptr) T(e);
|
||||
}
|
||||
|
||||
//! Destruct an element
|
||||
void destruct(T* ptr)
|
||||
{
|
||||
ptr->~T();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
#ifdef DEBUG_CLIENTBLOCK
|
||||
#undef DEBUG_CLIENTBLOCK
|
||||
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
|
||||
#endif
|
||||
|
||||
//! defines an allocation strategy (used only by irr::array so far)
|
||||
enum eAllocStrategy
|
||||
{
|
||||
ALLOC_STRATEGY_SAFE = 0, // increase size by 1
|
||||
ALLOC_STRATEGY_DOUBLE = 1, // double size when under 500 elements, beyond that increase by 1/4th size. Plus a small constant.
|
||||
ALLOC_STRATEGY_SQRT = 2 // not implemented
|
||||
};
|
||||
|
||||
|
||||
} // end namespace core
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -5,9 +5,11 @@
|
||||
#ifndef __IRR_ARRAY_H_INCLUDED__
|
||||
#define __IRR_ARRAY_H_INCLUDED__
|
||||
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <vector>
|
||||
|
||||
#include "irrTypes.h"
|
||||
#include "heapsort.h"
|
||||
#include "irrAllocator.h"
|
||||
#include "irrMath.h"
|
||||
|
||||
namespace irr
|
||||
@ -18,44 +20,27 @@ namespace core
|
||||
//! Self reallocating template array (like stl vector) with additional features.
|
||||
/** Some features are: Heap sorting, binary search methods, easier debugging.
|
||||
*/
|
||||
template <class T, typename TAlloc = irrAllocator<T> >
|
||||
template <class T>
|
||||
class array
|
||||
{
|
||||
|
||||
public:
|
||||
static_assert(!std::is_same<T, bool>::value,
|
||||
"irr::core::array<T> with T = bool not supported. Use std::vector instead.");
|
||||
|
||||
//! Default constructor for empty array.
|
||||
array() : data(0), allocated(0), used(0),
|
||||
strategy(ALLOC_STRATEGY_DOUBLE), free_when_destroyed(true), is_sorted(true)
|
||||
{
|
||||
}
|
||||
|
||||
array() : m_data(), is_sorted(true)
|
||||
{ }
|
||||
|
||||
//! Constructs an array and allocates an initial chunk of memory.
|
||||
/** \param start_count Amount of elements to pre-allocate. */
|
||||
explicit array(u32 start_count) : data(0), allocated(0), used(0),
|
||||
strategy(ALLOC_STRATEGY_DOUBLE),
|
||||
free_when_destroyed(true), is_sorted(true)
|
||||
explicit array(u32 start_count) : m_data(), is_sorted(true)
|
||||
{
|
||||
reallocate(start_count);
|
||||
m_data.reserve(start_count);
|
||||
}
|
||||
|
||||
|
||||
//! Copy constructor
|
||||
array(const array<T, TAlloc>& other) : data(0)
|
||||
{
|
||||
*this = other;
|
||||
}
|
||||
|
||||
|
||||
//! Destructor.
|
||||
/** Frees allocated memory, if set_free_when_destroyed was not set to
|
||||
false by the user before. */
|
||||
~array()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
array(const array<T>& other) : m_data(other.m_data), is_sorted(other.is_sorted)
|
||||
{ }
|
||||
|
||||
//! Reallocates the array, make it bigger or smaller.
|
||||
/** \param new_size New size of array.
|
||||
@ -65,52 +50,28 @@ public:
|
||||
*/
|
||||
void reallocate(u32 new_size, bool canShrink=true)
|
||||
{
|
||||
if (allocated==new_size)
|
||||
return;
|
||||
if (!canShrink && (new_size < allocated))
|
||||
return;
|
||||
|
||||
T* old_data = data;
|
||||
|
||||
data = allocator.allocate(new_size); //new T[new_size];
|
||||
allocated = new_size;
|
||||
|
||||
// copy old data
|
||||
const s32 end = used < new_size ? used : new_size;
|
||||
|
||||
for (s32 i=0; i<end; ++i)
|
||||
{
|
||||
// data[i] = old_data[i];
|
||||
allocator.construct(&data[i], old_data[i]);
|
||||
size_t allocated = m_data.capacity();
|
||||
if (new_size < allocated) {
|
||||
if (canShrink)
|
||||
m_data.resize(new_size);
|
||||
} else {
|
||||
m_data.reserve(new_size);
|
||||
}
|
||||
|
||||
// destruct old data
|
||||
for (u32 j=0; j<used; ++j)
|
||||
allocator.destruct(&old_data[j]);
|
||||
|
||||
if (allocated < used)
|
||||
used = allocated;
|
||||
|
||||
allocator.deallocate(old_data); //delete [] old_data;
|
||||
}
|
||||
|
||||
|
||||
//! set a new allocation strategy
|
||||
/** if the maximum size of the array is unknown, you can define how big the
|
||||
allocation should happen.
|
||||
\param newStrategy New strategy to apply to this array. */
|
||||
void setAllocStrategy ( eAllocStrategy newStrategy = ALLOC_STRATEGY_DOUBLE )
|
||||
{
|
||||
strategy = newStrategy;
|
||||
}
|
||||
|
||||
|
||||
//! Adds an element at back of array.
|
||||
/** If the array is too small to add this new element it is made bigger.
|
||||
\param element: Element to add at the back of the array. */
|
||||
void push_back(const T& element)
|
||||
{
|
||||
insert(element, used);
|
||||
m_data.push_back(element);
|
||||
is_sorted = false;
|
||||
}
|
||||
|
||||
void push_back(T&& element)
|
||||
{
|
||||
m_data.push_back(std::move(element));
|
||||
is_sorted = false;
|
||||
}
|
||||
|
||||
|
||||
@ -121,7 +82,14 @@ public:
|
||||
\param element Element to add at the back of the array. */
|
||||
void push_front(const T& element)
|
||||
{
|
||||
insert(element);
|
||||
m_data.insert(m_data.begin(), element);
|
||||
is_sorted = false;
|
||||
}
|
||||
|
||||
void push_front(T&& element)
|
||||
{
|
||||
m_data.insert(m_data.begin(), std::move(element));
|
||||
is_sorted = false;
|
||||
}
|
||||
|
||||
|
||||
@ -131,106 +99,21 @@ public:
|
||||
\param index: Where position to insert the new element. */
|
||||
void insert(const T& element, u32 index=0)
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(index>used) // access violation
|
||||
|
||||
if (used + 1 > allocated)
|
||||
{
|
||||
// this doesn't work if the element is in the same
|
||||
// array. So we'll copy the element first to be sure
|
||||
// we'll get no data corruption
|
||||
const T e(element);
|
||||
|
||||
// increase data block
|
||||
u32 newAlloc;
|
||||
switch ( strategy )
|
||||
{
|
||||
case ALLOC_STRATEGY_DOUBLE:
|
||||
newAlloc = used + 5 + (allocated < 500 ? used : used >> 2);
|
||||
break;
|
||||
default:
|
||||
case ALLOC_STRATEGY_SAFE:
|
||||
newAlloc = used + 1;
|
||||
break;
|
||||
}
|
||||
reallocate( newAlloc);
|
||||
|
||||
// move array content and construct new element
|
||||
// first move end one up
|
||||
for (u32 i=used; i>index; --i)
|
||||
{
|
||||
if (i<used)
|
||||
allocator.destruct(&data[i]);
|
||||
allocator.construct(&data[i], data[i-1]); // data[i] = data[i-1];
|
||||
}
|
||||
// then add new element
|
||||
if (used > index)
|
||||
allocator.destruct(&data[index]);
|
||||
allocator.construct(&data[index], e); // data[index] = e;
|
||||
}
|
||||
else
|
||||
{
|
||||
// element inserted not at end
|
||||
if ( used > index )
|
||||
{
|
||||
// create one new element at the end
|
||||
allocator.construct(&data[used], data[used-1]);
|
||||
|
||||
// move the rest of the array content
|
||||
for (u32 i=used-1; i>index; --i)
|
||||
{
|
||||
data[i] = data[i-1];
|
||||
}
|
||||
// insert the new element
|
||||
data[index] = element;
|
||||
}
|
||||
else
|
||||
{
|
||||
// insert the new element to the end
|
||||
allocator.construct(&data[index], element);
|
||||
}
|
||||
}
|
||||
// set to false as we don't know if we have the comparison operators
|
||||
_IRR_DEBUG_BREAK_IF(index > m_data.size()) // access violation
|
||||
auto pos = std::next(m_data.begin(), index);
|
||||
m_data.insert(pos, element);
|
||||
is_sorted = false;
|
||||
++used;
|
||||
}
|
||||
|
||||
|
||||
//! Clears the array and deletes all allocated memory.
|
||||
void clear()
|
||||
{
|
||||
if (free_when_destroyed)
|
||||
{
|
||||
for (u32 i=0; i<used; ++i)
|
||||
allocator.destruct(&data[i]);
|
||||
|
||||
allocator.deallocate(data); // delete [] data;
|
||||
}
|
||||
data = 0;
|
||||
used = 0;
|
||||
allocated = 0;
|
||||
// vector::clear() reduces the size to 0, but doesn't free memory.
|
||||
// This swap is guaranteed to delete the allocated memory.
|
||||
std::vector<T>().swap(m_data);
|
||||
is_sorted = true;
|
||||
}
|
||||
|
||||
|
||||
//! Sets pointer to new array, using this as new workspace.
|
||||
/** Make sure that set_free_when_destroyed is used properly.
|
||||
\param newPointer: Pointer to new array of elements.
|
||||
\param size: Size of the new array.
|
||||
\param _is_sorted Flag which tells whether the new array is already
|
||||
sorted.
|
||||
\param _free_when_destroyed Sets whether the new memory area shall be
|
||||
freed by the array upon destruction, or if this will be up to the user
|
||||
application. */
|
||||
void set_pointer(T* newPointer, u32 size, bool _is_sorted=false, bool _free_when_destroyed=true)
|
||||
{
|
||||
clear();
|
||||
data = newPointer;
|
||||
allocated = size;
|
||||
used = size;
|
||||
is_sorted = _is_sorted;
|
||||
free_when_destroyed=_free_when_destroyed;
|
||||
}
|
||||
|
||||
//! Set (copy) data from given memory block
|
||||
/** \param newData data to set, must have newSize elements
|
||||
\param newSize Amount of elements in newData
|
||||
@ -240,12 +123,11 @@ public:
|
||||
*/
|
||||
void set_data(const T* newData, u32 newSize, bool newDataIsSorted=false, bool canShrink=false)
|
||||
{
|
||||
reallocate(newSize, canShrink);
|
||||
set_used(newSize);
|
||||
for ( u32 i=0; i<newSize; ++i)
|
||||
{
|
||||
data[i] = newData[i];
|
||||
m_data.resize(newSize);
|
||||
if (canShrink) {
|
||||
m_data.shrink_to_fit();
|
||||
}
|
||||
std::copy(newData, newData + newSize, m_data.begin());
|
||||
is_sorted = newDataIsSorted;
|
||||
}
|
||||
|
||||
@ -255,80 +137,51 @@ public:
|
||||
\param size Amount of elements in otherData */
|
||||
bool equals(const T* otherData, u32 size) const
|
||||
{
|
||||
if (used != size)
|
||||
if (m_data.size() != size)
|
||||
return false;
|
||||
|
||||
for (u32 i=0; i<size; ++i)
|
||||
if (data[i] != otherData[i])
|
||||
return false;
|
||||
return true;
|
||||
return std::equal(m_data.begin(), m_data.end(), otherData);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Sets if the array should delete the memory it uses upon destruction.
|
||||
/** Also clear and set_pointer will only delete the (original) memory
|
||||
area if this flag is set to true, which is also the default. The
|
||||
methods reallocate, set_used, push_back, push_front, insert, and erase
|
||||
will still try to deallocate the original memory, which might cause
|
||||
troubles depending on the intended use of the memory area.
|
||||
\param f If true, the array frees the allocated memory in its
|
||||
destructor, otherwise not. The default is true. */
|
||||
void set_free_when_destroyed(bool f)
|
||||
{
|
||||
free_when_destroyed = f;
|
||||
}
|
||||
|
||||
|
||||
//! Sets the size of the array and allocates new elements if necessary.
|
||||
/** Please note: This is only secure when using it with simple types,
|
||||
because no default constructor will be called for the added elements.
|
||||
\param usedNow Amount of elements now used. */
|
||||
/** \param usedNow Amount of elements now used. */
|
||||
void set_used(u32 usedNow)
|
||||
{
|
||||
if (allocated < usedNow)
|
||||
reallocate(usedNow);
|
||||
|
||||
used = usedNow;
|
||||
m_data.resize(usedNow);
|
||||
}
|
||||
|
||||
//! Assignment operator
|
||||
const array<T, TAlloc>& operator=(const array<T, TAlloc>& other)
|
||||
const array<T>& operator=(const array<T>& other)
|
||||
{
|
||||
if (this == &other)
|
||||
return *this;
|
||||
strategy = other.strategy;
|
||||
|
||||
if (data)
|
||||
clear();
|
||||
|
||||
//if (allocated < other.allocated)
|
||||
if (other.allocated == 0)
|
||||
data = 0;
|
||||
else
|
||||
data = allocator.allocate(other.allocated); // new T[other.allocated];
|
||||
|
||||
used = other.used;
|
||||
free_when_destroyed = true;
|
||||
m_data = other.m_data;
|
||||
is_sorted = other.is_sorted;
|
||||
allocated = other.allocated;
|
||||
|
||||
for (u32 i=0; i<other.used; ++i)
|
||||
allocator.construct(&data[i], other.data[i]); // data[i] = other.data[i];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
array<T>& operator=(const std::vector<T> &other)
|
||||
{
|
||||
m_data = other;
|
||||
is_sorted = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
array<T>& operator=(std::vector<T> &&other)
|
||||
{
|
||||
m_data = std::move(other);
|
||||
is_sorted = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! Equality operator
|
||||
bool operator == (const array<T, TAlloc>& other) const
|
||||
bool operator == (const array<T>& other) const
|
||||
{
|
||||
return equals(other.const_pointer(), other.size());
|
||||
}
|
||||
|
||||
|
||||
//! Inequality operator
|
||||
bool operator != (const array<T, TAlloc>& other) const
|
||||
bool operator != (const array<T>& other) const
|
||||
{
|
||||
return !(*this==other);
|
||||
}
|
||||
@ -337,36 +190,36 @@ public:
|
||||
//! Direct access operator
|
||||
T& operator [](u32 index)
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(index>=used) // access violation
|
||||
_IRR_DEBUG_BREAK_IF(index >= m_data.size()) // access violation
|
||||
|
||||
return data[index];
|
||||
return m_data[index];
|
||||
}
|
||||
|
||||
|
||||
//! Direct const access operator
|
||||
const T& operator [](u32 index) const
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(index>=used) // access violation
|
||||
_IRR_DEBUG_BREAK_IF(index >= m_data.size()) // access violation
|
||||
|
||||
return data[index];
|
||||
return m_data[index];
|
||||
}
|
||||
|
||||
|
||||
//! Gets last element.
|
||||
T& getLast()
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!used) // access violation
|
||||
_IRR_DEBUG_BREAK_IF(m_data.empty()) // access violation
|
||||
|
||||
return data[used-1];
|
||||
return m_data.back();
|
||||
}
|
||||
|
||||
|
||||
//! Gets last element
|
||||
const T& getLast() const
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!used) // access violation
|
||||
_IRR_DEBUG_BREAK_IF(m_data.empty()) // access violation
|
||||
|
||||
return data[used-1];
|
||||
return m_data.back();
|
||||
}
|
||||
|
||||
|
||||
@ -374,7 +227,7 @@ public:
|
||||
/** \return Pointer to the array. */
|
||||
T* pointer()
|
||||
{
|
||||
return data;
|
||||
return m_data.empty() ? nullptr : &m_data[0];
|
||||
}
|
||||
|
||||
|
||||
@ -382,7 +235,7 @@ public:
|
||||
/** \return Pointer to the array. */
|
||||
const T* const_pointer() const
|
||||
{
|
||||
return data;
|
||||
return m_data.empty() ? nullptr : &m_data[0];
|
||||
}
|
||||
|
||||
|
||||
@ -390,7 +243,7 @@ public:
|
||||
/** \return Size of elements in the array which are actually occupied. */
|
||||
u32 size() const
|
||||
{
|
||||
return used;
|
||||
return m_data.size();
|
||||
}
|
||||
|
||||
|
||||
@ -399,7 +252,7 @@ public:
|
||||
allocated would be allocated_size() * sizeof(ElementTypeUsed); */
|
||||
u32 allocated_size() const
|
||||
{
|
||||
return allocated;
|
||||
return m_data.capacity();
|
||||
}
|
||||
|
||||
|
||||
@ -407,7 +260,7 @@ public:
|
||||
/** \return True if the array is empty false if not. */
|
||||
bool empty() const
|
||||
{
|
||||
return used == 0;
|
||||
return m_data.empty();
|
||||
}
|
||||
|
||||
|
||||
@ -416,9 +269,10 @@ public:
|
||||
O(n*log n) in worst case. */
|
||||
void sort()
|
||||
{
|
||||
if (!is_sorted && used>1)
|
||||
heapsort(data, used);
|
||||
is_sorted = true;
|
||||
if (!is_sorted) {
|
||||
std::sort(m_data.begin(), m_data.end());
|
||||
is_sorted = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -432,10 +286,9 @@ public:
|
||||
s32 binary_search(const T& element)
|
||||
{
|
||||
sort();
|
||||
return binary_search(element, 0, used-1);
|
||||
return binary_search(element, 0, (s32)m_data.size() - 1);
|
||||
}
|
||||
|
||||
|
||||
//! Performs a binary search for an element if possible, returns -1 if not found.
|
||||
/** This method is for const arrays and so cannot call sort(), if the array is
|
||||
not sorted then linear_search will be used instead. Potentially very slow!
|
||||
@ -445,12 +298,11 @@ public:
|
||||
s32 binary_search(const T& element) const
|
||||
{
|
||||
if (is_sorted)
|
||||
return binary_search(element, 0, used-1);
|
||||
return binary_search(element, 0, (s32)m_data.size() - 1);
|
||||
else
|
||||
return linear_search(element);
|
||||
}
|
||||
|
||||
|
||||
//! Performs a binary search for an element, returns -1 if not found.
|
||||
/** \param element: Element to search for.
|
||||
\param left First left index
|
||||
@ -459,31 +311,15 @@ public:
|
||||
is returned. */
|
||||
s32 binary_search(const T& element, s32 left, s32 right) const
|
||||
{
|
||||
if (!used)
|
||||
if (left > right)
|
||||
return -1;
|
||||
|
||||
s32 m;
|
||||
|
||||
do
|
||||
{
|
||||
m = (left+right)>>1;
|
||||
|
||||
if (element < data[m])
|
||||
right = m - 1;
|
||||
else
|
||||
left = m + 1;
|
||||
|
||||
} while((element < data[m] || data[m] < element) && left<=right);
|
||||
// this last line equals to:
|
||||
// " while((element != array[m]) && left<=right);"
|
||||
// but we only want to use the '<' operator.
|
||||
// the same in next line, it is "(element == array[m])"
|
||||
|
||||
|
||||
if (!(element < data[m]) && !(data[m] < element))
|
||||
return m;
|
||||
|
||||
return -1;
|
||||
auto lpos = std::next(m_data.begin(), left);
|
||||
auto rpos = std::next(m_data.begin(), right);
|
||||
auto it = std::lower_bound(lpos, rpos, element);
|
||||
// *it = first element in [first, last) that is >= element, or last if not found.
|
||||
if (*it < element || element < *it)
|
||||
return -1;
|
||||
return it - m_data.begin();
|
||||
}
|
||||
|
||||
|
||||
@ -498,25 +334,11 @@ public:
|
||||
s32 binary_search_multi(const T& element, s32 &last)
|
||||
{
|
||||
sort();
|
||||
s32 index = binary_search(element, 0, used-1);
|
||||
if ( index < 0 )
|
||||
return index;
|
||||
|
||||
// The search can be somewhere in the middle of the set
|
||||
// look linear previous and past the index
|
||||
last = index;
|
||||
|
||||
while ( index > 0 && !(element < data[index - 1]) && !(data[index - 1] < element) )
|
||||
{
|
||||
index -= 1;
|
||||
}
|
||||
// look linear up
|
||||
while ( last < (s32) used - 1 && !(element < data[last + 1]) && !(data[last + 1] < element) )
|
||||
{
|
||||
last += 1;
|
||||
}
|
||||
|
||||
return index;
|
||||
auto iters = std::equal_range(m_data.begin(), m_data.end(), element);
|
||||
if (iters.first == iters.second)
|
||||
return -1;
|
||||
last = (iters.second - m_data.begin()) - 1;
|
||||
return iters.first - m_data.begin();
|
||||
}
|
||||
|
||||
|
||||
@ -528,11 +350,10 @@ public:
|
||||
is returned. */
|
||||
s32 linear_search(const T& element) const
|
||||
{
|
||||
for (u32 i=0; i<used; ++i)
|
||||
if (element == data[i])
|
||||
return (s32)i;
|
||||
|
||||
return -1;
|
||||
auto it = std::find(m_data.begin(), m_data.end(), element);
|
||||
if (it == m_data.end())
|
||||
return -1;
|
||||
return it - m_data.begin();
|
||||
}
|
||||
|
||||
|
||||
@ -544,11 +365,11 @@ public:
|
||||
is returned. */
|
||||
s32 linear_reverse_search(const T& element) const
|
||||
{
|
||||
for (s32 i=used-1; i>=0; --i)
|
||||
if (data[i] == element)
|
||||
return i;
|
||||
|
||||
return -1;
|
||||
auto it = std::find(m_data.rbegin(), m_data.rend(), element);
|
||||
if (it == m_data.rend())
|
||||
return -1;
|
||||
size_t offset = it - m_data.rbegin();
|
||||
return m_data.size() - offset - 1;
|
||||
}
|
||||
|
||||
|
||||
@ -558,17 +379,9 @@ public:
|
||||
\param index: Index of element to be erased. */
|
||||
void erase(u32 index)
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(index>=used) // access violation
|
||||
|
||||
for (u32 i=index+1; i<used; ++i)
|
||||
{
|
||||
allocator.destruct(&data[i-1]);
|
||||
allocator.construct(&data[i-1], data[i]); // data[i-1] = data[i];
|
||||
}
|
||||
|
||||
allocator.destruct(&data[used-1]);
|
||||
|
||||
--used;
|
||||
_IRR_DEBUG_BREAK_IF(index >= m_data.size()) // access violation
|
||||
auto it = std::next(m_data.begin(), index);
|
||||
m_data.erase(it);
|
||||
}
|
||||
|
||||
|
||||
@ -579,30 +392,14 @@ public:
|
||||
\param count: Amount of elements to be erased. */
|
||||
void erase(u32 index, s32 count)
|
||||
{
|
||||
if (index>=used || count<1)
|
||||
if (index >= m_data.size() || count < 1)
|
||||
return;
|
||||
if (index+count>used)
|
||||
count = used-index;
|
||||
|
||||
u32 i;
|
||||
for (i=index; i<index+count; ++i)
|
||||
allocator.destruct(&data[i]);
|
||||
|
||||
for (i=index+count; i<used; ++i)
|
||||
{
|
||||
if (i-count >= index+count) // not already destructed before loop
|
||||
allocator.destruct(&data[i-count]);
|
||||
|
||||
allocator.construct(&data[i-count], data[i]); // data[i-count] = data[i];
|
||||
|
||||
if (i >= used-count) // those which are not overwritten
|
||||
allocator.destruct(&data[i]);
|
||||
}
|
||||
|
||||
used-= count;
|
||||
count = core::min_(count, (s32)m_data.size() - (s32)index);
|
||||
auto first = std::next(m_data.begin(), index);
|
||||
auto last = std::next(first, count);
|
||||
m_data.erase(first, last);
|
||||
}
|
||||
|
||||
|
||||
//! Sets if the array is sorted
|
||||
void set_sorted(bool _is_sorted)
|
||||
{
|
||||
@ -614,38 +411,30 @@ public:
|
||||
/** Afterward this object will contain the content of the other object and the other
|
||||
object will contain the content of this object.
|
||||
\param other Swap content with this object */
|
||||
void swap(array<T, TAlloc>& other)
|
||||
void swap(array<T>& other)
|
||||
{
|
||||
core::swap(data, other.data);
|
||||
core::swap(allocated, other.allocated);
|
||||
core::swap(used, other.used);
|
||||
core::swap(allocator, other.allocator); // memory is still released by the same allocator used for allocation
|
||||
eAllocStrategy helper_strategy(strategy); // can't use core::swap with bitfields
|
||||
strategy = other.strategy;
|
||||
other.strategy = helper_strategy;
|
||||
bool helper_free_when_destroyed(free_when_destroyed);
|
||||
free_when_destroyed = other.free_when_destroyed;
|
||||
other.free_when_destroyed = helper_free_when_destroyed;
|
||||
bool helper_is_sorted(is_sorted);
|
||||
is_sorted = other.is_sorted;
|
||||
other.is_sorted = helper_is_sorted;
|
||||
m_data.swap(other.m_data);
|
||||
std::swap(is_sorted, other.is_sorted);
|
||||
}
|
||||
|
||||
//! Pull the contents of this array as a vector.
|
||||
// The array is left empty.
|
||||
std::vector<T> steal()
|
||||
{
|
||||
std::vector<T> ret = std::move(m_data);
|
||||
m_data.clear();
|
||||
is_sorted = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
typedef TAlloc allocator_type;
|
||||
typedef T value_type;
|
||||
typedef u32 size_type;
|
||||
|
||||
private:
|
||||
T* data;
|
||||
u32 allocated;
|
||||
u32 used;
|
||||
TAlloc allocator;
|
||||
eAllocStrategy strategy:4;
|
||||
bool free_when_destroyed:1;
|
||||
bool is_sorted:1;
|
||||
std::vector<T> m_data;
|
||||
bool is_sorted;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace core
|
||||
} // end namespace irr
|
||||
|
||||
|
@ -1,414 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __IRR_LIST_H_INCLUDED__
|
||||
#define __IRR_LIST_H_INCLUDED__
|
||||
|
||||
#include "irrTypes.h"
|
||||
#include "irrAllocator.h"
|
||||
#include "irrMath.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace core
|
||||
{
|
||||
|
||||
|
||||
//! Doubly linked list template.
|
||||
template <class T>
|
||||
class list
|
||||
{
|
||||
private:
|
||||
|
||||
//! List element node with pointer to previous and next element in the list.
|
||||
struct SKListNode
|
||||
{
|
||||
SKListNode(const T& e) : Next(0), Prev(0), Element(e) {}
|
||||
|
||||
SKListNode* Next;
|
||||
SKListNode* Prev;
|
||||
T Element;
|
||||
};
|
||||
|
||||
public:
|
||||
class ConstIterator;
|
||||
|
||||
//! List iterator.
|
||||
class Iterator
|
||||
{
|
||||
public:
|
||||
Iterator() : Current(0) {}
|
||||
|
||||
Iterator& operator ++() { Current = Current->Next; return *this; }
|
||||
Iterator& operator --() { Current = Current->Prev; return *this; }
|
||||
Iterator operator ++(s32) { Iterator tmp = *this; Current = Current->Next; return tmp; }
|
||||
Iterator operator --(s32) { Iterator tmp = *this; Current = Current->Prev; return tmp; }
|
||||
|
||||
Iterator& operator +=(s32 num)
|
||||
{
|
||||
if(num > 0)
|
||||
{
|
||||
while (num-- && this->Current != 0) ++(*this);
|
||||
}
|
||||
else
|
||||
{
|
||||
while(num++ && this->Current != 0) --(*this);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Iterator operator + (s32 num) const { Iterator tmp = *this; return tmp += num; }
|
||||
Iterator& operator -=(s32 num) { return (*this)+=(-num); }
|
||||
Iterator operator - (s32 num) const { return (*this)+ (-num); }
|
||||
|
||||
bool operator ==(const Iterator& other) const { return Current == other.Current; }
|
||||
bool operator !=(const Iterator& other) const { return Current != other.Current; }
|
||||
bool operator ==(const ConstIterator& other) const { return Current == other.Current; }
|
||||
bool operator !=(const ConstIterator& other) const { return Current != other.Current; }
|
||||
|
||||
T & operator * () { return Current->Element; }
|
||||
T * operator ->() { return &Current->Element; }
|
||||
|
||||
private:
|
||||
explicit Iterator(SKListNode* begin) : Current(begin) {}
|
||||
|
||||
SKListNode* Current;
|
||||
|
||||
friend class list<T>;
|
||||
friend class ConstIterator;
|
||||
};
|
||||
|
||||
//! List iterator for const access.
|
||||
class ConstIterator
|
||||
{
|
||||
public:
|
||||
|
||||
ConstIterator() : Current(0) {}
|
||||
ConstIterator(const Iterator& iter) : Current(iter.Current) {}
|
||||
|
||||
ConstIterator& operator ++() { Current = Current->Next; return *this; }
|
||||
ConstIterator& operator --() { Current = Current->Prev; return *this; }
|
||||
ConstIterator operator ++(s32) { ConstIterator tmp = *this; Current = Current->Next; return tmp; }
|
||||
ConstIterator operator --(s32) { ConstIterator tmp = *this; Current = Current->Prev; return tmp; }
|
||||
|
||||
ConstIterator& operator +=(s32 num)
|
||||
{
|
||||
if(num > 0)
|
||||
{
|
||||
while(num-- && this->Current != 0) ++(*this);
|
||||
}
|
||||
else
|
||||
{
|
||||
while(num++ && this->Current != 0) --(*this);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
ConstIterator operator + (s32 num) const { ConstIterator tmp = *this; return tmp += num; }
|
||||
ConstIterator& operator -=(s32 num) { return (*this)+=(-num); }
|
||||
ConstIterator operator - (s32 num) const { return (*this)+ (-num); }
|
||||
|
||||
bool operator ==(const ConstIterator& other) const { return Current == other.Current; }
|
||||
bool operator !=(const ConstIterator& other) const { return Current != other.Current; }
|
||||
bool operator ==(const Iterator& other) const { return Current == other.Current; }
|
||||
bool operator !=(const Iterator& other) const { return Current != other.Current; }
|
||||
|
||||
const T & operator * () { return Current->Element; }
|
||||
const T * operator ->() { return &Current->Element; }
|
||||
|
||||
ConstIterator & operator =(const Iterator & iterator) { Current = iterator.Current; return *this; }
|
||||
|
||||
private:
|
||||
explicit ConstIterator(SKListNode* begin) : Current(begin) {}
|
||||
|
||||
SKListNode* Current;
|
||||
|
||||
friend class Iterator;
|
||||
friend class list<T>;
|
||||
};
|
||||
|
||||
//! Default constructor for empty list.
|
||||
list()
|
||||
: First(0), Last(0), Size(0) {}
|
||||
|
||||
|
||||
//! Copy constructor.
|
||||
list(const list<T>& other) : First(0), Last(0), Size(0)
|
||||
{
|
||||
*this = other;
|
||||
}
|
||||
|
||||
|
||||
//! Destructor
|
||||
~list()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
|
||||
//! Assignment operator
|
||||
void operator=(const list<T>& other)
|
||||
{
|
||||
if(&other == this)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
clear();
|
||||
|
||||
SKListNode* node = other.First;
|
||||
while(node)
|
||||
{
|
||||
push_back(node->Element);
|
||||
node = node->Next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! Returns amount of elements in list.
|
||||
/** \return Amount of elements in the list. */
|
||||
u32 size() const
|
||||
{
|
||||
return Size;
|
||||
}
|
||||
u32 getSize() const
|
||||
{
|
||||
return Size;
|
||||
}
|
||||
|
||||
|
||||
//! Clears the list, deletes all elements in the list.
|
||||
/** All existing iterators of this list will be invalid. */
|
||||
void clear()
|
||||
{
|
||||
while(First)
|
||||
{
|
||||
SKListNode * next = First->Next;
|
||||
allocator.destruct(First);
|
||||
allocator.deallocate(First);
|
||||
First = next;
|
||||
}
|
||||
|
||||
//First = 0; handled by loop
|
||||
Last = 0;
|
||||
Size = 0;
|
||||
}
|
||||
|
||||
|
||||
//! Checks for empty list.
|
||||
/** \return True if the list is empty and false if not. */
|
||||
bool empty() const
|
||||
{
|
||||
return (First == 0);
|
||||
}
|
||||
|
||||
|
||||
//! Adds an element at the end of the list.
|
||||
/** \param element Element to add to the list. */
|
||||
void push_back(const T& element)
|
||||
{
|
||||
SKListNode* node = allocator.allocate(1);
|
||||
allocator.construct(node, element);
|
||||
|
||||
++Size;
|
||||
|
||||
if (First == 0)
|
||||
First = node;
|
||||
|
||||
node->Prev = Last;
|
||||
|
||||
if (Last != 0)
|
||||
Last->Next = node;
|
||||
|
||||
Last = node;
|
||||
}
|
||||
|
||||
|
||||
//! Adds an element at the begin of the list.
|
||||
/** \param element: Element to add to the list. */
|
||||
void push_front(const T& element)
|
||||
{
|
||||
SKListNode* node = allocator.allocate(1);
|
||||
allocator.construct(node, element);
|
||||
|
||||
++Size;
|
||||
|
||||
if (First == 0)
|
||||
{
|
||||
Last = node;
|
||||
First = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
node->Next = First;
|
||||
First->Prev = node;
|
||||
First = node;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! Gets first node.
|
||||
/** \return A list iterator pointing to the beginning of the list. */
|
||||
Iterator begin()
|
||||
{
|
||||
return Iterator(First);
|
||||
}
|
||||
|
||||
|
||||
//! Gets first node.
|
||||
/** \return A const list iterator pointing to the beginning of the list. */
|
||||
ConstIterator begin() const
|
||||
{
|
||||
return ConstIterator(First);
|
||||
}
|
||||
|
||||
|
||||
//! Gets end node.
|
||||
/** \return List iterator pointing to null. */
|
||||
Iterator end()
|
||||
{
|
||||
return Iterator(0);
|
||||
}
|
||||
|
||||
|
||||
//! Gets end node.
|
||||
/** \return Const list iterator pointing to null. */
|
||||
ConstIterator end() const
|
||||
{
|
||||
return ConstIterator(0);
|
||||
}
|
||||
|
||||
|
||||
//! Gets last element.
|
||||
/** \return List iterator pointing to the last element of the list. */
|
||||
Iterator getLast()
|
||||
{
|
||||
return Iterator(Last);
|
||||
}
|
||||
|
||||
|
||||
//! Gets last element.
|
||||
/** \return Const list iterator pointing to the last element of the list. */
|
||||
ConstIterator getLast() const
|
||||
{
|
||||
return ConstIterator(Last);
|
||||
}
|
||||
|
||||
|
||||
//! Inserts an element after an element.
|
||||
/** \param it Iterator pointing to element after which the new element
|
||||
should be inserted.
|
||||
\param element The new element to be inserted into the list.
|
||||
*/
|
||||
void insert_after(const Iterator& it, const T& element)
|
||||
{
|
||||
SKListNode* node = allocator.allocate(1);
|
||||
allocator.construct(node, element);
|
||||
|
||||
node->Next = it.Current->Next;
|
||||
|
||||
if (it.Current->Next)
|
||||
it.Current->Next->Prev = node;
|
||||
|
||||
node->Prev = it.Current;
|
||||
it.Current->Next = node;
|
||||
++Size;
|
||||
|
||||
if (it.Current == Last)
|
||||
Last = node;
|
||||
}
|
||||
|
||||
|
||||
//! Inserts an element before an element.
|
||||
/** \param it Iterator pointing to element before which the new element
|
||||
should be inserted.
|
||||
\param element The new element to be inserted into the list.
|
||||
*/
|
||||
void insert_before(const Iterator& it, const T& element)
|
||||
{
|
||||
SKListNode* node = allocator.allocate(1);
|
||||
allocator.construct(node, element);
|
||||
|
||||
node->Prev = it.Current->Prev;
|
||||
|
||||
if (it.Current->Prev)
|
||||
it.Current->Prev->Next = node;
|
||||
|
||||
node->Next = it.Current;
|
||||
it.Current->Prev = node;
|
||||
++Size;
|
||||
|
||||
if (it.Current == First)
|
||||
First = node;
|
||||
}
|
||||
|
||||
|
||||
//! Erases an element.
|
||||
/** \param it Iterator pointing to the element which shall be erased.
|
||||
\return Iterator pointing to next element. */
|
||||
Iterator erase(Iterator& it)
|
||||
{
|
||||
// suggest changing this to a const Iterator& and
|
||||
// working around line: it.Current = 0 (possibly with a mutable, or just let it be garbage?)
|
||||
|
||||
Iterator returnIterator(it);
|
||||
++returnIterator;
|
||||
|
||||
if(it.Current == First)
|
||||
{
|
||||
First = it.Current->Next;
|
||||
}
|
||||
else
|
||||
{
|
||||
it.Current->Prev->Next = it.Current->Next;
|
||||
}
|
||||
|
||||
if(it.Current == Last)
|
||||
{
|
||||
Last = it.Current->Prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
it.Current->Next->Prev = it.Current->Prev;
|
||||
}
|
||||
|
||||
allocator.destruct(it.Current);
|
||||
allocator.deallocate(it.Current);
|
||||
it.Current = 0;
|
||||
--Size;
|
||||
|
||||
return returnIterator;
|
||||
}
|
||||
|
||||
//! Swap the content of this list container with the content of another list
|
||||
/** Afterward this object will contain the content of the other object and the other
|
||||
object will contain the content of this object. Iterators will afterward be valid for
|
||||
the swapped object.
|
||||
\param other Swap content with this object */
|
||||
void swap(list<T>& other)
|
||||
{
|
||||
core::swap(First, other.First);
|
||||
core::swap(Last, other.Last);
|
||||
core::swap(Size, other.Size);
|
||||
core::swap(allocator, other.allocator); // memory is still released by the same allocator used for allocation
|
||||
}
|
||||
|
||||
typedef T value_type;
|
||||
typedef u32 size_type;
|
||||
|
||||
private:
|
||||
|
||||
SKListNode* First;
|
||||
SKListNode* Last;
|
||||
u32 Size;
|
||||
irrAllocator<SKListNode> allocator;
|
||||
|
||||
};
|
||||
|
||||
|
||||
} // end namespace core
|
||||
}// end namespace irr
|
||||
|
||||
#endif
|
||||
|
1082
include/irrMap.h
1082
include/irrMap.h
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,6 @@
|
||||
#ifndef __IRR_MATH_H_INCLUDED__
|
||||
#define __IRR_MATH_H_INCLUDED__
|
||||
|
||||
#include "IrrCompileConfig.h"
|
||||
#include "irrTypes.h"
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
@ -21,9 +20,7 @@ namespace core
|
||||
|
||||
const s32 ROUNDING_ERROR_S32 = 0;
|
||||
|
||||
#ifdef __IRR_HAS_S64
|
||||
const s64 ROUNDING_ERROR_S64 = 0;
|
||||
#endif
|
||||
const f32 ROUNDING_ERROR_f32 = 0.000001f;
|
||||
const f64 ROUNDING_ERROR_f64 = 0.00000001;
|
||||
|
||||
@ -186,7 +183,6 @@ namespace core
|
||||
return ROUNDING_ERROR_S32;
|
||||
}
|
||||
|
||||
#ifdef __IRR_HAS_S64
|
||||
template <>
|
||||
inline s64 roundingError()
|
||||
{
|
||||
@ -198,7 +194,6 @@ namespace core
|
||||
{
|
||||
return ROUNDING_ERROR_S64;
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class T>
|
||||
inline T relativeErrorFactor()
|
||||
@ -310,29 +305,25 @@ namespace core
|
||||
return a <= tolerance;
|
||||
}
|
||||
|
||||
#ifdef __IRR_HAS_S64
|
||||
//! returns if a equals zero, taking rounding errors into account
|
||||
inline bool iszero(const s64 a, const s64 tolerance = 0)
|
||||
{
|
||||
return abs_(a) <= tolerance;
|
||||
}
|
||||
#endif
|
||||
|
||||
inline s32 s32_min(s32 a, s32 b)
|
||||
{
|
||||
const s32 mask = (a - b) >> 31;
|
||||
return (a & mask) | (b & ~mask);
|
||||
return min_(a, b);
|
||||
}
|
||||
|
||||
inline s32 s32_max(s32 a, s32 b)
|
||||
{
|
||||
const s32 mask = (a - b) >> 31;
|
||||
return (b & mask) | (a & ~mask);
|
||||
return max_(a, b);
|
||||
}
|
||||
|
||||
inline s32 s32_clamp (s32 value, s32 low, s32 high)
|
||||
{
|
||||
return s32_min(s32_max(value,low), high);
|
||||
return clamp(value, low, high);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -381,33 +372,6 @@ namespace core
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//! conditional set based on mask and arithmetic shift
|
||||
REALINLINE u32 if_c_a_else_b ( const s32 condition, const u32 a, const u32 b )
|
||||
{
|
||||
return ( ( -condition >> 31 ) & ( a ^ b ) ) ^ b;
|
||||
}
|
||||
|
||||
//! conditional set based on mask and arithmetic shift
|
||||
REALINLINE u16 if_c_a_else_b ( const s16 condition, const u16 a, const u16 b )
|
||||
{
|
||||
return ( ( -condition >> 15 ) & ( a ^ b ) ) ^ b;
|
||||
}
|
||||
|
||||
//! conditional set based on mask and arithmetic shift
|
||||
REALINLINE u32 if_c_a_else_0 ( const s32 condition, const u32 a )
|
||||
{
|
||||
return ( -condition >> 31 ) & a;
|
||||
}
|
||||
|
||||
/*
|
||||
if (condition) state |= m; else state &= ~m;
|
||||
*/
|
||||
REALINLINE void setbit_cond ( u32 &state, s32 condition, u32 mask )
|
||||
{
|
||||
// 0, or any positive to mask
|
||||
//s32 conmask = -condition >> 31;
|
||||
state ^= ( ( -condition >> 31 ) ^ state ) & mask;
|
||||
}
|
||||
|
||||
// NOTE: This is not as exact as the c99/c++11 round function, especially at high numbers starting with 8388609
|
||||
// (only low number which seems to go wrong is 0.49999997 which is rounded to 1)
|
||||
@ -435,13 +399,11 @@ namespace core
|
||||
return static_cast<s32>(squareroot(static_cast<f32>(f)));
|
||||
}
|
||||
|
||||
#ifdef __IRR_HAS_S64
|
||||
// calculate: sqrt ( x )
|
||||
REALINLINE s64 squareroot(const s64 f)
|
||||
{
|
||||
return static_cast<s64>(squareroot(static_cast<f64>(f)));
|
||||
}
|
||||
#endif
|
||||
|
||||
// calculate: 1 / sqrt ( x )
|
||||
REALINLINE f64 reciprocal_squareroot(const f64 x)
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user