mirror of
https://github.com/minetest/irrlicht.git
synced 2025-07-04 09:10:27 +02:00
Compare commits
69 Commits
Author | SHA1 | Date | |
---|---|---|---|
1d43ea17ca | |||
09e6eeb65b | |||
839bdc1a65 | |||
ea297196b7 | |||
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 |
118
.github/workflows/build.yml
vendored
118
.github/workflows/build.yml
vendored
@ -8,13 +8,16 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
linux-gl:
|
linux-gl:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ubuntu:bionic
|
||||||
|
env: { LANG: "C.UTF-8" }
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
apt-get update
|
||||||
sudo apt-get install g++ cmake libxxf86vm-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
|
apt-get install g++ cmake libxi-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
@ -26,19 +29,22 @@ jobs:
|
|||||||
make DESTDIR=$PWD/_install install
|
make DESTDIR=$PWD/_install install
|
||||||
tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local .
|
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:
|
with:
|
||||||
name: irrlicht-linux
|
name: irrlicht-linux
|
||||||
path: ./irrlicht-linux.tar.gz
|
path: ./irrlicht-linux.tar.gz
|
||||||
|
|
||||||
linux-gles:
|
linux-gles:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ubuntu:bionic
|
||||||
|
env: { LANG: "C.UTF-8" }
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
apt-get update
|
||||||
sudo apt-get install g++ cmake libxxf86vm-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
|
apt-get install g++ cmake libxi-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
@ -57,10 +63,33 @@ jobs:
|
|||||||
cd bin/Linux
|
cd bin/Linux
|
||||||
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest
|
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest
|
||||||
|
|
||||||
|
linux-sdl:
|
||||||
|
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 -qyy
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
sed '/#define _IRR_COMPILE_WITH_SDL_DEVICE_/ s|^//||g' -i include/IrrCompileConfig.h
|
||||||
|
cmake . -DBUILD_EXAMPLES=1
|
||||||
|
make -j2
|
||||||
|
|
||||||
|
- name: Test (headless)
|
||||||
|
run: |
|
||||||
|
cd bin/Linux
|
||||||
|
./AutomatedTest null
|
||||||
|
|
||||||
win32:
|
win32:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Install compiler
|
- name: Install compiler
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update && sudo apt-get install cmake -qyy
|
sudo apt-get update && sudo apt-get install cmake -qyy
|
||||||
@ -74,7 +103,7 @@ jobs:
|
|||||||
CC: i686-w64-mingw32-gcc
|
CC: i686-w64-mingw32-gcc
|
||||||
CXX: i686-w64-mingw32-g++
|
CXX: i686-w64-mingw32-g++
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: irrlicht-win32
|
name: irrlicht-win32
|
||||||
path: ./irrlicht-win32.zip
|
path: ./irrlicht-win32.zip
|
||||||
@ -82,7 +111,7 @@ jobs:
|
|||||||
win64:
|
win64:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Install compiler
|
- name: Install compiler
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update && sudo apt-get install cmake -qyy
|
sudo apt-get update && sudo apt-get install cmake -qyy
|
||||||
@ -96,15 +125,15 @@ jobs:
|
|||||||
CC: x86_64-w64-mingw32-gcc
|
CC: x86_64-w64-mingw32-gcc
|
||||||
CXX: x86_64-w64-mingw32-g++
|
CXX: x86_64-w64-mingw32-g++
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: irrlicht-win64
|
name: irrlicht-win64
|
||||||
path: ./irrlicht-win64.zip
|
path: ./irrlicht-win64.zip
|
||||||
|
|
||||||
macos:
|
macos:
|
||||||
runs-on: macos-10.15
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: |
|
run: |
|
||||||
brew update
|
brew update
|
||||||
@ -118,3 +147,62 @@ jobs:
|
|||||||
- name: Test (headless)
|
- name: Test (headless)
|
||||||
run: |
|
run: |
|
||||||
./bin/OSX/AutomatedTest null
|
./bin/OSX/AutomatedTest null
|
||||||
|
|
||||||
|
msvc:
|
||||||
|
name: VS 2019 ${{ matrix.config.arch }}
|
||||||
|
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
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Restore from cache and run vcpkg
|
||||||
|
uses: lukka/run-vcpkg@v7
|
||||||
|
with:
|
||||||
|
vcpkgArguments: ${{env.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}} `
|
||||||
|
-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/
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,3 +15,7 @@ bin/Linux
|
|||||||
scripts/gl2ext.h
|
scripts/gl2ext.h
|
||||||
scripts/glcorearb.h
|
scripts/glcorearb.h
|
||||||
scripts/glext.h
|
scripts/glext.h
|
||||||
|
*.vcxproj*
|
||||||
|
*.dir/
|
||||||
|
*.sln
|
||||||
|
*visualstudio/
|
||||||
|
@ -7,8 +7,10 @@ else()
|
|||||||
cmake_policy(VERSION 3.9)
|
cmake_policy(VERSION 3.9)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(IRRLICHTMT_REVISION 10)
|
||||||
|
|
||||||
project(Irrlicht
|
project(Irrlicht
|
||||||
VERSION 1.9.0
|
VERSION 1.9.0.${IRRLICHTMT_REVISION}
|
||||||
LANGUAGES CXX
|
LANGUAGES CXX
|
||||||
)
|
)
|
||||||
|
|
||||||
|
18
README.md
18
README.md
@ -3,7 +3,8 @@ IrrlichtMt version 1.9
|
|||||||
|
|
||||||
The Irrlicht Engine is an open source realtime 3D engine written in C++.
|
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
|
Build
|
||||||
-----
|
-----
|
||||||
@ -29,6 +30,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.
|
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
|
Platforms
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <iostream>
|
||||||
#include <irrlicht.h>
|
#include <irrlicht.h>
|
||||||
#include "exampleHelper.h"
|
#include "exampleHelper.h"
|
||||||
|
|
||||||
@ -6,6 +7,9 @@ using namespace irr;
|
|||||||
static IrrlichtDevice *device = nullptr;
|
static IrrlichtDevice *device = nullptr;
|
||||||
static int test_fail = 0;
|
static int test_fail = 0;
|
||||||
|
|
||||||
|
void test_irr_array();
|
||||||
|
void test_irr_string();
|
||||||
|
|
||||||
static video::E_DRIVER_TYPE chooseDriver(const char *arg_)
|
static video::E_DRIVER_TYPE chooseDriver(const char *arg_)
|
||||||
{
|
{
|
||||||
if (core::stringc(arg_) == "null")
|
if (core::stringc(arg_) == "null")
|
||||||
@ -27,8 +31,22 @@ static inline void check(bool ok, const char *msg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
run_unit_tests();
|
||||||
|
|
||||||
SIrrlichtCreationParameters p;
|
SIrrlichtCreationParameters p;
|
||||||
p.DriverType = chooseDriver(argc > 1 ? argv[1] : "");
|
p.DriverType = chooseDriver(argc > 1 ? argv[1] : "");
|
||||||
p.WindowSize = core::dimension2du(640, 480);
|
p.WindowSize = core::dimension2du(640, 480);
|
||||||
@ -89,7 +107,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
while (device->run())
|
while (device->run())
|
||||||
{
|
{
|
||||||
if (device->getTimer()->getTime() >= 1300)
|
if (device->getTimer()->getTime() >= 1000)
|
||||||
{
|
{
|
||||||
device->getTimer()->setTime(0);
|
device->getTimer()->setTime(0);
|
||||||
++n;
|
++n;
|
||||||
|
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 11)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
set(IRREXAMPLES
|
set(IRREXAMPLES
|
||||||
# removed
|
# removed
|
||||||
|
@ -39,46 +39,46 @@ namespace scene
|
|||||||
public:
|
public:
|
||||||
core::array<T> Indices;
|
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
|
// push const ref due to compiler problem with gcc 4.6, big endian
|
||||||
Indices.push_back((const T&)element);
|
Indices.push_back((const T&)element);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual u32 operator [](u32 index) const _IRR_OVERRIDE_
|
u32 operator [](u32 index) const override
|
||||||
{
|
{
|
||||||
return (u32)(Indices[index]);
|
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;
|
Indices[index]=(T)value;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
|
void set_used(u32 usedNow) override
|
||||||
{
|
{
|
||||||
Indices.set_used(usedNow);
|
Indices.set_used(usedNow);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
|
void reallocate(u32 new_size) override
|
||||||
{
|
{
|
||||||
Indices.reallocate(new_size);
|
Indices.reallocate(new_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual u32 allocated_size() const _IRR_OVERRIDE_
|
u32 allocated_size() const override
|
||||||
{
|
{
|
||||||
return Indices.allocated_size();
|
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))
|
if (sizeof(T)==sizeof(u16))
|
||||||
return video::EIT_16BIT;
|
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);
|
||||||
virtual void setType(video::E_INDEX_TYPE IndexType) _IRR_OVERRIDE_
|
void setType(video::E_INDEX_TYPE IndexType) override
|
||||||
{
|
{
|
||||||
IIndexList *NewIndices=0;
|
IIndexList *NewIndices=0;
|
||||||
|
|
||||||
@ -141,78 +141,78 @@ namespace scene
|
|||||||
Indices=NewIndices;
|
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();
|
return Indices->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void push_back(const u32 &element) _IRR_OVERRIDE_
|
void push_back(const u32 &element) override
|
||||||
{
|
{
|
||||||
Indices->push_back(element);
|
Indices->push_back(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual u32 operator [](u32 index) const _IRR_OVERRIDE_
|
u32 operator [](u32 index) const override
|
||||||
{
|
{
|
||||||
return (*Indices)[index];
|
return (*Indices)[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual u32 getLast() _IRR_OVERRIDE_
|
u32 getLast() override
|
||||||
{
|
{
|
||||||
return Indices->getLast();
|
return Indices->getLast();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setValue(u32 index, u32 value) _IRR_OVERRIDE_
|
void setValue(u32 index, u32 value) override
|
||||||
{
|
{
|
||||||
Indices->setValue(index, value);
|
Indices->setValue(index, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
|
void set_used(u32 usedNow) override
|
||||||
{
|
{
|
||||||
Indices->set_used(usedNow);
|
Indices->set_used(usedNow);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
|
void reallocate(u32 new_size) override
|
||||||
{
|
{
|
||||||
Indices->reallocate(new_size);
|
Indices->reallocate(new_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual u32 allocated_size() const _IRR_OVERRIDE_
|
u32 allocated_size() const override
|
||||||
{
|
{
|
||||||
return Indices->allocated_size();
|
return Indices->allocated_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void* pointer() _IRR_OVERRIDE_
|
void* pointer() override
|
||||||
{
|
{
|
||||||
return Indices->pointer();
|
return Indices->pointer();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! get the current hardware mapping hint
|
//! get the current hardware mapping hint
|
||||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint() const _IRR_OVERRIDE_
|
E_HARDWARE_MAPPING getHardwareMappingHint() const override
|
||||||
{
|
{
|
||||||
return MappingHint;
|
return MappingHint;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! set the hardware mapping hint, for driver
|
//! 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;
|
MappingHint=NewMappingHint;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! flags the mesh as changed, reloads hardware buffers
|
//! flags the mesh as changed, reloads hardware buffers
|
||||||
virtual void setDirty() _IRR_OVERRIDE_
|
void setDirty() override
|
||||||
{
|
{
|
||||||
++ChangedID;
|
++ChangedID;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get the currently used ID for identification of changes.
|
//! Get the currently used ID for identification of changes.
|
||||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
/** 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;
|
E_HARDWARE_MAPPING MappingHint;
|
||||||
u32 ChangedID;
|
u32 ChangedID;
|
||||||
|
@ -32,7 +32,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Get material of this meshbuffer
|
//! Get material of this meshbuffer
|
||||||
/** \return Material of this buffer */
|
/** \return Material of this buffer */
|
||||||
virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_
|
const video::SMaterial& getMaterial() const override
|
||||||
{
|
{
|
||||||
return Material;
|
return Material;
|
||||||
}
|
}
|
||||||
@ -40,7 +40,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Get material of this meshbuffer
|
//! Get material of this meshbuffer
|
||||||
/** \return Material of this buffer */
|
/** \return Material of this buffer */
|
||||||
virtual video::SMaterial& getMaterial() _IRR_OVERRIDE_
|
video::SMaterial& getMaterial() override
|
||||||
{
|
{
|
||||||
return Material;
|
return Material;
|
||||||
}
|
}
|
||||||
@ -48,7 +48,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Get pointer to vertices
|
//! Get pointer to vertices
|
||||||
/** \return Pointer to vertices. */
|
/** \return Pointer to vertices. */
|
||||||
virtual const void* getVertices() const _IRR_OVERRIDE_
|
const void* getVertices() const override
|
||||||
{
|
{
|
||||||
return Vertices.const_pointer();
|
return Vertices.const_pointer();
|
||||||
}
|
}
|
||||||
@ -56,7 +56,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Get pointer to vertices
|
//! Get pointer to vertices
|
||||||
/** \return Pointer to vertices. */
|
/** \return Pointer to vertices. */
|
||||||
virtual void* getVertices() _IRR_OVERRIDE_
|
void* getVertices() override
|
||||||
{
|
{
|
||||||
return Vertices.pointer();
|
return Vertices.pointer();
|
||||||
}
|
}
|
||||||
@ -64,21 +64,21 @@ namespace scene
|
|||||||
|
|
||||||
//! Get number of vertices
|
//! Get number of vertices
|
||||||
/** \return Number of vertices. */
|
/** \return Number of vertices. */
|
||||||
virtual u32 getVertexCount() const _IRR_OVERRIDE_
|
u32 getVertexCount() const override
|
||||||
{
|
{
|
||||||
return Vertices.size();
|
return Vertices.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get type of index data which is stored in this meshbuffer.
|
//! Get type of index data which is stored in this meshbuffer.
|
||||||
/** \return Index type of this buffer. */
|
/** \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;
|
return video::EIT_16BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get pointer to indices
|
//! Get pointer to indices
|
||||||
/** \return Pointer to indices. */
|
/** \return Pointer to indices. */
|
||||||
virtual const u16* getIndices() const _IRR_OVERRIDE_
|
const u16* getIndices() const override
|
||||||
{
|
{
|
||||||
return Indices.const_pointer();
|
return Indices.const_pointer();
|
||||||
}
|
}
|
||||||
@ -86,7 +86,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Get pointer to indices
|
//! Get pointer to indices
|
||||||
/** \return Pointer to indices. */
|
/** \return Pointer to indices. */
|
||||||
virtual u16* getIndices() _IRR_OVERRIDE_
|
u16* getIndices() override
|
||||||
{
|
{
|
||||||
return Indices.pointer();
|
return Indices.pointer();
|
||||||
}
|
}
|
||||||
@ -94,7 +94,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Get number of indices
|
//! Get number of indices
|
||||||
/** \return Number of indices. */
|
/** \return Number of indices. */
|
||||||
virtual u32 getIndexCount() const _IRR_OVERRIDE_
|
u32 getIndexCount() const override
|
||||||
{
|
{
|
||||||
return Indices.size();
|
return Indices.size();
|
||||||
}
|
}
|
||||||
@ -102,7 +102,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Get the axis aligned bounding box
|
//! Get the axis aligned bounding box
|
||||||
/** \return Axis aligned bounding box of this buffer. */
|
/** \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;
|
return BoundingBox;
|
||||||
}
|
}
|
||||||
@ -111,7 +111,7 @@ namespace scene
|
|||||||
//! Set the axis aligned bounding box
|
//! Set the axis aligned bounding box
|
||||||
/** \param box New axis aligned bounding box for this buffer. */
|
/** \param box New axis aligned bounding box for this buffer. */
|
||||||
//! set user axis aligned bounding box
|
//! set user axis aligned bounding box
|
||||||
virtual void setBoundingBox(const core::aabbox3df& box) _IRR_OVERRIDE_
|
void setBoundingBox(const core::aabbox3df& box) override
|
||||||
{
|
{
|
||||||
BoundingBox = box;
|
BoundingBox = box;
|
||||||
}
|
}
|
||||||
@ -119,7 +119,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Recalculate the bounding box.
|
//! Recalculate the bounding box.
|
||||||
/** should be called if the mesh changed. */
|
/** should be called if the mesh changed. */
|
||||||
virtual void recalculateBoundingBox() _IRR_OVERRIDE_
|
void recalculateBoundingBox() override
|
||||||
{
|
{
|
||||||
if (!Vertices.empty())
|
if (!Vertices.empty())
|
||||||
{
|
{
|
||||||
@ -136,43 +136,43 @@ namespace scene
|
|||||||
|
|
||||||
//! Get type of vertex data stored in this buffer.
|
//! Get type of vertex data stored in this buffer.
|
||||||
/** \return Type of vertex data. */
|
/** \return Type of vertex data. */
|
||||||
virtual video::E_VERTEX_TYPE getVertexType() const _IRR_OVERRIDE_
|
video::E_VERTEX_TYPE getVertexType() const override
|
||||||
{
|
{
|
||||||
return T::getType();
|
return T::getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns position of vertex i
|
//! 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;
|
return Vertices[i].Pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns position of vertex i
|
//! returns position of vertex i
|
||||||
virtual core::vector3df& getPosition(u32 i) _IRR_OVERRIDE_
|
core::vector3df& getPosition(u32 i) override
|
||||||
{
|
{
|
||||||
return Vertices[i].Pos;
|
return Vertices[i].Pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns normal of vertex i
|
//! 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;
|
return Vertices[i].Normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns normal of vertex i
|
//! returns normal of vertex i
|
||||||
virtual core::vector3df& getNormal(u32 i) _IRR_OVERRIDE_
|
core::vector3df& getNormal(u32 i) override
|
||||||
{
|
{
|
||||||
return Vertices[i].Normal;
|
return Vertices[i].Normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns texture coord of vertex i
|
//! 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;
|
return Vertices[i].TCoords;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns texture coord of vertex i
|
//! returns texture coord of vertex i
|
||||||
virtual core::vector2df& getTCoords(u32 i) _IRR_OVERRIDE_
|
core::vector2df& getTCoords(u32 i) override
|
||||||
{
|
{
|
||||||
return Vertices[i].TCoords;
|
return Vertices[i].TCoords;
|
||||||
}
|
}
|
||||||
@ -183,7 +183,7 @@ namespace scene
|
|||||||
or the main buffer is of standard type. Otherwise, behavior is
|
or the main buffer is of standard type. Otherwise, behavior is
|
||||||
undefined.
|
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())
|
if (vertices == getVertices())
|
||||||
return;
|
return;
|
||||||
@ -212,7 +212,7 @@ namespace scene
|
|||||||
undefined.
|
undefined.
|
||||||
\param other Meshbuffer to be appended to this one.
|
\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)
|
if (this==other)
|
||||||
@ -238,19 +238,19 @@ namespace scene
|
|||||||
|
|
||||||
|
|
||||||
//! get the current hardware mapping hint
|
//! 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;
|
return MappingHint_Vertex;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! get the current hardware mapping hint
|
//! 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;
|
return MappingHint_Index;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! set the hardware mapping hint, for driver
|
//! 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)
|
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
|
||||||
MappingHint_Vertex=NewMappingHint;
|
MappingHint_Vertex=NewMappingHint;
|
||||||
@ -259,19 +259,19 @@ namespace scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Describe what kind of primitive geometry is used by the meshbuffer
|
//! 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;
|
PrimitiveType = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get the kind of primitive geometry which is used by the meshbuffer
|
//! 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;
|
return PrimitiveType;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! flags the mesh as changed, reloads hardware buffers
|
//! 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)
|
if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
|
||||||
++ChangedID_Vertex;
|
++ChangedID_Vertex;
|
||||||
@ -281,17 +281,17 @@ namespace scene
|
|||||||
|
|
||||||
//! Get the currently used ID for identification of changes.
|
//! Get the currently used ID for identification of changes.
|
||||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
/** 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.
|
//! Get the currently used ID for identification of changes.
|
||||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
/** 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;}
|
||||||
|
|
||||||
virtual void setHWBuffer(void *ptr) const _IRR_OVERRIDE_ {
|
void setHWBuffer(void *ptr) const override {
|
||||||
HWBuffer = ptr;
|
HWBuffer = ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void *getHWBuffer() const _IRR_OVERRIDE_ {
|
void *getHWBuffer() const override {
|
||||||
return HWBuffer;
|
return HWBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,33 +40,33 @@ namespace scene
|
|||||||
public:
|
public:
|
||||||
core::array<T> Vertices;
|
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);}
|
{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];}
|
{return (video::S3DVertex&)Vertices[index];}
|
||||||
|
|
||||||
virtual video::S3DVertex& getLast() _IRR_OVERRIDE_
|
video::S3DVertex& getLast() override
|
||||||
{return (video::S3DVertex&)Vertices.getLast();}
|
{return (video::S3DVertex&)Vertices.getLast();}
|
||||||
|
|
||||||
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
|
void set_used(u32 usedNow) override
|
||||||
{Vertices.set_used(usedNow);}
|
{Vertices.set_used(usedNow);}
|
||||||
|
|
||||||
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
|
void reallocate(u32 new_size) override
|
||||||
{Vertices.reallocate(new_size);}
|
{Vertices.reallocate(new_size);}
|
||||||
|
|
||||||
virtual u32 allocated_size() const _IRR_OVERRIDE_
|
u32 allocated_size() const override
|
||||||
{
|
{
|
||||||
return Vertices.allocated_size();
|
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:
|
public:
|
||||||
@ -95,7 +95,7 @@ namespace scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual void setType(video::E_VERTEX_TYPE vertexType) _IRR_OVERRIDE_
|
void setType(video::E_VERTEX_TYPE vertexType) override
|
||||||
{
|
{
|
||||||
IVertexList *NewVertices=0;
|
IVertexList *NewVertices=0;
|
||||||
|
|
||||||
@ -130,73 +130,73 @@ namespace scene
|
|||||||
Vertices=NewVertices;
|
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();
|
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);
|
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];
|
return (*Vertices)[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual video::S3DVertex& getLast() _IRR_OVERRIDE_
|
video::S3DVertex& getLast() override
|
||||||
{
|
{
|
||||||
return Vertices->getLast();
|
return Vertices->getLast();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
|
void set_used(u32 usedNow) override
|
||||||
{
|
{
|
||||||
Vertices->set_used(usedNow);
|
Vertices->set_used(usedNow);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
|
void reallocate(u32 new_size) override
|
||||||
{
|
{
|
||||||
Vertices->reallocate(new_size);
|
Vertices->reallocate(new_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual u32 allocated_size() const _IRR_OVERRIDE_
|
u32 allocated_size() const override
|
||||||
{
|
{
|
||||||
return Vertices->allocated_size();
|
return Vertices->allocated_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual video::S3DVertex* pointer() _IRR_OVERRIDE_
|
video::S3DVertex* pointer() override
|
||||||
{
|
{
|
||||||
return Vertices->pointer();
|
return Vertices->pointer();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! get the current hardware mapping hint
|
//! get the current hardware mapping hint
|
||||||
virtual E_HARDWARE_MAPPING getHardwareMappingHint() const _IRR_OVERRIDE_
|
E_HARDWARE_MAPPING getHardwareMappingHint() const override
|
||||||
{
|
{
|
||||||
return MappingHint;
|
return MappingHint;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! set the hardware mapping hint, for driver
|
//! 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;
|
MappingHint=NewMappingHint;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! flags the mesh as changed, reloads hardware buffers
|
//! flags the mesh as changed, reloads hardware buffers
|
||||||
virtual void setDirty() _IRR_OVERRIDE_
|
void setDirty() override
|
||||||
{
|
{
|
||||||
++ChangedID;
|
++ChangedID;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get the currently used ID for identification of changes.
|
//! Get the currently used ID for identification of changes.
|
||||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
/** 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;
|
E_HARDWARE_MAPPING MappingHint;
|
||||||
u32 ChangedID;
|
u32 ChangedID;
|
||||||
|
@ -16,10 +16,6 @@ namespace irr
|
|||||||
/** This device uses the Win32 API and works in all versions of Windows. */
|
/** This device uses the Win32 API and works in all versions of Windows. */
|
||||||
EIDT_WIN32,
|
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.
|
//! A device native to Unix style operating systems.
|
||||||
/** This device uses the X11 windowing system and works in Linux, Solaris, FreeBSD, OSX and
|
/** This device uses the X11 windowing system and works in Linux, Solaris, FreeBSD, OSX and
|
||||||
other operating systems which support X11. */
|
other operating systems which support X11. */
|
||||||
@ -38,18 +34,6 @@ namespace irr
|
|||||||
in by defining the _IRR_COMPILE_WITH_SDL_DEVICE_ macro in IrrCompileConfig.h */
|
in by defining the _IRR_COMPILE_WITH_SDL_DEVICE_ macro in IrrCompileConfig.h */
|
||||||
EIDT_SDL,
|
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.
|
//! 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
|
/** 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
|
to your operating system. If this is unavailable then the X11, SDL and then console device
|
||||||
|
@ -91,9 +91,6 @@ enum EGUI_ELEMENT_TYPE
|
|||||||
//! The root of the GUI
|
//! The root of the GUI
|
||||||
EGUIET_ROOT,
|
EGUIET_ROOT,
|
||||||
|
|
||||||
//! IGUIProfiler
|
|
||||||
EGUIET_PROFILER,
|
|
||||||
|
|
||||||
//! Not an element, amount of elements in there
|
//! Not an element, amount of elements in there
|
||||||
EGUIET_COUNT,
|
EGUIET_COUNT,
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
|
|
@ -61,7 +61,7 @@ namespace scene
|
|||||||
if getMeshType() returns EAMT_MD2 it's safe to cast the
|
if getMeshType() returns EAMT_MD2 it's safe to cast the
|
||||||
IAnimatedMesh to IAnimatedMeshMD2.
|
IAnimatedMesh to IAnimatedMeshMD2.
|
||||||
\returns Type of the mesh. */
|
\returns Type of the mesh. */
|
||||||
virtual E_ANIMATED_MESH_TYPE getMeshType() const _IRR_OVERRIDE_
|
E_ANIMATED_MESH_TYPE getMeshType() const override
|
||||||
{
|
{
|
||||||
return EAMT_UNKNOWN;
|
return EAMT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
@ -74,17 +74,17 @@ namespace scene
|
|||||||
virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0;
|
virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0;
|
||||||
|
|
||||||
//! Get the axis aligned bounding box of this node
|
//! 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.
|
//! Returns the relative transformation of the scene node.
|
||||||
//virtual core::matrix4 getRelativeTransformation() const = 0;
|
//virtual core::matrix4 getRelativeTransformation() const = 0;
|
||||||
|
|
||||||
//! The animation method.
|
//! The animation method.
|
||||||
virtual void OnAnimate(u32 timeMs) _IRR_OVERRIDE_ =0;
|
void OnAnimate(u32 timeMs) override =0;
|
||||||
|
|
||||||
//! The render method.
|
//! The render method.
|
||||||
/** Does nothing as bones are not visible. */
|
/** Does nothing as bones are not visible. */
|
||||||
virtual void render() _IRR_OVERRIDE_ { }
|
void render() override { }
|
||||||
|
|
||||||
//! How the relative transformation of the bone is used
|
//! How the relative transformation of the bone is used
|
||||||
virtual void setSkinningSpace( E_BONE_SKINNING_SPACE space ) =0;
|
virtual void setSkinningSpace( E_BONE_SKINNING_SPACE space ) =0;
|
||||||
|
@ -72,7 +72,7 @@ namespace scene
|
|||||||
ISceneManager::addCameraSceneNodeFPS, may want to get
|
ISceneManager::addCameraSceneNodeFPS, may want to get
|
||||||
this input for changing their position, look at target or
|
this input for changing their position, look at target or
|
||||||
whatever. */
|
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
|
//! Sets the look at target of the camera
|
||||||
/** If the camera's target and rotation are bound ( @see
|
/** If the camera's target and rotation are bound ( @see
|
||||||
@ -90,7 +90,7 @@ namespace scene
|
|||||||
bindTargetAndRotation() ) then calling this will also change
|
bindTargetAndRotation() ) then calling this will also change
|
||||||
the camera's target to match the rotation.
|
the camera's target to match the rotation.
|
||||||
\param rotation New rotation of the node in degrees. */
|
\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
|
//! Gets the current look at target of the camera
|
||||||
/** \return The current look at target of the camera, in world co-ordinates */
|
/** \return The current look at target of the camera, in world co-ordinates */
|
||||||
|
@ -160,6 +160,9 @@ namespace gui
|
|||||||
\param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/
|
\param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/
|
||||||
virtual void setReferenceRect(core::rect<s32>* rect=0) = 0;
|
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
|
//! Sets the active cursor icon
|
||||||
/** Setting cursor icons is so far only supported on Win32 and Linux */
|
/** Setting cursor icons is so far only supported on Win32 and Linux */
|
||||||
|
@ -280,18 +280,6 @@ namespace irr
|
|||||||
//! A file open dialog has been closed without choosing a file
|
//! A file open dialog has been closed without choosing a file
|
||||||
EGET_FILE_CHOOSE_DIALOG_CANCELLED,
|
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
|
//! In an editbox 'ENTER' was pressed
|
||||||
EGET_EDITBOX_ENTER,
|
EGET_EDITBOX_ENTER,
|
||||||
|
|
||||||
@ -304,36 +292,14 @@ namespace irr
|
|||||||
//! The tab was changed in an tab control
|
//! The tab was changed in an tab control
|
||||||
EGET_TAB_CHANGED,
|
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
|
//! The selection in a combo box has been changed
|
||||||
EGET_COMBO_BOX_CHANGED,
|
EGET_COMBO_BOX_CHANGED,
|
||||||
|
|
||||||
//! The value of a spin box has changed
|
|
||||||
EGET_SPINBOX_CHANGED,
|
|
||||||
|
|
||||||
//! A table has changed
|
//! A table has changed
|
||||||
EGET_TABLE_CHANGED,
|
EGET_TABLE_CHANGED,
|
||||||
EGET_TABLE_HEADER_CHANGED,
|
EGET_TABLE_HEADER_CHANGED,
|
||||||
EGET_TABLE_SELECTED_AGAIN,
|
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
|
//! No real event. Just for convenience to get number of events
|
||||||
EGET_COUNT
|
EGET_COUNT
|
||||||
};
|
};
|
||||||
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
|||||||
#define __I_GUI_ELEMENT_H_INCLUDED__
|
#define __I_GUI_ELEMENT_H_INCLUDED__
|
||||||
|
|
||||||
#include "IReferenceCounted.h"
|
#include "IReferenceCounted.h"
|
||||||
#include "irrList.h"
|
|
||||||
#include "rect.h"
|
#include "rect.h"
|
||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
#include "IEventReceiver.h"
|
#include "IEventReceiver.h"
|
||||||
@ -14,6 +13,10 @@
|
|||||||
#include "EGUIAlignment.h"
|
#include "EGUIAlignment.h"
|
||||||
#include "IAttributes.h"
|
#include "IAttributes.h"
|
||||||
#include "IGUIEnvironment.h"
|
#include "IGUIEnvironment.h"
|
||||||
|
#include <cassert>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
@ -50,12 +53,9 @@ public:
|
|||||||
//! Destructor
|
//! Destructor
|
||||||
virtual ~IGUIElement()
|
virtual ~IGUIElement()
|
||||||
{
|
{
|
||||||
// delete all children
|
for (auto child : Children) {
|
||||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
child->Parent = nullptr;
|
||||||
for (; it != Children.end(); ++it)
|
child->drop();
|
||||||
{
|
|
||||||
(*it)->Parent = 0;
|
|
||||||
(*it)->drop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,10 +239,9 @@ public:
|
|||||||
recalculateAbsolutePosition(false);
|
recalculateAbsolutePosition(false);
|
||||||
|
|
||||||
// update all children
|
// update all children
|
||||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
for (auto child : Children)
|
||||||
for (; it != Children.end(); ++it)
|
|
||||||
{
|
{
|
||||||
(*it)->updateAbsolutePosition();
|
child->updateAbsolutePosition();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,20 +262,19 @@ public:
|
|||||||
{
|
{
|
||||||
IGUIElement* target = 0;
|
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())
|
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);
|
target = (*it)->getElementFromPoint(point);
|
||||||
if (target)
|
if (target)
|
||||||
return target;
|
return target;
|
||||||
|
|
||||||
--it;
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,17 +306,19 @@ public:
|
|||||||
//! Removes a child.
|
//! Removes a child.
|
||||||
virtual void removeChild(IGUIElement* child)
|
virtual void removeChild(IGUIElement* child)
|
||||||
{
|
{
|
||||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
assert(child->Parent == this);
|
||||||
for (; it != Children.end(); ++it)
|
Children.erase(child->ParentPos);
|
||||||
if ((*it) == child)
|
child->Parent = nullptr;
|
||||||
{
|
child->drop();
|
||||||
(*it)->Parent = 0;
|
|
||||||
(*it)->drop();
|
|
||||||
Children.erase(it);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Removes all children.
|
||||||
|
virtual void removeAllChildren() {
|
||||||
|
while (!Children.empty()) {
|
||||||
|
auto child = Children.back();
|
||||||
|
child->remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//! Removes this element from its parent.
|
//! Removes this element from its parent.
|
||||||
virtual void remove()
|
virtual void remove()
|
||||||
@ -333,9 +333,8 @@ public:
|
|||||||
{
|
{
|
||||||
if ( isVisible() )
|
if ( isVisible() )
|
||||||
{
|
{
|
||||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
for (auto child : Children)
|
||||||
for (; it != Children.end(); ++it)
|
child->draw();
|
||||||
(*it)->draw();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,9 +344,8 @@ public:
|
|||||||
{
|
{
|
||||||
if ( isVisible() )
|
if ( isVisible() )
|
||||||
{
|
{
|
||||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
for (auto child : Children)
|
||||||
for (; it != Children.end(); ++it)
|
child->OnPostRender( timeMs );
|
||||||
(*it)->OnPostRender( timeMs );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -547,7 +545,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
//! Called if an event happened.
|
//! 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;
|
return Parent ? Parent->OnEvent(event) : false;
|
||||||
}
|
}
|
||||||
@ -555,20 +553,15 @@ public:
|
|||||||
|
|
||||||
//! Brings a child to front
|
//! Brings a child to front
|
||||||
/** \return True if successful, false if not. */
|
/** \return True if successful, false if not. */
|
||||||
virtual bool bringToFront(IGUIElement* element)
|
virtual bool bringToFront(IGUIElement* child)
|
||||||
{
|
{
|
||||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
if (child->Parent != this)
|
||||||
for (; it != Children.end(); ++it)
|
|
||||||
{
|
|
||||||
if (element == (*it))
|
|
||||||
{
|
|
||||||
Children.erase(it);
|
|
||||||
Children.push_back(element);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
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. */
|
/** \return True if successful, false if not. */
|
||||||
virtual bool sendToBack(IGUIElement* child)
|
virtual bool sendToBack(IGUIElement* child)
|
||||||
{
|
{
|
||||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
if (child->Parent != this)
|
||||||
if (child == (*it)) // already there
|
|
||||||
return true;
|
|
||||||
for (; it != Children.end(); ++it)
|
|
||||||
{
|
|
||||||
if (child == (*it))
|
|
||||||
{
|
|
||||||
Children.erase(it);
|
|
||||||
Children.push_front(child);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
if (child->ParentPos == Children.begin()) // already there
|
||||||
|
return true;
|
||||||
|
Children.erase(child->ParentPos);
|
||||||
|
child->ParentPos = Children.insert(Children.begin(), child);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns list with children of this element
|
//! Returns list with children of this element
|
||||||
virtual const core::list<IGUIElement*>& getChildren() const
|
virtual const std::list<IGUIElement*>& getChildren() const
|
||||||
{
|
{
|
||||||
return Children;
|
return Children;
|
||||||
}
|
}
|
||||||
@ -610,14 +596,13 @@ public:
|
|||||||
{
|
{
|
||||||
IGUIElement* e = 0;
|
IGUIElement* e = 0;
|
||||||
|
|
||||||
core::list<IGUIElement*>::ConstIterator it = Children.begin();
|
for (auto child : Children)
|
||||||
for (; it != Children.end(); ++it)
|
|
||||||
{
|
{
|
||||||
if ((*it)->getID() == id)
|
if (child->getID() == id)
|
||||||
return (*it);
|
return child;
|
||||||
|
|
||||||
if (searchchildren)
|
if (searchchildren)
|
||||||
e = (*it)->getElementFromId(id, true);
|
e = child->getElementFromId(id, true);
|
||||||
|
|
||||||
if (e)
|
if (e)
|
||||||
return e;
|
return e;
|
||||||
@ -663,7 +648,7 @@ public:
|
|||||||
if (wanted==-2)
|
if (wanted==-2)
|
||||||
wanted = 1073741824; // maximum s32
|
wanted = 1073741824; // maximum s32
|
||||||
|
|
||||||
core::list<IGUIElement*>::ConstIterator it = Children.begin();
|
auto it = Children.begin();
|
||||||
|
|
||||||
s32 closestOrder, currentOrder;
|
s32 closestOrder, currentOrder;
|
||||||
|
|
||||||
@ -758,8 +743,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
//! Returns the type name of the gui element.
|
//! Returns the type name of the gui element.
|
||||||
/** This is needed serializing elements. For serializing your own elements, override this function
|
/** This is needed serializing elements. */
|
||||||
and return your own type name which is created by your IGUIElementFactory */
|
|
||||||
virtual const c8* getTypeName() const
|
virtual const c8* getTypeName() const
|
||||||
{
|
{
|
||||||
return GUIElementTypeNames[Type];
|
return GUIElementTypeNames[Type];
|
||||||
@ -806,10 +790,40 @@ protected:
|
|||||||
child->remove(); // remove from old parent
|
child->remove(); // remove from old parent
|
||||||
child->LastParentRect = getAbsolutePosition();
|
child->LastParentRect = getAbsolutePosition();
|
||||||
child->Parent = this;
|
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
|
// not virtual because needed in constructor
|
||||||
void recalculateAbsolutePosition(bool recursive)
|
void recalculateAbsolutePosition(bool recursive)
|
||||||
{
|
{
|
||||||
@ -931,10 +945,9 @@ protected:
|
|||||||
if ( recursive )
|
if ( recursive )
|
||||||
{
|
{
|
||||||
// update all children
|
// update all children
|
||||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
for (auto child : Children)
|
||||||
for (; it != Children.end(); ++it)
|
|
||||||
{
|
{
|
||||||
(*it)->recalculateAbsolutePosition(recursive);
|
child->recalculateAbsolutePosition(recursive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -942,11 +955,14 @@ protected:
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
//! List of all children of this element
|
//! List of all children of this element
|
||||||
core::list<IGUIElement*> Children;
|
std::list<IGUIElement*> Children;
|
||||||
|
|
||||||
//! Pointer to the parent
|
//! Pointer to the parent
|
||||||
IGUIElement* Parent;
|
IGUIElement* Parent;
|
||||||
|
|
||||||
|
//! Our position in the parent list. Only valid when Parent != nullptr
|
||||||
|
std::list<IGUIElement*>::iterator ParentPos;
|
||||||
|
|
||||||
//! relative rect of element
|
//! relative rect of element
|
||||||
core::rect<s32> RelativeRect;
|
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 "IReferenceCounted.h"
|
||||||
#include "IGUISkin.h"
|
#include "IGUISkin.h"
|
||||||
#include "rect.h"
|
#include "rect.h"
|
||||||
#include "EMessageBoxFlags.h"
|
|
||||||
#include "EFocusFlags.h"
|
#include "EFocusFlags.h"
|
||||||
#include "IEventReceiver.h"
|
#include "IEventReceiver.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
@ -38,27 +37,17 @@ class IGUIFont;
|
|||||||
class IGUISpriteBank;
|
class IGUISpriteBank;
|
||||||
class IGUIScrollBar;
|
class IGUIScrollBar;
|
||||||
class IGUIImage;
|
class IGUIImage;
|
||||||
class IGUIMeshViewer;
|
|
||||||
class IGUICheckBox;
|
class IGUICheckBox;
|
||||||
class IGUIListBox;
|
class IGUIListBox;
|
||||||
class IGUITreeView;
|
|
||||||
class IGUIImageList;
|
class IGUIImageList;
|
||||||
class IGUIFileOpenDialog;
|
class IGUIFileOpenDialog;
|
||||||
class IGUIColorSelectDialog;
|
|
||||||
class IGUIInOutFader;
|
|
||||||
class IGUIStaticText;
|
class IGUIStaticText;
|
||||||
class IGUIEditBox;
|
class IGUIEditBox;
|
||||||
class IGUISpinBox;
|
|
||||||
class IGUITabControl;
|
class IGUITabControl;
|
||||||
class IGUITab;
|
class IGUITab;
|
||||||
class IGUITable;
|
|
||||||
class IGUIContextMenu;
|
|
||||||
class IGUIComboBox;
|
class IGUIComboBox;
|
||||||
class IGUIToolBar;
|
|
||||||
class IGUIButton;
|
class IGUIButton;
|
||||||
class IGUIWindow;
|
class IGUIWindow;
|
||||||
class IGUIProfiler;
|
|
||||||
class IGUIElementFactory;
|
|
||||||
|
|
||||||
//! GUI Environment. Used as factory and manager of all other GUI elements.
|
//! 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):
|
/** \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,
|
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;
|
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.
|
//! Adds a scrollbar.
|
||||||
/** \param horizontal Specifies if the scroll bar is drawn horizontal
|
/** \param horizontal Specifies if the scroll bar is drawn horizontal
|
||||||
or vertical.
|
or vertical.
|
||||||
@ -348,31 +288,6 @@ public:
|
|||||||
virtual IGUIListBox* addListBox(const core::rect<s32>& rectangle,
|
virtual IGUIListBox* addListBox(const core::rect<s32>& rectangle,
|
||||||
IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) = 0;
|
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.
|
//! Adds a file open dialog.
|
||||||
/** \param title Text to be displayed as the title of the 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
|
\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 modal=true, IGUIElement* parent=0, s32 id=-1,
|
||||||
bool restoreCWD=false, io::path::char_type* startDir=0) = 0;
|
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.
|
//! Adds a static text.
|
||||||
/** \param text Text to be displayed. Can be altered after creation by SetText().
|
/** \param text Text to be displayed. Can be altered after creation by SetText().
|
||||||
\param rectangle Rectangle specifying the borders of the static text
|
\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,
|
virtual IGUIEditBox* addEditBox(const wchar_t* text, const core::rect<s32>& rectangle,
|
||||||
bool border=true, IGUIElement* parent=0, s32 id=-1) = 0;
|
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.
|
//! Adds a tab control to the environment.
|
||||||
/** \param rectangle Rectangle specifying the borders of the tab control.
|
/** \param rectangle Rectangle specifying the borders of the tab control.
|
||||||
\param parent Parent item of the element, e.g. a window.
|
\param parent Parent item of the element, e.g. a window.
|
||||||
@ -493,40 +371,6 @@ public:
|
|||||||
virtual IGUITab* addTab(const core::rect<s32>& rectangle,
|
virtual IGUITab* addTab(const core::rect<s32>& rectangle,
|
||||||
IGUIElement* parent=0, s32 id=-1) = 0;
|
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.
|
//! Adds a combo box to the environment.
|
||||||
/** \param rectangle Rectangle specifying the borders of the combo box.
|
/** \param rectangle Rectangle specifying the borders of the combo box.
|
||||||
\param parent Parent item of the element, e.g. a window.
|
\param parent Parent item of the element, e.g. a window.
|
||||||
@ -538,86 +382,6 @@ public:
|
|||||||
virtual IGUIComboBox* addComboBox(const core::rect<s32>& rectangle,
|
virtual IGUIComboBox* addComboBox(const core::rect<s32>& rectangle,
|
||||||
IGUIElement* parent=0, s32 id=-1) = 0;
|
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;
|
|
||||||
|
|
||||||
//! Find the next element which would be selected when pressing the tab-key
|
//! 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
|
/** If you set the focus for the result you can manually force focus-changes like they
|
||||||
would happen otherwise by the tab-keys.
|
would happen otherwise by the tab-keys.
|
||||||
|
@ -19,7 +19,7 @@ class IGUIFontBitmap : public IGUIFont
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
//! Returns the type of this font
|
//! 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
|
//! returns the parsed Symbol Information
|
||||||
virtual IGUISpriteBank* getSpriteBank() const = 0;
|
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
|
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.
|
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
|
} // 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
|
|
@ -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__
|
|
||||||
|
|
@ -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 "position2d.h"
|
||||||
#include "rect.h"
|
#include "rect.h"
|
||||||
#include "SColor.h"
|
#include "SColor.h"
|
||||||
#include "irrAllocator.h"
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
@ -44,7 +43,7 @@ public:
|
|||||||
delete[] Data;
|
delete[] Data;
|
||||||
|
|
||||||
if (DeleteMipMapsMemory)
|
if (DeleteMipMapsMemory)
|
||||||
Allocator.deallocate(MipMapsData);
|
delete[] MipMapsData;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns the color format
|
//! Returns the color format
|
||||||
@ -275,13 +274,13 @@ public:
|
|||||||
will by copied internally.
|
will by copied internally.
|
||||||
\param deleteMemory Whether the memory is deallocated upon
|
\param deleteMemory Whether the memory is deallocated upon
|
||||||
destruction. */
|
destruction. */
|
||||||
void setMipMapsData(void* data, bool ownForeignMemory, bool deleteMemory)
|
void setMipMapsData(void* data, bool ownForeignMemory)
|
||||||
{
|
{
|
||||||
if (data != MipMapsData)
|
if (data != MipMapsData)
|
||||||
{
|
{
|
||||||
if (DeleteMipMapsMemory)
|
if (DeleteMipMapsMemory)
|
||||||
{
|
{
|
||||||
Allocator.deallocate(MipMapsData);
|
delete[] MipMapsData;
|
||||||
|
|
||||||
DeleteMipMapsMemory = false;
|
DeleteMipMapsMemory = false;
|
||||||
}
|
}
|
||||||
@ -292,7 +291,7 @@ public:
|
|||||||
{
|
{
|
||||||
MipMapsData = static_cast<u8*>(data);
|
MipMapsData = static_cast<u8*>(data);
|
||||||
|
|
||||||
DeleteMipMapsMemory = deleteMemory;
|
DeleteMipMapsMemory = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -311,7 +310,7 @@ public:
|
|||||||
dataSize += getDataSizeFromFormat(Format, width, height);
|
dataSize += getDataSizeFromFormat(Format, width, height);
|
||||||
} while (width != 1 || height != 1);
|
} while (width != 1 || height != 1);
|
||||||
|
|
||||||
MipMapsData = Allocator.allocate(dataSize);
|
MipMapsData = new u8[dataSize];
|
||||||
memcpy(MipMapsData, data, dataSize);
|
memcpy(MipMapsData, data, dataSize);
|
||||||
|
|
||||||
DeleteMipMapsMemory = true;
|
DeleteMipMapsMemory = true;
|
||||||
@ -578,7 +577,6 @@ protected:
|
|||||||
bool DeleteMemory;
|
bool DeleteMemory;
|
||||||
bool DeleteMipMapsMemory;
|
bool DeleteMipMapsMemory;
|
||||||
|
|
||||||
core::irrAllocator<u8> Allocator;
|
|
||||||
#if defined(IRRLICHT_sRGB)
|
#if defined(IRRLICHT_sRGB)
|
||||||
int Format_sRGB;
|
int Format_sRGB;
|
||||||
#endif
|
#endif
|
||||||
|
@ -30,44 +30,6 @@ namespace scene
|
|||||||
{
|
{
|
||||||
public:
|
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.
|
//! Recalculates all normals of the mesh.
|
||||||
/** \param mesh: Mesh on which the operation is performed.
|
/** \param mesh: Mesh on which the operation is performed.
|
||||||
\param smooth: If the normals shall be smoothed.
|
\param smooth: If the normals shall be smoothed.
|
||||||
@ -82,26 +44,6 @@ namespace scene
|
|||||||
virtual void recalculateNormals(IMeshBuffer* buffer,
|
virtual void recalculateNormals(IMeshBuffer* buffer,
|
||||||
bool smooth = false, bool angleWeighted = false) const=0;
|
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.
|
//! Scales the actual mesh, not a scene node.
|
||||||
/** \param mesh Mesh on which the operation is performed.
|
/** \param mesh Mesh on which the operation is performed.
|
||||||
\param factor Scale factor for each axis. */
|
\param factor Scale factor for each axis. */
|
||||||
@ -118,116 +60,6 @@ namespace scene
|
|||||||
apply(SVertexPositionScaleManipulator(factor), buffer, true);
|
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.
|
//! Clones a static IMesh into a modifiable SMesh.
|
||||||
/** All meshbuffers in the returned SMesh
|
/** All meshbuffers in the returned SMesh
|
||||||
are of type SMeshBuffer or SMeshBufferLightMap.
|
are of type SMeshBuffer or SMeshBufferLightMap.
|
||||||
@ -237,59 +69,6 @@ namespace scene
|
|||||||
IReferenceCounted::drop() for more information. */
|
IReferenceCounted::drop() for more information. */
|
||||||
virtual SMesh* createMeshCopy(IMesh* mesh) const = 0;
|
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.
|
//! Get amount of polygons in mesh.
|
||||||
/** \param mesh Input mesh
|
/** \param mesh Input mesh
|
||||||
\return Number of polygons in mesh. */
|
\return Number of polygons in mesh. */
|
||||||
@ -310,43 +89,6 @@ namespace scene
|
|||||||
virtual IAnimatedMesh * createAnimatedMesh(IMesh* mesh,
|
virtual IAnimatedMesh * createAnimatedMesh(IMesh* mesh,
|
||||||
scene::E_ANIMATED_MESH_TYPE type = scene::EAMT_UNKNOWN) const = 0;
|
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
|
//! Apply a manipulator on the Meshbuffer
|
||||||
/** \param func A functor defining the mesh manipulation.
|
/** \param func A functor defining the mesh manipulation.
|
||||||
\param buffer The Meshbuffer to apply the manipulator to.
|
\param buffer The Meshbuffer to apply the manipulator to.
|
||||||
|
@ -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,30 +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;
|
|
||||||
|
|
||||||
//! get maxmimum number generated by rand()
|
|
||||||
virtual s32 randMax() const =0;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
#endif
|
|
@ -7,10 +7,6 @@
|
|||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_LEAK_HUNTER_
|
|
||||||
#include "leakHunter.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -50,17 +46,11 @@ namespace irr
|
|||||||
IReferenceCounted()
|
IReferenceCounted()
|
||||||
: DebugName(0), ReferenceCounter(1)
|
: DebugName(0), ReferenceCounter(1)
|
||||||
{
|
{
|
||||||
#ifdef _IRR_COMPILE_WITH_LEAK_HUNTER_
|
|
||||||
LeakHunter::addObject(this);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Destructor.
|
//! Destructor.
|
||||||
virtual ~IReferenceCounted()
|
virtual ~IReferenceCounted()
|
||||||
{
|
{
|
||||||
#ifdef _IRR_COMPILE_WITH_LEAK_HUNTER_
|
|
||||||
LeakHunter::removeObject(this);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Grabs the object. Increments the reference counter by one.
|
//! Grabs the object. Increments the reference counter by one.
|
||||||
|
@ -602,32 +602,6 @@ namespace scene
|
|||||||
pass currently is active they can render the correct part of their geometry. */
|
pass currently is active they can render the correct part of their geometry. */
|
||||||
virtual E_SCENE_NODE_RENDER_PASS getSceneNodeRenderPass() const = 0;
|
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.
|
//! Creates a new scene manager.
|
||||||
/** This can be used to easily draw and/or store two
|
/** This can be used to easily draw and/or store two
|
||||||
independent scenes at the same time. The mesh cache will be
|
independent scenes at the same time. The mesh cache will be
|
||||||
|
@ -13,8 +13,8 @@
|
|||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
#include "aabbox3d.h"
|
#include "aabbox3d.h"
|
||||||
#include "matrix4.h"
|
#include "matrix4.h"
|
||||||
#include "irrList.h"
|
|
||||||
#include "IAttributes.h"
|
#include "IAttributes.h"
|
||||||
|
#include <list>
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
@ -24,7 +24,7 @@ namespace scene
|
|||||||
class ISceneManager;
|
class ISceneManager;
|
||||||
|
|
||||||
//! Typedef for list of scene nodes
|
//! Typedef for list of scene nodes
|
||||||
typedef core::list<ISceneNode*> ISceneNodeList;
|
typedef std::list<ISceneNode*> ISceneNodeList;
|
||||||
|
|
||||||
//! Scene node interface.
|
//! Scene node interface.
|
||||||
/** A scene node is a node in the hierarchical scene graph. Every scene
|
/** A scene node is a node in the hierarchical scene graph. Every scene
|
||||||
@ -81,7 +81,7 @@ namespace scene
|
|||||||
{
|
{
|
||||||
if (IsVisible)
|
if (IsVisible)
|
||||||
{
|
{
|
||||||
ISceneNodeList::Iterator it = Children.begin();
|
ISceneNodeList::iterator it = Children.begin();
|
||||||
for (; it != Children.end(); ++it)
|
for (; it != Children.end(); ++it)
|
||||||
(*it)->OnRegisterSceneNode();
|
(*it)->OnRegisterSceneNode();
|
||||||
}
|
}
|
||||||
@ -103,7 +103,7 @@ namespace scene
|
|||||||
|
|
||||||
// perform the post render process on all children
|
// perform the post render process on all children
|
||||||
|
|
||||||
ISceneNodeList::Iterator it = Children.begin();
|
ISceneNodeList::iterator it = Children.begin();
|
||||||
for (; it != Children.end(); ++it)
|
for (; it != Children.end(); ++it)
|
||||||
(*it)->OnAnimate(timeMs);
|
(*it)->OnAnimate(timeMs);
|
||||||
}
|
}
|
||||||
@ -289,7 +289,7 @@ namespace scene
|
|||||||
e.g. because it couldn't be found in the children list. */
|
e.g. because it couldn't be found in the children list. */
|
||||||
virtual bool removeChild(ISceneNode* child)
|
virtual bool removeChild(ISceneNode* child)
|
||||||
{
|
{
|
||||||
ISceneNodeList::Iterator it = Children.begin();
|
ISceneNodeList::iterator it = Children.begin();
|
||||||
for (; it != Children.end(); ++it)
|
for (; it != Children.end(); ++it)
|
||||||
if ((*it) == child)
|
if ((*it) == child)
|
||||||
{
|
{
|
||||||
@ -309,7 +309,7 @@ namespace scene
|
|||||||
*/
|
*/
|
||||||
virtual void removeAll()
|
virtual void removeAll()
|
||||||
{
|
{
|
||||||
ISceneNodeList::Iterator it = Children.begin();
|
ISceneNodeList::iterator it = Children.begin();
|
||||||
for (; it != Children.end(); ++it)
|
for (; it != Children.end(); ++it)
|
||||||
{
|
{
|
||||||
(*it)->Parent = 0;
|
(*it)->Parent = 0;
|
||||||
@ -519,7 +519,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Returns a const reference to the list of all children.
|
//! Returns a const reference to the list of all children.
|
||||||
/** \return The list of all children of this node. */
|
/** \return The list of all children of this node. */
|
||||||
const core::list<ISceneNode*>& getChildren() const
|
const std::list<ISceneNode*>& getChildren() const
|
||||||
{
|
{
|
||||||
return Children;
|
return Children;
|
||||||
}
|
}
|
||||||
@ -611,7 +611,7 @@ namespace scene
|
|||||||
|
|
||||||
// clone children
|
// clone children
|
||||||
|
|
||||||
ISceneNodeList::Iterator it = toCopyFrom->Children.begin();
|
ISceneNodeList::iterator it = toCopyFrom->Children.begin();
|
||||||
for (; it != toCopyFrom->Children.end(); ++it)
|
for (; it != toCopyFrom->Children.end(); ++it)
|
||||||
(*it)->clone(this, newManager);
|
(*it)->clone(this, newManager);
|
||||||
}
|
}
|
||||||
@ -622,7 +622,7 @@ namespace scene
|
|||||||
{
|
{
|
||||||
SceneManager = newManager;
|
SceneManager = newManager;
|
||||||
|
|
||||||
ISceneNodeList::Iterator it = Children.begin();
|
ISceneNodeList::iterator it = Children.begin();
|
||||||
for (; it != Children.end(); ++it)
|
for (; it != Children.end(); ++it)
|
||||||
(*it)->setSceneManager(newManager);
|
(*it)->setSceneManager(newManager);
|
||||||
}
|
}
|
||||||
@ -646,7 +646,7 @@ namespace scene
|
|||||||
ISceneNode* Parent;
|
ISceneNode* Parent;
|
||||||
|
|
||||||
//! List of all children of this node
|
//! List of all children of this node
|
||||||
core::list<ISceneNode*> Children;
|
std::list<ISceneNode*> Children;
|
||||||
|
|
||||||
//! Pointer to the scene manager
|
//! Pointer to the scene manager
|
||||||
ISceneManager* SceneManager;
|
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
|
|
||||||
|
|
@ -100,7 +100,7 @@ namespace scene
|
|||||||
private:
|
private:
|
||||||
//! Internal members used by CSkinnedMesh
|
//! Internal members used by CSkinnedMesh
|
||||||
friend class CSkinnedMesh;
|
friend class CSkinnedMesh;
|
||||||
bool *Moved;
|
char *Moved;
|
||||||
core::vector3df StaticPos;
|
core::vector3df StaticPos;
|
||||||
core::vector3df StaticNormal;
|
core::vector3df StaticNormal;
|
||||||
};
|
};
|
||||||
|
@ -41,7 +41,6 @@ namespace video
|
|||||||
struct S3DVertex;
|
struct S3DVertex;
|
||||||
struct S3DVertex2TCoords;
|
struct S3DVertex2TCoords;
|
||||||
struct S3DVertexTangents;
|
struct S3DVertexTangents;
|
||||||
struct SLight;
|
|
||||||
class IImageLoader;
|
class IImageLoader;
|
||||||
class IImageWriter;
|
class IImageWriter;
|
||||||
class IMaterialRenderer;
|
class IMaterialRenderer;
|
||||||
@ -332,7 +331,7 @@ namespace video
|
|||||||
_IRR_DEPRECATED_ ITexture* addTexture(const io::path& name, IImage* image, void* mipmapData)
|
_IRR_DEPRECATED_ ITexture* addTexture(const io::path& name, IImage* image, void* mipmapData)
|
||||||
{
|
{
|
||||||
if (image)
|
if (image)
|
||||||
image->setMipMapsData(mipmapData, false, true);
|
image->setMipMapsData(mipmapData, false);
|
||||||
|
|
||||||
return addTexture(name, image);
|
return addTexture(name, image);
|
||||||
}
|
}
|
||||||
@ -1053,33 +1052,6 @@ namespace video
|
|||||||
\return Amount of primitives drawn in the last frame. */
|
\return Amount of primitives drawn in the last frame. */
|
||||||
virtual u32 getPrimitiveCountDrawn( u32 mode =0 ) const =0;
|
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.
|
//! Gets name of this video driver.
|
||||||
/** \return Returns the name of the video driver, e.g. in case
|
/** \return Returns the name of the video driver, e.g. in case
|
||||||
of the Direct3D8 driver, it would return "Direct3D 8.1". */
|
of the Direct3D8 driver, it would return "Direct3D 8.1". */
|
||||||
|
@ -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__
|
#define __IRR_COMPILE_CONFIG_H_INCLUDED__
|
||||||
|
|
||||||
//! Identifies the IrrlichtMt fork customized for the Minetest engine
|
//! Identifies the IrrlichtMt fork customized for the Minetest engine
|
||||||
#define IRRLICHT_VERSION_MT_REVISION 5
|
#define IRRLICHT_VERSION_MT_REVISION 10
|
||||||
#define IRRLICHT_VERSION_MT "mt5"
|
#define IRRLICHT_VERSION_MT "mt10"
|
||||||
|
|
||||||
//! Irrlicht SDK Version
|
//! Irrlicht SDK Version
|
||||||
#define IRRLICHT_VERSION_MAJOR 1
|
#define IRRLICHT_VERSION_MAJOR 1
|
||||||
@ -37,8 +37,6 @@
|
|||||||
//! _IRR_COMPILE_WITH_OSX_DEVICE_ for Cocoa native windowing on OSX
|
//! _IRR_COMPILE_WITH_OSX_DEVICE_ for Cocoa native windowing on OSX
|
||||||
//! _IRR_COMPILE_WITH_X11_DEVICE_ for Linux X11 based device
|
//! _IRR_COMPILE_WITH_X11_DEVICE_ for Linux X11 based device
|
||||||
//! _IRR_COMPILE_WITH_SDL_DEVICE_ for platform independent SDL framework
|
//! _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
|
//! 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).
|
//! way which can be used to disable defines (instead of outcommenting them in this header).
|
||||||
@ -52,12 +50,6 @@
|
|||||||
#undef _IRR_COMPILE_WITH_SDL_DEVICE_
|
#undef _IRR_COMPILE_WITH_SDL_DEVICE_
|
||||||
#endif
|
#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
|
//! WIN32 for Windows32
|
||||||
//! WIN64 for Windows64
|
//! WIN64 for Windows64
|
||||||
// The windows platform and API support SDL and WINDOW device
|
// The windows platform and API support SDL and WINDOW device
|
||||||
@ -280,19 +272,9 @@ define out. */
|
|||||||
#undef _IRR_COMPILE_WITH_X11_
|
#undef _IRR_COMPILE_WITH_X11_
|
||||||
#endif
|
#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_)
|
#if defined(_IRR_LINUX_PLATFORM_) && defined(_IRR_COMPILE_WITH_X11_)
|
||||||
#define _IRR_LINUX_X11_VIDMODE_
|
//! XInput2 (library called Xi) is currently only used to support touch-input.
|
||||||
//#define _IRR_LINUX_X11_RANDR_
|
#define _IRR_LINUX_X11_XINPUT2_
|
||||||
//#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_
|
#ifdef NO_IRR_LINUX_X11_XINPUT2_
|
||||||
#undef _IRR_LINUX_X11_XINPUT2_
|
#undef _IRR_LINUX_X11_XINPUT2_
|
||||||
#endif
|
#endif
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
#include "EDeviceTypes.h"
|
#include "EDeviceTypes.h"
|
||||||
#include "IEventReceiver.h"
|
#include "IEventReceiver.h"
|
||||||
#include "ICursorControl.h"
|
#include "ICursorControl.h"
|
||||||
#include "IVideoModeList.h"
|
|
||||||
#include "ITimer.h"
|
#include "ITimer.h"
|
||||||
#include "IOSOperator.h"
|
#include "IOSOperator.h"
|
||||||
|
|
||||||
@ -20,7 +19,6 @@ namespace irr
|
|||||||
{
|
{
|
||||||
class ILogger;
|
class ILogger;
|
||||||
class IEventReceiver;
|
class IEventReceiver;
|
||||||
class IRandomizer;
|
|
||||||
|
|
||||||
namespace io {
|
namespace io {
|
||||||
class IFileSystem;
|
class IFileSystem;
|
||||||
@ -111,14 +109,6 @@ namespace irr
|
|||||||
/** \return Pointer to the logger. */
|
/** \return Pointer to the logger. */
|
||||||
virtual ILogger* getLogger() = 0;
|
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
|
//! Get context manager
|
||||||
virtual video::IContextManager* getContextManager() = 0;
|
virtual video::IContextManager* getContextManager() = 0;
|
||||||
|
|
||||||
@ -136,22 +126,6 @@ namespace irr
|
|||||||
\return Pointer to the ITimer object. */
|
\return Pointer to the ITimer object. */
|
||||||
virtual ITimer* getTimer() = 0;
|
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.
|
//! Sets the caption of the window.
|
||||||
/** \param text: New text of the window caption. */
|
/** \param text: New text of the window caption. */
|
||||||
virtual void setWindowCaption(const wchar_t* text) = 0;
|
virtual void setWindowCaption(const wchar_t* text) = 0;
|
||||||
@ -182,6 +156,12 @@ namespace irr
|
|||||||
/** \return True if window is minimized. */
|
/** \return True if window is minimized. */
|
||||||
virtual bool isWindowMinimized() const = 0;
|
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
|
//! Checks if the Irrlicht window is running in fullscreen mode
|
||||||
/** \return True if window is fullscreen. */
|
/** \return True if window is fullscreen. */
|
||||||
virtual bool isFullscreen() const = 0;
|
virtual bool isFullscreen() const = 0;
|
||||||
@ -296,14 +276,6 @@ namespace irr
|
|||||||
//! Is device motion available.
|
//! Is device motion available.
|
||||||
virtual bool isDeviceMotionAvailable() = 0;
|
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.
|
//! 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.
|
/** 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
|
\param timeMs maximal time in milliseconds for two consecutive clicks to be recognized as double click
|
||||||
@ -342,24 +314,6 @@ namespace irr
|
|||||||
{
|
{
|
||||||
case video::EDT_NULL:
|
case video::EDT_NULL:
|
||||||
return true;
|
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:
|
case video::EDT_OPENGL:
|
||||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
||||||
return true;
|
return true;
|
||||||
|
@ -38,14 +38,14 @@ namespace scene
|
|||||||
|
|
||||||
//! Gets the frame count of the animated mesh.
|
//! Gets the frame count of the animated mesh.
|
||||||
/** \return Amount of frames. If the amount is 1, it is a static, non 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();
|
return Meshes.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Gets the default animation speed of the animated mesh.
|
//! 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. */
|
/** \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;
|
return FramesPerSecond;
|
||||||
}
|
}
|
||||||
@ -53,7 +53,7 @@ namespace scene
|
|||||||
//! Gets the frame count of the animated mesh.
|
//! 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.
|
/** \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.*/
|
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;
|
FramesPerSecond=fps;
|
||||||
}
|
}
|
||||||
@ -66,7 +66,7 @@ namespace scene
|
|||||||
\param startFrameLoop: start frame
|
\param startFrameLoop: start frame
|
||||||
\param endFrameLoop: end frame
|
\param endFrameLoop: end frame
|
||||||
\return The animated mesh based on a detail level. */
|
\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())
|
if (Meshes.empty())
|
||||||
return 0;
|
return 0;
|
||||||
@ -86,13 +86,13 @@ namespace scene
|
|||||||
|
|
||||||
//! Returns an axis aligned bounding box of the mesh.
|
//! Returns an axis aligned bounding box of the mesh.
|
||||||
/** \return A bounding box of this mesh is returned. */
|
/** \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;
|
return Box;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! set user axis aligned bounding 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;
|
Box = box;
|
||||||
}
|
}
|
||||||
@ -112,13 +112,13 @@ namespace scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Returns the type of the animated mesh.
|
//! 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;
|
return Type;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns amount of mesh buffers.
|
//! returns amount of mesh buffers.
|
||||||
virtual u32 getMeshBufferCount() const _IRR_OVERRIDE_
|
u32 getMeshBufferCount() const override
|
||||||
{
|
{
|
||||||
if (Meshes.empty())
|
if (Meshes.empty())
|
||||||
return 0;
|
return 0;
|
||||||
@ -127,7 +127,7 @@ namespace scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns pointer to a mesh buffer
|
//! returns pointer to a mesh buffer
|
||||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const _IRR_OVERRIDE_
|
IMeshBuffer* getMeshBuffer(u32 nr) const override
|
||||||
{
|
{
|
||||||
if (Meshes.empty())
|
if (Meshes.empty())
|
||||||
return 0;
|
return 0;
|
||||||
@ -139,7 +139,7 @@ namespace scene
|
|||||||
/** \param material: material to search for
|
/** \param material: material to search for
|
||||||
\return Returns the pointer to the mesh buffer or
|
\return Returns the pointer to the mesh buffer or
|
||||||
NULL if there is no such mesh buffer. */
|
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())
|
if (Meshes.empty())
|
||||||
return 0;
|
return 0;
|
||||||
@ -148,21 +148,21 @@ namespace scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Set a material flag for all meshbuffers of this mesh.
|
//! Set a material flag for all meshbuffers of this mesh.
|
||||||
virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) _IRR_OVERRIDE_
|
void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) override
|
||||||
{
|
{
|
||||||
for (u32 i=0; i<Meshes.size(); ++i)
|
for (u32 i=0; i<Meshes.size(); ++i)
|
||||||
Meshes[i]->setMaterialFlag(flag, newvalue);
|
Meshes[i]->setMaterialFlag(flag, newvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! set the hardware mapping hint, for driver
|
//! 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)
|
for (u32 i=0; i<Meshes.size(); ++i)
|
||||||
Meshes[i]->setHardwareMappingHint(newMappingHint, buffer);
|
Meshes[i]->setHardwareMappingHint(newMappingHint, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! flags the meshbuffer as changed, reloads hardware buffers
|
//! 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)
|
for (u32 i=0; i<Meshes.size(); ++i)
|
||||||
Meshes[i]->setDirty(buffer);
|
Meshes[i]->setDirty(buffer);
|
||||||
|
@ -30,6 +30,7 @@ namespace irr
|
|||||||
Bits(32),
|
Bits(32),
|
||||||
ZBufferBits(24),
|
ZBufferBits(24),
|
||||||
Fullscreen(false),
|
Fullscreen(false),
|
||||||
|
WindowMaximized(false),
|
||||||
WindowResizable(2),
|
WindowResizable(2),
|
||||||
Stencilbuffer(true),
|
Stencilbuffer(true),
|
||||||
Vsync(false),
|
Vsync(false),
|
||||||
@ -73,6 +74,7 @@ namespace irr
|
|||||||
Bits = other.Bits;
|
Bits = other.Bits;
|
||||||
ZBufferBits = other.ZBufferBits;
|
ZBufferBits = other.ZBufferBits;
|
||||||
Fullscreen = other.Fullscreen;
|
Fullscreen = other.Fullscreen;
|
||||||
|
WindowMaximized = other.WindowMaximized;
|
||||||
WindowResizable = other.WindowResizable;
|
WindowResizable = other.WindowResizable;
|
||||||
Stencilbuffer = other.Stencilbuffer;
|
Stencilbuffer = other.Stencilbuffer;
|
||||||
Vsync = other.Vsync;
|
Vsync = other.Vsync;
|
||||||
@ -98,11 +100,9 @@ namespace irr
|
|||||||
/** This setting decides the windowing system used by the device, most device types are native
|
/** 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.
|
to a specific operating system and so may not be available.
|
||||||
EIDT_WIN32 is only available on Windows desktops,
|
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_COCOA is only available on Mac OSX,
|
||||||
EIDT_X11 is available on Linux, Solaris, BSD and other operating systems which use X11,
|
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_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.
|
EIDT_BEST will select the best available device for your operating system.
|
||||||
Default: EIDT_BEST. */
|
Default: EIDT_BEST. */
|
||||||
E_DEVICE_TYPE DeviceType;
|
E_DEVICE_TYPE DeviceType;
|
||||||
@ -129,6 +129,9 @@ namespace irr
|
|||||||
/** Otherwise the device runs in windowed mode. Default: false. */
|
/** Otherwise the device runs in windowed mode. Default: false. */
|
||||||
bool Fullscreen;
|
bool Fullscreen;
|
||||||
|
|
||||||
|
//! Maximised window. (Only supported on SDL.) Default: false
|
||||||
|
bool WindowMaximized;
|
||||||
|
|
||||||
//! Should a non-fullscreen window be resizable.
|
//! Should a non-fullscreen window be resizable.
|
||||||
/** Might not be supported by all devices. Ignored when Fullscreen is true.
|
/** Might not be supported by all devices. Ignored when Fullscreen is true.
|
||||||
Values: 0 = not resizable, 1 = resizable, 2 = system decides default itself
|
Values: 0 = not resizable, 1 = resizable, 2 = system decides default itself
|
||||||
|
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
|
|
@ -6,7 +6,6 @@
|
|||||||
#define __S_MATERIAL_LAYER_H_INCLUDED__
|
#define __S_MATERIAL_LAYER_H_INCLUDED__
|
||||||
|
|
||||||
#include "matrix4.h"
|
#include "matrix4.h"
|
||||||
#include "irrAllocator.h"
|
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
@ -69,8 +68,7 @@ namespace video
|
|||||||
{
|
{
|
||||||
if ( TextureMatrix )
|
if ( TextureMatrix )
|
||||||
{
|
{
|
||||||
MatrixAllocator.destruct(TextureMatrix);
|
delete TextureMatrix;
|
||||||
MatrixAllocator.deallocate(TextureMatrix);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,8 +88,7 @@ namespace video
|
|||||||
*TextureMatrix = *other.TextureMatrix;
|
*TextureMatrix = *other.TextureMatrix;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MatrixAllocator.destruct(TextureMatrix);
|
delete TextureMatrix;
|
||||||
MatrixAllocator.deallocate(TextureMatrix);
|
|
||||||
TextureMatrix = 0;
|
TextureMatrix = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -99,8 +96,7 @@ namespace video
|
|||||||
{
|
{
|
||||||
if (other.TextureMatrix)
|
if (other.TextureMatrix)
|
||||||
{
|
{
|
||||||
TextureMatrix = MatrixAllocator.allocate(1);
|
TextureMatrix = new core::matrix4(*other.TextureMatrix);
|
||||||
MatrixAllocator.construct(TextureMatrix,*other.TextureMatrix);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
TextureMatrix = 0;
|
TextureMatrix = 0;
|
||||||
@ -122,8 +118,7 @@ namespace video
|
|||||||
{
|
{
|
||||||
if (!TextureMatrix)
|
if (!TextureMatrix)
|
||||||
{
|
{
|
||||||
TextureMatrix = MatrixAllocator.allocate(1);
|
TextureMatrix = new core::matrix4();
|
||||||
MatrixAllocator.construct(TextureMatrix,core::IdentityMatrix);
|
|
||||||
}
|
}
|
||||||
return *TextureMatrix;
|
return *TextureMatrix;
|
||||||
}
|
}
|
||||||
@ -146,8 +141,7 @@ namespace video
|
|||||||
{
|
{
|
||||||
if (!TextureMatrix)
|
if (!TextureMatrix)
|
||||||
{
|
{
|
||||||
TextureMatrix = MatrixAllocator.allocate(1);
|
TextureMatrix = new core::matrix4(mat);
|
||||||
MatrixAllocator.construct(TextureMatrix,mat);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*TextureMatrix = mat;
|
*TextureMatrix = mat;
|
||||||
@ -216,7 +210,6 @@ namespace video
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
friend class SMaterial;
|
friend class SMaterial;
|
||||||
irr::core::irrAllocator<irr::core::matrix4> MatrixAllocator;
|
|
||||||
|
|
||||||
//! Texture Matrix
|
//! Texture Matrix
|
||||||
/** Do not access this element directly as the internal
|
/** Do not access this element directly as the internal
|
||||||
|
@ -44,20 +44,20 @@ namespace scene
|
|||||||
|
|
||||||
|
|
||||||
//! returns amount of mesh buffers.
|
//! returns amount of mesh buffers.
|
||||||
virtual u32 getMeshBufferCount() const _IRR_OVERRIDE_
|
u32 getMeshBufferCount() const override
|
||||||
{
|
{
|
||||||
return MeshBuffers.size();
|
return MeshBuffers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns pointer to a mesh buffer
|
//! returns pointer to a mesh buffer
|
||||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const _IRR_OVERRIDE_
|
IMeshBuffer* getMeshBuffer(u32 nr) const override
|
||||||
{
|
{
|
||||||
return MeshBuffers[nr];
|
return MeshBuffers[nr];
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns a meshbuffer which fits a material
|
//! returns a meshbuffer which fits a material
|
||||||
/** reverse search */
|
/** 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)
|
for (s32 i = (s32)MeshBuffers.size()-1; i >= 0; --i)
|
||||||
{
|
{
|
||||||
@ -69,13 +69,13 @@ namespace scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns an axis aligned bounding box
|
//! returns an axis aligned bounding box
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_
|
const core::aabbox3d<f32>& getBoundingBox() const override
|
||||||
{
|
{
|
||||||
return BoundingBox;
|
return BoundingBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! set user axis aligned bounding box
|
//! set user axis aligned bounding box
|
||||||
virtual void setBoundingBox( const core::aabbox3df& box) _IRR_OVERRIDE_
|
void setBoundingBox( const core::aabbox3df& box) override
|
||||||
{
|
{
|
||||||
BoundingBox = box;
|
BoundingBox = box;
|
||||||
}
|
}
|
||||||
@ -118,21 +118,21 @@ namespace scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! sets a flag of all contained materials to a new value
|
//! sets a flag of all contained materials to a new value
|
||||||
virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) _IRR_OVERRIDE_
|
void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) override
|
||||||
{
|
{
|
||||||
for (u32 i=0; i<MeshBuffers.size(); ++i)
|
for (u32 i=0; i<MeshBuffers.size(); ++i)
|
||||||
MeshBuffers[i]->getMaterial().setFlag(flag, newvalue);
|
MeshBuffers[i]->getMaterial().setFlag(flag, newvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! set the hardware mapping hint, for driver
|
//! 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)
|
for (u32 i=0; i<MeshBuffers.size(); ++i)
|
||||||
MeshBuffers[i]->setHardwareMappingHint(newMappingHint, buffer);
|
MeshBuffers[i]->setHardwareMappingHint(newMappingHint, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! flags the meshbuffer as changed, reloads hardware buffers
|
//! 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)
|
for (u32 i=0; i<MeshBuffers.size(); ++i)
|
||||||
MeshBuffers[i]->setDirty(buffer);
|
MeshBuffers[i]->setDirty(buffer);
|
||||||
|
@ -32,13 +32,13 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Get Material of this buffer.
|
//! Get Material of this buffer.
|
||||||
virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_
|
const video::SMaterial& getMaterial() const override
|
||||||
{
|
{
|
||||||
return Material;
|
return Material;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get Material of this buffer.
|
//! Get Material of this buffer.
|
||||||
virtual video::SMaterial& getMaterial() _IRR_OVERRIDE_
|
video::SMaterial& getMaterial() override
|
||||||
{
|
{
|
||||||
return Material;
|
return Material;
|
||||||
}
|
}
|
||||||
@ -58,7 +58,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Get pointer to vertex array
|
//! Get pointer to vertex array
|
||||||
virtual const void* getVertices() const _IRR_OVERRIDE_
|
const void* getVertices() const override
|
||||||
{
|
{
|
||||||
switch (VertexType)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -72,7 +72,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Get pointer to vertex array
|
//! Get pointer to vertex array
|
||||||
virtual void* getVertices() _IRR_OVERRIDE_
|
void* getVertices() override
|
||||||
{
|
{
|
||||||
switch (VertexType)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -86,7 +86,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Get vertex count
|
//! Get vertex count
|
||||||
virtual u32 getVertexCount() const _IRR_OVERRIDE_
|
u32 getVertexCount() const override
|
||||||
{
|
{
|
||||||
switch (VertexType)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -101,43 +101,43 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
|
|
||||||
//! Get type of index data which is stored in this meshbuffer.
|
//! Get type of index data which is stored in this meshbuffer.
|
||||||
/** \return Index type of this buffer. */
|
/** \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;
|
return video::EIT_16BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get pointer to index array
|
//! Get pointer to index array
|
||||||
virtual const u16* getIndices() const _IRR_OVERRIDE_
|
const u16* getIndices() const override
|
||||||
{
|
{
|
||||||
return Indices.const_pointer();
|
return Indices.const_pointer();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get pointer to index array
|
//! Get pointer to index array
|
||||||
virtual u16* getIndices() _IRR_OVERRIDE_
|
u16* getIndices() override
|
||||||
{
|
{
|
||||||
return Indices.pointer();
|
return Indices.pointer();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get index count
|
//! Get index count
|
||||||
virtual u32 getIndexCount() const _IRR_OVERRIDE_
|
u32 getIndexCount() const override
|
||||||
{
|
{
|
||||||
return Indices.size();
|
return Indices.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get bounding box
|
//! Get bounding box
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_
|
const core::aabbox3d<f32>& getBoundingBox() const override
|
||||||
{
|
{
|
||||||
return BoundingBox;
|
return BoundingBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Set bounding box
|
//! Set bounding box
|
||||||
virtual void setBoundingBox( const core::aabbox3df& box) _IRR_OVERRIDE_
|
void setBoundingBox( const core::aabbox3df& box) override
|
||||||
{
|
{
|
||||||
BoundingBox = box;
|
BoundingBox = box;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Recalculate bounding box
|
//! Recalculate bounding box
|
||||||
virtual void recalculateBoundingBox() _IRR_OVERRIDE_
|
void recalculateBoundingBox() override
|
||||||
{
|
{
|
||||||
if(!BoundingBoxNeedsRecalculated)
|
if(!BoundingBoxNeedsRecalculated)
|
||||||
return;
|
return;
|
||||||
@ -186,7 +186,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Get vertex type
|
//! Get vertex type
|
||||||
virtual video::E_VERTEX_TYPE getVertexType() const _IRR_OVERRIDE_
|
video::E_VERTEX_TYPE getVertexType() const override
|
||||||
{
|
{
|
||||||
return VertexType;
|
return VertexType;
|
||||||
}
|
}
|
||||||
@ -244,7 +244,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns position of vertex i
|
//! 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)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -258,7 +258,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns position of vertex i
|
//! returns position of vertex i
|
||||||
virtual core::vector3df& getPosition(u32 i) _IRR_OVERRIDE_
|
core::vector3df& getPosition(u32 i) override
|
||||||
{
|
{
|
||||||
switch (VertexType)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -272,7 +272,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns normal of vertex i
|
//! 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)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -286,7 +286,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns normal of vertex i
|
//! returns normal of vertex i
|
||||||
virtual core::vector3df& getNormal(u32 i) _IRR_OVERRIDE_
|
core::vector3df& getNormal(u32 i) override
|
||||||
{
|
{
|
||||||
switch (VertexType)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -300,7 +300,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns texture coords of vertex i
|
//! 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)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -314,7 +314,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns texture coords of vertex i
|
//! returns texture coords of vertex i
|
||||||
virtual core::vector2df& getTCoords(u32 i) _IRR_OVERRIDE_
|
core::vector2df& getTCoords(u32 i) override
|
||||||
{
|
{
|
||||||
switch (VertexType)
|
switch (VertexType)
|
||||||
{
|
{
|
||||||
@ -328,25 +328,25 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! append the vertices and indices to the current buffer
|
//! 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
|
//! 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
|
//! 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;
|
return MappingHint_Vertex;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! get the current hardware mapping hint for index buffers
|
//! 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;
|
return MappingHint_Index;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! set the hardware mapping hint, for driver
|
//! 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)
|
if (Buffer==EBT_VERTEX)
|
||||||
MappingHint_Vertex=NewMappingHint;
|
MappingHint_Vertex=NewMappingHint;
|
||||||
@ -360,19 +360,19 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Describe what kind of primitive geometry is used by the meshbuffer
|
//! 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;
|
PrimitiveType = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get the kind of primitive geometry which is used by the meshbuffer
|
//! 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;
|
return PrimitiveType;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! flags the mesh as changed, reloads hardware buffers
|
//! 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)
|
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
|
||||||
++ChangedID_Vertex;
|
++ChangedID_Vertex;
|
||||||
@ -380,15 +380,15 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||||||
++ChangedID_Index;
|
++ChangedID_Index;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual u32 getChangedID_Vertex() const _IRR_OVERRIDE_ {return ChangedID_Vertex;}
|
u32 getChangedID_Vertex() const override {return ChangedID_Vertex;}
|
||||||
|
|
||||||
virtual u32 getChangedID_Index() const _IRR_OVERRIDE_ {return ChangedID_Index;}
|
u32 getChangedID_Index() const override {return ChangedID_Index;}
|
||||||
|
|
||||||
virtual void setHWBuffer(void *ptr) const _IRR_OVERRIDE_ {
|
void setHWBuffer(void *ptr) const override {
|
||||||
HWBuffer = ptr;
|
HWBuffer = ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void *getHWBuffer() const _IRR_OVERRIDE_ {
|
void *getHWBuffer() const override {
|
||||||
return HWBuffer;
|
return HWBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,199 +24,6 @@ namespace scene
|
|||||||
struct IVertexManipulator
|
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
|
//! Vertex manipulator which scales the position of the vertex
|
||||||
class SVertexPositionScaleManipulator : public IVertexManipulator
|
class SVertexPositionScaleManipulator : public IVertexManipulator
|
||||||
@ -232,74 +39,6 @@ namespace scene
|
|||||||
core::vector3df Factor;
|
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 scene
|
||||||
} // end namespace irr
|
} // 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
|
|
@ -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,113 +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
|
|
||||||
{
|
|
||||||
|
|
||||||
//! 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();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//! 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__
|
#ifndef __IRR_ARRAY_H_INCLUDED__
|
||||||
#define __IRR_ARRAY_H_INCLUDED__
|
#define __IRR_ARRAY_H_INCLUDED__
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iterator>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
#include "heapsort.h"
|
|
||||||
#include "irrAllocator.h"
|
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
@ -18,44 +20,27 @@ namespace core
|
|||||||
//! Self reallocating template array (like stl vector) with additional features.
|
//! Self reallocating template array (like stl vector) with additional features.
|
||||||
/** Some features are: Heap sorting, binary search methods, easier debugging.
|
/** Some features are: Heap sorting, binary search methods, easier debugging.
|
||||||
*/
|
*/
|
||||||
template <class T, typename TAlloc = irrAllocator<T> >
|
template <class T>
|
||||||
class array
|
class array
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
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.
|
//! Default constructor for empty array.
|
||||||
array() : data(0), allocated(0), used(0),
|
array() : m_data(), is_sorted(true)
|
||||||
strategy(ALLOC_STRATEGY_DOUBLE), free_when_destroyed(true), is_sorted(true)
|
{ }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Constructs an array and allocates an initial chunk of memory.
|
//! Constructs an array and allocates an initial chunk of memory.
|
||||||
/** \param start_count Amount of elements to pre-allocate. */
|
/** \param start_count Amount of elements to pre-allocate. */
|
||||||
explicit array(u32 start_count) : data(0), allocated(0), used(0),
|
explicit array(u32 start_count) : m_data(), is_sorted(true)
|
||||||
strategy(ALLOC_STRATEGY_DOUBLE),
|
|
||||||
free_when_destroyed(true), is_sorted(true)
|
|
||||||
{
|
{
|
||||||
reallocate(start_count);
|
m_data.reserve(start_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Copy constructor
|
//! Copy constructor
|
||||||
array(const array<T, TAlloc>& other) : data(0)
|
array(const array<T>& other) : m_data(other.m_data), is_sorted(other.is_sorted)
|
||||||
{
|
{ }
|
||||||
*this = other;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Destructor.
|
|
||||||
/** Frees allocated memory, if set_free_when_destroyed was not set to
|
|
||||||
false by the user before. */
|
|
||||||
~array()
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Reallocates the array, make it bigger or smaller.
|
//! Reallocates the array, make it bigger or smaller.
|
||||||
/** \param new_size New size of array.
|
/** \param new_size New size of array.
|
||||||
@ -65,52 +50,28 @@ public:
|
|||||||
*/
|
*/
|
||||||
void reallocate(u32 new_size, bool canShrink=true)
|
void reallocate(u32 new_size, bool canShrink=true)
|
||||||
{
|
{
|
||||||
if (allocated==new_size)
|
size_t allocated = m_data.capacity();
|
||||||
return;
|
if (new_size < allocated) {
|
||||||
if (!canShrink && (new_size < allocated))
|
if (canShrink)
|
||||||
return;
|
m_data.resize(new_size);
|
||||||
|
} else {
|
||||||
T* old_data = data;
|
m_data.reserve(new_size);
|
||||||
|
|
||||||
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]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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.
|
//! Adds an element at back of array.
|
||||||
/** If the array is too small to add this new element it is made bigger.
|
/** 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. */
|
\param element: Element to add at the back of the array. */
|
||||||
void push_back(const T& element)
|
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. */
|
\param element Element to add at the back of the array. */
|
||||||
void push_front(const T& element)
|
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. */
|
\param index: Where position to insert the new element. */
|
||||||
void insert(const T& element, u32 index=0)
|
void insert(const T& element, u32 index=0)
|
||||||
{
|
{
|
||||||
_IRR_DEBUG_BREAK_IF(index>used) // access violation
|
_IRR_DEBUG_BREAK_IF(index > m_data.size()) // access violation
|
||||||
|
auto pos = std::next(m_data.begin(), index);
|
||||||
if (used + 1 > allocated)
|
m_data.insert(pos, element);
|
||||||
{
|
|
||||||
// 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
|
|
||||||
is_sorted = false;
|
is_sorted = false;
|
||||||
++used;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Clears the array and deletes all allocated memory.
|
//! Clears the array and deletes all allocated memory.
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
if (free_when_destroyed)
|
// vector::clear() reduces the size to 0, but doesn't free memory.
|
||||||
{
|
// This swap is guaranteed to delete the allocated memory.
|
||||||
for (u32 i=0; i<used; ++i)
|
std::vector<T>().swap(m_data);
|
||||||
allocator.destruct(&data[i]);
|
|
||||||
|
|
||||||
allocator.deallocate(data); // delete [] data;
|
|
||||||
}
|
|
||||||
data = 0;
|
|
||||||
used = 0;
|
|
||||||
allocated = 0;
|
|
||||||
is_sorted = true;
|
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
|
//! Set (copy) data from given memory block
|
||||||
/** \param newData data to set, must have newSize elements
|
/** \param newData data to set, must have newSize elements
|
||||||
\param newSize Amount of elements in newData
|
\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)
|
void set_data(const T* newData, u32 newSize, bool newDataIsSorted=false, bool canShrink=false)
|
||||||
{
|
{
|
||||||
reallocate(newSize, canShrink);
|
m_data.resize(newSize);
|
||||||
set_used(newSize);
|
if (canShrink) {
|
||||||
for ( u32 i=0; i<newSize; ++i)
|
m_data.shrink_to_fit();
|
||||||
{
|
|
||||||
data[i] = newData[i];
|
|
||||||
}
|
}
|
||||||
|
std::copy(newData, newData + newSize, m_data.begin());
|
||||||
is_sorted = newDataIsSorted;
|
is_sorted = newDataIsSorted;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,85 +137,51 @@ public:
|
|||||||
\param size Amount of elements in otherData */
|
\param size Amount of elements in otherData */
|
||||||
bool equals(const T* otherData, u32 size) const
|
bool equals(const T* otherData, u32 size) const
|
||||||
{
|
{
|
||||||
if (used != size)
|
if (m_data.size() != size)
|
||||||
return false;
|
return false;
|
||||||
|
return std::equal(m_data.begin(), m_data.end(), otherData);
|
||||||
for (u32 i=0; i<size; ++i)
|
|
||||||
if (data[i] != otherData[i])
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//! 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.
|
//! Sets the size of the array and allocates new elements if necessary.
|
||||||
/** Please note: This is only secure when using it with simple types,
|
/** \param usedNow Amount of elements now used. */
|
||||||
because no default constructor will be called for the added elements.
|
|
||||||
\param usedNow Amount of elements now used. */
|
|
||||||
void set_used(u32 usedNow)
|
void set_used(u32 usedNow)
|
||||||
{
|
{
|
||||||
if (allocated < usedNow)
|
m_data.resize(usedNow);
|
||||||
reallocate(usedNow);
|
|
||||||
|
|
||||||
used = usedNow;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Assignment operator
|
//! Assignment operator
|
||||||
const array<T, TAlloc>& operator=(const array<T, TAlloc>& other)
|
const array<T>& operator=(const array<T>& other)
|
||||||
{
|
{
|
||||||
if (this == &other)
|
if (this == &other)
|
||||||
return *this;
|
return *this;
|
||||||
strategy = other.strategy;
|
m_data = other.m_data;
|
||||||
|
|
||||||
// (TODO: we could probably avoid re-allocations of data when (allocated < other.allocated)
|
|
||||||
|
|
||||||
if (data)
|
|
||||||
clear();
|
|
||||||
|
|
||||||
used = other.used;
|
|
||||||
free_when_destroyed = true;
|
|
||||||
is_sorted = other.is_sorted;
|
is_sorted = other.is_sorted;
|
||||||
allocated = other.allocated;
|
|
||||||
|
|
||||||
if (other.allocated == 0)
|
|
||||||
{
|
|
||||||
data = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
data = allocator.allocate(other.allocated); // new T[other.allocated];
|
|
||||||
|
|
||||||
for (u32 i=0; i<other.used; ++i)
|
|
||||||
allocator.construct(&data[i], other.data[i]); // data[i] = other.data[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
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
|
//! Equality operator
|
||||||
bool operator == (const array<T, TAlloc>& other) const
|
bool operator == (const array<T>& other) const
|
||||||
{
|
{
|
||||||
return equals(other.const_pointer(), other.size());
|
return equals(other.const_pointer(), other.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Inequality operator
|
//! Inequality operator
|
||||||
bool operator != (const array<T, TAlloc>& other) const
|
bool operator != (const array<T>& other) const
|
||||||
{
|
{
|
||||||
return !(*this==other);
|
return !(*this==other);
|
||||||
}
|
}
|
||||||
@ -342,36 +190,36 @@ public:
|
|||||||
//! Direct access operator
|
//! Direct access operator
|
||||||
T& operator [](u32 index)
|
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
|
//! Direct const access operator
|
||||||
const T& operator [](u32 index) const
|
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.
|
//! Gets last element.
|
||||||
T& getLast()
|
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
|
//! Gets last element
|
||||||
const T& getLast() const
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -379,7 +227,7 @@ public:
|
|||||||
/** \return Pointer to the array. */
|
/** \return Pointer to the array. */
|
||||||
T* pointer()
|
T* pointer()
|
||||||
{
|
{
|
||||||
return data;
|
return m_data.empty() ? nullptr : &m_data[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -387,7 +235,7 @@ public:
|
|||||||
/** \return Pointer to the array. */
|
/** \return Pointer to the array. */
|
||||||
const T* const_pointer() const
|
const T* const_pointer() const
|
||||||
{
|
{
|
||||||
return data;
|
return m_data.empty() ? nullptr : &m_data[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -395,7 +243,7 @@ public:
|
|||||||
/** \return Size of elements in the array which are actually occupied. */
|
/** \return Size of elements in the array which are actually occupied. */
|
||||||
u32 size() const
|
u32 size() const
|
||||||
{
|
{
|
||||||
return used;
|
return m_data.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -404,7 +252,7 @@ public:
|
|||||||
allocated would be allocated_size() * sizeof(ElementTypeUsed); */
|
allocated would be allocated_size() * sizeof(ElementTypeUsed); */
|
||||||
u32 allocated_size() const
|
u32 allocated_size() const
|
||||||
{
|
{
|
||||||
return allocated;
|
return m_data.capacity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -412,7 +260,7 @@ public:
|
|||||||
/** \return True if the array is empty false if not. */
|
/** \return True if the array is empty false if not. */
|
||||||
bool empty() const
|
bool empty() const
|
||||||
{
|
{
|
||||||
return used == 0;
|
return m_data.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -421,10 +269,11 @@ public:
|
|||||||
O(n*log n) in worst case. */
|
O(n*log n) in worst case. */
|
||||||
void sort()
|
void sort()
|
||||||
{
|
{
|
||||||
if (!is_sorted && used>1)
|
if (!is_sorted) {
|
||||||
heapsort(data, used);
|
std::sort(m_data.begin(), m_data.end());
|
||||||
is_sorted = true;
|
is_sorted = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Performs a binary search for an element, returns -1 if not found.
|
//! Performs a binary search for an element, returns -1 if not found.
|
||||||
@ -437,10 +286,9 @@ public:
|
|||||||
s32 binary_search(const T& element)
|
s32 binary_search(const T& element)
|
||||||
{
|
{
|
||||||
sort();
|
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.
|
//! 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
|
/** 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!
|
not sorted then linear_search will be used instead. Potentially very slow!
|
||||||
@ -450,12 +298,11 @@ public:
|
|||||||
s32 binary_search(const T& element) const
|
s32 binary_search(const T& element) const
|
||||||
{
|
{
|
||||||
if (is_sorted)
|
if (is_sorted)
|
||||||
return binary_search(element, 0, used-1);
|
return binary_search(element, 0, (s32)m_data.size() - 1);
|
||||||
else
|
else
|
||||||
return linear_search(element);
|
return linear_search(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Performs a binary search for an element, returns -1 if not found.
|
//! Performs a binary search for an element, returns -1 if not found.
|
||||||
/** \param element: Element to search for.
|
/** \param element: Element to search for.
|
||||||
\param left First left index
|
\param left First left index
|
||||||
@ -464,31 +311,15 @@ public:
|
|||||||
is returned. */
|
is returned. */
|
||||||
s32 binary_search(const T& element, s32 left, s32 right) const
|
s32 binary_search(const T& element, s32 left, s32 right) const
|
||||||
{
|
{
|
||||||
if (!used)
|
if (left > right)
|
||||||
return -1;
|
return -1;
|
||||||
|
auto lpos = std::next(m_data.begin(), left);
|
||||||
s32 m;
|
auto rpos = std::next(m_data.begin(), right);
|
||||||
|
auto it = std::lower_bound(lpos, rpos, element);
|
||||||
do
|
// *it = first element in [first, last) that is >= element, or last if not found.
|
||||||
{
|
if (*it < element || element < *it)
|
||||||
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;
|
return -1;
|
||||||
|
return it - m_data.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -503,25 +334,11 @@ public:
|
|||||||
s32 binary_search_multi(const T& element, s32 &last)
|
s32 binary_search_multi(const T& element, s32 &last)
|
||||||
{
|
{
|
||||||
sort();
|
sort();
|
||||||
s32 index = binary_search(element, 0, used-1);
|
auto iters = std::equal_range(m_data.begin(), m_data.end(), element);
|
||||||
if ( index < 0 )
|
if (iters.first == iters.second)
|
||||||
return index;
|
return -1;
|
||||||
|
last = (iters.second - m_data.begin()) - 1;
|
||||||
// The search can be somewhere in the middle of the set
|
return iters.first - m_data.begin();
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -533,11 +350,10 @@ public:
|
|||||||
is returned. */
|
is returned. */
|
||||||
s32 linear_search(const T& element) const
|
s32 linear_search(const T& element) const
|
||||||
{
|
{
|
||||||
for (u32 i=0; i<used; ++i)
|
auto it = std::find(m_data.begin(), m_data.end(), element);
|
||||||
if (element == data[i])
|
if (it == m_data.end())
|
||||||
return (s32)i;
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
return it - m_data.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -549,11 +365,11 @@ public:
|
|||||||
is returned. */
|
is returned. */
|
||||||
s32 linear_reverse_search(const T& element) const
|
s32 linear_reverse_search(const T& element) const
|
||||||
{
|
{
|
||||||
for (s32 i=used-1; i>=0; --i)
|
auto it = std::find(m_data.rbegin(), m_data.rend(), element);
|
||||||
if (data[i] == element)
|
if (it == m_data.rend())
|
||||||
return i;
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
size_t offset = it - m_data.rbegin();
|
||||||
|
return m_data.size() - offset - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -563,17 +379,9 @@ public:
|
|||||||
\param index: Index of element to be erased. */
|
\param index: Index of element to be erased. */
|
||||||
void erase(u32 index)
|
void erase(u32 index)
|
||||||
{
|
{
|
||||||
_IRR_DEBUG_BREAK_IF(index>=used) // access violation
|
_IRR_DEBUG_BREAK_IF(index >= m_data.size()) // access violation
|
||||||
|
auto it = std::next(m_data.begin(), index);
|
||||||
for (u32 i=index+1; i<used; ++i)
|
m_data.erase(it);
|
||||||
{
|
|
||||||
allocator.destruct(&data[i-1]);
|
|
||||||
allocator.construct(&data[i-1], data[i]); // data[i-1] = data[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
allocator.destruct(&data[used-1]);
|
|
||||||
|
|
||||||
--used;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -584,30 +392,14 @@ public:
|
|||||||
\param count: Amount of elements to be erased. */
|
\param count: Amount of elements to be erased. */
|
||||||
void erase(u32 index, s32 count)
|
void erase(u32 index, s32 count)
|
||||||
{
|
{
|
||||||
if (index>=used || count<1)
|
if (index >= m_data.size() || count < 1)
|
||||||
return;
|
return;
|
||||||
if (index+count>used)
|
count = core::min_(count, (s32)m_data.size() - (s32)index);
|
||||||
count = used-index;
|
auto first = std::next(m_data.begin(), index);
|
||||||
|
auto last = std::next(first, count);
|
||||||
u32 i;
|
m_data.erase(first, last);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Sets if the array is sorted
|
//! Sets if the array is sorted
|
||||||
void set_sorted(bool _is_sorted)
|
void set_sorted(bool _is_sorted)
|
||||||
{
|
{
|
||||||
@ -619,38 +411,30 @@ public:
|
|||||||
/** Afterward this object will contain the content of the other object and the other
|
/** Afterward this object will contain the content of the other object and the other
|
||||||
object will contain the content of this object.
|
object will contain the content of this object.
|
||||||
\param other Swap content with 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);
|
m_data.swap(other.m_data);
|
||||||
core::swap(allocated, other.allocated);
|
std::swap(is_sorted, other.is_sorted);
|
||||||
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
|
//! Pull the contents of this array as a vector.
|
||||||
strategy = other.strategy;
|
// The array is left empty.
|
||||||
other.strategy = helper_strategy;
|
std::vector<T> steal()
|
||||||
bool helper_free_when_destroyed(free_when_destroyed);
|
{
|
||||||
free_when_destroyed = other.free_when_destroyed;
|
std::vector<T> ret = std::move(m_data);
|
||||||
other.free_when_destroyed = helper_free_when_destroyed;
|
m_data.clear();
|
||||||
bool helper_is_sorted(is_sorted);
|
is_sorted = true;
|
||||||
is_sorted = other.is_sorted;
|
return ret;
|
||||||
other.is_sorted = helper_is_sorted;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef TAlloc allocator_type;
|
|
||||||
typedef T value_type;
|
typedef T value_type;
|
||||||
typedef u32 size_type;
|
typedef u32 size_type;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
T* data;
|
std::vector<T> m_data;
|
||||||
u32 allocated;
|
bool is_sorted;
|
||||||
u32 used;
|
|
||||||
TAlloc allocator;
|
|
||||||
eAllocStrategy strategy:4;
|
|
||||||
bool free_when_destroyed:1;
|
|
||||||
bool is_sorted:1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // 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
File diff suppressed because it is too large
Load Diff
@ -112,13 +112,10 @@ For functions: template<class T> _IRR_DEPRECATED_ void test4(void) {}
|
|||||||
#define _IRR_DEPRECATED_
|
#define _IRR_DEPRECATED_
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//! Defines an override macro, to protect virtual functions from typos and other mismatches
|
//! deprecated macro for virtual function override
|
||||||
/** Usage in a derived class:
|
/** prefer to use the override keyword for new code */
|
||||||
virtual void somefunc() _IRR_OVERRIDE_;
|
|
||||||
*/
|
|
||||||
#define _IRR_OVERRIDE_ override
|
#define _IRR_OVERRIDE_ override
|
||||||
|
|
||||||
|
|
||||||
//! creates four CC codes used in Irrlicht for simple ids
|
//! creates four CC codes used in Irrlicht for simple ids
|
||||||
/** some compilers can create those by directly writing the
|
/** some compilers can create those by directly writing the
|
||||||
code like 'code', but some generate warnings so we use this macro here */
|
code like 'code', but some generate warnings so we use this macro here */
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -35,7 +35,6 @@
|
|||||||
#include "CMeshBuffer.h"
|
#include "CMeshBuffer.h"
|
||||||
#include "coreutil.h"
|
#include "coreutil.h"
|
||||||
#include "CVertexBuffer.h"
|
#include "CVertexBuffer.h"
|
||||||
#include "IProfiler.h"
|
|
||||||
#include "dimension2d.h"
|
#include "dimension2d.h"
|
||||||
#include "ECullingTypes.h"
|
#include "ECullingTypes.h"
|
||||||
#include "EDebugSceneTypes.h"
|
#include "EDebugSceneTypes.h"
|
||||||
@ -47,10 +46,8 @@
|
|||||||
#include "EMaterialFlags.h"
|
#include "EMaterialFlags.h"
|
||||||
#include "EMaterialTypes.h"
|
#include "EMaterialTypes.h"
|
||||||
#include "EMeshWriterEnums.h"
|
#include "EMeshWriterEnums.h"
|
||||||
#include "EMessageBoxFlags.h"
|
|
||||||
#include "ESceneNodeTypes.h"
|
#include "ESceneNodeTypes.h"
|
||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
#include "heapsort.h"
|
|
||||||
#include "IAnimatedMesh.h"
|
#include "IAnimatedMesh.h"
|
||||||
#include "IAnimatedMeshSceneNode.h"
|
#include "IAnimatedMeshSceneNode.h"
|
||||||
#include "IAttributes.h"
|
#include "IAttributes.h"
|
||||||
@ -66,31 +63,21 @@
|
|||||||
#include "IGPUProgrammingServices.h"
|
#include "IGPUProgrammingServices.h"
|
||||||
#include "IGUIButton.h"
|
#include "IGUIButton.h"
|
||||||
#include "IGUICheckBox.h"
|
#include "IGUICheckBox.h"
|
||||||
#include "IGUIColorSelectDialog.h"
|
|
||||||
#include "IGUIComboBox.h"
|
#include "IGUIComboBox.h"
|
||||||
#include "IGUIContextMenu.h"
|
|
||||||
#include "IGUIEditBox.h"
|
#include "IGUIEditBox.h"
|
||||||
#include "IGUIElement.h"
|
#include "IGUIElement.h"
|
||||||
#include "IGUIElementFactory.h"
|
|
||||||
#include "IGUIEnvironment.h"
|
#include "IGUIEnvironment.h"
|
||||||
#include "IGUIFileOpenDialog.h"
|
#include "IGUIFileOpenDialog.h"
|
||||||
#include "IGUIFont.h"
|
#include "IGUIFont.h"
|
||||||
#include "IGUIFontBitmap.h"
|
#include "IGUIFontBitmap.h"
|
||||||
#include "IGUIImage.h"
|
#include "IGUIImage.h"
|
||||||
#include "IGUIInOutFader.h"
|
|
||||||
#include "IGUIListBox.h"
|
#include "IGUIListBox.h"
|
||||||
#include "IGUIMeshViewer.h"
|
|
||||||
#include "IGUIScrollBar.h"
|
#include "IGUIScrollBar.h"
|
||||||
#include "IGUISkin.h"
|
#include "IGUISkin.h"
|
||||||
#include "IGUISpinBox.h"
|
|
||||||
#include "IGUISpriteBank.h"
|
#include "IGUISpriteBank.h"
|
||||||
#include "IGUIStaticText.h"
|
#include "IGUIStaticText.h"
|
||||||
#include "IGUITabControl.h"
|
#include "IGUITabControl.h"
|
||||||
#include "IGUITable.h"
|
|
||||||
#include "IGUIToolbar.h"
|
#include "IGUIToolbar.h"
|
||||||
#include "IGUIWindow.h"
|
|
||||||
#include "IGUITreeView.h"
|
|
||||||
#include "IGUIProfiler.h"
|
|
||||||
#include "IImage.h"
|
#include "IImage.h"
|
||||||
#include "IImageLoader.h"
|
#include "IImageLoader.h"
|
||||||
#include "IImageWriter.h"
|
#include "IImageWriter.h"
|
||||||
@ -109,11 +96,8 @@
|
|||||||
#include "IReadFile.h"
|
#include "IReadFile.h"
|
||||||
#include "IReferenceCounted.h"
|
#include "IReferenceCounted.h"
|
||||||
#include "irrArray.h"
|
#include "irrArray.h"
|
||||||
#include "IRandomizer.h"
|
|
||||||
#include "IRenderTarget.h"
|
#include "IRenderTarget.h"
|
||||||
#include "IrrlichtDevice.h"
|
#include "IrrlichtDevice.h"
|
||||||
#include "irrList.h"
|
|
||||||
#include "irrMap.h"
|
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
@ -121,14 +105,12 @@
|
|||||||
#include "ISceneCollisionManager.h"
|
#include "ISceneCollisionManager.h"
|
||||||
#include "ISceneManager.h"
|
#include "ISceneManager.h"
|
||||||
#include "ISceneNode.h"
|
#include "ISceneNode.h"
|
||||||
#include "ISceneNodeFactory.h"
|
|
||||||
#include "IShaderConstantSetCallBack.h"
|
#include "IShaderConstantSetCallBack.h"
|
||||||
#include "ISkinnedMesh.h"
|
#include "ISkinnedMesh.h"
|
||||||
#include "ITexture.h"
|
#include "ITexture.h"
|
||||||
#include "ITimer.h"
|
#include "ITimer.h"
|
||||||
#include "IVertexBuffer.h"
|
#include "IVertexBuffer.h"
|
||||||
#include "IVideoDriver.h"
|
#include "IVideoDriver.h"
|
||||||
#include "IVideoModeList.h"
|
|
||||||
#include "IWriteFile.h"
|
#include "IWriteFile.h"
|
||||||
#include "Keycodes.h"
|
#include "Keycodes.h"
|
||||||
#include "line2d.h"
|
#include "line2d.h"
|
||||||
@ -144,7 +126,6 @@
|
|||||||
#include "SColor.h"
|
#include "SColor.h"
|
||||||
#include "SExposedVideoData.h"
|
#include "SExposedVideoData.h"
|
||||||
#include "SIrrCreationParameters.h"
|
#include "SIrrCreationParameters.h"
|
||||||
#include "SLight.h"
|
|
||||||
#include "SMaterial.h"
|
#include "SMaterial.h"
|
||||||
#include "SMesh.h"
|
#include "SMesh.h"
|
||||||
#include "SMeshBuffer.h"
|
#include "SMeshBuffer.h"
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
// Copyright (C) 2013 Michael Zeilfelder
|
|
||||||
// This file is part of the "Irrlicht Engine".
|
|
||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
||||||
|
|
||||||
#ifndef __LEAK_HUNTER_INCLUDED__
|
|
||||||
#define __LEAK_HUNTER_INCLUDED__
|
|
||||||
|
|
||||||
#include "IrrCompileConfig.h"
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_LEAK_HUNTER_
|
|
||||||
|
|
||||||
#include "irrArray.h"
|
|
||||||
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
class IReferenceCounted;
|
|
||||||
|
|
||||||
//! A class helping to find unreleased objects of type IReferenceCounted.
|
|
||||||
/** To use this you have recompile Irrlicht with _IRR_COMPILE_WITH_LEAK_HUNTER_.
|
|
||||||
Note that this will slow down your application and should only be used for debugging.
|
|
||||||
The way to use is that you can check after you closed and dropped your last Irrlicht device
|
|
||||||
if there are still any IReferenceCounted left over which have not been deleted.
|
|
||||||
*/
|
|
||||||
class LeakHunter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend class IReferenceCounted;
|
|
||||||
|
|
||||||
//! Clear all IReferenceCounted objects inside LeakHunter
|
|
||||||
/** This does not affect the IReferenceCounted themselves only the
|
|
||||||
counting of them. Usually you don't ever need to clear, but
|
|
||||||
sometimes it helps when for example you want to ignore
|
|
||||||
certain leaks.
|
|
||||||
*/
|
|
||||||
static void clearReferenceCountedObjects()
|
|
||||||
{
|
|
||||||
ReferenceCountedObjects.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Access all objects which are currently reference counted.
|
|
||||||
static inline irr::core::array<const IReferenceCounted*> getReferenceCountedObjects()
|
|
||||||
{
|
|
||||||
return ReferenceCountedObjects;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
static inline void addObject(const IReferenceCounted* object)
|
|
||||||
{
|
|
||||||
ReferenceCountedObjects.push_back(object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void removeObject(const IReferenceCounted* object)
|
|
||||||
{
|
|
||||||
irr::s32 idx = ReferenceCountedObjects.linear_search(object );
|
|
||||||
if ( idx >= 0 )
|
|
||||||
{
|
|
||||||
irr::core::swap( ReferenceCountedObjects[idx], ReferenceCountedObjects.getLast() );
|
|
||||||
ReferenceCountedObjects.erase( ReferenceCountedObjects.size()-1 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// NOTE: We don't do additional grab()/drop()'s here as we want to supervise reference counted objects and not affect them otherwise.
|
|
||||||
IRRLICHT_API static irr::core::array<const IReferenceCounted*> ReferenceCountedObjects;
|
|
||||||
};
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_WITH_LEAK_HUNTER_
|
|
||||||
|
|
||||||
#endif
|
|
@ -8,6 +8,8 @@
|
|||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
#include "dimension2d.h"
|
#include "dimension2d.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
namespace core
|
namespace core
|
||||||
@ -414,5 +416,21 @@ public:
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
struct hash<irr::core::vector2d<T> >
|
||||||
|
{
|
||||||
|
size_t operator()(const irr::core::vector2d<T>& vec) const
|
||||||
|
{
|
||||||
|
size_t h1 = hash<T>()(vec.X);
|
||||||
|
size_t h2 = hash<T>()(vec.Y);
|
||||||
|
return (h1 << (4 * sizeof(h1)) | h1 >> (4 * sizeof(h1))) ^ h2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
namespace core
|
namespace core
|
||||||
@ -466,5 +468,22 @@ namespace core
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
struct hash<irr::core::vector3d<T> >
|
||||||
|
{
|
||||||
|
size_t operator()(const irr::core::vector3d<T>& vec) const
|
||||||
|
{
|
||||||
|
size_t h1 = hash<T>()(vec.X);
|
||||||
|
size_t h2 = hash<T>()(vec.Y);
|
||||||
|
size_t h3 = hash<T>()(vec.Z);
|
||||||
|
return (h1 << (5 * sizeof(h1)) | h1 >> (3 * sizeof(h1))) ^ (h2 << (2 * sizeof(h2)) | h2 >> (6 * sizeof(h2))) ^ h3;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#define MAX_LIGHTS 8
|
|
||||||
|
|
||||||
/* Attributes */
|
/* Attributes */
|
||||||
|
|
||||||
attribute vec3 inVertexPosition;
|
attribute vec3 inVertexPosition;
|
||||||
@ -22,15 +20,6 @@ uniform vec4 uMaterialEmissive;
|
|||||||
uniform vec4 uMaterialSpecular;
|
uniform vec4 uMaterialSpecular;
|
||||||
uniform float uMaterialShininess;
|
uniform float uMaterialShininess;
|
||||||
|
|
||||||
uniform int uLightCount;
|
|
||||||
uniform int uLightType[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightPosition[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightDirection[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightAttenuation[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightAmbient[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightDiffuse[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightSpecular[MAX_LIGHTS];
|
|
||||||
|
|
||||||
uniform float uThickness;
|
uniform float uThickness;
|
||||||
|
|
||||||
/* Varyings */
|
/* Varyings */
|
||||||
@ -41,58 +30,6 @@ varying vec4 vVertexColor;
|
|||||||
varying vec4 vSpecularColor;
|
varying vec4 vSpecularColor;
|
||||||
varying float vFogCoord;
|
varying float vFogCoord;
|
||||||
|
|
||||||
void dirLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
vec3 L = normalize(-(uNMatrix * vec4(uLightDirection[index], 0.0)).xyz);
|
|
||||||
|
|
||||||
ambient += uLightAmbient[index];
|
|
||||||
|
|
||||||
float NdotL = dot(normal, L);
|
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
|
||||||
{
|
|
||||||
diffuse += uLightDiffuse[index] * NdotL;
|
|
||||||
|
|
||||||
vec3 E = normalize(-position);
|
|
||||||
vec3 HalfVector = normalize(L + E);
|
|
||||||
float NdotH = max(0.0, dot(normal, HalfVector));
|
|
||||||
|
|
||||||
float SpecularFactor = pow(NdotH, uMaterialShininess);
|
|
||||||
specular += uLightSpecular[index] * SpecularFactor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pointLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
vec3 L = uLightPosition[index] - position;
|
|
||||||
float D = length(L);
|
|
||||||
L = normalize(L);
|
|
||||||
|
|
||||||
float Attenuation = 1.0 / (uLightAttenuation[index].x + uLightAttenuation[index].y * D +
|
|
||||||
uLightAttenuation[index].z * D * D);
|
|
||||||
|
|
||||||
ambient += uLightAmbient[index] * Attenuation;
|
|
||||||
|
|
||||||
float NdotL = dot(normal, L);
|
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
|
||||||
{
|
|
||||||
diffuse += uLightDiffuse[index] * NdotL * Attenuation;
|
|
||||||
|
|
||||||
vec3 E = normalize(-position);
|
|
||||||
vec3 HalfVector = normalize(L + E);
|
|
||||||
float NdotH = max(0.0, dot(normal, HalfVector));
|
|
||||||
|
|
||||||
float SpecularFactor = pow(NdotH, uMaterialShininess);
|
|
||||||
specular += uLightSpecular[index] * SpecularFactor * Attenuation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void spotLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
// TO-DO
|
|
||||||
}
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
||||||
@ -112,48 +49,5 @@ void main()
|
|||||||
vVertexColor = inVertexColor.bgra;
|
vVertexColor = inVertexColor.bgra;
|
||||||
vSpecularColor = vec4(0.0, 0.0, 0.0, 0.0);
|
vSpecularColor = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
|
||||||
if (uLightCount > 0)
|
|
||||||
{
|
|
||||||
vec3 Normal = normalize((uNMatrix * vec4(inVertexNormal, 0.0)).xyz);
|
|
||||||
|
|
||||||
vec4 Ambient = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
vec4 Diffuse = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount ) // can't use uniform as loop-counter directly in glsl
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 0)
|
|
||||||
pointLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount )
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 1)
|
|
||||||
spotLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount )
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 2)
|
|
||||||
dirLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 LightColor = Ambient * uMaterialAmbient + Diffuse * uMaterialDiffuse;
|
|
||||||
LightColor = clamp(LightColor, 0.0, 1.0);
|
|
||||||
LightColor.w = 1.0;
|
|
||||||
|
|
||||||
vVertexColor *= LightColor;
|
|
||||||
vVertexColor += uMaterialEmissive;
|
|
||||||
vVertexColor += uGlobalAmbient * uMaterialAmbient;
|
|
||||||
vVertexColor = clamp(vVertexColor, 0.0, 1.0);
|
|
||||||
|
|
||||||
vSpecularColor *= uMaterialSpecular;
|
|
||||||
}
|
|
||||||
|
|
||||||
vFogCoord = length(Position);
|
vFogCoord = length(Position);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#define MAX_LIGHTS 8
|
|
||||||
|
|
||||||
/* Attributes */
|
/* Attributes */
|
||||||
|
|
||||||
attribute vec3 inVertexPosition;
|
attribute vec3 inVertexPosition;
|
||||||
@ -21,15 +19,6 @@ uniform vec4 uMaterialEmissive;
|
|||||||
uniform vec4 uMaterialSpecular;
|
uniform vec4 uMaterialSpecular;
|
||||||
uniform float uMaterialShininess;
|
uniform float uMaterialShininess;
|
||||||
|
|
||||||
uniform int uLightCount;
|
|
||||||
uniform int uLightType[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightPosition[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightDirection[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightAttenuation[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightAmbient[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightDiffuse[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightSpecular[MAX_LIGHTS];
|
|
||||||
|
|
||||||
uniform float uThickness;
|
uniform float uThickness;
|
||||||
|
|
||||||
/* Varyings */
|
/* Varyings */
|
||||||
@ -39,58 +28,6 @@ varying vec4 vVertexColor;
|
|||||||
varying vec4 vSpecularColor;
|
varying vec4 vSpecularColor;
|
||||||
varying float vFogCoord;
|
varying float vFogCoord;
|
||||||
|
|
||||||
void dirLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
vec3 L = normalize(-(uNMatrix * vec4(uLightDirection[index], 0.0)).xyz);
|
|
||||||
|
|
||||||
ambient += uLightAmbient[index];
|
|
||||||
|
|
||||||
float NdotL = dot(normal, L);
|
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
|
||||||
{
|
|
||||||
diffuse += uLightDiffuse[index] * NdotL;
|
|
||||||
|
|
||||||
vec3 E = normalize(-position);
|
|
||||||
vec3 HalfVector = normalize(L + E);
|
|
||||||
float NdotH = max(0.0, dot(normal, HalfVector));
|
|
||||||
|
|
||||||
float SpecularFactor = pow(NdotH, uMaterialShininess);
|
|
||||||
specular += uLightSpecular[index] * SpecularFactor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pointLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
vec3 L = uLightPosition[index] - position;
|
|
||||||
float D = length(L);
|
|
||||||
L = normalize(L);
|
|
||||||
|
|
||||||
float Attenuation = 1.0 / (uLightAttenuation[index].x + uLightAttenuation[index].y * D +
|
|
||||||
uLightAttenuation[index].z * D * D);
|
|
||||||
|
|
||||||
ambient += uLightAmbient[index] * Attenuation;
|
|
||||||
|
|
||||||
float NdotL = dot(normal, L);
|
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
|
||||||
{
|
|
||||||
diffuse += uLightDiffuse[index] * NdotL * Attenuation;
|
|
||||||
|
|
||||||
vec3 E = normalize(-position);
|
|
||||||
vec3 HalfVector = normalize(L + E);
|
|
||||||
float NdotH = max(0.0, dot(normal, HalfVector));
|
|
||||||
|
|
||||||
float SpecularFactor = pow(NdotH, uMaterialShininess);
|
|
||||||
specular += uLightSpecular[index] * SpecularFactor * Attenuation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void spotLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
// TO-DO
|
|
||||||
}
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
||||||
@ -104,48 +41,5 @@ void main()
|
|||||||
|
|
||||||
vec3 Position = (uWVMatrix * vec4(inVertexPosition, 1.0)).xyz;
|
vec3 Position = (uWVMatrix * vec4(inVertexPosition, 1.0)).xyz;
|
||||||
|
|
||||||
if (uLightCount > 0)
|
|
||||||
{
|
|
||||||
vec3 Normal = normalize((uNMatrix * vec4(inVertexNormal, 0.0)).xyz);
|
|
||||||
|
|
||||||
vec4 Ambient = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
vec4 Diffuse = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount ) // can't use uniform as loop-counter directly in glsl
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 0)
|
|
||||||
pointLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount )
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 1)
|
|
||||||
spotLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount )
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 2)
|
|
||||||
dirLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 LightColor = Ambient * uMaterialAmbient + Diffuse * uMaterialDiffuse;
|
|
||||||
LightColor = clamp(LightColor, 0.0, 1.0);
|
|
||||||
LightColor.w = 1.0;
|
|
||||||
|
|
||||||
vVertexColor *= LightColor;
|
|
||||||
vVertexColor += uMaterialEmissive;
|
|
||||||
vVertexColor += uGlobalAmbient * uMaterialAmbient;
|
|
||||||
vVertexColor = clamp(vVertexColor, 0.0, 1.0);
|
|
||||||
|
|
||||||
vSpecularColor *= uMaterialSpecular;
|
|
||||||
}
|
|
||||||
|
|
||||||
vFogCoord = length(Position);
|
vFogCoord = length(Position);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#define MAX_LIGHTS 8
|
|
||||||
|
|
||||||
/* Attributes */
|
/* Attributes */
|
||||||
|
|
||||||
attribute vec3 inVertexPosition;
|
attribute vec3 inVertexPosition;
|
||||||
@ -23,15 +21,6 @@ uniform vec4 uMaterialEmissive;
|
|||||||
uniform vec4 uMaterialSpecular;
|
uniform vec4 uMaterialSpecular;
|
||||||
uniform float uMaterialShininess;
|
uniform float uMaterialShininess;
|
||||||
|
|
||||||
uniform int uLightCount;
|
|
||||||
uniform int uLightType[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightPosition[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightDirection[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightAttenuation[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightAmbient[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightDiffuse[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightSpecular[MAX_LIGHTS];
|
|
||||||
|
|
||||||
uniform float uThickness;
|
uniform float uThickness;
|
||||||
|
|
||||||
/* Varyings */
|
/* Varyings */
|
||||||
@ -42,58 +31,6 @@ varying vec4 vVertexColor;
|
|||||||
varying vec4 vSpecularColor;
|
varying vec4 vSpecularColor;
|
||||||
varying float vFogCoord;
|
varying float vFogCoord;
|
||||||
|
|
||||||
void dirLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
vec3 L = normalize(-(uNMatrix * vec4(uLightDirection[index], 0.0)).xyz);
|
|
||||||
|
|
||||||
ambient += uLightAmbient[index];
|
|
||||||
|
|
||||||
float NdotL = dot(normal, L);
|
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
|
||||||
{
|
|
||||||
diffuse += uLightDiffuse[index] * NdotL;
|
|
||||||
|
|
||||||
vec3 E = normalize(-position);
|
|
||||||
vec3 HalfVector = normalize(L + E);
|
|
||||||
float NdotH = max(0.0, dot(normal, HalfVector));
|
|
||||||
|
|
||||||
float SpecularFactor = pow(NdotH, uMaterialShininess);
|
|
||||||
specular += uLightSpecular[index] * SpecularFactor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pointLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
vec3 L = uLightPosition[index] - position;
|
|
||||||
float D = length(L);
|
|
||||||
L = normalize(L);
|
|
||||||
|
|
||||||
float Attenuation = 1.0 / (uLightAttenuation[index].x + uLightAttenuation[index].y * D +
|
|
||||||
uLightAttenuation[index].z * D * D);
|
|
||||||
|
|
||||||
ambient += uLightAmbient[index] * Attenuation;
|
|
||||||
|
|
||||||
float NdotL = dot(normal, L);
|
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
|
||||||
{
|
|
||||||
diffuse += uLightDiffuse[index] * NdotL * Attenuation;
|
|
||||||
|
|
||||||
vec3 E = normalize(-position);
|
|
||||||
vec3 HalfVector = normalize(L + E);
|
|
||||||
float NdotH = max(0.0, dot(normal, HalfVector));
|
|
||||||
|
|
||||||
float SpecularFactor = pow(NdotH, uMaterialShininess);
|
|
||||||
specular += uLightSpecular[index] * SpecularFactor * Attenuation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void spotLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
// TO-DO
|
|
||||||
}
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
||||||
@ -110,48 +47,5 @@ void main()
|
|||||||
|
|
||||||
vec3 Position = (uWVMatrix * vec4(inVertexPosition, 1.0)).xyz;
|
vec3 Position = (uWVMatrix * vec4(inVertexPosition, 1.0)).xyz;
|
||||||
|
|
||||||
if (uLightCount > 0)
|
|
||||||
{
|
|
||||||
vec3 Normal = normalize((uNMatrix * vec4(inVertexNormal, 0.0)).xyz);
|
|
||||||
|
|
||||||
vec4 Ambient = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
vec4 Diffuse = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount ) // can't use uniform as loop-counter directly in glsl
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 0)
|
|
||||||
pointLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount )
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 1)
|
|
||||||
spotLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount )
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 2)
|
|
||||||
dirLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 LightColor = Ambient * uMaterialAmbient + Diffuse * uMaterialDiffuse;
|
|
||||||
LightColor = clamp(LightColor, 0.0, 1.0);
|
|
||||||
LightColor.w = 1.0;
|
|
||||||
|
|
||||||
vVertexColor *= LightColor;
|
|
||||||
vVertexColor += uMaterialEmissive;
|
|
||||||
vVertexColor += uGlobalAmbient * uMaterialAmbient;
|
|
||||||
vVertexColor = clamp(vVertexColor, 0.0, 1.0);
|
|
||||||
|
|
||||||
vSpecularColor *= uMaterialSpecular;
|
|
||||||
}
|
|
||||||
|
|
||||||
vFogCoord = length(Position);
|
vFogCoord = length(Position);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#define MAX_LIGHTS 8
|
|
||||||
|
|
||||||
/* Attributes */
|
/* Attributes */
|
||||||
|
|
||||||
attribute vec3 inVertexPosition;
|
attribute vec3 inVertexPosition;
|
||||||
@ -21,15 +19,6 @@ uniform vec4 uMaterialEmissive;
|
|||||||
uniform vec4 uMaterialSpecular;
|
uniform vec4 uMaterialSpecular;
|
||||||
uniform float uMaterialShininess;
|
uniform float uMaterialShininess;
|
||||||
|
|
||||||
uniform int uLightCount;
|
|
||||||
uniform int uLightType[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightPosition[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightDirection[MAX_LIGHTS];
|
|
||||||
uniform vec3 uLightAttenuation[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightAmbient[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightDiffuse[MAX_LIGHTS];
|
|
||||||
uniform vec4 uLightSpecular[MAX_LIGHTS];
|
|
||||||
|
|
||||||
uniform float uThickness;
|
uniform float uThickness;
|
||||||
|
|
||||||
/* Varyings */
|
/* Varyings */
|
||||||
@ -39,58 +28,6 @@ varying vec4 vVertexColor;
|
|||||||
varying vec4 vSpecularColor;
|
varying vec4 vSpecularColor;
|
||||||
varying float vFogCoord;
|
varying float vFogCoord;
|
||||||
|
|
||||||
void dirLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
vec3 L = normalize(-(uNMatrix * vec4(uLightDirection[index], 0.0)).xyz);
|
|
||||||
|
|
||||||
ambient += uLightAmbient[index];
|
|
||||||
|
|
||||||
float NdotL = dot(normal, L);
|
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
|
||||||
{
|
|
||||||
diffuse += uLightDiffuse[index] * NdotL;
|
|
||||||
|
|
||||||
vec3 E = normalize(-position);
|
|
||||||
vec3 HalfVector = normalize(L + E);
|
|
||||||
float NdotH = max(0.0, dot(normal, HalfVector));
|
|
||||||
|
|
||||||
float SpecularFactor = pow(NdotH, uMaterialShininess);
|
|
||||||
specular += uLightSpecular[index] * SpecularFactor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pointLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
vec3 L = uLightPosition[index] - position;
|
|
||||||
float D = length(L);
|
|
||||||
L = normalize(L);
|
|
||||||
|
|
||||||
float Attenuation = 1.0 / (uLightAttenuation[index].x + uLightAttenuation[index].y * D +
|
|
||||||
uLightAttenuation[index].z * D * D);
|
|
||||||
|
|
||||||
ambient += uLightAmbient[index] * Attenuation;
|
|
||||||
|
|
||||||
float NdotL = dot(normal, L);
|
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
|
||||||
{
|
|
||||||
diffuse += uLightDiffuse[index] * NdotL * Attenuation;
|
|
||||||
|
|
||||||
vec3 E = normalize(-position);
|
|
||||||
vec3 HalfVector = normalize(L + E);
|
|
||||||
float NdotH = max(0.0, dot(normal, HalfVector));
|
|
||||||
|
|
||||||
float SpecularFactor = pow(NdotH, uMaterialShininess);
|
|
||||||
specular += uLightSpecular[index] * SpecularFactor * Attenuation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void spotLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
|
|
||||||
{
|
|
||||||
// TO-DO
|
|
||||||
}
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
||||||
@ -107,48 +44,5 @@ void main()
|
|||||||
vVertexColor = inVertexColor.bgra;
|
vVertexColor = inVertexColor.bgra;
|
||||||
vSpecularColor = vec4(0.0, 0.0, 0.0, 0.0);
|
vSpecularColor = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
|
||||||
if (uLightCount > 0)
|
|
||||||
{
|
|
||||||
vec3 Normal = normalize((uNMatrix * vec4(inVertexNormal, 0.0)).xyz);
|
|
||||||
|
|
||||||
vec4 Ambient = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
vec4 Diffuse = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount ) // can't use uniform as loop-counter directly in glsl
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 0)
|
|
||||||
pointLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount )
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 1)
|
|
||||||
spotLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
|
||||||
{
|
|
||||||
if( i >= uLightCount )
|
|
||||||
break;
|
|
||||||
if (uLightType[i] == 2)
|
|
||||||
dirLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 LightColor = Ambient * uMaterialAmbient + Diffuse * uMaterialDiffuse;
|
|
||||||
LightColor = clamp(LightColor, 0.0, 1.0);
|
|
||||||
LightColor.w = 1.0;
|
|
||||||
|
|
||||||
vVertexColor *= LightColor;
|
|
||||||
vVertexColor += uMaterialEmissive;
|
|
||||||
vVertexColor += uGlobalAmbient * uMaterialAmbient;
|
|
||||||
vVertexColor = clamp(vVertexColor, 0.0, 1.0);
|
|
||||||
|
|
||||||
vSpecularColor *= uMaterialSpecular;
|
|
||||||
}
|
|
||||||
|
|
||||||
vFogCoord = length(Position);
|
vFogCoord = length(Position);
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ namespace io
|
|||||||
virtual void addDirectoryToFileList(const io::path &filename);
|
virtual void addDirectoryToFileList(const io::path &filename);
|
||||||
|
|
||||||
//! return the name (id) of the file Archive
|
//! return the name (id) of the file Archive
|
||||||
virtual const io::path& getArchiveName() const _IRR_OVERRIDE_ {return Path;}
|
const io::path& getArchiveName() const override {return Path;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! Android's asset manager
|
//! Android's asset manager
|
||||||
|
@ -180,11 +180,6 @@ void CIrrDeviceAndroid::setWindowCaption(const wchar_t* text)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CIrrDeviceAndroid::present(video::IImage* surface, void* windowId, core::rect<s32>* srcClip)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CIrrDeviceAndroid::isWindowActive() const
|
bool CIrrDeviceAndroid::isWindowActive() const
|
||||||
{
|
{
|
||||||
return (Focused && !Paused);
|
return (Focused && !Paused);
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
#include "CIrrDeviceStub.h"
|
#include "CIrrDeviceStub.h"
|
||||||
#include "IrrlichtDevice.h"
|
#include "IrrlichtDevice.h"
|
||||||
#include "IImagePresenter.h"
|
|
||||||
#include "ICursorControl.h"
|
#include "ICursorControl.h"
|
||||||
|
|
||||||
#include <android/sensor.h>
|
#include <android/sensor.h>
|
||||||
@ -19,7 +18,7 @@
|
|||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
class CIrrDeviceAndroid : public CIrrDeviceStub, video::IImagePresenter
|
class CIrrDeviceAndroid : public CIrrDeviceStub
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CIrrDeviceAndroid(const SIrrlichtCreationParameters& param);
|
CIrrDeviceAndroid(const SIrrlichtCreationParameters& param);
|
||||||
@ -34,8 +33,6 @@ namespace irr
|
|||||||
|
|
||||||
virtual void setWindowCaption(const wchar_t* text);
|
virtual void setWindowCaption(const wchar_t* text);
|
||||||
|
|
||||||
virtual bool present(video::IImage* surface, void* windowId, core::rect<s32>* srcClip);
|
|
||||||
|
|
||||||
virtual bool isWindowActive() const;
|
virtual bool isWindowActive() const;
|
||||||
|
|
||||||
virtual bool isWindowFocused() const;
|
virtual bool isWindowFocused() const;
|
||||||
|
@ -236,15 +236,6 @@ void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs)
|
|||||||
|
|
||||||
// set CurrentFrameNr
|
// set CurrentFrameNr
|
||||||
buildFrameNr(timeMs-LastTimeMs);
|
buildFrameNr(timeMs-LastTimeMs);
|
||||||
|
|
||||||
// update bbox
|
|
||||||
if (Mesh)
|
|
||||||
{
|
|
||||||
scene::IMesh * mesh = getMeshForCurrentFrame();
|
|
||||||
|
|
||||||
if (mesh)
|
|
||||||
Box = mesh->getBoundingBox();
|
|
||||||
}
|
|
||||||
LastTimeMs = timeMs;
|
LastTimeMs = timeMs;
|
||||||
|
|
||||||
IAnimatedMeshSceneNode::OnAnimate(timeMs);
|
IAnimatedMeshSceneNode::OnAnimate(timeMs);
|
||||||
@ -276,6 +267,7 @@ void CAnimatedMeshSceneNode::render()
|
|||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
os::Printer::log("Animated Mesh returned no mesh to render.", Mesh->getDebugName(), ELL_WARNING);
|
os::Printer::log("Animated Mesh returned no mesh to render.", Mesh->getDebugName(), ELL_WARNING);
|
||||||
#endif
|
#endif
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
||||||
|
@ -31,114 +31,114 @@ namespace scene
|
|||||||
virtual ~CAnimatedMeshSceneNode();
|
virtual ~CAnimatedMeshSceneNode();
|
||||||
|
|
||||||
//! sets the current frame. from now on the animation is played from this frame.
|
//! sets the current frame. from now on the animation is played from this frame.
|
||||||
virtual void setCurrentFrame(f32 frame) _IRR_OVERRIDE_;
|
void setCurrentFrame(f32 frame) override;
|
||||||
|
|
||||||
//! frame
|
//! frame
|
||||||
virtual void OnRegisterSceneNode() _IRR_OVERRIDE_;
|
void OnRegisterSceneNode() override;
|
||||||
|
|
||||||
//! OnAnimate() is called just before rendering the whole scene.
|
//! OnAnimate() is called just before rendering the whole scene.
|
||||||
virtual void OnAnimate(u32 timeMs) _IRR_OVERRIDE_;
|
void OnAnimate(u32 timeMs) override;
|
||||||
|
|
||||||
//! renders the node.
|
//! renders the node.
|
||||||
virtual void render() _IRR_OVERRIDE_;
|
void render() override;
|
||||||
|
|
||||||
//! returns the axis aligned bounding box of this node
|
//! returns the axis aligned bounding box of this node
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_;
|
const core::aabbox3d<f32>& getBoundingBox() const override;
|
||||||
|
|
||||||
//! sets the frames between the animation is looped.
|
//! sets the frames between the animation is looped.
|
||||||
//! the default is 0 - MaximalFrameCount of the mesh.
|
//! the default is 0 - MaximalFrameCount of the mesh.
|
||||||
//! NOTE: setMesh will also change this value and set it to the full range of animations of the mesh
|
//! NOTE: setMesh will also change this value and set it to the full range of animations of the mesh
|
||||||
virtual bool setFrameLoop(s32 begin, s32 end) _IRR_OVERRIDE_;
|
bool setFrameLoop(s32 begin, s32 end) override;
|
||||||
|
|
||||||
//! Sets looping mode which is on by default. If set to false,
|
//! Sets looping mode which is on by default. If set to false,
|
||||||
//! animations will not be looped.
|
//! animations will not be looped.
|
||||||
virtual void setLoopMode(bool playAnimationLooped) _IRR_OVERRIDE_;
|
void setLoopMode(bool playAnimationLooped) override;
|
||||||
|
|
||||||
//! returns the current loop mode
|
//! returns the current loop mode
|
||||||
virtual bool getLoopMode() const _IRR_OVERRIDE_;
|
bool getLoopMode() const override;
|
||||||
|
|
||||||
//! Sets a callback interface which will be called if an animation
|
//! Sets a callback interface which will be called if an animation
|
||||||
//! playback has ended. Set this to 0 to disable the callback again.
|
//! playback has ended. Set this to 0 to disable the callback again.
|
||||||
virtual void setAnimationEndCallback(IAnimationEndCallBack* callback=0) _IRR_OVERRIDE_;
|
void setAnimationEndCallback(IAnimationEndCallBack* callback=0) override;
|
||||||
|
|
||||||
//! sets the speed with which the animation is played
|
//! sets the speed with which the animation is played
|
||||||
//! NOTE: setMesh will also change this value and set it to the default speed of the mesh
|
//! NOTE: setMesh will also change this value and set it to the default speed of the mesh
|
||||||
virtual void setAnimationSpeed(f32 framesPerSecond) _IRR_OVERRIDE_;
|
void setAnimationSpeed(f32 framesPerSecond) override;
|
||||||
|
|
||||||
//! gets the speed with which the animation is played
|
//! gets the speed with which the animation is played
|
||||||
virtual f32 getAnimationSpeed() const _IRR_OVERRIDE_;
|
f32 getAnimationSpeed() const override;
|
||||||
|
|
||||||
//! returns the material based on the zero based index i. To get the amount
|
//! returns the material based on the zero based index i. To get the amount
|
||||||
//! of materials used by this scene node, use getMaterialCount().
|
//! of materials used by this scene node, use getMaterialCount().
|
||||||
//! This function is needed for inserting the node into the scene hierarchy on a
|
//! This function is needed for inserting the node into the scene hierarchy on a
|
||||||
//! optimal position for minimizing renderstate changes, but can also be used
|
//! optimal position for minimizing renderstate changes, but can also be used
|
||||||
//! to directly modify the material of a scene node.
|
//! to directly modify the material of a scene node.
|
||||||
virtual video::SMaterial& getMaterial(u32 i) _IRR_OVERRIDE_;
|
video::SMaterial& getMaterial(u32 i) override;
|
||||||
|
|
||||||
//! returns amount of materials used by this scene node.
|
//! returns amount of materials used by this scene node.
|
||||||
virtual u32 getMaterialCount() const _IRR_OVERRIDE_;
|
u32 getMaterialCount() const override;
|
||||||
|
|
||||||
//! Returns a pointer to a child node, which has the same transformation as
|
//! Returns a pointer to a child node, which has the same transformation as
|
||||||
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
||||||
virtual IBoneSceneNode* getJointNode(const c8* jointName) _IRR_OVERRIDE_;
|
IBoneSceneNode* getJointNode(const c8* jointName) override;
|
||||||
|
|
||||||
//! same as getJointNode(const c8* jointName), but based on id
|
//! same as getJointNode(const c8* jointName), but based on id
|
||||||
virtual IBoneSceneNode* getJointNode(u32 jointID) _IRR_OVERRIDE_;
|
IBoneSceneNode* getJointNode(u32 jointID) override;
|
||||||
|
|
||||||
//! Gets joint count.
|
//! Gets joint count.
|
||||||
virtual u32 getJointCount() const _IRR_OVERRIDE_;
|
u32 getJointCount() const override;
|
||||||
|
|
||||||
//! Removes a child from this scene node.
|
//! Removes a child from this scene node.
|
||||||
//! Implemented here, to be able to remove the shadow properly, if there is one,
|
//! Implemented here, to be able to remove the shadow properly, if there is one,
|
||||||
//! or to remove attached child.
|
//! or to remove attached child.
|
||||||
virtual bool removeChild(ISceneNode* child) _IRR_OVERRIDE_;
|
bool removeChild(ISceneNode* child) override;
|
||||||
|
|
||||||
//! Returns the current displayed frame number.
|
//! Returns the current displayed frame number.
|
||||||
virtual f32 getFrameNr() const _IRR_OVERRIDE_;
|
f32 getFrameNr() const override;
|
||||||
//! Returns the current start frame number.
|
//! Returns the current start frame number.
|
||||||
virtual s32 getStartFrame() const _IRR_OVERRIDE_;
|
s32 getStartFrame() const override;
|
||||||
//! Returns the current end frame number.
|
//! Returns the current end frame number.
|
||||||
virtual s32 getEndFrame() const _IRR_OVERRIDE_;
|
s32 getEndFrame() const override;
|
||||||
|
|
||||||
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
|
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
|
||||||
/* In this way it is possible to change the materials a mesh causing all mesh scene nodes
|
/* In this way it is possible to change the materials a mesh causing all mesh scene nodes
|
||||||
referencing this mesh to change too. */
|
referencing this mesh to change too. */
|
||||||
virtual void setReadOnlyMaterials(bool readonly) _IRR_OVERRIDE_;
|
void setReadOnlyMaterials(bool readonly) override;
|
||||||
|
|
||||||
//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
|
//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
|
||||||
virtual bool isReadOnlyMaterials() const _IRR_OVERRIDE_;
|
bool isReadOnlyMaterials() const override;
|
||||||
|
|
||||||
//! Sets a new mesh
|
//! Sets a new mesh
|
||||||
virtual void setMesh(IAnimatedMesh* mesh) _IRR_OVERRIDE_;
|
void setMesh(IAnimatedMesh* mesh) override;
|
||||||
|
|
||||||
//! Returns the current mesh
|
//! Returns the current mesh
|
||||||
virtual IAnimatedMesh* getMesh(void) _IRR_OVERRIDE_ { return Mesh; }
|
IAnimatedMesh* getMesh(void) override { return Mesh; }
|
||||||
|
|
||||||
//! Returns type of the scene node
|
//! Returns type of the scene node
|
||||||
virtual ESCENE_NODE_TYPE getType() const _IRR_OVERRIDE_ { return ESNT_ANIMATED_MESH; }
|
ESCENE_NODE_TYPE getType() const override { return ESNT_ANIMATED_MESH; }
|
||||||
|
|
||||||
//! updates the absolute position based on the relative and the parents position
|
//! updates the absolute position based on the relative and the parents position
|
||||||
virtual void updateAbsolutePosition() _IRR_OVERRIDE_;
|
void updateAbsolutePosition() override;
|
||||||
|
|
||||||
|
|
||||||
//! Set the joint update mode (0-unused, 1-get joints only, 2-set joints only, 3-move and set)
|
//! Set the joint update mode (0-unused, 1-get joints only, 2-set joints only, 3-move and set)
|
||||||
virtual void setJointMode(E_JOINT_UPDATE_ON_RENDER mode) _IRR_OVERRIDE_;
|
void setJointMode(E_JOINT_UPDATE_ON_RENDER mode) override;
|
||||||
|
|
||||||
//! Sets the transition time in seconds (note: This needs to enable joints, and setJointmode maybe set to 2)
|
//! Sets the transition time in seconds (note: This needs to enable joints, and setJointmode maybe set to 2)
|
||||||
//! you must call animateJoints(), or the mesh will not animate
|
//! you must call animateJoints(), or the mesh will not animate
|
||||||
virtual void setTransitionTime(f32 Time) _IRR_OVERRIDE_;
|
void setTransitionTime(f32 Time) override;
|
||||||
|
|
||||||
//! updates the joint positions of this mesh
|
//! updates the joint positions of this mesh
|
||||||
virtual void animateJoints(bool CalculateAbsolutePositions=true) _IRR_OVERRIDE_;
|
void animateJoints(bool CalculateAbsolutePositions=true) override;
|
||||||
|
|
||||||
//! render mesh ignoring its transformation. Used with ragdolls. (culling is unaffected)
|
//! render mesh ignoring its transformation. Used with ragdolls. (culling is unaffected)
|
||||||
virtual void setRenderFromIdentity( bool On ) _IRR_OVERRIDE_;
|
void setRenderFromIdentity( bool On ) override;
|
||||||
|
|
||||||
//! Creates a clone of this scene node and its children.
|
//! Creates a clone of this scene node and its children.
|
||||||
/** \param newParent An optional new parent.
|
/** \param newParent An optional new parent.
|
||||||
\param newManager An optional new scene manager.
|
\param newManager An optional new scene manager.
|
||||||
\return The newly created clone of this node. */
|
\return The newly created clone of this node. */
|
||||||
virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) _IRR_OVERRIDE_;
|
ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -27,42 +27,42 @@ public:
|
|||||||
setBool(value);
|
setBool(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual s32 getInt() const _IRR_OVERRIDE_
|
s32 getInt() const override
|
||||||
{
|
{
|
||||||
return BoolValue ? 1 : 0;
|
return BoolValue ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual f32 getFloat() const _IRR_OVERRIDE_
|
f32 getFloat() const override
|
||||||
{
|
{
|
||||||
return BoolValue ? 1.0f : 0.0f;
|
return BoolValue ? 1.0f : 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool getBool() const _IRR_OVERRIDE_
|
bool getBool() const override
|
||||||
{
|
{
|
||||||
return BoolValue;
|
return BoolValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setInt(s32 intValue) _IRR_OVERRIDE_
|
void setInt(s32 intValue) override
|
||||||
{
|
{
|
||||||
BoolValue = (intValue != 0);
|
BoolValue = (intValue != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setFloat(f32 floatValue) _IRR_OVERRIDE_
|
void setFloat(f32 floatValue) override
|
||||||
{
|
{
|
||||||
BoolValue = (floatValue != 0);
|
BoolValue = (floatValue != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setBool(bool boolValue) _IRR_OVERRIDE_
|
void setBool(bool boolValue) override
|
||||||
{
|
{
|
||||||
BoolValue = boolValue;
|
BoolValue = boolValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual E_ATTRIBUTE_TYPE getType() const _IRR_OVERRIDE_
|
E_ATTRIBUTE_TYPE getType() const override
|
||||||
{
|
{
|
||||||
return EAT_BOOL;
|
return EAT_BOOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const wchar_t* getTypeString() const _IRR_OVERRIDE_
|
const wchar_t* getTypeString() const override
|
||||||
{
|
{
|
||||||
return L"bool";
|
return L"bool";
|
||||||
}
|
}
|
||||||
@ -81,32 +81,32 @@ public:
|
|||||||
setInt(value);
|
setInt(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual s32 getInt() const _IRR_OVERRIDE_
|
s32 getInt() const override
|
||||||
{
|
{
|
||||||
return Value;
|
return Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual f32 getFloat() const _IRR_OVERRIDE_
|
f32 getFloat() const override
|
||||||
{
|
{
|
||||||
return (f32)Value;
|
return (f32)Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setInt(s32 intValue) _IRR_OVERRIDE_
|
void setInt(s32 intValue) override
|
||||||
{
|
{
|
||||||
Value = intValue;
|
Value = intValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setFloat(f32 floatValue) _IRR_OVERRIDE_
|
void setFloat(f32 floatValue) override
|
||||||
{
|
{
|
||||||
Value = (s32)floatValue;
|
Value = (s32)floatValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual E_ATTRIBUTE_TYPE getType() const _IRR_OVERRIDE_
|
E_ATTRIBUTE_TYPE getType() const override
|
||||||
{
|
{
|
||||||
return EAT_INT;
|
return EAT_INT;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const wchar_t* getTypeString() const _IRR_OVERRIDE_
|
const wchar_t* getTypeString() const override
|
||||||
{
|
{
|
||||||
return L"int";
|
return L"int";
|
||||||
}
|
}
|
||||||
@ -125,32 +125,32 @@ public:
|
|||||||
setFloat(value);
|
setFloat(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual s32 getInt() const _IRR_OVERRIDE_
|
s32 getInt() const override
|
||||||
{
|
{
|
||||||
return (s32)Value;
|
return (s32)Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual f32 getFloat() const _IRR_OVERRIDE_
|
f32 getFloat() const override
|
||||||
{
|
{
|
||||||
return Value;
|
return Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setInt(s32 intValue) _IRR_OVERRIDE_
|
void setInt(s32 intValue) override
|
||||||
{
|
{
|
||||||
Value = (f32)intValue;
|
Value = (f32)intValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setFloat(f32 floatValue) _IRR_OVERRIDE_
|
void setFloat(f32 floatValue) override
|
||||||
{
|
{
|
||||||
Value = floatValue;
|
Value = floatValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual E_ATTRIBUTE_TYPE getType() const _IRR_OVERRIDE_
|
E_ATTRIBUTE_TYPE getType() const override
|
||||||
{
|
{
|
||||||
return EAT_FLOAT;
|
return EAT_FLOAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const wchar_t* getTypeString() const _IRR_OVERRIDE_
|
const wchar_t* getTypeString() const override
|
||||||
{
|
{
|
||||||
return L"float";
|
return L"float";
|
||||||
}
|
}
|
||||||
|
@ -30,37 +30,37 @@ public:
|
|||||||
~CAttributes();
|
~CAttributes();
|
||||||
|
|
||||||
//! Returns amount of attributes in this collection of attributes.
|
//! Returns amount of attributes in this collection of attributes.
|
||||||
virtual u32 getAttributeCount() const _IRR_OVERRIDE_;
|
u32 getAttributeCount() const override;
|
||||||
|
|
||||||
//! Returns attribute name by index.
|
//! Returns attribute name by index.
|
||||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||||
virtual const c8* getAttributeName(s32 index) const _IRR_OVERRIDE_;
|
const c8* getAttributeName(s32 index) const override;
|
||||||
|
|
||||||
//! Returns the type of an attribute
|
//! Returns the type of an attribute
|
||||||
//! \param attributeName: Name for the attribute
|
//! \param attributeName: Name for the attribute
|
||||||
virtual E_ATTRIBUTE_TYPE getAttributeType(const c8* attributeName) const _IRR_OVERRIDE_;
|
E_ATTRIBUTE_TYPE getAttributeType(const c8* attributeName) const override;
|
||||||
|
|
||||||
//! Returns attribute type by index.
|
//! Returns attribute type by index.
|
||||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||||
virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) const _IRR_OVERRIDE_;
|
E_ATTRIBUTE_TYPE getAttributeType(s32 index) const override;
|
||||||
|
|
||||||
//! Returns the type string of the attribute
|
//! Returns the type string of the attribute
|
||||||
//! \param attributeName: String for the attribute type
|
//! \param attributeName: String for the attribute type
|
||||||
//! \param defaultNotFound Value returned when attributeName was not found
|
//! \param defaultNotFound Value returned when attributeName was not found
|
||||||
virtual const wchar_t* getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound = L"unknown") const _IRR_OVERRIDE_;
|
const wchar_t* getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound = L"unknown") const override;
|
||||||
|
|
||||||
//! Returns the type string of the attribute by index.
|
//! Returns the type string of the attribute by index.
|
||||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||||
virtual const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") const _IRR_OVERRIDE_;
|
const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") const override;
|
||||||
|
|
||||||
//! Returns if an attribute with a name exists
|
//! Returns if an attribute with a name exists
|
||||||
virtual bool existsAttribute(const c8* attributeName) const _IRR_OVERRIDE_;
|
bool existsAttribute(const c8* attributeName) const override;
|
||||||
|
|
||||||
//! Returns attribute index from name, -1 if not found
|
//! Returns attribute index from name, -1 if not found
|
||||||
virtual s32 findAttribute(const c8* attributeName) const _IRR_OVERRIDE_;
|
s32 findAttribute(const c8* attributeName) const override;
|
||||||
|
|
||||||
//! Removes all attributes
|
//! Removes all attributes
|
||||||
virtual void clear() _IRR_OVERRIDE_;
|
void clear() override;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -70,23 +70,23 @@ public:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
//! Adds an attribute as integer
|
//! Adds an attribute as integer
|
||||||
virtual void addInt(const c8* attributeName, s32 value) _IRR_OVERRIDE_;
|
void addInt(const c8* attributeName, s32 value) override;
|
||||||
|
|
||||||
//! Sets an attribute as integer value
|
//! Sets an attribute as integer value
|
||||||
virtual void setAttribute(const c8* attributeName, s32 value) _IRR_OVERRIDE_;
|
void setAttribute(const c8* attributeName, s32 value) override;
|
||||||
|
|
||||||
//! Gets an attribute as integer value
|
//! Gets an attribute as integer value
|
||||||
//! \param attributeName: Name of the attribute to get.
|
//! \param attributeName: Name of the attribute to get.
|
||||||
//! \param defaultNotFound Value returned when attributeName was not found
|
//! \param defaultNotFound Value returned when attributeName was not found
|
||||||
//! \return Returns value of the attribute previously set by setAttribute()
|
//! \return Returns value of the attribute previously set by setAttribute()
|
||||||
virtual s32 getAttributeAsInt(const c8* attributeName, irr::s32 defaultNotFound=0) const _IRR_OVERRIDE_;
|
s32 getAttributeAsInt(const c8* attributeName, irr::s32 defaultNotFound=0) const override;
|
||||||
|
|
||||||
//! Gets an attribute as integer value
|
//! Gets an attribute as integer value
|
||||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||||
virtual s32 getAttributeAsInt(s32 index) const _IRR_OVERRIDE_;
|
s32 getAttributeAsInt(s32 index) const override;
|
||||||
|
|
||||||
//! Sets an attribute as integer value
|
//! Sets an attribute as integer value
|
||||||
virtual void setAttribute(s32 index, s32 value) _IRR_OVERRIDE_;
|
void setAttribute(s32 index, s32 value) override;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
@ -95,23 +95,23 @@ public:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
//! Adds an attribute as float
|
//! Adds an attribute as float
|
||||||
virtual void addFloat(const c8* attributeName, f32 value) _IRR_OVERRIDE_;
|
void addFloat(const c8* attributeName, f32 value) override;
|
||||||
|
|
||||||
//! Sets a attribute as float value
|
//! Sets a attribute as float value
|
||||||
virtual void setAttribute(const c8* attributeName, f32 value) _IRR_OVERRIDE_;
|
void setAttribute(const c8* attributeName, f32 value) override;
|
||||||
|
|
||||||
//! Gets an attribute as float value
|
//! Gets an attribute as float value
|
||||||
//! \param attributeName: Name of the attribute to get.
|
//! \param attributeName: Name of the attribute to get.
|
||||||
//! \param defaultNotFound Value returned when attributeName was not found
|
//! \param defaultNotFound Value returned when attributeName was not found
|
||||||
//! \return Returns value of the attribute previously set by setAttribute()
|
//! \return Returns value of the attribute previously set by setAttribute()
|
||||||
virtual f32 getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound=0.f) const _IRR_OVERRIDE_;
|
f32 getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound=0.f) const override;
|
||||||
|
|
||||||
//! Gets an attribute as float value
|
//! Gets an attribute as float value
|
||||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||||
virtual f32 getAttributeAsFloat(s32 index) const _IRR_OVERRIDE_;
|
f32 getAttributeAsFloat(s32 index) const override;
|
||||||
|
|
||||||
//! Sets an attribute as float value
|
//! Sets an attribute as float value
|
||||||
virtual void setAttribute(s32 index, f32 value) _IRR_OVERRIDE_;
|
void setAttribute(s32 index, f32 value) override;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -119,23 +119,23 @@ public:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
//! Adds an attribute as bool
|
//! Adds an attribute as bool
|
||||||
virtual void addBool(const c8* attributeName, bool value) _IRR_OVERRIDE_;
|
void addBool(const c8* attributeName, bool value) override;
|
||||||
|
|
||||||
//! Sets an attribute as boolean value
|
//! Sets an attribute as boolean value
|
||||||
virtual void setAttribute(const c8* attributeName, bool value) _IRR_OVERRIDE_;
|
void setAttribute(const c8* attributeName, bool value) override;
|
||||||
|
|
||||||
//! Gets an attribute as boolean value
|
//! Gets an attribute as boolean value
|
||||||
//! \param attributeName: Name of the attribute to get.
|
//! \param attributeName: Name of the attribute to get.
|
||||||
//! \param defaultNotFound Value returned when attributeName was not found
|
//! \param defaultNotFound Value returned when attributeName was not found
|
||||||
//! \return Returns value of the attribute previously set by setAttribute()
|
//! \return Returns value of the attribute previously set by setAttribute()
|
||||||
virtual bool getAttributeAsBool(const c8* attributeName, bool defaultNotFound=false) const _IRR_OVERRIDE_;
|
bool getAttributeAsBool(const c8* attributeName, bool defaultNotFound=false) const override;
|
||||||
|
|
||||||
//! Gets an attribute as boolean value
|
//! Gets an attribute as boolean value
|
||||||
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
||||||
virtual bool getAttributeAsBool(s32 index) const _IRR_OVERRIDE_;
|
bool getAttributeAsBool(s32 index) const override;
|
||||||
|
|
||||||
//! Sets an attribute as boolean value
|
//! Sets an attribute as boolean value
|
||||||
virtual void setAttribute(s32 index, bool value) _IRR_OVERRIDE_;
|
void setAttribute(s32 index, bool value) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Constructor
|
//! Constructor
|
||||||
CB3DMeshFileLoader::CB3DMeshFileLoader(scene::ISceneManager* smgr)
|
CB3DMeshFileLoader::CB3DMeshFileLoader(scene::ISceneManager* smgr)
|
||||||
: AnimatedMesh(0), B3DFile(0), NormalsInFile(false),
|
: AnimatedMesh(0), B3DFile(0), VerticesStart(0), NormalsInFile(false),
|
||||||
HasVertexColors(false), ShowWarning(true)
|
HasVertexColors(false), ShowWarning(true)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
|
@ -33,13 +33,13 @@ public:
|
|||||||
|
|
||||||
//! returns true if the file maybe is able to be loaded by this class
|
//! returns true if the file maybe is able to be loaded by this class
|
||||||
//! based on the file extension (e.g. ".bsp")
|
//! based on the file extension (e.g. ".bsp")
|
||||||
virtual bool isALoadableFileExtension(const io::path& filename) const _IRR_OVERRIDE_;
|
bool isALoadableFileExtension(const io::path& filename) const override;
|
||||||
|
|
||||||
//! creates/loads an animated mesh from the file.
|
//! creates/loads an animated mesh from the file.
|
||||||
//! \return Pointer to the created mesh. Returns 0 if loading failed.
|
//! \return Pointer to the created mesh. Returns 0 if loading failed.
|
||||||
//! If you no longer need the mesh, you should call IAnimatedMesh::drop().
|
//! If you no longer need the mesh, you should call IAnimatedMesh::drop().
|
||||||
//! See IReferenceCounted::drop() for more information.
|
//! See IReferenceCounted::drop() for more information.
|
||||||
virtual IAnimatedMesh* createMesh(io::IReadFile* file) _IRR_OVERRIDE_;
|
IAnimatedMesh* createMesh(io::IReadFile* file) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include "IMeshBuffer.h"
|
#include "IMeshBuffer.h"
|
||||||
#include "IWriteFile.h"
|
#include "IWriteFile.h"
|
||||||
#include "ITexture.h"
|
#include "ITexture.h"
|
||||||
#include "irrMap.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
@ -60,7 +59,7 @@ bool CB3DMeshWriter::writeMesh(io::IWriteFile* file, IMesh* const mesh, s32 flag
|
|||||||
|
|
||||||
const u32 numMeshBuffers = mesh->getMeshBufferCount();
|
const u32 numMeshBuffers = mesh->getMeshBufferCount();
|
||||||
array<SB3dTexture> texs;
|
array<SB3dTexture> texs;
|
||||||
map<ITexture *, u32> tex2id; // TODO: texture pointer as key not sufficient as same texture can have several id's
|
std::map<ITexture *, u32> tex2id; // TODO: texture pointer as key not sufficient as same texture can have several id's
|
||||||
u32 texsizes = 0;
|
u32 texsizes = 0;
|
||||||
for (u32 i = 0; i < numMeshBuffers; i++)
|
for (u32 i = 0; i < numMeshBuffers; i++)
|
||||||
{
|
{
|
||||||
|
@ -27,10 +27,10 @@ public:
|
|||||||
CB3DMeshWriter();
|
CB3DMeshWriter();
|
||||||
|
|
||||||
//! Returns the type of the mesh writer
|
//! Returns the type of the mesh writer
|
||||||
virtual EMESH_WRITER_TYPE getType() const _IRR_OVERRIDE_;
|
EMESH_WRITER_TYPE getType() const override;
|
||||||
|
|
||||||
//! writes a mesh
|
//! writes a mesh
|
||||||
virtual bool writeMesh(io::IWriteFile* file, scene::IMesh* mesh, s32 flags=EMWF_NONE) _IRR_OVERRIDE_;
|
bool writeMesh(io::IWriteFile* file, scene::IMesh* mesh, s32 flags=EMWF_NONE) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void writeJointChunk(io::IWriteFile* file, ISkinnedMesh* mesh , ISkinnedMesh::SJoint* joint, f32 animationSpeedMultiplier);
|
void writeJointChunk(io::IWriteFile* file, ISkinnedMesh* mesh , ISkinnedMesh::SJoint* joint, f32 animationSpeedMultiplier);
|
||||||
|
@ -28,58 +28,58 @@ public:
|
|||||||
virtual ~CBillboardSceneNode();
|
virtual ~CBillboardSceneNode();
|
||||||
|
|
||||||
//! pre render event
|
//! pre render event
|
||||||
virtual void OnRegisterSceneNode() _IRR_OVERRIDE_;
|
void OnRegisterSceneNode() override;
|
||||||
|
|
||||||
//! render
|
//! render
|
||||||
virtual void render() _IRR_OVERRIDE_;
|
void render() override;
|
||||||
|
|
||||||
//! returns the axis aligned bounding box of this node
|
//! returns the axis aligned bounding box of this node
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_;
|
const core::aabbox3d<f32>& getBoundingBox() const override;
|
||||||
|
|
||||||
//! sets the size of the billboard
|
//! sets the size of the billboard
|
||||||
virtual void setSize(const core::dimension2d<f32>& size) _IRR_OVERRIDE_;
|
void setSize(const core::dimension2d<f32>& size) override;
|
||||||
|
|
||||||
//! Sets the widths of the top and bottom edges of the billboard independently.
|
//! Sets the widths of the top and bottom edges of the billboard independently.
|
||||||
virtual void setSize(f32 height, f32 bottomEdgeWidth, f32 topEdgeWidth) _IRR_OVERRIDE_;
|
void setSize(f32 height, f32 bottomEdgeWidth, f32 topEdgeWidth) override;
|
||||||
|
|
||||||
//! gets the size of the billboard
|
//! gets the size of the billboard
|
||||||
virtual const core::dimension2d<f32>& getSize() const _IRR_OVERRIDE_;
|
const core::dimension2d<f32>& getSize() const override;
|
||||||
|
|
||||||
//! Gets the widths of the top and bottom edges of the billboard.
|
//! Gets the widths of the top and bottom edges of the billboard.
|
||||||
virtual void getSize(f32& height, f32& bottomEdgeWidth, f32& topEdgeWidth) const _IRR_OVERRIDE_;
|
void getSize(f32& height, f32& bottomEdgeWidth, f32& topEdgeWidth) const override;
|
||||||
|
|
||||||
virtual video::SMaterial& getMaterial(u32 i) _IRR_OVERRIDE_;
|
video::SMaterial& getMaterial(u32 i) override;
|
||||||
|
|
||||||
//! returns amount of materials used by this scene node.
|
//! returns amount of materials used by this scene node.
|
||||||
virtual u32 getMaterialCount() const _IRR_OVERRIDE_;
|
u32 getMaterialCount() const override;
|
||||||
|
|
||||||
//! Set the color of all vertices of the billboard
|
//! Set the color of all vertices of the billboard
|
||||||
//! \param overallColor: the color to set
|
//! \param overallColor: the color to set
|
||||||
virtual void setColor(const video::SColor& overallColor) _IRR_OVERRIDE_;
|
void setColor(const video::SColor& overallColor) override;
|
||||||
|
|
||||||
//! Set the color of the top and bottom vertices of the billboard
|
//! Set the color of the top and bottom vertices of the billboard
|
||||||
//! \param topColor: the color to set the top vertices
|
//! \param topColor: the color to set the top vertices
|
||||||
//! \param bottomColor: the color to set the bottom vertices
|
//! \param bottomColor: the color to set the bottom vertices
|
||||||
virtual void setColor(const video::SColor& topColor,
|
virtual void setColor(const video::SColor& topColor,
|
||||||
const video::SColor& bottomColor) _IRR_OVERRIDE_;
|
const video::SColor& bottomColor) override;
|
||||||
|
|
||||||
//! Gets the color of the top and bottom vertices of the billboard
|
//! Gets the color of the top and bottom vertices of the billboard
|
||||||
//! \param[out] topColor: stores the color of the top vertices
|
//! \param[out] topColor: stores the color of the top vertices
|
||||||
//! \param[out] bottomColor: stores the color of the bottom vertices
|
//! \param[out] bottomColor: stores the color of the bottom vertices
|
||||||
virtual void getColor(video::SColor& topColor,
|
virtual void getColor(video::SColor& topColor,
|
||||||
video::SColor& bottomColor) const _IRR_OVERRIDE_;
|
video::SColor& bottomColor) const override;
|
||||||
|
|
||||||
//! Get the real boundingbox used by the billboard (which depends on the active camera)
|
//! Get the real boundingbox used by the billboard (which depends on the active camera)
|
||||||
virtual const core::aabbox3d<f32>& getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode* camera) _IRR_OVERRIDE_;
|
const core::aabbox3d<f32>& getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode* camera) override;
|
||||||
|
|
||||||
//! Get the amount of mesh buffers.
|
//! Get the amount of mesh buffers.
|
||||||
virtual u32 getMeshBufferCount() const _IRR_OVERRIDE_
|
u32 getMeshBufferCount() const override
|
||||||
{
|
{
|
||||||
return Buffer ? 1 : 0;
|
return Buffer ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get pointer to the mesh buffer.
|
//! Get pointer to the mesh buffer.
|
||||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const _IRR_OVERRIDE_
|
IMeshBuffer* getMeshBuffer(u32 nr) const override
|
||||||
{
|
{
|
||||||
if ( nr == 0 )
|
if ( nr == 0 )
|
||||||
return Buffer;
|
return Buffer;
|
||||||
@ -87,10 +87,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Returns type of the scene node
|
//! Returns type of the scene node
|
||||||
virtual ESCENE_NODE_TYPE getType() const _IRR_OVERRIDE_ { return ESNT_BILLBOARD; }
|
ESCENE_NODE_TYPE getType() const override { return ESNT_BILLBOARD; }
|
||||||
|
|
||||||
//! Creates a clone of this scene node and its children.
|
//! Creates a clone of this scene node and its children.
|
||||||
virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) _IRR_OVERRIDE_;
|
ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void updateMesh(const irr::scene::ICameraSceneNode* camera);
|
void updateMesh(const irr::scene::ICameraSceneNode* camera);
|
||||||
|
@ -71,7 +71,7 @@ void CBoneSceneNode::OnAnimate(u32 timeMs)
|
|||||||
//updateAbsolutePosition();
|
//updateAbsolutePosition();
|
||||||
|
|
||||||
// perform the post render process on all children
|
// perform the post render process on all children
|
||||||
ISceneNodeList::Iterator it = Children.begin();
|
ISceneNodeList::iterator it = Children.begin();
|
||||||
for (; it != Children.end(); ++it)
|
for (; it != Children.end(); ++it)
|
||||||
(*it)->OnAnimate(timeMs);
|
(*it)->OnAnimate(timeMs);
|
||||||
}
|
}
|
||||||
@ -82,7 +82,7 @@ void CBoneSceneNode::helper_updateAbsolutePositionOfAllChildren(ISceneNode *Node
|
|||||||
{
|
{
|
||||||
Node->updateAbsolutePosition();
|
Node->updateAbsolutePosition();
|
||||||
|
|
||||||
ISceneNodeList::ConstIterator it = Node->getChildren().begin();
|
ISceneNodeList::const_iterator it = Node->getChildren().begin();
|
||||||
for (; it != Node->getChildren().end(); ++it)
|
for (; it != Node->getChildren().end(); ++it)
|
||||||
{
|
{
|
||||||
helper_updateAbsolutePositionOfAllChildren( (*it) );
|
helper_updateAbsolutePositionOfAllChildren( (*it) );
|
||||||
|
@ -23,33 +23,33 @@ namespace scene
|
|||||||
s32 id=-1, u32 boneIndex=0, const c8* boneName=0);
|
s32 id=-1, u32 boneIndex=0, const c8* boneName=0);
|
||||||
|
|
||||||
//! Returns the index of the bone
|
//! Returns the index of the bone
|
||||||
virtual u32 getBoneIndex() const _IRR_OVERRIDE_;
|
u32 getBoneIndex() const override;
|
||||||
|
|
||||||
//! Sets the animation mode of the bone. Returns true if successful.
|
//! Sets the animation mode of the bone. Returns true if successful.
|
||||||
virtual bool setAnimationMode(E_BONE_ANIMATION_MODE mode) _IRR_OVERRIDE_;
|
bool setAnimationMode(E_BONE_ANIMATION_MODE mode) override;
|
||||||
|
|
||||||
//! Gets the current animation mode of the bone
|
//! Gets the current animation mode of the bone
|
||||||
virtual E_BONE_ANIMATION_MODE getAnimationMode() const _IRR_OVERRIDE_;
|
E_BONE_ANIMATION_MODE getAnimationMode() const override;
|
||||||
|
|
||||||
//! returns the axis aligned bounding box of this node
|
//! returns the axis aligned bounding box of this node
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_;
|
const core::aabbox3d<f32>& getBoundingBox() const override;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//! Returns the relative transformation of the scene node.
|
//! Returns the relative transformation of the scene node.
|
||||||
//virtual core::matrix4 getRelativeTransformation() const _IRR_OVERRIDE_;
|
//core::matrix4 getRelativeTransformation() const override;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
virtual void OnAnimate(u32 timeMs) _IRR_OVERRIDE_;
|
void OnAnimate(u32 timeMs) override;
|
||||||
|
|
||||||
virtual void updateAbsolutePositionOfAllChildren() _IRR_OVERRIDE_;
|
void updateAbsolutePositionOfAllChildren() override;
|
||||||
|
|
||||||
//! How the relative transformation of the bone is used
|
//! How the relative transformation of the bone is used
|
||||||
virtual void setSkinningSpace(E_BONE_SKINNING_SPACE space) _IRR_OVERRIDE_
|
void setSkinningSpace(E_BONE_SKINNING_SPACE space) override
|
||||||
{
|
{
|
||||||
SkinningSpace=space;
|
SkinningSpace=space;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual E_BONE_SKINNING_SPACE getSkinningSpace() const _IRR_OVERRIDE_
|
E_BONE_SKINNING_SPACE getSkinningSpace() const override
|
||||||
{
|
{
|
||||||
return SkinningSpace;
|
return SkinningSpace;
|
||||||
}
|
}
|
||||||
|
@ -30,117 +30,117 @@ namespace scene
|
|||||||
\param projection The new projection matrix of the camera.
|
\param projection The new projection matrix of the camera.
|
||||||
\param isOrthogonal Set this to true if the matrix is an orthogonal one (e.g.
|
\param isOrthogonal Set this to true if the matrix is an orthogonal one (e.g.
|
||||||
from matrix4::buildProjectionMatrixOrthoLH(). */
|
from matrix4::buildProjectionMatrixOrthoLH(). */
|
||||||
virtual void setProjectionMatrix(const core::matrix4& projection, bool isOrthogonal = false) _IRR_OVERRIDE_;
|
void setProjectionMatrix(const core::matrix4& projection, bool isOrthogonal = false) override;
|
||||||
|
|
||||||
//! Gets the current projection matrix of the camera
|
//! Gets the current projection matrix of the camera
|
||||||
//! \return Returns the current projection matrix of the camera.
|
//! \return Returns the current projection matrix of the camera.
|
||||||
virtual const core::matrix4& getProjectionMatrix() const _IRR_OVERRIDE_;
|
const core::matrix4& getProjectionMatrix() const override;
|
||||||
|
|
||||||
//! Gets the current view matrix of the camera
|
//! Gets the current view matrix of the camera
|
||||||
//! \return Returns the current view matrix of the camera.
|
//! \return Returns the current view matrix of the camera.
|
||||||
virtual const core::matrix4& getViewMatrix() const _IRR_OVERRIDE_;
|
const core::matrix4& getViewMatrix() const override;
|
||||||
|
|
||||||
//! Sets a custom view matrix affector.
|
//! Sets a custom view matrix affector.
|
||||||
/** \param affector: The affector matrix. */
|
/** \param affector: The affector matrix. */
|
||||||
virtual void setViewMatrixAffector(const core::matrix4& affector) _IRR_OVERRIDE_;
|
void setViewMatrixAffector(const core::matrix4& affector) override;
|
||||||
|
|
||||||
//! Gets the custom view matrix affector.
|
//! Gets the custom view matrix affector.
|
||||||
virtual const core::matrix4& getViewMatrixAffector() const _IRR_OVERRIDE_;
|
const core::matrix4& getViewMatrixAffector() const override;
|
||||||
|
|
||||||
//! It is possible to send mouse and key events to the camera. Most cameras
|
//! It is possible to send mouse and key events to the camera. Most cameras
|
||||||
//! may ignore this input, but camera scene nodes which are created for
|
//! may ignore this input, but camera scene nodes which are created for
|
||||||
//! example with scene::ISceneManager::addMayaCameraSceneNode or
|
//! example with scene::ISceneManager::addMayaCameraSceneNode or
|
||||||
//! scene::ISceneManager::addMeshViewerCameraSceneNode, may want to get this input
|
//! scene::ISceneManager::addMeshViewerCameraSceneNode, may want to get this input
|
||||||
//! for changing their position, look at target or whatever.
|
//! for changing their position, look at target or whatever.
|
||||||
virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_;
|
bool OnEvent(const SEvent& event) override;
|
||||||
|
|
||||||
//! Sets the look at target of the camera
|
//! Sets the look at target of the camera
|
||||||
/** If the camera's target and rotation are bound ( @see bindTargetAndRotation() )
|
/** If the camera's target and rotation are bound ( @see bindTargetAndRotation() )
|
||||||
then calling this will also change the camera's scene node rotation to match the target.
|
then calling this will also change the camera's scene node rotation to match the target.
|
||||||
\param pos: Look at target of the camera. */
|
\param pos: Look at target of the camera. */
|
||||||
virtual void setTarget(const core::vector3df& pos) _IRR_OVERRIDE_;
|
void setTarget(const core::vector3df& pos) override;
|
||||||
|
|
||||||
//! Sets the rotation of the node.
|
//! Sets the rotation of the node.
|
||||||
/** This only modifies the relative rotation of the node.
|
/** This only modifies the relative rotation of the node.
|
||||||
If the camera's target and rotation are bound ( @see bindTargetAndRotation() )
|
If the camera's target and rotation are bound ( @see bindTargetAndRotation() )
|
||||||
then calling this will also change the camera's target to match the rotation.
|
then calling this will also change the camera's target to match the rotation.
|
||||||
\param rotation New rotation of the node in degrees. */
|
\param rotation New rotation of the node in degrees. */
|
||||||
virtual void setRotation(const core::vector3df& rotation) _IRR_OVERRIDE_;
|
void setRotation(const core::vector3df& rotation) override;
|
||||||
|
|
||||||
//! Gets the current look at target of the camera
|
//! Gets the current look at target of the camera
|
||||||
/** \return The current look at target of the camera */
|
/** \return The current look at target of the camera */
|
||||||
virtual const core::vector3df& getTarget() const _IRR_OVERRIDE_;
|
const core::vector3df& getTarget() const override;
|
||||||
|
|
||||||
//! Sets the up vector of the camera.
|
//! Sets the up vector of the camera.
|
||||||
//! \param pos: New upvector of the camera.
|
//! \param pos: New upvector of the camera.
|
||||||
virtual void setUpVector(const core::vector3df& pos) _IRR_OVERRIDE_;
|
void setUpVector(const core::vector3df& pos) override;
|
||||||
|
|
||||||
//! Gets the up vector of the camera.
|
//! Gets the up vector of the camera.
|
||||||
//! \return Returns the up vector of the camera.
|
//! \return Returns the up vector of the camera.
|
||||||
virtual const core::vector3df& getUpVector() const _IRR_OVERRIDE_;
|
const core::vector3df& getUpVector() const override;
|
||||||
|
|
||||||
//! Gets distance from the camera to the near plane.
|
//! Gets distance from the camera to the near plane.
|
||||||
//! \return Value of the near plane of the camera.
|
//! \return Value of the near plane of the camera.
|
||||||
virtual f32 getNearValue() const _IRR_OVERRIDE_;
|
f32 getNearValue() const override;
|
||||||
|
|
||||||
//! Gets the distance from the camera to the far plane.
|
//! Gets the distance from the camera to the far plane.
|
||||||
//! \return Value of the far plane of the camera.
|
//! \return Value of the far plane of the camera.
|
||||||
virtual f32 getFarValue() const _IRR_OVERRIDE_;
|
f32 getFarValue() const override;
|
||||||
|
|
||||||
//! Get the aspect ratio of the camera.
|
//! Get the aspect ratio of the camera.
|
||||||
//! \return The aspect ratio of the camera.
|
//! \return The aspect ratio of the camera.
|
||||||
virtual f32 getAspectRatio() const _IRR_OVERRIDE_;
|
f32 getAspectRatio() const override;
|
||||||
|
|
||||||
//! Gets the field of view of the camera.
|
//! Gets the field of view of the camera.
|
||||||
//! \return Field of view of the camera
|
//! \return Field of view of the camera
|
||||||
virtual f32 getFOV() const _IRR_OVERRIDE_;
|
f32 getFOV() const override;
|
||||||
|
|
||||||
//! Sets the value of the near clipping plane. (default: 1.0f)
|
//! Sets the value of the near clipping plane. (default: 1.0f)
|
||||||
virtual void setNearValue(f32 zn) _IRR_OVERRIDE_;
|
void setNearValue(f32 zn) override;
|
||||||
|
|
||||||
//! Sets the value of the far clipping plane (default: 2000.0f)
|
//! Sets the value of the far clipping plane (default: 2000.0f)
|
||||||
virtual void setFarValue(f32 zf) _IRR_OVERRIDE_;
|
void setFarValue(f32 zf) override;
|
||||||
|
|
||||||
//! Sets the aspect ratio (default: 4.0f / 3.0f)
|
//! Sets the aspect ratio (default: 4.0f / 3.0f)
|
||||||
virtual void setAspectRatio(f32 aspect) _IRR_OVERRIDE_;
|
void setAspectRatio(f32 aspect) override;
|
||||||
|
|
||||||
//! Sets the field of view (Default: PI / 3.5f)
|
//! Sets the field of view (Default: PI / 3.5f)
|
||||||
virtual void setFOV(f32 fovy) _IRR_OVERRIDE_;
|
void setFOV(f32 fovy) override;
|
||||||
|
|
||||||
//! PreRender event
|
//! PreRender event
|
||||||
virtual void OnRegisterSceneNode() _IRR_OVERRIDE_;
|
void OnRegisterSceneNode() override;
|
||||||
|
|
||||||
//! Render
|
//! Render
|
||||||
virtual void render() _IRR_OVERRIDE_;
|
void render() override;
|
||||||
|
|
||||||
//! Update
|
//! Update
|
||||||
virtual void updateMatrices() _IRR_OVERRIDE_;
|
void updateMatrices() override;
|
||||||
|
|
||||||
//! Returns the axis aligned bounding box of this node
|
//! Returns the axis aligned bounding box of this node
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_;
|
const core::aabbox3d<f32>& getBoundingBox() const override;
|
||||||
|
|
||||||
//! Returns the view area.
|
//! Returns the view area.
|
||||||
virtual const SViewFrustum* getViewFrustum() const _IRR_OVERRIDE_;
|
const SViewFrustum* getViewFrustum() const override;
|
||||||
|
|
||||||
//! Disables or enables the camera to get key or mouse inputs.
|
//! Disables or enables the camera to get key or mouse inputs.
|
||||||
//! If this is set to true, the camera will respond to key inputs
|
//! If this is set to true, the camera will respond to key inputs
|
||||||
//! otherwise not.
|
//! otherwise not.
|
||||||
virtual void setInputReceiverEnabled(bool enabled) _IRR_OVERRIDE_;
|
void setInputReceiverEnabled(bool enabled) override;
|
||||||
|
|
||||||
//! Returns if the input receiver of the camera is currently enabled.
|
//! Returns if the input receiver of the camera is currently enabled.
|
||||||
virtual bool isInputReceiverEnabled() const _IRR_OVERRIDE_;
|
bool isInputReceiverEnabled() const override;
|
||||||
|
|
||||||
//! Returns type of the scene node
|
//! Returns type of the scene node
|
||||||
virtual ESCENE_NODE_TYPE getType() const _IRR_OVERRIDE_ { return ESNT_CAMERA; }
|
ESCENE_NODE_TYPE getType() const override { return ESNT_CAMERA; }
|
||||||
|
|
||||||
//! Binds the camera scene node's rotation to its target position and vice versa, or unbinds them.
|
//! Binds the camera scene node's rotation to its target position and vice versa, or unbinds them.
|
||||||
virtual void bindTargetAndRotation(bool bound) _IRR_OVERRIDE_;
|
void bindTargetAndRotation(bool bound) override;
|
||||||
|
|
||||||
//! Queries if the camera scene node's rotation and its target position are bound together.
|
//! Queries if the camera scene node's rotation and its target position are bound together.
|
||||||
virtual bool getTargetAndRotationBinding(void) const _IRR_OVERRIDE_;
|
bool getTargetAndRotationBinding(void) const override;
|
||||||
|
|
||||||
//! Creates a clone of this scene node and its children.
|
//! Creates a clone of this scene node and its children.
|
||||||
virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) _IRR_OVERRIDE_;
|
ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -1,167 +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
|
|
||||||
|
|
||||||
#include "CDefaultGUIElementFactory.h"
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_GUI_
|
|
||||||
|
|
||||||
#include "IGUIEnvironment.h"
|
|
||||||
|
|
||||||
#include "IGUIButton.h"
|
|
||||||
#include "IGUICheckBox.h"
|
|
||||||
#include "IGUIColorSelectDialog.h"
|
|
||||||
#include "IGUIComboBox.h"
|
|
||||||
#include "IGUIContextMenu.h"
|
|
||||||
#include "IGUIEditBox.h"
|
|
||||||
#include "IGUIFileOpenDialog.h"
|
|
||||||
#include "IGUIInOutFader.h"
|
|
||||||
#include "IGUIImage.h"
|
|
||||||
#include "IGUIListBox.h"
|
|
||||||
#include "IGUIMeshViewer.h"
|
|
||||||
#include "IGUIScrollBar.h"
|
|
||||||
#include "IGUISpinBox.h"
|
|
||||||
#include "IGUIStaticText.h"
|
|
||||||
#include "IGUITabControl.h"
|
|
||||||
#include "IGUITable.h"
|
|
||||||
#include "IGUIToolbar.h"
|
|
||||||
#include "IGUIWindow.h"
|
|
||||||
#include "IGUITreeView.h"
|
|
||||||
#include "IGUIProfiler.h"
|
|
||||||
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
namespace gui
|
|
||||||
{
|
|
||||||
|
|
||||||
CDefaultGUIElementFactory::CDefaultGUIElementFactory(IGUIEnvironment* env)
|
|
||||||
: Environment(env)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
setDebugName("CDefaultGUIElementFactory");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// don't grab the gui environment here to prevent cyclic references
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! adds an element to the env based on its type id
|
|
||||||
IGUIElement* CDefaultGUIElementFactory::addGUIElement(EGUI_ELEMENT_TYPE type, IGUIElement* parent)
|
|
||||||
{
|
|
||||||
switch(type)
|
|
||||||
{
|
|
||||||
case EGUIET_BUTTON:
|
|
||||||
return Environment->addButton(core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_CHECK_BOX:
|
|
||||||
return Environment->addCheckBox(false, core::rect<s32>(0,0,100,100), parent);
|
|
||||||
case EGUIET_COLOR_SELECT_DIALOG:
|
|
||||||
return Environment->addColorSelectDialog(0,true,parent);
|
|
||||||
case EGUIET_COMBO_BOX:
|
|
||||||
return Environment->addComboBox(core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_CONTEXT_MENU:
|
|
||||||
return Environment->addContextMenu(core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_MENU:
|
|
||||||
return Environment->addMenu(parent);
|
|
||||||
case EGUIET_EDIT_BOX:
|
|
||||||
return Environment->addEditBox(0,core::rect<s32>(0,0,100,100),true, parent);
|
|
||||||
case EGUIET_FILE_OPEN_DIALOG:
|
|
||||||
return Environment->addFileOpenDialog(0,true,parent);
|
|
||||||
case EGUIET_IMAGE:
|
|
||||||
return Environment->addImage(0,core::position2di(0,0), true, parent);
|
|
||||||
case EGUIET_IN_OUT_FADER:
|
|
||||||
return Environment->addInOutFader(0,parent);
|
|
||||||
case EGUIET_LIST_BOX:
|
|
||||||
return Environment->addListBox(core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_MESH_VIEWER:
|
|
||||||
return Environment->addMeshViewer(core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_MODAL_SCREEN:
|
|
||||||
return Environment->addModalScreen(parent);
|
|
||||||
case EGUIET_MESSAGE_BOX:
|
|
||||||
return Environment->addMessageBox(0,0,false,0,parent);
|
|
||||||
case EGUIET_SCROLL_BAR:
|
|
||||||
return Environment->addScrollBar(false,core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_STATIC_TEXT:
|
|
||||||
return Environment->addStaticText(0,core::rect<s32>(0,0,100,100),false,true,parent);
|
|
||||||
case EGUIET_TAB:
|
|
||||||
return Environment->addTab(core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_TAB_CONTROL:
|
|
||||||
return Environment->addTabControl(core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_TABLE:
|
|
||||||
return Environment->addTable(core::rect<s32>(0,0,100,100), parent);
|
|
||||||
case EGUIET_TOOL_BAR:
|
|
||||||
return Environment->addToolBar(parent);
|
|
||||||
case EGUIET_WINDOW:
|
|
||||||
return Environment->addWindow(core::rect<s32>(0,0,100,100),false,0,parent);
|
|
||||||
case EGUIET_SPIN_BOX:
|
|
||||||
return Environment->addSpinBox(L"0.0", core::rect<s32>(0,0,100,100), true, parent);
|
|
||||||
case EGUIET_TREE_VIEW:
|
|
||||||
return Environment->addTreeView(core::rect<s32>(0,0,100,100),parent);
|
|
||||||
case EGUIET_PROFILER:
|
|
||||||
return Environment->addProfilerDisplay(core::rect<s32>(0,0,100,100), parent);
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! adds an element to the environment based on its type name
|
|
||||||
IGUIElement* CDefaultGUIElementFactory::addGUIElement(const c8* typeName, IGUIElement* parent)
|
|
||||||
{
|
|
||||||
return addGUIElement( getTypeFromName(typeName), parent );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Returns the amount of element types this factory is able to create.
|
|
||||||
s32 CDefaultGUIElementFactory::getCreatableGUIElementTypeCount() const
|
|
||||||
{
|
|
||||||
return EGUIET_COUNT;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Returns the type of a creatable element type.
|
|
||||||
EGUI_ELEMENT_TYPE CDefaultGUIElementFactory::getCreateableGUIElementType(s32 idx) const
|
|
||||||
{
|
|
||||||
if (idx>=0 && idx<EGUIET_COUNT)
|
|
||||||
return (EGUI_ELEMENT_TYPE)idx;
|
|
||||||
|
|
||||||
return EGUIET_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Returns the type name of a creatable element type.
|
|
||||||
const c8* CDefaultGUIElementFactory::getCreateableGUIElementTypeName(s32 idx) const
|
|
||||||
{
|
|
||||||
if (idx>=0 && idx<EGUIET_COUNT)
|
|
||||||
return GUIElementTypeNames[idx];
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Returns the type name of a creatable element type.
|
|
||||||
const c8* CDefaultGUIElementFactory::getCreateableGUIElementTypeName(EGUI_ELEMENT_TYPE type) const
|
|
||||||
{
|
|
||||||
// for this factory, type == index
|
|
||||||
|
|
||||||
if (type>=0 && type<EGUIET_COUNT)
|
|
||||||
return GUIElementTypeNames[type];
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGUI_ELEMENT_TYPE CDefaultGUIElementFactory::getTypeFromName(const c8* name) const
|
|
||||||
{
|
|
||||||
for ( u32 i=0; GUIElementTypeNames[i]; ++i)
|
|
||||||
if (!strcmp(name, GUIElementTypeNames[i]) )
|
|
||||||
return (EGUI_ELEMENT_TYPE)i;
|
|
||||||
|
|
||||||
return EGUIET_ELEMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace gui
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_WITH_GUI_
|
|
||||||
|
|
@ -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 __C_DEFAULT_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
|
||||||
#define __C_DEFAULT_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "IrrCompileConfig.h"
|
|
||||||
#ifdef _IRR_COMPILE_WITH_GUI_
|
|
||||||
|
|
||||||
#include "IGUIElementFactory.h"
|
|
||||||
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
namespace gui
|
|
||||||
{
|
|
||||||
class IGUIElement;
|
|
||||||
class IGUIEnvironment;
|
|
||||||
|
|
||||||
//! This interface makes it possible to dynamically create gui elements.
|
|
||||||
class CDefaultGUIElementFactory : public IGUIElementFactory
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
CDefaultGUIElementFactory(IGUIEnvironment* env);
|
|
||||||
|
|
||||||
//! 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. A value of 0 adds it to the root.
|
|
||||||
\return Returns pointer to the new element or 0 if unsuccessful. */
|
|
||||||
virtual IGUIElement* addGUIElement(EGUI_ELEMENT_TYPE type, IGUIElement* parent=0) _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! Adds a GUI element to the GUI Environment based on its type name.
|
|
||||||
/** \param typeName: Type name of the element to add. Taken from the GUIElementTypeNames c8* array.
|
|
||||||
\param parent: Parent scene node of the new element. A value of 0 adds it to the root.
|
|
||||||
\return Returns pointer to the new element or 0 if unsuccessful. */
|
|
||||||
virtual IGUIElement* addGUIElement(const c8* typeName, IGUIElement* parent=0) _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! Returns the amount of GUI element types this factory is able to create.
|
|
||||||
virtual s32 getCreatableGUIElementTypeCount() const _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! Returns the type of a createable GUI element type based on the index.
|
|
||||||
/** \param idx: Index of the element type in this factory. The value must be equal or greater than 0
|
|
||||||
and lower than getCreatableGUIElementTypeCount(). */
|
|
||||||
virtual EGUI_ELEMENT_TYPE getCreateableGUIElementType(s32 idx) const _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! Returns the type name of a createable GUI element type based on the index.
|
|
||||||
/** \param idx: Index of the element type in this factory. The value must be equal or greater than 0
|
|
||||||
and lower than getCreatableGUIElementTypeCount(). */
|
|
||||||
virtual const c8* getCreateableGUIElementTypeName(s32 idx) const _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! Returns the type name of a createable GUI element based on its type.
|
|
||||||
/** \param type: Type of the GUI element.
|
|
||||||
\return: Returns the name of the type if this factory can create it, otherwise it returns 0. */
|
|
||||||
virtual const c8* getCreateableGUIElementTypeName(EGUI_ELEMENT_TYPE type) const _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
EGUI_ELEMENT_TYPE getTypeFromName(const c8* name) const;
|
|
||||||
|
|
||||||
IGUIEnvironment* Environment;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace gui
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_WITH_GUI_
|
|
||||||
|
|
||||||
#endif // __C_DEFAULT_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
|
@ -1,122 +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
|
|
||||||
|
|
||||||
#include "CDefaultSceneNodeFactory.h"
|
|
||||||
#include "ISceneManager.h"
|
|
||||||
#include "IDummyTransformationSceneNode.h"
|
|
||||||
#include "ICameraSceneNode.h"
|
|
||||||
#include "IBillboardSceneNode.h"
|
|
||||||
#include "IAnimatedMeshSceneNode.h"
|
|
||||||
#include "IMeshSceneNode.h"
|
|
||||||
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
namespace scene
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
CDefaultSceneNodeFactory::CDefaultSceneNodeFactory(ISceneManager* mgr)
|
|
||||||
: Manager(mgr)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
setDebugName("CDefaultSceneNodeFactory");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// don't grab the scene manager here to prevent cyclic references
|
|
||||||
|
|
||||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_MESH, "mesh"));
|
|
||||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_EMPTY, "empty"));
|
|
||||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_DUMMY_TRANSFORMATION, "dummyTransformation"));
|
|
||||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_CAMERA, "camera"));
|
|
||||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_BILLBOARD, "billBoard"));
|
|
||||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_ANIMATED_MESH, "animatedMesh"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! adds a scene node to the scene graph based on its type id
|
|
||||||
ISceneNode* CDefaultSceneNodeFactory::addSceneNode(ESCENE_NODE_TYPE type, ISceneNode* parent)
|
|
||||||
{
|
|
||||||
switch(type)
|
|
||||||
{
|
|
||||||
case ESNT_MESH:
|
|
||||||
return Manager->addMeshSceneNode(0, parent, -1, core::vector3df(),
|
|
||||||
core::vector3df(), core::vector3df(1,1,1), true);
|
|
||||||
case ESNT_EMPTY:
|
|
||||||
return Manager->addEmptySceneNode(parent);
|
|
||||||
case ESNT_DUMMY_TRANSFORMATION:
|
|
||||||
return Manager->addDummyTransformationSceneNode(parent);
|
|
||||||
case ESNT_CAMERA:
|
|
||||||
return Manager->addCameraSceneNode(parent);
|
|
||||||
case ESNT_BILLBOARD:
|
|
||||||
return Manager->addBillboardSceneNode(parent);
|
|
||||||
case ESNT_ANIMATED_MESH:
|
|
||||||
return Manager->addAnimatedMeshSceneNode(0, parent, -1, core::vector3df(),
|
|
||||||
core::vector3df(), core::vector3df(1,1,1), true);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! adds a scene node to the scene graph based on its type name
|
|
||||||
ISceneNode* CDefaultSceneNodeFactory::addSceneNode(const c8* typeName, ISceneNode* parent)
|
|
||||||
{
|
|
||||||
return addSceneNode( getTypeFromName(typeName), parent );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! returns amount of scene node types this factory is able to create
|
|
||||||
u32 CDefaultSceneNodeFactory::getCreatableSceneNodeTypeCount() const
|
|
||||||
{
|
|
||||||
return SupportedSceneNodeTypes.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! returns type of a creatable scene node type
|
|
||||||
ESCENE_NODE_TYPE CDefaultSceneNodeFactory::getCreateableSceneNodeType(u32 idx) const
|
|
||||||
{
|
|
||||||
if (idx<SupportedSceneNodeTypes.size())
|
|
||||||
return SupportedSceneNodeTypes[idx].Type;
|
|
||||||
else
|
|
||||||
return ESNT_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! returns type name of a creatable scene node type
|
|
||||||
const c8* CDefaultSceneNodeFactory::getCreateableSceneNodeTypeName(u32 idx) const
|
|
||||||
{
|
|
||||||
if (idx<SupportedSceneNodeTypes.size())
|
|
||||||
return SupportedSceneNodeTypes[idx].TypeName.c_str();
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! returns type name of a creatable scene node type
|
|
||||||
const c8* CDefaultSceneNodeFactory::getCreateableSceneNodeTypeName(ESCENE_NODE_TYPE type) const
|
|
||||||
{
|
|
||||||
for (u32 i=0; i<SupportedSceneNodeTypes.size(); ++i)
|
|
||||||
if (SupportedSceneNodeTypes[i].Type == type)
|
|
||||||
return SupportedSceneNodeTypes[i].TypeName.c_str();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ESCENE_NODE_TYPE CDefaultSceneNodeFactory::getTypeFromName(const c8* name) const
|
|
||||||
{
|
|
||||||
for (u32 i=0; i<SupportedSceneNodeTypes.size(); ++i)
|
|
||||||
if (SupportedSceneNodeTypes[i].TypeName == name)
|
|
||||||
return SupportedSceneNodeTypes[i].Type;
|
|
||||||
|
|
||||||
return ESNT_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace scene
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
@ -1,80 +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 __C_DEFAULT_SCENE_NODE_FACTORY_H_INCLUDED__
|
|
||||||
#define __C_DEFAULT_SCENE_NODE_FACTORY_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "ISceneNodeFactory.h"
|
|
||||||
#include "irrArray.h"
|
|
||||||
#include "irrString.h"
|
|
||||||
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
namespace scene
|
|
||||||
{
|
|
||||||
class ISceneNode;
|
|
||||||
class ISceneManager;
|
|
||||||
|
|
||||||
//! Interface making it possible to dynamicly create scene nodes and animators
|
|
||||||
class CDefaultSceneNodeFactory : public ISceneNodeFactory
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
CDefaultSceneNodeFactory(ISceneManager* mgr);
|
|
||||||
|
|
||||||
//! 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. */
|
|
||||||
virtual ISceneNode* addSceneNode(ESCENE_NODE_TYPE type, ISceneNode* parent=0) _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! 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. */
|
|
||||||
virtual ISceneNode* addSceneNode(const c8* typeName, ISceneNode* parent=0) _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! returns amount of scene node types this factory is able to create
|
|
||||||
virtual u32 getCreatableSceneNodeTypeCount() const _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! 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
|
|
||||||
uetCreatableSceneNodeTypeCount() */
|
|
||||||
virtual const c8* getCreateableSceneNodeTypeName(u32 idx) const _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! 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 _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
//! returns type name of a creatable scene node type
|
|
||||||
/** \param idx: 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 _IRR_OVERRIDE_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
ESCENE_NODE_TYPE getTypeFromName(const c8* name) const;
|
|
||||||
|
|
||||||
struct SSceneNodeTypePair
|
|
||||||
{
|
|
||||||
SSceneNodeTypePair(ESCENE_NODE_TYPE type, const c8* name)
|
|
||||||
: Type(type), TypeName(name)
|
|
||||||
{}
|
|
||||||
|
|
||||||
ESCENE_NODE_TYPE Type;
|
|
||||||
core::stringc TypeName;
|
|
||||||
};
|
|
||||||
|
|
||||||
core::array<SSceneNodeTypePair> SupportedSceneNodeTypes;
|
|
||||||
|
|
||||||
ISceneManager* Manager;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace scene
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -20,36 +20,36 @@ namespace scene
|
|||||||
CDummyTransformationSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id);
|
CDummyTransformationSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id);
|
||||||
|
|
||||||
//! returns the axis aligned bounding box of this node
|
//! returns the axis aligned bounding box of this node
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_;
|
const core::aabbox3d<f32>& getBoundingBox() const override;
|
||||||
|
|
||||||
//! Returns a reference to the current relative transformation matrix.
|
//! Returns a reference to the current relative transformation matrix.
|
||||||
//! This is the matrix, this scene node uses instead of scale, translation
|
//! This is the matrix, this scene node uses instead of scale, translation
|
||||||
//! and rotation.
|
//! and rotation.
|
||||||
virtual core::matrix4& getRelativeTransformationMatrix() _IRR_OVERRIDE_;
|
core::matrix4& getRelativeTransformationMatrix() override;
|
||||||
|
|
||||||
//! Returns the relative transformation of the scene node.
|
//! Returns the relative transformation of the scene node.
|
||||||
virtual core::matrix4 getRelativeTransformation() const _IRR_OVERRIDE_;
|
core::matrix4 getRelativeTransformation() const override;
|
||||||
|
|
||||||
//! does nothing.
|
//! does nothing.
|
||||||
virtual void render() _IRR_OVERRIDE_ {}
|
void render() override {}
|
||||||
|
|
||||||
//! Returns type of the scene node
|
//! Returns type of the scene node
|
||||||
virtual ESCENE_NODE_TYPE getType() const _IRR_OVERRIDE_ { return ESNT_DUMMY_TRANSFORMATION; }
|
ESCENE_NODE_TYPE getType() const override { return ESNT_DUMMY_TRANSFORMATION; }
|
||||||
|
|
||||||
//! Creates a clone of this scene node and its children.
|
//! Creates a clone of this scene node and its children.
|
||||||
virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) _IRR_OVERRIDE_;
|
ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) override;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// TODO: We can add least add some warnings to find troubles faster until we have
|
// TODO: We can add least add some warnings to find troubles faster until we have
|
||||||
// fixed bug id 2318691.
|
// fixed bug id 2318691.
|
||||||
virtual const core::vector3df& getScale() const _IRR_OVERRIDE_;
|
const core::vector3df& getScale() const override;
|
||||||
virtual void setScale(const core::vector3df& scale) _IRR_OVERRIDE_;
|
void setScale(const core::vector3df& scale) override;
|
||||||
virtual const core::vector3df& getRotation() const _IRR_OVERRIDE_;
|
const core::vector3df& getRotation() const override;
|
||||||
virtual void setRotation(const core::vector3df& rotation) _IRR_OVERRIDE_;
|
void setRotation(const core::vector3df& rotation) override;
|
||||||
virtual const core::vector3df& getPosition() const _IRR_OVERRIDE_;
|
const core::vector3df& getPosition() const override;
|
||||||
virtual void setPosition(const core::vector3df& newpos) _IRR_OVERRIDE_;
|
void setPosition(const core::vector3df& newpos) override;
|
||||||
|
|
||||||
core::matrix4 RelativeTransformationMatrix;
|
core::matrix4 RelativeTransformationMatrix;
|
||||||
core::aabbox3d<f32> Box;
|
core::aabbox3d<f32> Box;
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
#include "irrArray.h"
|
#include "irrArray.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include <dlfcn.h>
|
|
||||||
|
|
||||||
#if defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_)
|
#if defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_)
|
||||||
#include <android/native_activity.h>
|
#include <android/native_activity.h>
|
||||||
@ -21,7 +20,7 @@ namespace video
|
|||||||
{
|
{
|
||||||
|
|
||||||
CEGLManager::CEGLManager() : IContextManager(), EglWindow(0), EglDisplay(EGL_NO_DISPLAY),
|
CEGLManager::CEGLManager() : IContextManager(), EglWindow(0), EglDisplay(EGL_NO_DISPLAY),
|
||||||
EglSurface(EGL_NO_SURFACE), EglContext(EGL_NO_CONTEXT), EglConfig(0), MajorVersion(0), MinorVersion(0), libHandle(NULL)
|
EglSurface(EGL_NO_SURFACE), EglContext(EGL_NO_CONTEXT), EglConfig(0), MajorVersion(0), MinorVersion(0)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
setDebugName("CEGLManager");
|
setDebugName("CEGLManager");
|
||||||
@ -110,9 +109,6 @@ void CEGLManager::terminate()
|
|||||||
|
|
||||||
MajorVersion = 0;
|
MajorVersion = 0;
|
||||||
MinorVersion = 0;
|
MinorVersion = 0;
|
||||||
|
|
||||||
if (libHandle)
|
|
||||||
dlclose(libHandle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CEGLManager::generateSurface()
|
bool CEGLManager::generateSurface()
|
||||||
@ -596,15 +592,7 @@ const SExposedVideoData& CEGLManager::getContext() const
|
|||||||
|
|
||||||
void* CEGLManager::getProcAddress(const std::string &procName)
|
void* CEGLManager::getProcAddress(const std::string &procName)
|
||||||
{
|
{
|
||||||
void* proc = NULL;
|
return (void*)eglGetProcAddress(procName.c_str());
|
||||||
proc = (void*)eglGetProcAddress(procName.c_str());
|
|
||||||
if (!proc) { // fallback
|
|
||||||
if (!libHandle)
|
|
||||||
libHandle = dlopen("libGLESv2.so", RTLD_LAZY);
|
|
||||||
if (libHandle)
|
|
||||||
proc = dlsym(libHandle, procName.c_str());
|
|
||||||
}
|
|
||||||
return proc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CEGLManager::swapBuffers()
|
bool CEGLManager::swapBuffers()
|
||||||
|
@ -32,42 +32,42 @@ namespace video
|
|||||||
// Initialize EGL.
|
// Initialize EGL.
|
||||||
/* This method initialize EGLand create EGL display, anyway surface and context
|
/* This method initialize EGLand create EGL display, anyway surface and context
|
||||||
aren't create. */
|
aren't create. */
|
||||||
virtual bool initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data) _IRR_OVERRIDE_;
|
bool initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data) override;
|
||||||
|
|
||||||
// Terminate EGL.
|
// Terminate EGL.
|
||||||
/* Terminate EGL context. This method break both existed surface and context. */
|
/* Terminate EGL context. This method break both existed surface and context. */
|
||||||
virtual void terminate() _IRR_OVERRIDE_;
|
void terminate() override;
|
||||||
|
|
||||||
// Create EGL surface.
|
// Create EGL surface.
|
||||||
/* This method create EGL surface. On some platforms eg. Android, we must
|
/* This method create EGL surface. On some platforms eg. Android, we must
|
||||||
recreate surface on each resume, because WindowID may change, so existed
|
recreate surface on each resume, because WindowID may change, so existed
|
||||||
surface may not be valid. If EGL context already exist, this method
|
surface may not be valid. If EGL context already exist, this method
|
||||||
automatically activates it. */
|
automatically activates it. */
|
||||||
virtual bool generateSurface() _IRR_OVERRIDE_;
|
bool generateSurface() override;
|
||||||
|
|
||||||
// Destroy EGL surface.
|
// Destroy EGL surface.
|
||||||
/* This method destroy EGL. On some platforms eg. Android, we should call
|
/* This method destroy EGL. On some platforms eg. Android, we should call
|
||||||
this method on each pause, because after resume this surface may not be valid.
|
this method on each pause, because after resume this surface may not be valid.
|
||||||
Hovewer this method doesn'r break EGL context. */
|
Hovewer this method doesn'r break EGL context. */
|
||||||
virtual void destroySurface() _IRR_OVERRIDE_;
|
void destroySurface() override;
|
||||||
|
|
||||||
// Create EGL context.
|
// Create EGL context.
|
||||||
/* This method create and activate EGL context. */
|
/* This method create and activate EGL context. */
|
||||||
virtual bool generateContext() _IRR_OVERRIDE_;
|
bool generateContext() override;
|
||||||
|
|
||||||
// Destroy EGL context.
|
// Destroy EGL context.
|
||||||
/* This method destroy EGL context. */
|
/* This method destroy EGL context. */
|
||||||
virtual void destroyContext() _IRR_OVERRIDE_;
|
void destroyContext() override;
|
||||||
|
|
||||||
virtual const SExposedVideoData& getContext() const _IRR_OVERRIDE_;
|
const SExposedVideoData& getContext() const override;
|
||||||
|
|
||||||
virtual bool activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero) _IRR_OVERRIDE_;
|
bool activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero) override;
|
||||||
|
|
||||||
// Get procedure address.
|
// Get procedure address.
|
||||||
virtual void* getProcAddress(const std::string &procName) _IRR_OVERRIDE_;
|
void* getProcAddress(const std::string &procName) override;
|
||||||
|
|
||||||
// Swap buffers.
|
// Swap buffers.
|
||||||
virtual bool swapBuffers() _IRR_OVERRIDE_;
|
bool swapBuffers() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum EConfigStyle
|
enum EConfigStyle
|
||||||
@ -111,8 +111,6 @@ namespace video
|
|||||||
|
|
||||||
EGLint MajorVersion;
|
EGLint MajorVersion;
|
||||||
EGLint MinorVersion;
|
EGLint MinorVersion;
|
||||||
|
|
||||||
void* libHandle;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,19 +20,19 @@ namespace scene
|
|||||||
CEmptySceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id);
|
CEmptySceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id);
|
||||||
|
|
||||||
//! returns the axis aligned bounding box of this node
|
//! returns the axis aligned bounding box of this node
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_;
|
const core::aabbox3d<f32>& getBoundingBox() const override;
|
||||||
|
|
||||||
//! This method is called just before the rendering process of the whole scene.
|
//! This method is called just before the rendering process of the whole scene.
|
||||||
virtual void OnRegisterSceneNode() _IRR_OVERRIDE_;
|
void OnRegisterSceneNode() override;
|
||||||
|
|
||||||
//! does nothing.
|
//! does nothing.
|
||||||
virtual void render() _IRR_OVERRIDE_;
|
void render() override;
|
||||||
|
|
||||||
//! Returns type of the scene node
|
//! Returns type of the scene node
|
||||||
virtual ESCENE_NODE_TYPE getType() const _IRR_OVERRIDE_ { return ESNT_EMPTY; }
|
ESCENE_NODE_TYPE getType() const override { return ESNT_EMPTY; }
|
||||||
|
|
||||||
//! Creates a clone of this scene node and its children.
|
//! Creates a clone of this scene node and its children.
|
||||||
virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) _IRR_OVERRIDE_;
|
ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -82,37 +82,37 @@ public:
|
|||||||
\param offset The offset where the file is stored in an archive
|
\param offset The offset where the file is stored in an archive
|
||||||
\param size The size of the file in bytes.
|
\param size The size of the file in bytes.
|
||||||
\param id The ID of the file in the archive which owns it */
|
\param id The ID of the file in the archive which owns it */
|
||||||
virtual u32 addItem(const io::path& fullPath, u32 offset, u32 size, bool isDirectory, u32 id=0) _IRR_OVERRIDE_;
|
u32 addItem(const io::path& fullPath, u32 offset, u32 size, bool isDirectory, u32 id=0) override;
|
||||||
|
|
||||||
//! Sorts the file list. You should call this after adding any items to the file list
|
//! Sorts the file list. You should call this after adding any items to the file list
|
||||||
virtual void sort() _IRR_OVERRIDE_;
|
void sort() override;
|
||||||
|
|
||||||
//! Returns the amount of files in the filelist.
|
//! Returns the amount of files in the filelist.
|
||||||
virtual u32 getFileCount() const _IRR_OVERRIDE_;
|
u32 getFileCount() const override;
|
||||||
|
|
||||||
//! Gets the name of a file in the list, based on an index.
|
//! Gets the name of a file in the list, based on an index.
|
||||||
virtual const io::path& getFileName(u32 index) const _IRR_OVERRIDE_;
|
const io::path& getFileName(u32 index) const override;
|
||||||
|
|
||||||
//! Gets the full name of a file in the list, path included, based on an index.
|
//! Gets the full name of a file in the list, path included, based on an index.
|
||||||
virtual const io::path& getFullFileName(u32 index) const _IRR_OVERRIDE_;
|
const io::path& getFullFileName(u32 index) const override;
|
||||||
|
|
||||||
//! Returns the ID of a file in the file list, based on an index.
|
//! Returns the ID of a file in the file list, based on an index.
|
||||||
virtual u32 getID(u32 index) const _IRR_OVERRIDE_;
|
u32 getID(u32 index) const override;
|
||||||
|
|
||||||
//! Returns true if the file is a directory
|
//! Returns true if the file is a directory
|
||||||
virtual bool isDirectory(u32 index) const _IRR_OVERRIDE_;
|
bool isDirectory(u32 index) const override;
|
||||||
|
|
||||||
//! Returns the size of a file
|
//! Returns the size of a file
|
||||||
virtual u32 getFileSize(u32 index) const _IRR_OVERRIDE_;
|
u32 getFileSize(u32 index) const override;
|
||||||
|
|
||||||
//! Returns the offset of a file
|
//! Returns the offset of a file
|
||||||
virtual u32 getFileOffset(u32 index) const _IRR_OVERRIDE_;
|
u32 getFileOffset(u32 index) const override;
|
||||||
|
|
||||||
//! Searches for a file or folder within the list, returns the index
|
//! Searches for a file or folder within the list, returns the index
|
||||||
virtual s32 findFile(const io::path& filename, bool isFolder) const _IRR_OVERRIDE_;
|
s32 findFile(const io::path& filename, bool isFolder) const override;
|
||||||
|
|
||||||
//! Returns the base path of the file list
|
//! Returns the base path of the file list
|
||||||
virtual const io::path& getPath() const _IRR_OVERRIDE_;
|
const io::path& getPath() const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
#include "IReadFile.h"
|
#include "IReadFile.h"
|
||||||
#include "IWriteFile.h"
|
#include "IWriteFile.h"
|
||||||
#include "CZipReader.h"
|
#include "CZipReader.h"
|
||||||
#include "CMountPointReader.h"
|
|
||||||
#include "CFileList.h"
|
#include "CFileList.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
@ -16,7 +15,7 @@
|
|||||||
#include "CMemoryFile.h"
|
#include "CMemoryFile.h"
|
||||||
#include "CLimitReadFile.h"
|
#include "CLimitReadFile.h"
|
||||||
#include "CWriteFile.h"
|
#include "CWriteFile.h"
|
||||||
#include "irrList.h"
|
#include <list>
|
||||||
|
|
||||||
#if defined (__STRICT_ANSI__)
|
#if defined (__STRICT_ANSI__)
|
||||||
#error Compiling with __STRICT_ANSI__ not supported. g++ does set this when compiling with -std=c++11 or -std=c++0x. Use instead -std=gnu++11 or -std=gnu++0x. Or use -U__STRICT_ANSI__ to disable strict ansi.
|
#error Compiling with __STRICT_ANSI__ not supported. g++ does set this when compiling with -std=c++11 or -std=c++0x. Use instead -std=gnu++11 or -std=gnu++0x. Or use -U__STRICT_ANSI__ to disable strict ansi.
|
||||||
@ -55,26 +54,6 @@ CFileSystem::CFileSystem()
|
|||||||
//! reset current working directory
|
//! reset current working directory
|
||||||
getWorkingDirectory();
|
getWorkingDirectory();
|
||||||
|
|
||||||
#ifdef __IRR_COMPILE_WITH_PAK_ARCHIVE_LOADER_
|
|
||||||
ArchiveLoader.push_back(new CArchiveLoaderPAK(this));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IRR_COMPILE_WITH_NPK_ARCHIVE_LOADER_
|
|
||||||
ArchiveLoader.push_back(new CArchiveLoaderNPK(this));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IRR_COMPILE_WITH_TAR_ARCHIVE_LOADER_
|
|
||||||
ArchiveLoader.push_back(new CArchiveLoaderTAR(this));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IRR_COMPILE_WITH_WAD_ARCHIVE_LOADER_
|
|
||||||
ArchiveLoader.push_back(new CArchiveLoaderWAD(this));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
|
|
||||||
ArchiveLoader.push_back(new CArchiveLoaderMount(this));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_
|
#ifdef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_
|
||||||
ArchiveLoader.push_back(new CArchiveLoaderZIP(this));
|
ArchiveLoader.push_back(new CArchiveLoaderZIP(this));
|
||||||
#endif
|
#endif
|
||||||
@ -219,8 +198,6 @@ bool CFileSystem::addFileArchive(const io::path& filename, bool ignoreCase,
|
|||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
// see if archive is already added
|
// see if archive is already added
|
||||||
if (changeArchivePassword(filename, password, retArchive))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
@ -316,29 +293,6 @@ bool CFileSystem::addFileArchive(const io::path& filename, bool ignoreCase,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't expose!
|
|
||||||
bool CFileSystem::changeArchivePassword(const path& filename,
|
|
||||||
const core::stringc& password,
|
|
||||||
IFileArchive** archive)
|
|
||||||
{
|
|
||||||
for (s32 idx = 0; idx < (s32)FileArchives.size(); ++idx)
|
|
||||||
{
|
|
||||||
// TODO: This should go into a path normalization method
|
|
||||||
// We need to check for directory names with trailing slash and without
|
|
||||||
const path absPath = getAbsolutePath(filename);
|
|
||||||
const path arcPath = FileArchives[idx]->getFileList()->getPath();
|
|
||||||
if ((absPath == arcPath) || ((absPath+_IRR_TEXT("/")) == arcPath))
|
|
||||||
{
|
|
||||||
if (password.size())
|
|
||||||
FileArchives[idx]->Password=password;
|
|
||||||
if (archive)
|
|
||||||
*archive = FileArchives[idx];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CFileSystem::addFileArchive(IReadFile* file, bool ignoreCase,
|
bool CFileSystem::addFileArchive(IReadFile* file, bool ignoreCase,
|
||||||
bool ignorePaths, E_FILE_ARCHIVE_TYPE archiveType,
|
bool ignorePaths, E_FILE_ARCHIVE_TYPE archiveType,
|
||||||
@ -349,9 +303,6 @@ bool CFileSystem::addFileArchive(IReadFile* file, bool ignoreCase,
|
|||||||
|
|
||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
if (changeArchivePassword(file->getFileName(), password, retArchive))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
IFileArchive* archive = 0;
|
IFileArchive* archive = 0;
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
@ -714,11 +665,10 @@ path CFileSystem::getRelativeFilename(const path& filename, const path& director
|
|||||||
io::path path1, file, ext;
|
io::path path1, file, ext;
|
||||||
core::splitFilename(getAbsolutePath(filename), &path1, &file, &ext);
|
core::splitFilename(getAbsolutePath(filename), &path1, &file, &ext);
|
||||||
io::path path2(getAbsolutePath(directory));
|
io::path path2(getAbsolutePath(directory));
|
||||||
core::list<io::path> list1, list2;
|
std::list<io::path> list1, list2;
|
||||||
path1.split(list1, _IRR_TEXT("/\\"), 2);
|
path1.split(list1, _IRR_TEXT("/\\"), 2);
|
||||||
path2.split(list2, _IRR_TEXT("/\\"), 2);
|
path2.split(list2, _IRR_TEXT("/\\"), 2);
|
||||||
u32 i=0;
|
std::list<io::path>::const_iterator it1,it2;
|
||||||
core::list<io::path>::ConstIterator it1,it2;
|
|
||||||
it1=list1.begin();
|
it1=list1.begin();
|
||||||
it2=list2.begin();
|
it2=list2.begin();
|
||||||
|
|
||||||
@ -742,19 +692,19 @@ path CFileSystem::getRelativeFilename(const path& filename, const path& director
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
for (; i<list1.size() && i<list2.size()
|
for (; it1 != list1.end() && it2 != list2.end()
|
||||||
#if defined (_IRR_WINDOWS_API_)
|
#if defined (_IRR_WINDOWS_API_)
|
||||||
&& (io::path(*it1).make_lower()==io::path(*it2).make_lower())
|
&& (io::path(*it1).make_lower()==io::path(*it2).make_lower())
|
||||||
#else
|
#else
|
||||||
&& (*it1==*it2)
|
&& (*it1==*it2)
|
||||||
#endif
|
#endif
|
||||||
; ++i)
|
;)
|
||||||
{
|
{
|
||||||
++it1;
|
++it1;
|
||||||
++it2;
|
++it2;
|
||||||
}
|
}
|
||||||
path1=_IRR_TEXT("");
|
path1=_IRR_TEXT("");
|
||||||
for (; i<list2.size(); ++i)
|
for (; it2 != list2.end(); ++it2)
|
||||||
path1 += _IRR_TEXT("../");
|
path1 += _IRR_TEXT("../");
|
||||||
while (it1 != list1.end())
|
while (it1 != list1.end())
|
||||||
{
|
{
|
||||||
|
@ -14,8 +14,6 @@ namespace io
|
|||||||
{
|
{
|
||||||
|
|
||||||
class CZipReader;
|
class CZipReader;
|
||||||
class CPakReader;
|
|
||||||
class CMountPointReader;
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
FileSystem which uses normal files and one zipfile
|
FileSystem which uses normal files and one zipfile
|
||||||
@ -31,109 +29,104 @@ public:
|
|||||||
virtual ~CFileSystem();
|
virtual ~CFileSystem();
|
||||||
|
|
||||||
//! opens a file for read access
|
//! opens a file for read access
|
||||||
virtual IReadFile* createAndOpenFile(const io::path& filename) _IRR_OVERRIDE_;
|
IReadFile* createAndOpenFile(const io::path& filename) override;
|
||||||
|
|
||||||
//! Creates an IReadFile interface for accessing memory like a file.
|
//! Creates an IReadFile interface for accessing memory like a file.
|
||||||
virtual IReadFile* createMemoryReadFile(const void* memory, s32 len, const io::path& fileName, bool deleteMemoryWhenDropped = false) _IRR_OVERRIDE_;
|
IReadFile* createMemoryReadFile(const void* memory, s32 len, const io::path& fileName, bool deleteMemoryWhenDropped = false) override;
|
||||||
|
|
||||||
//! Creates an IReadFile interface for accessing files inside files
|
//! Creates an IReadFile interface for accessing files inside files
|
||||||
virtual IReadFile* createLimitReadFile(const io::path& fileName, IReadFile* alreadyOpenedFile, long pos, long areaSize) _IRR_OVERRIDE_;
|
IReadFile* createLimitReadFile(const io::path& fileName, IReadFile* alreadyOpenedFile, long pos, long areaSize) override;
|
||||||
|
|
||||||
//! Creates an IWriteFile interface for accessing memory like a file.
|
//! Creates an IWriteFile interface for accessing memory like a file.
|
||||||
virtual IWriteFile* createMemoryWriteFile(void* memory, s32 len, const io::path& fileName, bool deleteMemoryWhenDropped=false) _IRR_OVERRIDE_;
|
IWriteFile* createMemoryWriteFile(void* memory, s32 len, const io::path& fileName, bool deleteMemoryWhenDropped=false) override;
|
||||||
|
|
||||||
//! Opens a file for write access.
|
//! Opens a file for write access.
|
||||||
virtual IWriteFile* createAndWriteFile(const io::path& filename, bool append=false) _IRR_OVERRIDE_;
|
IWriteFile* createAndWriteFile(const io::path& filename, bool append=false) override;
|
||||||
|
|
||||||
//! Adds an archive to the file system.
|
//! Adds an archive to the file system.
|
||||||
virtual bool addFileArchive(const io::path& filename,
|
virtual bool addFileArchive(const io::path& filename,
|
||||||
bool ignoreCase = true, bool ignorePaths = true,
|
bool ignoreCase = true, bool ignorePaths = true,
|
||||||
E_FILE_ARCHIVE_TYPE archiveType = EFAT_UNKNOWN,
|
E_FILE_ARCHIVE_TYPE archiveType = EFAT_UNKNOWN,
|
||||||
const core::stringc& password="",
|
const core::stringc& password="",
|
||||||
IFileArchive** retArchive = 0) _IRR_OVERRIDE_;
|
IFileArchive** retArchive = 0) override;
|
||||||
|
|
||||||
//! Adds an archive to the file system.
|
//! Adds an archive to the file system.
|
||||||
virtual bool addFileArchive(IReadFile* file, bool ignoreCase=true,
|
virtual bool addFileArchive(IReadFile* file, bool ignoreCase=true,
|
||||||
bool ignorePaths=true,
|
bool ignorePaths=true,
|
||||||
E_FILE_ARCHIVE_TYPE archiveType=EFAT_UNKNOWN,
|
E_FILE_ARCHIVE_TYPE archiveType=EFAT_UNKNOWN,
|
||||||
const core::stringc& password="",
|
const core::stringc& password="",
|
||||||
IFileArchive** retArchive = 0) _IRR_OVERRIDE_;
|
IFileArchive** retArchive = 0) override;
|
||||||
|
|
||||||
//! Adds an archive to the file system.
|
//! Adds an archive to the file system.
|
||||||
virtual bool addFileArchive(IFileArchive* archive) _IRR_OVERRIDE_;
|
bool addFileArchive(IFileArchive* archive) override;
|
||||||
|
|
||||||
//! move the hirarchy of the filesystem. moves sourceIndex relative up or down
|
//! move the hirarchy of the filesystem. moves sourceIndex relative up or down
|
||||||
virtual bool moveFileArchive(u32 sourceIndex, s32 relative) _IRR_OVERRIDE_;
|
bool moveFileArchive(u32 sourceIndex, s32 relative) override;
|
||||||
|
|
||||||
//! Adds an external archive loader to the engine.
|
//! Adds an external archive loader to the engine.
|
||||||
virtual void addArchiveLoader(IArchiveLoader* loader) _IRR_OVERRIDE_;
|
void addArchiveLoader(IArchiveLoader* loader) override;
|
||||||
|
|
||||||
//! Returns the total number of archive loaders added.
|
//! Returns the total number of archive loaders added.
|
||||||
virtual u32 getArchiveLoaderCount() const _IRR_OVERRIDE_;
|
u32 getArchiveLoaderCount() const override;
|
||||||
|
|
||||||
//! Gets the archive loader by index.
|
//! Gets the archive loader by index.
|
||||||
virtual IArchiveLoader* getArchiveLoader(u32 index) const _IRR_OVERRIDE_;
|
IArchiveLoader* getArchiveLoader(u32 index) const override;
|
||||||
|
|
||||||
//! gets the file archive count
|
//! gets the file archive count
|
||||||
virtual u32 getFileArchiveCount() const _IRR_OVERRIDE_;
|
u32 getFileArchiveCount() const override;
|
||||||
|
|
||||||
//! gets an archive
|
//! gets an archive
|
||||||
virtual IFileArchive* getFileArchive(u32 index) _IRR_OVERRIDE_;
|
IFileArchive* getFileArchive(u32 index) override;
|
||||||
|
|
||||||
//! removes an archive from the file system.
|
//! removes an archive from the file system.
|
||||||
virtual bool removeFileArchive(u32 index) _IRR_OVERRIDE_;
|
bool removeFileArchive(u32 index) override;
|
||||||
|
|
||||||
//! removes an archive from the file system.
|
//! removes an archive from the file system.
|
||||||
virtual bool removeFileArchive(const io::path& filename) _IRR_OVERRIDE_;
|
bool removeFileArchive(const io::path& filename) override;
|
||||||
|
|
||||||
//! Removes an archive from the file system.
|
//! Removes an archive from the file system.
|
||||||
virtual bool removeFileArchive(const IFileArchive* archive) _IRR_OVERRIDE_;
|
bool removeFileArchive(const IFileArchive* archive) override;
|
||||||
|
|
||||||
//! Returns the string of the current working directory
|
//! Returns the string of the current working directory
|
||||||
virtual const io::path& getWorkingDirectory() _IRR_OVERRIDE_;
|
const io::path& getWorkingDirectory() override;
|
||||||
|
|
||||||
//! Changes the current Working Directory to the string given.
|
//! Changes the current Working Directory to the string given.
|
||||||
//! The string is operating system dependent. Under Windows it will look
|
//! The string is operating system dependent. Under Windows it will look
|
||||||
//! like this: "drive:\directory\sudirectory\"
|
//! like this: "drive:\directory\sudirectory\"
|
||||||
virtual bool changeWorkingDirectoryTo(const io::path& newDirectory) _IRR_OVERRIDE_;
|
bool changeWorkingDirectoryTo(const io::path& newDirectory) override;
|
||||||
|
|
||||||
//! Converts a relative path to an absolute (unique) path, resolving symbolic links
|
//! Converts a relative path to an absolute (unique) path, resolving symbolic links
|
||||||
virtual io::path getAbsolutePath(const io::path& filename) const _IRR_OVERRIDE_;
|
io::path getAbsolutePath(const io::path& filename) const override;
|
||||||
|
|
||||||
//! Returns the directory a file is located in.
|
//! Returns the directory a file is located in.
|
||||||
/** \param filename: The file to get the directory from */
|
/** \param filename: The file to get the directory from */
|
||||||
virtual io::path getFileDir(const io::path& filename) const _IRR_OVERRIDE_;
|
io::path getFileDir(const io::path& filename) const override;
|
||||||
|
|
||||||
//! Returns the base part of a filename, i.e. the name without the directory
|
//! Returns the base part of a filename, i.e. the name without the directory
|
||||||
//! part. If no directory is prefixed, the full name is returned.
|
//! part. If no directory is prefixed, the full name is returned.
|
||||||
/** \param filename: The file to get the basename from */
|
/** \param filename: The file to get the basename from */
|
||||||
virtual io::path getFileBasename(const io::path& filename, bool keepExtension=true) const _IRR_OVERRIDE_;
|
io::path getFileBasename(const io::path& filename, bool keepExtension=true) const override;
|
||||||
|
|
||||||
//! flatten a path and file name for example: "/you/me/../." becomes "/you"
|
//! flatten a path and file name for example: "/you/me/../." becomes "/you"
|
||||||
virtual io::path& flattenFilename( io::path& directory, const io::path& root = "/" ) const _IRR_OVERRIDE_;
|
io::path& flattenFilename( io::path& directory, const io::path& root = "/" ) const override;
|
||||||
|
|
||||||
//! Get the relative filename, relative to the given directory
|
//! Get the relative filename, relative to the given directory
|
||||||
virtual path getRelativeFilename(const path& filename, const path& directory) const _IRR_OVERRIDE_;
|
path getRelativeFilename(const path& filename, const path& directory) const override;
|
||||||
|
|
||||||
virtual EFileSystemType setFileListSystem(EFileSystemType listType) _IRR_OVERRIDE_;
|
EFileSystemType setFileListSystem(EFileSystemType listType) override;
|
||||||
|
|
||||||
//! Creates a list of files and directories in the current working directory
|
//! Creates a list of files and directories in the current working directory
|
||||||
//! and returns it.
|
//! and returns it.
|
||||||
virtual IFileList* createFileList() _IRR_OVERRIDE_;
|
IFileList* createFileList() override;
|
||||||
|
|
||||||
//! Creates an empty filelist
|
//! Creates an empty filelist
|
||||||
virtual IFileList* createEmptyFileList(const io::path& path, bool ignoreCase, bool ignorePaths) _IRR_OVERRIDE_;
|
IFileList* createEmptyFileList(const io::path& path, bool ignoreCase, bool ignorePaths) override;
|
||||||
|
|
||||||
//! determines if a file exists and would be able to be opened.
|
//! determines if a file exists and would be able to be opened.
|
||||||
virtual bool existFile(const io::path& filename) const _IRR_OVERRIDE_;
|
bool existFile(const io::path& filename) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// don't expose, needs refactoring
|
|
||||||
bool changeArchivePassword(const path& filename,
|
|
||||||
const core::stringc& password,
|
|
||||||
IFileArchive** archive = 0);
|
|
||||||
|
|
||||||
//! Currently used FileSystemType
|
//! Currently used FileSystemType
|
||||||
EFileSystemType FileSystemType;
|
EFileSystemType FileSystemType;
|
||||||
//! WorkingDirectory for Native and Virtual filesystems
|
//! WorkingDirectory for Native and Virtual filesystems
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#ifdef _IRR_COMPILE_WITH_GLX_MANAGER_
|
#ifdef _IRR_COMPILE_WITH_GLX_MANAGER_
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include <dlfcn.h>
|
|
||||||
|
|
||||||
#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
|
#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
|
||||||
#define GL_GLEXT_LEGACY 1
|
#define GL_GLEXT_LEGACY 1
|
||||||
@ -29,7 +28,7 @@ namespace video
|
|||||||
{
|
{
|
||||||
|
|
||||||
CGLXManager::CGLXManager(const SIrrlichtCreationParameters& params, const SExposedVideoData& videodata, int screennr)
|
CGLXManager::CGLXManager(const SIrrlichtCreationParameters& params, const SExposedVideoData& videodata, int screennr)
|
||||||
: Params(params), PrimaryContext(videodata), VisualInfo(0), glxFBConfig(0), GlxWin(0), libHandle(NULL)
|
: Params(params), PrimaryContext(videodata), VisualInfo(0), glxFBConfig(0), GlxWin(0)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
setDebugName("CGLXManager");
|
setDebugName("CGLXManager");
|
||||||
@ -280,8 +279,6 @@ bool CGLXManager::initialize(const SIrrlichtCreationParameters& params, const SE
|
|||||||
|
|
||||||
void CGLXManager::terminate()
|
void CGLXManager::terminate()
|
||||||
{
|
{
|
||||||
if (libHandle)
|
|
||||||
dlclose(libHandle);
|
|
||||||
memset((void*)&CurrentContext, 0, sizeof(CurrentContext));
|
memset((void*)&CurrentContext, 0, sizeof(CurrentContext));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -311,6 +308,16 @@ void CGLXManager::destroySurface()
|
|||||||
glXDestroyWindow((Display*)CurrentContext.OpenGLLinux.X11Display, GlxWin);
|
glXDestroyWindow((Display*)CurrentContext.OpenGLLinux.X11Display, GlxWin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(GLX_ARB_create_context)
|
||||||
|
static int IrrIgnoreError(Display *display, XErrorEvent *event)
|
||||||
|
{
|
||||||
|
char msg[256];
|
||||||
|
XGetErrorText(display, event->error_code, msg, 256);
|
||||||
|
os::Printer::log("Ignoring an X error", msg, ELL_DEBUG);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool CGLXManager::generateContext()
|
bool CGLXManager::generateContext()
|
||||||
{
|
{
|
||||||
GLXContext context = 0;
|
GLXContext context = 0;
|
||||||
@ -329,13 +336,16 @@ bool CGLXManager::generateContext()
|
|||||||
|
|
||||||
if (glxCreateContextAttribsARB)
|
if (glxCreateContextAttribsARB)
|
||||||
{
|
{
|
||||||
|
os::Printer::log("GLX with GLX_ARB_create_context", ELL_DEBUG);
|
||||||
int contextAttrBuffer[] = {
|
int contextAttrBuffer[] = {
|
||||||
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
|
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
|
||||||
GLX_CONTEXT_MINOR_VERSION_ARB, 0,
|
GLX_CONTEXT_MINOR_VERSION_ARB, 0,
|
||||||
// GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
|
// GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
XErrorHandler old = XSetErrorHandler(IrrIgnoreError);
|
||||||
context = glxCreateContextAttribsARB((Display*)CurrentContext.OpenGLLinux.X11Display, (GLXFBConfig)glxFBConfig, NULL, True, contextAttrBuffer);
|
context = glxCreateContextAttribsARB((Display*)CurrentContext.OpenGLLinux.X11Display, (GLXFBConfig)glxFBConfig, NULL, True, contextAttrBuffer);
|
||||||
|
XSetErrorHandler(old);
|
||||||
// transparently fall back to legacy call
|
// transparently fall back to legacy call
|
||||||
}
|
}
|
||||||
if (!context)
|
if (!context)
|
||||||
@ -456,15 +466,7 @@ void CGLXManager::destroyContext()
|
|||||||
|
|
||||||
void* CGLXManager::getProcAddress(const std::string &procName)
|
void* CGLXManager::getProcAddress(const std::string &procName)
|
||||||
{
|
{
|
||||||
void* proc = NULL;
|
return (void*)glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(procName.c_str()));
|
||||||
proc = (void*)glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(procName.c_str()));
|
|
||||||
if (!proc) {
|
|
||||||
if (!libHandle)
|
|
||||||
libHandle = dlopen("libGL.so", RTLD_LAZY);
|
|
||||||
if (libHandle)
|
|
||||||
proc = dlsym(libHandle, procName.c_str());
|
|
||||||
}
|
|
||||||
return proc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGLXManager::swapBuffers()
|
bool CGLXManager::swapBuffers()
|
||||||
|
@ -34,34 +34,34 @@ namespace video
|
|||||||
~CGLXManager();
|
~CGLXManager();
|
||||||
|
|
||||||
// Initialize
|
// Initialize
|
||||||
virtual bool initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data) _IRR_OVERRIDE_;
|
bool initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data) override;
|
||||||
|
|
||||||
// Terminate
|
// Terminate
|
||||||
virtual void terminate() _IRR_OVERRIDE_;
|
void terminate() override;
|
||||||
|
|
||||||
// Create surface.
|
// Create surface.
|
||||||
virtual bool generateSurface() _IRR_OVERRIDE_;
|
bool generateSurface() override;
|
||||||
|
|
||||||
// Destroy surface.
|
// Destroy surface.
|
||||||
virtual void destroySurface() _IRR_OVERRIDE_;
|
void destroySurface() override;
|
||||||
|
|
||||||
// Create context.
|
// Create context.
|
||||||
virtual bool generateContext() _IRR_OVERRIDE_;
|
bool generateContext() override;
|
||||||
|
|
||||||
// Destroy context.
|
// Destroy context.
|
||||||
virtual void destroyContext() _IRR_OVERRIDE_;
|
void destroyContext() override;
|
||||||
|
|
||||||
//! Get current context
|
//! Get current context
|
||||||
virtual const SExposedVideoData& getContext() const _IRR_OVERRIDE_;
|
const SExposedVideoData& getContext() const override;
|
||||||
|
|
||||||
//! Change render context, disable old and activate new defined by videoData
|
//! Change render context, disable old and activate new defined by videoData
|
||||||
virtual bool activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero) _IRR_OVERRIDE_;
|
bool activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero) override;
|
||||||
|
|
||||||
// Get procedure address.
|
// Get procedure address.
|
||||||
virtual void* getProcAddress(const std::string &procName) _IRR_OVERRIDE_;
|
void* getProcAddress(const std::string &procName) override;
|
||||||
|
|
||||||
// Swap buffers.
|
// Swap buffers.
|
||||||
virtual bool swapBuffers() _IRR_OVERRIDE_;
|
bool swapBuffers() override;
|
||||||
|
|
||||||
XVisualInfo* getVisual() const {return VisualInfo;} // return XVisualInfo
|
XVisualInfo* getVisual() const {return VisualInfo;} // return XVisualInfo
|
||||||
|
|
||||||
@ -72,7 +72,6 @@ namespace video
|
|||||||
XVisualInfo* VisualInfo;
|
XVisualInfo* VisualInfo;
|
||||||
void* glxFBConfig; // GLXFBConfig
|
void* glxFBConfig; // GLXFBConfig
|
||||||
XID GlxWin; // GLXWindow
|
XID GlxWin; // GLXWindow
|
||||||
void* libHandle; // handle to libGL.so
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,64 +30,64 @@ namespace gui
|
|||||||
virtual ~CGUIButton();
|
virtual ~CGUIButton();
|
||||||
|
|
||||||
//! called if an event happened.
|
//! called if an event happened.
|
||||||
virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_;
|
bool OnEvent(const SEvent& event) override;
|
||||||
|
|
||||||
//! draws the element and its children
|
//! draws the element and its children
|
||||||
virtual void draw() _IRR_OVERRIDE_;
|
void draw() override;
|
||||||
|
|
||||||
//! sets another skin independent font. if this is set to zero, the button uses the font of the skin.
|
//! sets another skin independent font. if this is set to zero, the button uses the font of the skin.
|
||||||
virtual void setOverrideFont(IGUIFont* font=0) _IRR_OVERRIDE_;
|
void setOverrideFont(IGUIFont* font=0) override;
|
||||||
|
|
||||||
//! Gets the override font (if any)
|
//! Gets the override font (if any)
|
||||||
virtual IGUIFont* getOverrideFont() const _IRR_OVERRIDE_;
|
IGUIFont* getOverrideFont() const override;
|
||||||
|
|
||||||
//! Get the font which is used right now for drawing
|
//! Get the font which is used right now for drawing
|
||||||
virtual IGUIFont* getActiveFont() const _IRR_OVERRIDE_;
|
IGUIFont* getActiveFont() const override;
|
||||||
|
|
||||||
//! Sets another color for the button text.
|
//! Sets another color for the button text.
|
||||||
virtual void setOverrideColor(video::SColor color) _IRR_OVERRIDE_;
|
void setOverrideColor(video::SColor color) override;
|
||||||
|
|
||||||
//! Gets the override color
|
//! Gets the override color
|
||||||
virtual video::SColor getOverrideColor(void) const _IRR_OVERRIDE_;
|
video::SColor getOverrideColor(void) const override;
|
||||||
|
|
||||||
//! Gets the currently used text color
|
//! Gets the currently used text color
|
||||||
virtual video::SColor getActiveColor() const _IRR_OVERRIDE_;
|
video::SColor getActiveColor() const override;
|
||||||
|
|
||||||
//! Sets if the button text should use the override color or the color in the gui skin.
|
//! Sets if the button text should use the override color or the color in the gui skin.
|
||||||
virtual void enableOverrideColor(bool enable) _IRR_OVERRIDE_;
|
void enableOverrideColor(bool enable) override;
|
||||||
|
|
||||||
//! Checks if an override color is enabled
|
//! Checks if an override color is enabled
|
||||||
virtual bool isOverrideColorEnabled(void) const _IRR_OVERRIDE_;
|
bool isOverrideColorEnabled(void) const override;
|
||||||
|
|
||||||
//! Sets an image which should be displayed on the button when it is in the given state.
|
//! Sets an image which should be displayed on the button when it is in the given state.
|
||||||
virtual void setImage(EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image=0, const core::rect<s32>& sourceRect=core::rect<s32>(0,0,0,0)) _IRR_OVERRIDE_;
|
void setImage(EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image=0, const core::rect<s32>& sourceRect=core::rect<s32>(0,0,0,0)) override;
|
||||||
|
|
||||||
//! Sets an image which should be displayed on the button when it is in normal state.
|
//! Sets an image which should be displayed on the button when it is in normal state.
|
||||||
virtual void setImage(video::ITexture* image=0) _IRR_OVERRIDE_
|
void setImage(video::ITexture* image=0) override
|
||||||
{
|
{
|
||||||
setImage(EGBIS_IMAGE_UP, image);
|
setImage(EGBIS_IMAGE_UP, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets an image which should be displayed on the button when it is in normal state.
|
//! Sets an image which should be displayed on the button when it is in normal state.
|
||||||
virtual void setImage(video::ITexture* image, const core::rect<s32>& pos) _IRR_OVERRIDE_
|
void setImage(video::ITexture* image, const core::rect<s32>& pos) override
|
||||||
{
|
{
|
||||||
setImage(EGBIS_IMAGE_UP, image, pos);
|
setImage(EGBIS_IMAGE_UP, image, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets an image which should be displayed on the button when it is in pressed state.
|
//! Sets an image which should be displayed on the button when it is in pressed state.
|
||||||
virtual void setPressedImage(video::ITexture* image=0) _IRR_OVERRIDE_
|
void setPressedImage(video::ITexture* image=0) override
|
||||||
{
|
{
|
||||||
setImage(EGBIS_IMAGE_DOWN, image);
|
setImage(EGBIS_IMAGE_DOWN, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets an image which should be displayed on the button when it is in pressed state.
|
//! Sets an image which should be displayed on the button when it is in pressed state.
|
||||||
virtual void setPressedImage(video::ITexture* image, const core::rect<s32>& pos) _IRR_OVERRIDE_
|
void setPressedImage(video::ITexture* image, const core::rect<s32>& pos) override
|
||||||
{
|
{
|
||||||
setImage(EGBIS_IMAGE_DOWN, image, pos);
|
setImage(EGBIS_IMAGE_DOWN, image, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets the sprite bank used by the button
|
//! Sets the sprite bank used by the button
|
||||||
virtual void setSpriteBank(IGUISpriteBank* bank=0) _IRR_OVERRIDE_;
|
void setSpriteBank(IGUISpriteBank* bank=0) override;
|
||||||
|
|
||||||
//! Sets the animated sprite for a specific button state
|
//! Sets the animated sprite for a specific button state
|
||||||
/** \param index: Number of the sprite within the sprite bank, use -1 for no sprite
|
/** \param index: Number of the sprite within the sprite bank, use -1 for no sprite
|
||||||
@ -97,60 +97,60 @@ namespace gui
|
|||||||
*/
|
*/
|
||||||
virtual void setSprite(EGUI_BUTTON_STATE state, s32 index,
|
virtual void setSprite(EGUI_BUTTON_STATE state, s32 index,
|
||||||
video::SColor color=video::SColor(255,255,255,255),
|
video::SColor color=video::SColor(255,255,255,255),
|
||||||
bool loop=false, bool scale=false) _IRR_OVERRIDE_;
|
bool loop=false, bool scale=false) override;
|
||||||
|
|
||||||
//! Get the sprite-index for the given state or -1 when no sprite is set
|
//! Get the sprite-index for the given state or -1 when no sprite is set
|
||||||
virtual s32 getSpriteIndex(EGUI_BUTTON_STATE state) const _IRR_OVERRIDE_;
|
s32 getSpriteIndex(EGUI_BUTTON_STATE state) const override;
|
||||||
|
|
||||||
//! Get the sprite color for the given state. Color is only used when a sprite is set.
|
//! Get the sprite color for the given state. Color is only used when a sprite is set.
|
||||||
virtual video::SColor getSpriteColor(EGUI_BUTTON_STATE state) const _IRR_OVERRIDE_;
|
video::SColor getSpriteColor(EGUI_BUTTON_STATE state) const override;
|
||||||
|
|
||||||
//! Returns if the sprite in the given state does loop
|
//! Returns if the sprite in the given state does loop
|
||||||
virtual bool getSpriteLoop(EGUI_BUTTON_STATE state) const _IRR_OVERRIDE_;
|
bool getSpriteLoop(EGUI_BUTTON_STATE state) const override;
|
||||||
|
|
||||||
//! Returns if the sprite in the given state is scaled
|
//! Returns if the sprite in the given state is scaled
|
||||||
virtual bool getSpriteScale(EGUI_BUTTON_STATE state) const _IRR_OVERRIDE_;
|
bool getSpriteScale(EGUI_BUTTON_STATE state) const override;
|
||||||
|
|
||||||
//! Sets if the button should behave like a push button. Which means it
|
//! Sets if the button should behave like a push button. Which means it
|
||||||
//! can be in two states: Normal or Pressed. With a click on the button,
|
//! can be in two states: Normal or Pressed. With a click on the button,
|
||||||
//! the user can change the state of the button.
|
//! the user can change the state of the button.
|
||||||
virtual void setIsPushButton(bool isPushButton=true) _IRR_OVERRIDE_;
|
void setIsPushButton(bool isPushButton=true) override;
|
||||||
|
|
||||||
//! Checks whether the button is a push button
|
//! Checks whether the button is a push button
|
||||||
virtual bool isPushButton() const _IRR_OVERRIDE_;
|
bool isPushButton() const override;
|
||||||
|
|
||||||
//! Sets the pressed state of the button if this is a pushbutton
|
//! Sets the pressed state of the button if this is a pushbutton
|
||||||
virtual void setPressed(bool pressed=true) _IRR_OVERRIDE_;
|
void setPressed(bool pressed=true) override;
|
||||||
|
|
||||||
//! Returns if the button is currently pressed
|
//! Returns if the button is currently pressed
|
||||||
virtual bool isPressed() const _IRR_OVERRIDE_;
|
bool isPressed() const override;
|
||||||
|
|
||||||
//! Sets if the button should use the skin to draw its border
|
//! Sets if the button should use the skin to draw its border
|
||||||
virtual void setDrawBorder(bool border=true) _IRR_OVERRIDE_;
|
void setDrawBorder(bool border=true) override;
|
||||||
|
|
||||||
//! Checks if the button face and border are being drawn
|
//! Checks if the button face and border are being drawn
|
||||||
virtual bool isDrawingBorder() const _IRR_OVERRIDE_;
|
bool isDrawingBorder() const override;
|
||||||
|
|
||||||
//! Sets if the alpha channel should be used for drawing images on the button (default is false)
|
//! Sets if the alpha channel should be used for drawing images on the button (default is false)
|
||||||
virtual void setUseAlphaChannel(bool useAlphaChannel=true) _IRR_OVERRIDE_;
|
void setUseAlphaChannel(bool useAlphaChannel=true) override;
|
||||||
|
|
||||||
//! Checks if the alpha channel should be used for drawing images on the button
|
//! Checks if the alpha channel should be used for drawing images on the button
|
||||||
virtual bool isAlphaChannelUsed() const _IRR_OVERRIDE_;
|
bool isAlphaChannelUsed() const override;
|
||||||
|
|
||||||
//! Sets if the button should scale the button images to fit
|
//! Sets if the button should scale the button images to fit
|
||||||
virtual void setScaleImage(bool scaleImage=true) _IRR_OVERRIDE_;
|
void setScaleImage(bool scaleImage=true) override;
|
||||||
|
|
||||||
//! Checks whether the button scales the used images
|
//! Checks whether the button scales the used images
|
||||||
virtual bool isScalingImage() const _IRR_OVERRIDE_;
|
bool isScalingImage() const override;
|
||||||
|
|
||||||
//! Get if the shift key was pressed in last EGET_BUTTON_CLICKED event
|
//! Get if the shift key was pressed in last EGET_BUTTON_CLICKED event
|
||||||
virtual bool getClickShiftState() const _IRR_OVERRIDE_
|
bool getClickShiftState() const override
|
||||||
{
|
{
|
||||||
return ClickShiftState;
|
return ClickShiftState;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get if the control key was pressed in last EGET_BUTTON_CLICKED event
|
//! Get if the control key was pressed in last EGET_BUTTON_CLICKED event
|
||||||
virtual bool getClickControlState() const _IRR_OVERRIDE_
|
bool getClickControlState() const override
|
||||||
{
|
{
|
||||||
return ClickControlState;
|
return ClickControlState;
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user