2 Commits
master ... afl

Author SHA1 Message Date
275e152523 v2 2023-09-18 21:47:45 +02:00
4ca90e3dfd afl-fuzz 2023-09-18 15:48:40 +02:00
480 changed files with 112747 additions and 102669 deletions

View File

@ -8,46 +8,47 @@ on:
jobs:
linux-gl:
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
container:
image: ubuntu:bionic
env: { LANG: "C.UTF-8" }
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: Install deps
run: |
sudo apt-get update
sudo apt-get install g++ cmake libxi-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
apt-get update
apt-get install g++ cmake libxi-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
- name: Build
run: |
cmake . -DUSE_SDL2=OFF
cmake .
make VERBOSE=1 -j2
- name: Test
run: |
ctest --output-on-failure
- name: Package
run: |
make DESTDIR=$PWD/_install install
tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local .
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v3
with:
name: irrlicht-linux
path: ./irrlicht-linux.tar.gz
linux-gles:
# Xvfb test is broken on 20.04 for unknown reasons (not our bug)
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
container:
image: ubuntu:bionic
env: { LANG: "C.UTF-8" }
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: Install deps
run: |
sudo apt-get update
sudo apt-get install g++ cmake libxi-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
apt-get update
apt-get install g++ cmake libxi-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
- name: Build
run: |
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=OFF -DENABLE_OPENGL=OFF -DENABLE_GLES2=ON
cmake . -DBUILD_EXAMPLES=1 -DENABLE_OPENGL=OFF -DENABLE_GLES2=ON
make -j2
- name: Test (headless)
@ -61,17 +62,20 @@ jobs:
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest ogles2
linux-sdl:
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
container:
image: ubuntu:jammy
env: { LANG: "C.UTF-8" }
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: Install deps
run: |
sudo apt-get update
sudo apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
apt-get update
apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
- name: Build
run: |
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON -DCMAKE_BUILD_TYPE=Debug
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON
make -j2
- name: Test (headless)
@ -80,14 +84,16 @@ jobs:
./AutomatedTest null
linux-sdl-gl3:
# Xvfb test is broken on 20.04 for unknown reasons (not our bug)
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
container:
image: ubuntu:jammy
env: { LANG: "C.UTF-8" }
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: Install deps
run: |
sudo apt-get update
sudo apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
apt-get update
apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
- name: Build
run: |
@ -105,13 +111,16 @@ jobs:
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest opengl3
linux-sdl-gles2:
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
container:
image: ubuntu:jammy
env: { LANG: "C.UTF-8" }
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: Install deps
run: |
sudo apt-get update
sudo apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
apt-get update
apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
- name: Build
run: |
@ -130,7 +139,7 @@ jobs:
mingw:
name: "MinGW ${{matrix.config.variant}}${{matrix.config.extras}}"
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
@ -140,21 +149,22 @@ jobs:
- {variant: win32, arch: i686, extras: "-sdl"}
- {variant: win64, arch: x86_64, extras: "-sdl"}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: Install compiler
run: |
sudo apt-get update && sudo apt-get install cmake -qyy
./scripts/ci-get-mingw.sh
wget http://minetest.kitsunemimi.pw/mingw-w64-${{matrix.config.arch}}_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz
sudo tar -xaf mingw.tar.xz -C /usr
- name: Build
run: |
./scripts/ci-build-mingw.sh package
env:
CC: ${{matrix.config.arch}}-w64-mingw32-clang
CXX: ${{matrix.config.arch}}-w64-mingw32-clang++
CC: ${{matrix.config.arch}}-w64-mingw32-gcc
CXX: ${{matrix.config.arch}}-w64-mingw32-g++
extras: ${{matrix.config.extras}}
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v3
with:
name: irrlicht-${{matrix.config.variant}}${{matrix.config.extras}}
path: ./irrlicht-${{matrix.config.variant}}${{matrix.config.extras}}.zip
@ -162,14 +172,11 @@ jobs:
macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: Install deps
run: |
brew update --auto-update
brew update
brew install cmake libpng jpeg
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Build
run: |
@ -180,30 +187,13 @@ jobs:
run: |
./bin/OSX/AutomatedTest null
macos-sdl:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install deps
run: |
brew update --auto-update
brew install cmake libpng jpeg sdl2
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Build
run: |
cmake . -DCMAKE_FIND_FRAMEWORK=LAST -DBUILD_EXAMPLES=1 -DUSE_SDL2=1
make -j3
msvc:
name: VS 2019 ${{ matrix.config.arch }} ${{ matrix.sdl.label }}
runs-on: windows-2019
env:
VCPKG_VERSION: 8eb57355a4ffb410a2e94c07b4dca2dffbee8e50
# 2023.10.19
vcpkg_packages: zlib libpng libjpeg-turbo
VCPKG_VERSION: 14e7bb4ae24616ec54ff6b2f6ef4e8659434ea44
# 2022.05.10
vcpkg_packages: zlib libpng libjpeg-turbo opengl-registry
strategy:
fail-fast: false
matrix:
@ -220,7 +210,6 @@ jobs:
-
use: FALSE
label: '(no SDL)'
vcpkg_packages: opengl-registry
-
use: TRUE
label: '(with SDL)'
@ -228,7 +217,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v3
- name: Restore from cache and run vcpkg
uses: lukka/run-vcpkg@v7
@ -261,50 +250,7 @@ jobs:
run: move include artifact/
- name: Upload Artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
with:
name: msvc-${{ matrix.config.arch }}-${{matrix.sdl.use}}
name: msvc-${{ matrix.config.arch }}
path: artifact/
android:
name: Android ${{ matrix.arch }}
runs-on: ubuntu-20.04
env:
ndk_version: "r25c"
ANDROID_NDK: ${{ github.workspace }}/android-ndk
strategy:
matrix:
arch: [armeabi-v7a, arm64-v8a, x86, x86_64]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install deps
run: |
sudo rm /var/lib/man-db/auto-update
sudo apt-get update
sudo apt-get install -qyy wget unzip zip gcc-multilib make cmake
- name: Cache NDK
id: cache-ndk
uses: actions/cache@v4
with:
key: android-ndk-${{ env.ndk_version }}-linux
path: ${{ env.ANDROID_NDK }}
- name: Install NDK
run: |
wget --progress=bar:force "http://dl.google.com/android/repository/android-ndk-${ndk_version}-linux.zip"
unzip -q "android-ndk-${ndk_version}-linux.zip"
rm "android-ndk-${ndk_version}-linux.zip"
mv "android-ndk-${ndk_version}" "${ANDROID_NDK}"
if: ${{ steps.cache-ndk.outputs.cache-hit != 'true' }}
- name: Build
run: ./scripts/ci-build-android.sh ${{ matrix.arch }}
#- name: Upload Artifact
# uses: actions/upload-artifact@v4
# with:
# name: irrlicht-android-${{ matrix.arch }}
# path: ${{ runner.temp }}/pkg/${{ matrix.arch }}

1
.gitignore vendored
View File

@ -5,7 +5,6 @@ install_manifest.txt
IrrlichtMtConfig.cmake
IrrlichtMtConfigVersion.cmake
IrrlichtMtTargets.cmake
CTestTestfile.cmake
Makefile
libs/*
*.so*

View File

@ -1,6 +1,13 @@
cmake_minimum_required(VERSION 3.12)
cmake_minimum_required(VERSION 3.5)
set(IRRLICHTMT_REVISION 15)
# >=3.9 enables IPO; >=3.11 prefers GLVND
if(${CMAKE_VERSION} VERSION_LESS 3.11)
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
else()
cmake_policy(VERSION 3.11)
endif()
set(IRRLICHTMT_REVISION 12)
project(Irrlicht
VERSION 1.9.0.${IRRLICHTMT_REVISION}
@ -9,9 +16,6 @@ project(Irrlicht
message(STATUS "*** Building IrrlichtMt ${PROJECT_VERSION} ***")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(GNUInstallDirs)
if(ANDROID)
@ -34,9 +38,7 @@ if(NOT CMAKE_BUILD_TYPE)
endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
enable_testing()
add_subdirectory(src)
add_subdirectory(test)
add_subdirectory(source/Irrlicht)
option(BUILD_EXAMPLES "Build example applications" FALSE)
if(BUILD_EXAMPLES)

View File

@ -1,11 +1,5 @@
@PACKAGE_INIT@
include(CMakeFindDependencyMacro)
if(NOT TARGET IrrlichtMt::IrrlichtMt)
# private dependency only explicitly needed with static libs
if(@USE_SDL2@ AND NOT @BUILD_SHARED_LIBS@)
find_dependency(SDL2)
endif()
include("${CMAKE_CURRENT_LIST_DIR}/IrrlichtMtTargets.cmake")
endif()

26
LICENSE
View File

@ -1,26 +0,0 @@
Copyright (C) 2002-2012 Nikolaus Gebhardt
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Please note that the Irrlicht Engine is based in part on the work of the
Independent JPEG Group, the zlib, libPng and aesGladman. This means that if you use
the Irrlicht Engine in your product, you must acknowledge somewhere in your
documentation that you've used the IJPG code. It would also be nice to mention
that you use the Irrlicht Engine, the zlib, libPng and aesGladman. See the
corresponding license files for further informations. It is also possible to disable
usage of those additional libraries by defines in the IrrCompileConfig.h header and
recompiling the engine.

1
LICENSE Symbolic link
View File

@ -0,0 +1 @@
doc/irrlicht-license.txt

View File

@ -1,16 +1,9 @@
IrrlichtMt version 1.9
======================
Notice
------
The Irrlicht Engine is an open source realtime 3D engine written in C++.
IrrlichtMt has been moved into the [main Minetest repository](https://github.com/minetest) during Minetest 5.9 development. This repository is an archive useful for building older versions of Minetest.
About
-----
IrrlichtMt is the 3D engine of [Minetest](https://github.com/minetest).
It is based on the [Irrlicht Engine](https://irrlicht.sourceforge.io/) but is now developed independently.
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
@ -23,7 +16,6 @@ The following libraries are required to be installed:
* OpenGL
* or on mobile: OpenGL ES (can be optionally enabled on desktop too)
* on Unix: X11
* SDL2 (see below)
Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the following options are available:
* `BUILD_SHARED_LIBS` (default: `ON`) - Build IrrlichtMt as a shared library
@ -32,7 +24,7 @@ Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the
* `ENABLE_OPENGL3` (default: `OFF`) - Enable OpenGL 3+ driver
* `ENABLE_GLES1` - Enable OpenGL ES driver, legacy
* `ENABLE_GLES2` - Enable OpenGL ES 2+ driver
* `USE_SDL2` (default: platform-dependent, usually `ON`) - Use SDL2 instead of older native device code
* `USE_SDL2` (default: `OFF`) - Use SDL2 instead of native platform device
e.g. on a Linux system you might want to build for local use like this:
@ -49,7 +41,7 @@ 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 sdl2 --triplet x64-windows
vcpkg install zlib libjpeg-turbo libpng opengl-registry --triplet x64-windows
Run the following script in PowerShell:

4
bin/Linux/readme.txt Normal file
View File

@ -0,0 +1,4 @@
If you wish to compile the engine in linux yourself,
goto the \source directory. Run a 'make' in the subfolder 'Irrlicht'.
After this, you should be able to make all example applications in \examples.
Then just start an X Server and run them, from the directory where they are.

1
bin/OSX/readme.txt Normal file
View File

@ -0,0 +1 @@
If you want to compile only the Irrlicht Engine you should use XCode project available at source/Irrlicht/ directory. You can also use examples/BuildAllExamples.xcworkspace file to build the Irrlicht Engine + all examples.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,25 @@
The Win32-VisualStudio version is currently (Irrlicht 1.8) compiled with VS 2010 using the Windows 7.1 SDK as platform toolset.
You might get the necessary Windows Platform SDK here: http://msdn.microsoft.com/en-us/windows/bb980924.aspx
To link to that Irrlicht.dll you need to set platform toolset in your VS version to the same target or re-compile the Irrlicht.dll using another platform toolset.
To re-compile Irrlicht for Win32-VisualStudio:
There are several project files for different VS versions in source/Irrlicht.
Irrlicht10.0.sln is for VS 2010
Irrlicht11.0.sln is for VS 2012
Irrlicht12.0.sln is for VS 2013
To compile Irrlicht + all examples and all tools check the BuildAllExamples_*.sln files in the examples folder.
For newer VS versions you have update one of those projects (VS usually can do that automatically when you open an older solution file).
Currently each of those solutions does set the platform toolset "Windows 7.1 SDK" (to be compatible to each other).
You might want to change that in the project settings and set it to your current version.
Make sure you use the same platform toolset in your application and in the engine.
Also when compiling examples each example has to use the same platform toolset as was used for the engine.
Platform should be Win32
Configuration is by default "Release"
But you can also chose "Debug" if you want Irrlicht with Debug information.
Static builds are possible but you have to additionally set the _IRR_STATIC_LIB_ define in the application when linking to a static Irrlicht.lib

BIN
bin/Win32-gcc/irrlicht.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

16
bin/Win32-gcc/readme.txt Normal file
View File

@ -0,0 +1,16 @@
If you wish to compile Irrlicht for Win32-gcc you have several choices.
1. You can work from within a MinGW shell.
Go to the folder source/Irrlicht and run the Makefile with:
make win32
Examples can be build by going into the folder of the example (for example examples/01.HelloWorld) and running the Makefile with:
make all_win32
2. Use the Code::Blocks IDE
There is a project file called Irrlicht-gcc.cbp in source/Irrlicht to compile just the engine.
Be sure to select a Windows target like "Win32 - release - accurate math - dll"
There is also Code::Blocks workspace file in the examples folder called BuildAllExamples.workspace
Again be sure to select a Windows target like "Win32 - release - accurate math - dll"
This workspace allows you to compile the engine together with all examples and tools.

View File

@ -0,0 +1 @@
If you wish to compile Irrlicht for emscripten please check the documenation in examples/01.HelloWorld_emscripten.

27
build.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/bash -e
args=(-DBUILD_EXAMPLES=ON -DENABLE_OPENGL=OFF -DBUILD_SHARED_LIBS=OFF)
export CC=afl-clang-fast
export CXX=afl-clang-fast++
export LD=$CXX
unset AFL_USE_ASAN
if ! grep -Fq '/afl-' build2/CMakeCache.txt; then
rm -rf build2
cmake -S . -B build2 "${args[@]}"
fi
nice make -C build2 clean
nice make -C build2 -j10
for f in build2/bin/Linux/*; do
ln -snfv "../../$f" "bin/Linux/${f##*/}_noasan"
done
export CC=afl-clang-lto
export CXX=afl-clang-lto++
export LD=$CXX
export AFL_USE_ASAN=1
if ! grep -Fq '/afl-' CMakeCache.txt; then
rm -f CMakeCache.txt
cmake . "${args[@]}"
fi
nice make clean
nice make -j10

26
doc/irrlicht-license.txt Normal file
View File

@ -0,0 +1,26 @@
Copyright (C) 2002-2012 Nikolaus Gebhardt
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Please note that the Irrlicht Engine is based in part on the work of the
Independent JPEG Group, the zlib, libPng and aesGladman. This means that if you use
the Irrlicht Engine in your product, you must acknowledge somewhere in your
documentation that you've used the IJPG code. It would also be nice to mention
that you use the Irrlicht Engine, the zlib, libPng and aesGladman. See the
corresponding license files for further informations. It is also possible to disable
usage of those additional libraries by defines in the IrrCompileConfig.h header and
recompiling the engine.

63
doc/release_checklist.txt Normal file
View File

@ -0,0 +1,63 @@
Checklist for Irrlicht developers doing releases.
Note: Generally the more platforms, compilers, settings you can test the better. Ask for help for platforms which you don't own.
- PRE-BUILD TESTS:
- - Run tests in the tests folder
- - Compile and run examples.
- - Compile and run the tools. Note that some tools are in the buildall-examples VS project files on Windows,
but on Linux command line you have to compile them individually.
- VERSION UPDATES:
- - check IRRLICHT_SDK_VERSION (in IrrCompileConfig.h)
- - check version number in the Makefile
- - update readme.txt (version number, supported compilers)
- - Add new release information (date+version-number) in changes.txt
- - go through folders if other .txt files still make sense (things change and updating those files tends to be forgotten)
- DOCUMENTATION UPDATES:
- - run makedocumentation.sh in scripts\doc\irrlicht
- - run maketutorial.sh in scripts\doc\irrlicht (commit changed tutorial.html's)
- BUILDING THE RELEASE
(TBD - should we still release dll's? Newer and older VS builds are no longer compatible anyway)
- - run a clean build for buildAllExamples in the examples folder with the
target compiler for 32-bit and for release (old VS compiler - so far VS2010)
- - when possible compile the dll for MinGW on Windows (in release and with -s for smaller size)
- - when possible compile the dll for 64 bit (again with Visual Studio and release)
- - create a target directory, like irrlicht-1.8.1 for example
- - svn export to the target directory
- - copy the subfolders of doctemp into the doc folder of the target directory
careful, this should only be one(!) subfolder (we ended up with copies before, maybe Windows/Linux builds use different names?)
- - copy all .exe files (except test.exe) from bin\Win32-VisualStudio (.pdb's are not necessary)
- - copy Irrlicht.dll from bin\Win32-visualstudio
- - copy the files in lib\Win32-visualstudio
- - copy Irrlicht.dll from bin\Win64-VisualStudio
- - copy the files in lib\Win64-visualstudio
- - copy Irrlicht.dll from bin\Win32-gcc
- - copy the files in lib\Win32-gcc
- - remove the tests folder
- - remove scripts folder (if the release comes with docs, if you do a release
without docs for smaller filesizes then the script folder has to stay in).
- - create a zip file
- - figure out how to fix unix access right for shell-scripts in the zip file (my
trick so far is: unzip in Linux, set +x for all .sh files, zip again)
RELEASING:
- - upload the zip-file somewhere, then download it again on all platforms and do
another quick test with that file (do examples still run, can you compile)
- - give the link to the zip out on the mailinglist for others to look at
- - Upload new documentation (the content of doc/html) to: web.sourceforge.net
(sftp protocol, user and passwd are your sourceforge account, the folder
might not be shown - but you can still cd into it!):
/home/project-web/i/ir/irrlicht/htdocs
Best create first a folder with a new name, copy stuff in there, test (just
check the website), rename old folder and give new folder the "docu" name.
Then you can delete the old folder if you want.
- - upload the zip by logging in to sourceforge and using the "Files" menu (needs
admin privileges and it's the 'Files' menu between 'Summary' and 'Reviews').
The target is in one of the Irrlicht SDK subfolders. Then click the "i" beside
the file and "select all" to make it the active download.
- - write a forum post, tell everyone in facebook, reddit, your friends...
- - login to wordpress at http://irrlicht.sourceforge.net/wp-login.php, update the
downloads section and write a release post.

2891
doc/upgrade-guide.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -28,14 +28,14 @@ static video::E_DRIVER_TYPE chooseDriver(core::stringc arg_)
static inline void check(bool ok, const char *msg)
{
if (!ok) {
if (!ok)
{
test_fail++;
device->getLogger()->log((core::stringc("FAILED TEST: ") + msg).c_str(), ELL_ERROR);
}
}
void run_unit_tests()
{
void run_unit_tests() {
std::cout << "Running unit tests:" << std::endl;
try {
test_irr_array();
@ -93,11 +93,13 @@ int main(int argc, char *argv[])
check(mesh, "mesh loading");
if (mesh_file)
mesh_file->drop();
if (mesh) {
if (mesh)
{
video::ITexture* tex = driver->getTexture(mediaPath + "cooltexture.png");
check(tex, "texture loading");
scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
if (node) {
if (node)
{
node->forEachMaterial([tex] (video::SMaterial &mat) {
mat.Lighting = false;
mat.setTexture(0, tex);
@ -113,20 +115,25 @@ int main(int argc, char *argv[])
SEvent event;
device->getTimer()->start();
while (device->run()) {
if (device->getTimer()->getTime() >= 1000) {
while (device->run())
{
if (device->getTimer()->getTime() >= 1000)
{
device->getTimer()->setTime(0);
++n;
if (n == 1) { // Tooltip display
if (n == 1) // Tooltip display
{
bzero(&event, sizeof(SEvent));
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
event.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
event.MouseInput.X = button->getAbsolutePosition().getCenter().X;
event.MouseInput.Y = button->getAbsolutePosition().getCenter().Y;
device->postEventFromUser(event);
} else if (n == 2) // Text input focus
}
else if (n == 2) // Text input focus
guienv->setFocus(editbox);
else if (n == 3) { // Keypress for Text input
else if (n == 3) // Keypress for Text input
{
bzero(&event, sizeof(SEvent));
event.EventType = irr::EET_KEY_INPUT_EVENT;
event.KeyInput.Char = L'a';
@ -135,7 +142,8 @@ int main(int argc, char *argv[])
device->postEventFromUser(event);
event.KeyInput.PressedDown = false;
device->postEventFromUser(event);
} else
}
else
device->closeDevice();
}

View File

@ -4,8 +4,7 @@
using namespace irr;
using core::array;
static void test_basics()
{
static void test_basics() {
array<int> v;
v.push_back(1); // 1
v.push_front(2); // 2, 1
@ -58,8 +57,7 @@ static void test_basics()
UASSERTEQ(v.size(), 2);
}
static void test_linear_searches()
{
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++)
@ -77,8 +75,7 @@ static void test_linear_searches()
}
}
static void test_binary_searches()
{
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) {

View File

@ -3,13 +3,11 @@
#include <exception>
#include <iostream>
class TestFailedException : public std::exception
{
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 { \
#define UASSERTCMP(CMP, actual, expected) do { \
const auto &a = (actual); \
const auto &e = (expected); \
if (!CMP(a, e)) { \
@ -17,8 +15,7 @@ class TestFailedException : public std::exception
<< "Test assertion failed: " << #actual << " " << #CMP << " " \
<< #expected << std::endl \
<< " at " << __FILE__ << ":" << __LINE__ << std::endl \
<< " actual: " << a << std::endl \
<< " expected: " \
<< " actual: " << a << std::endl << " expected: " \
<< e << std::endl; \
throw TestFailedException(); \
} \

View File

@ -168,32 +168,22 @@ static void test_methods()
static void test_conv()
{
// locale-independent
// assumes Unicode and UTF-8 locale
setlocale(LC_CTYPE, "");
stringw out;
utf8ToWString(out, "†††");
multibyteToWString(out, "†††");
UASSERTEQ(out.size(), 3);
for (int i = 0; i < 3; i++)
UASSERTEQ(static_cast<u16>(out[i]), 0x2020);
stringc out2;
wStringToUTF8(out2, L"†††");
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);
}
// locale-dependent
if (!setlocale(LC_CTYPE, "C.UTF-8"))
setlocale(LC_CTYPE, "UTF-8"); // macOS
stringw out3;
multibyteToWString(out3, "†††");
UASSERTEQ(out3.size(), 3);
for (int i = 0; i < 3; i++)
UASSERTEQ(static_cast<u16>(out3[i]), 0x2020);
}
void test_irr_string()

View File

@ -1,7 +1,11 @@
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(IRREXAMPLES
# removed
LoadTexture
LoadMesh
)
if(UNIX)
if(FALSE)
list(APPEND IRREXAMPLES AutomatedTest)
endif()

View File

@ -0,0 +1,44 @@
#include <irrlicht.h>
#include <iostream>
using namespace irr;
int main(int argc, char *argv[])
{
if (argc < 2)
return 1;
SIrrlichtCreationParameters p;
p.DriverType = video::EDT_NULL;
p.WindowSize = core::dimension2du(640, 480);
p.LoggingLevel = ELL_DEBUG;
auto *device = createDeviceEx(p);
if (!device)
return 1;
auto *smgr = device->getSceneManager();
while (__AFL_LOOP(10000)) {
auto *mfile = device->getFileSystem()->createAndOpenFile(argv[1]);
if (!mfile)
continue;
scene::IAnimatedMesh *mesh;
// Irrlicht matches on file extension so we have to do this by hand
for (u32 i = 0; i < smgr->getMeshLoaderCount(); i++) {
mfile->seek(0);
mesh = smgr->getMeshLoader(i)->createMesh(mfile);
if (mesh) {
core::stringc msg("Loaded using loader #");
msg += core::stringc(i);
device->getLogger()->log(msg.c_str(), ELL_DEBUG);
break;
}
}
if (mesh)
mesh->drop();
mfile->drop();
}
device->drop();
return 0;
}

View File

@ -0,0 +1,29 @@
#include <irrlicht.h>
#include <iostream>
using namespace irr;
int main(int argc, char *argv[])
{
if (argc < 2)
return 1;
SIrrlichtCreationParameters p;
p.DriverType = video::EDT_NULL;
p.WindowSize = core::dimension2du(640, 480);
p.LoggingLevel = ELL_DEBUG;
auto *device = createDeviceEx(p);
if (!device)
return 1;
auto *driver = device->getVideoDriver();
while (__AFL_LOOP(10000)) {
auto *tex = driver->getTexture(argv[1]);
if (tex)
driver->removeTexture(tex);
}
device->drop();
return 0;
}

226
include/CIndexBuffer.h Normal file
View File

@ -0,0 +1,226 @@
// Copyright (C) 2008-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __C_INDEX_BUFFER_H_INCLUDED__
#define __C_INDEX_BUFFER_H_INCLUDED__
#include "IIndexBuffer.h"
namespace irr
{
namespace scene
{
class CIndexBuffer : public IIndexBuffer
{
class IIndexList
{
public:
virtual ~IIndexList(){};
virtual u32 stride() const =0;
virtual u32 size() const =0;
virtual void push_back(const u32 &element) =0;
virtual u32 operator [](u32 index) const =0;
virtual u32 getLast() =0;
virtual void setValue(u32 index, u32 value) =0;
virtual void set_used(u32 usedNow) =0;
virtual void reallocate(u32 new_size) =0;
virtual u32 allocated_size() const =0;
virtual void* pointer() =0;
virtual video::E_INDEX_TYPE getType() const =0;
};
template <class T>
class CSpecificIndexList : public IIndexList
{
public:
core::array<T> Indices;
u32 stride() const override {return sizeof(T);}
u32 size() const override {return Indices.size();}
void push_back(const u32 &element) override
{
// push const ref due to compiler problem with gcc 4.6, big endian
Indices.push_back((const T&)element);
}
u32 operator [](u32 index) const override
{
return (u32)(Indices[index]);
}
u32 getLast() override {return (u32)Indices.getLast();}
void setValue(u32 index, u32 value) override
{
Indices[index]=(T)value;
}
void set_used(u32 usedNow) override
{
Indices.set_used(usedNow);
}
void reallocate(u32 new_size) override
{
Indices.reallocate(new_size);
}
u32 allocated_size() const override
{
return Indices.allocated_size();
}
void* pointer() override {return Indices.pointer();}
video::E_INDEX_TYPE getType() const override
{
if (sizeof(T)==sizeof(u16))
return video::EIT_16BIT;
else
return video::EIT_32BIT;
}
};
public:
IIndexList *Indices;
CIndexBuffer(video::E_INDEX_TYPE IndexType) :Indices(0), MappingHint(EHM_NEVER), ChangedID(1)
{
setType(IndexType);
}
CIndexBuffer(const IIndexBuffer &IndexBufferCopy) :Indices(0), MappingHint(EHM_NEVER), ChangedID(1)
{
setType(IndexBufferCopy.getType());
reallocate(IndexBufferCopy.size());
for (u32 n=0;n<IndexBufferCopy.size();++n)
push_back(IndexBufferCopy[n]);
}
virtual ~CIndexBuffer()
{
delete Indices;
}
//virtual void setType(video::E_INDEX_TYPE IndexType);
void setType(video::E_INDEX_TYPE IndexType) override
{
IIndexList *NewIndices=0;
switch (IndexType)
{
case video::EIT_16BIT:
{
NewIndices=new CSpecificIndexList<u16>;
break;
}
case video::EIT_32BIT:
{
NewIndices=new CSpecificIndexList<u32>;
break;
}
}
if (Indices)
{
NewIndices->reallocate( Indices->size() );
for(u32 n=0;n<Indices->size();++n)
NewIndices->push_back((*Indices)[n]);
delete Indices;
}
Indices=NewIndices;
}
void* getData() override {return Indices->pointer();}
video::E_INDEX_TYPE getType() const override {return Indices->getType();}
u32 stride() const override {return Indices->stride();}
u32 size() const override
{
return Indices->size();
}
void push_back(const u32 &element) override
{
Indices->push_back(element);
}
u32 operator [](u32 index) const override
{
return (*Indices)[index];
}
u32 getLast() override
{
return Indices->getLast();
}
void setValue(u32 index, u32 value) override
{
Indices->setValue(index, value);
}
void set_used(u32 usedNow) override
{
Indices->set_used(usedNow);
}
void reallocate(u32 new_size) override
{
Indices->reallocate(new_size);
}
u32 allocated_size() const override
{
return Indices->allocated_size();
}
void* pointer() override
{
return Indices->pointer();
}
//! get the current hardware mapping hint
E_HARDWARE_MAPPING getHardwareMappingHint() const override
{
return MappingHint;
}
//! set the hardware mapping hint, for driver
void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) override
{
MappingHint=NewMappingHint;
}
//! flags the mesh as changed, reloads hardware buffers
void setDirty() override
{
++ChangedID;
}
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
u32 getChangedID() const override {return ChangedID;}
E_HARDWARE_MAPPING MappingHint;
u32 ChangedID;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __T_MESH_BUFFER_H_INCLUDED__
#define __T_MESH_BUFFER_H_INCLUDED__
#include "irrArray.h"
#include "IMeshBuffer.h"
@ -17,14 +18,18 @@ class CMeshBuffer : public IMeshBuffer
{
public:
//! Default constructor for empty meshbuffer
CMeshBuffer() :
ChangedID_Vertex(1), ChangedID_Index(1), MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER), HWBuffer(NULL), PrimitiveType(EPT_TRIANGLES)
CMeshBuffer()
: ChangedID_Vertex(1), ChangedID_Index(1)
, MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)
, HWBuffer(NULL)
, PrimitiveType(EPT_TRIANGLES)
{
#ifdef _DEBUG
setDebugName("CMeshBuffer");
#endif
}
//! Get material of this meshbuffer
/** \return Material of this buffer */
const video::SMaterial& getMaterial() const override
@ -32,6 +37,7 @@ public:
return Material;
}
//! Get material of this meshbuffer
/** \return Material of this buffer */
video::SMaterial& getMaterial() override
@ -39,6 +45,7 @@ public:
return Material;
}
//! Get pointer to vertices
/** \return Pointer to vertices. */
const void* getVertices() const override
@ -46,6 +53,7 @@ public:
return Vertices.const_pointer();
}
//! Get pointer to vertices
/** \return Pointer to vertices. */
void* getVertices() override
@ -53,6 +61,7 @@ public:
return Vertices.pointer();
}
//! Get number of vertices
/** \return Number of vertices. */
u32 getVertexCount() const override
@ -74,6 +83,7 @@ public:
return Indices.const_pointer();
}
//! Get pointer to indices
/** \return Pointer to indices. */
u16* getIndices() override
@ -81,6 +91,7 @@ public:
return Indices.pointer();
}
//! Get number of indices
/** \return Number of indices. */
u32 getIndexCount() const override
@ -88,6 +99,7 @@ public:
return Indices.size();
}
//! Get the axis aligned bounding box
/** \return Axis aligned bounding box of this buffer. */
const core::aabbox3d<f32>& getBoundingBox() const override
@ -95,6 +107,7 @@ public:
return BoundingBox;
}
//! Set the axis aligned bounding box
/** \param box New axis aligned bounding box for this buffer. */
//! set user axis aligned bounding box
@ -103,18 +116,23 @@ public:
BoundingBox = box;
}
//! Recalculate the bounding box.
/** should be called if the mesh changed. */
void recalculateBoundingBox() override
{
if (!Vertices.empty()) {
if (!Vertices.empty())
{
BoundingBox.reset(Vertices[0].Pos);
const irr::u32 vsize = Vertices.size();
for (u32 i=1; i<vsize; ++i)
BoundingBox.addInternalPoint(Vertices[i].Pos);
} else
BoundingBox.reset(0, 0, 0);
}
else
BoundingBox.reset(0,0,0);
}
//! Get type of vertex data stored in this buffer.
/** \return Type of vertex data. */
@ -159,6 +177,7 @@ public:
return Vertices[i].TCoords;
}
//! Append the vertices and indices to the current buffer
/** Only works for compatible types, i.e. either the same type
or the main buffer is of standard type. Otherwise, behavior is
@ -173,17 +192,51 @@ public:
u32 i;
Vertices.reallocate(vertexCount+numVertices);
for (i = 0; i < numVertices; ++i) {
for (i=0; i<numVertices; ++i)
{
Vertices.push_back(static_cast<const T*>(vertices)[i]);
BoundingBox.addInternalPoint(static_cast<const T*>(vertices)[i].Pos);
}
Indices.reallocate(getIndexCount()+numIndices);
for (i = 0; i < numIndices; ++i) {
for (i=0; i<numIndices; ++i)
{
Indices.push_back(indices[i]+vertexCount);
}
}
//! Append the meshbuffer to the current buffer
/** Only works for compatible types, i.e. either the same type
or the main buffer is of standard type. Otherwise, behavior is
undefined.
\param other Meshbuffer to be appended to this one.
*/
void append(const IMeshBuffer* const other) override
{
/*
if (this==other)
return;
const u32 vertexCount = getVertexCount();
u32 i;
Vertices.reallocate(vertexCount+other->getVertexCount());
for (i=0; i<other->getVertexCount(); ++i)
{
Vertices.push_back(reinterpret_cast<const T*>(other->getVertices())[i]);
}
Indices.reallocate(getIndexCount()+other->getIndexCount());
for (i=0; i<other->getIndexCount(); ++i)
{
Indices.push_back(other->getIndices()[i]+vertexCount);
}
BoundingBox.addInternalBox(other->getBoundingBox());
*/
}
//! get the current hardware mapping hint
E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const override
{
@ -234,16 +287,15 @@ public:
/** This shouldn't be used for anything outside the VideoDriver. */
u32 getChangedID_Index() const override {return ChangedID_Index;}
void setHWBuffer(void *ptr) const override
{
void setHWBuffer(void *ptr) const override {
HWBuffer = ptr;
}
void *getHWBuffer() const override
{
void *getHWBuffer() const override {
return HWBuffer;
}
u32 ChangedID_Vertex;
u32 ChangedID_Index;
@ -272,3 +324,7 @@ typedef CMeshBuffer<video::S3DVertex2TCoords> SMeshBufferLightMap;
typedef CMeshBuffer<video::S3DVertexTangents> SMeshBufferTangents;
} // end namespace scene
} // end namespace irr
#endif

213
include/CVertexBuffer.h Normal file
View File

@ -0,0 +1,213 @@
// Copyright (C) 2008-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __C_VERTEX_BUFFER_H_INCLUDED__
#define __C_VERTEX_BUFFER_H_INCLUDED__
#include "IVertexBuffer.h"
namespace irr
{
namespace scene
{
class CVertexBuffer : public IVertexBuffer
{
class IVertexList
{
public:
virtual ~IVertexList(){};
virtual u32 stride() const =0;
virtual u32 size() const =0;
virtual void push_back (const video::S3DVertex &element) =0;
virtual video::S3DVertex& operator [](const u32 index) const =0;
virtual video::S3DVertex& getLast() =0;
virtual void set_used(u32 usedNow) =0;
virtual void reallocate(u32 new_size) =0;
virtual u32 allocated_size() const =0;
virtual video::S3DVertex* pointer() =0;
virtual video::E_VERTEX_TYPE getType() const =0;
};
template <class T>
class CSpecificVertexList : public IVertexList
{
public:
core::array<T> Vertices;
u32 stride() const override {return sizeof(T);}
u32 size() const override {return Vertices.size();}
void push_back (const video::S3DVertex &element) override
{Vertices.push_back((T&)element);}
video::S3DVertex& operator [](const u32 index) const override
{return (video::S3DVertex&)Vertices[index];}
video::S3DVertex& getLast() override
{return (video::S3DVertex&)Vertices.getLast();}
void set_used(u32 usedNow) override
{Vertices.set_used(usedNow);}
void reallocate(u32 new_size) override
{Vertices.reallocate(new_size);}
u32 allocated_size() const override
{
return Vertices.allocated_size();
}
video::S3DVertex* pointer() override {return Vertices.pointer();}
video::E_VERTEX_TYPE getType() const override {return T::getType();}
};
public:
IVertexList *Vertices;
CVertexBuffer(video::E_VERTEX_TYPE vertexType) : Vertices(0),
MappingHint(EHM_NEVER), ChangedID(1)
{
CVertexBuffer::setType(vertexType);
}
CVertexBuffer(const IVertexBuffer &VertexBufferCopy) :
Vertices(0), MappingHint(EHM_NEVER),
ChangedID(1)
{
CVertexBuffer::setType(VertexBufferCopy.getType());
CVertexBuffer::reallocate(VertexBufferCopy.size());
for (u32 n=0;n<VertexBufferCopy.size();++n)
CVertexBuffer::push_back(VertexBufferCopy[n]);
}
virtual ~CVertexBuffer()
{
delete Vertices;
}
void setType(video::E_VERTEX_TYPE vertexType) override
{
if ( Vertices && Vertices->getType() == vertexType )
return;
IVertexList *NewVertices=0;
switch (vertexType)
{
case video::EVT_STANDARD:
{
NewVertices=new CSpecificVertexList<video::S3DVertex>;
break;
}
case video::EVT_2TCOORDS:
{
NewVertices=new CSpecificVertexList<video::S3DVertex2TCoords>;
break;
}
case video::EVT_TANGENTS:
{
NewVertices=new CSpecificVertexList<video::S3DVertexTangents>;
break;
}
}
if (Vertices)
{
NewVertices->reallocate( Vertices->size() );
for(u32 n=0;n<Vertices->size();++n)
NewVertices->push_back((*Vertices)[n]);
delete Vertices;
}
Vertices=NewVertices;
}
void* getData() override {return Vertices->pointer();}
video::E_VERTEX_TYPE getType() const override {return Vertices->getType();}
u32 stride() const override {return Vertices->stride();}
u32 size() const override
{
return Vertices->size();
}
void push_back (const video::S3DVertex &element) override
{
Vertices->push_back(element);
}
video::S3DVertex& operator [](const u32 index) const override
{
return (*Vertices)[index];
}
video::S3DVertex& getLast() override
{
return Vertices->getLast();
}
void set_used(u32 usedNow) override
{
Vertices->set_used(usedNow);
}
void reallocate(u32 new_size) override
{
Vertices->reallocate(new_size);
}
u32 allocated_size() const override
{
return Vertices->allocated_size();
}
video::S3DVertex* pointer() override
{
return Vertices->pointer();
}
//! get the current hardware mapping hint
E_HARDWARE_MAPPING getHardwareMappingHint() const override
{
return MappingHint;
}
//! set the hardware mapping hint, for driver
void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) override
{
MappingHint=NewMappingHint;
}
//! flags the mesh as changed, reloads hardware buffers
void setDirty() override
{
++ChangedID;
}
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
u32 getChangedID() const override {return ChangedID;}
E_HARDWARE_MAPPING MappingHint;
u32 ChangedID;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_ATTRIBUTES_H_INCLUDED__
#define __E_ATTRIBUTES_H_INCLUDED__
namespace irr
{
@ -18,9 +19,75 @@ enum E_ATTRIBUTE_TYPE
// float attribute
EAT_FLOAT,
// string attribute
EAT_STRING,
// boolean attribute
EAT_BOOL,
// enumeration attribute
EAT_ENUM,
// color attribute
EAT_COLOR,
// floating point color attribute
EAT_COLORF,
// 3d vector attribute
EAT_VECTOR3D,
// 2d position attribute
EAT_POSITION2D,
// vector 2d attribute
EAT_VECTOR2D,
// rectangle attribute
EAT_RECT,
// matrix attribute
EAT_MATRIX,
// quaternion attribute
EAT_QUATERNION,
// 3d bounding box
EAT_BBOX,
// plane
EAT_PLANE,
// 3d triangle
EAT_TRIANGLE3D,
// line 2d
EAT_LINE2D,
// line 3d
EAT_LINE3D,
// array of stringws attribute
EAT_STRINGWARRAY,
// array of float
EAT_FLOATARRAY,
// array of int
EAT_INTARRAY,
// binary data attribute
EAT_BINARY,
// texture reference attribute
EAT_TEXTURE,
// user pointer void*
EAT_USER_POINTER,
// dimension attribute
EAT_DIMENSION2D,
// known attribute type count
EAT_COUNT,
@ -30,3 +97,5 @@ enum E_ATTRIBUTE_TYPE
} // end namespace io
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_CULLING_TYPES_H_INCLUDED__
#define __E_CULLING_TYPES_H_INCLUDED__
#include "irrTypes.h"
@ -22,14 +23,19 @@ enum E_CULLING_TYPE
};
//! Names for culling type
const c8 *const AutomaticCullingNames[] = {
const c8* const AutomaticCullingNames[] =
{
"false",
"box", // camera box against node box
"frustum_box", // camera frustum against node box
"frustum_sphere", // camera frustum against node sphere
"occ_query", // occlusion query
0,
0
};
} // end namespace scene
} // end namespace irr
#endif // __E_CULLING_TYPES_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_DEBUG_SCENE_TYPES_H_INCLUDED__
#define __E_DEBUG_SCENE_TYPES_H_INCLUDED__
namespace irr
{
@ -37,5 +38,10 @@ enum E_DEBUG_SCENE_TYPE
EDS_FULL = 0xffffffff
};
} // end namespace scene
} // end namespace irr
#endif // __E_DEBUG_SCENE_TYPES_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_DEVICE_TYPES_H_INCLUDED__
#define __E_DEVICE_TYPES_H_INCLUDED__
namespace irr
{
@ -44,3 +45,6 @@ enum E_DEVICE_TYPE
};
} // end namespace irr
#endif // __E_DEVICE_TYPES_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_DRIVER_FEATURES_H_INCLUDED__
#define __E_DRIVER_FEATURES_H_INCLUDED__
namespace irr
{
@ -120,6 +121,21 @@ enum E_VIDEO_DRIVER_FEATURE
//! Support for texture coord transformation via texture matrix
EVDF_TEXTURE_MATRIX,
//! Support for DXTn compressed textures.
EVDF_TEXTURE_COMPRESSED_DXT,
//! Support for PVRTC compressed textures.
EVDF_TEXTURE_COMPRESSED_PVRTC,
//! Support for PVRTC2 compressed textures.
EVDF_TEXTURE_COMPRESSED_PVRTC2,
//! Support for ETC1 compressed textures.
EVDF_TEXTURE_COMPRESSED_ETC1,
//! Support for ETC2 compressed textures.
EVDF_TEXTURE_COMPRESSED_ETC2,
//! Support for cube map textures.
EVDF_TEXTURE_CUBEMAP,
@ -135,3 +151,7 @@ enum E_VIDEO_DRIVER_FEATURE
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_DRIVER_TYPES_H_INCLUDED__
#define __E_DRIVER_TYPES_H_INCLUDED__
#include "irrTypes.h"
@ -42,3 +43,6 @@ enum E_DRIVER_TYPE
} // end namespace video
} // end namespace irr
#endif

View File

@ -1,7 +1,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef E_FOCUS_FLAGS_H_INCLUDED__
#define E_FOCUS_FLAGS_H_INCLUDED__
namespace irr
{
@ -32,3 +33,6 @@ enum EFOCUS_FLAG
} // namespace gui
} // namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_GUI_ALIGNMENT_H_INCLUDED__
#define __E_GUI_ALIGNMENT_H_INCLUDED__
#include "irrTypes.h"
@ -23,13 +24,16 @@ enum EGUI_ALIGNMENT
};
//! Names for alignments
const c8 *const GUIAlignmentNames[] = {
const c8* const GUIAlignmentNames[] =
{
"upperLeft",
"lowerRight",
"center",
"scale",
0,
0
};
} // namespace gui
} // namespace irr
#endif // __E_GUI_ALIGNMENT_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_GUI_ELEMENT_TYPES_H_INCLUDED__
#define __E_GUI_ELEMENT_TYPES_H_INCLUDED__
#include "irrTypes.h"
@ -99,7 +100,8 @@ enum EGUI_ELEMENT_TYPE
};
//! Names for built-in element types
const c8 *const GUIElementTypeNames[] = {
const c8* const GUIElementTypeNames[] =
{
"button",
"checkBox",
"comboBox",
@ -126,8 +128,14 @@ const c8 *const GUIElementTypeNames[] = {
"element",
"root",
"profiler",
0,
0
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_HARDWARE_BUFFER_FLAGS_INCLUDED__
#define __E_HARDWARE_BUFFER_FLAGS_INCLUDED__
namespace irr
{
@ -38,3 +39,6 @@ enum E_BUFFER_TYPE
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_MATERIAL_PROPS_H_INCLUDED__
#define __E_MATERIAL_PROPS_H_INCLUDED__
namespace irr
{
@ -80,3 +81,7 @@ enum E_MATERIAL_PROP
} // end namespace video
} // end namespace irr
#endif // __E_MATERIAL_PROPS_H_INCLUDED__

View File

@ -2,9 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#include "irrTypes.h"
#ifndef __E_MATERIAL_TYPES_H_INCLUDED__
#define __E_MATERIAL_TYPES_H_INCLUDED__
namespace irr
{
@ -58,17 +57,19 @@ enum E_MATERIAL_TYPE
};
//! Array holding the built in material type names
const char *const sBuiltInMaterialTypeNames[] = {
const char* const sBuiltInMaterialTypeNames[] =
{
"solid",
"trans_alphach",
"trans_alphach_ref",
"trans_vertex_alpha",
"onetexture_blend",
0,
0
};
constexpr u32 numBuiltInMaterials =
sizeof(sBuiltInMaterialTypeNames) / sizeof(char *) - 1;
} // end namespace video
} // end namespace irr
#endif // __E_MATERIAL_TYPES_H_INCLUDED__

View File

@ -0,0 +1,65 @@
// 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_MESH_WRITER_ENUMS_H_INCLUDED__
#define __E_MESH_WRITER_ENUMS_H_INCLUDED__
#include "irrTypes.h"
namespace irr
{
namespace scene
{
//! An enumeration for all supported types of built-in mesh writers
/** A scene mesh writers is represented by a four character code
such as 'irrm' or 'coll' instead of simple numbers, to avoid
name clashes with external mesh writers.*/
enum EMESH_WRITER_TYPE
{
//! Irrlicht native mesh writer, for static .irrmesh files.
EMWT_IRR_MESH = MAKE_IRR_ID('i','r','r','m'),
//! COLLADA mesh writer for .dae and .xml files
EMWT_COLLADA = MAKE_IRR_ID('c','o','l','l'),
//! STL mesh writer for .stl files
EMWT_STL = MAKE_IRR_ID('s','t','l',0),
//! OBJ mesh writer for .obj files
EMWT_OBJ = MAKE_IRR_ID('o','b','j',0),
//! PLY mesh writer for .ply files
EMWT_PLY = MAKE_IRR_ID('p','l','y',0),
//! B3D mesh writer, for static .b3d files
EMWT_B3D = MAKE_IRR_ID('b', '3', 'd', 0)
};
//! flags configuring mesh writing
enum E_MESH_WRITER_FLAGS
{
//! no writer flags
EMWF_NONE = 0,
//! write lightmap textures out if possible
//! Currently not used by any Irrlicht mesh-writer
// (Note: User meshwriters can still use it)
EMWF_WRITE_LIGHTMAPS = 0x1,
//! write in a way that consumes less disk space
// (Note: Mainly there for user meshwriters)
EMWF_WRITE_COMPRESSED = 0x2,
//! write in binary format rather than text
EMWF_WRITE_BINARY = 0x4
};
} // end namespace scene
} // end namespace irr
#endif // __E_MESH_WRITER_ENUMS_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_PRIMITIVE_TYPES_H_INCLUDED__
#define __E_PRIMITIVE_TYPES_H_INCLUDED__
namespace irr
{
@ -41,3 +42,6 @@ enum E_PRIMITIVE_TYPE
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_READ_FILE_TYPES_H_INCLUDED__
#define __E_READ_FILE_TYPES_H_INCLUDED__
#include "irrTypes.h"
@ -28,3 +29,6 @@ enum EREAD_FILE_TYPE
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __E_SCENE_NODE_TYPES_H_INCLUDED__
#define __E_SCENE_NODE_TYPES_H_INCLUDED__
#include "irrTypes.h"
@ -45,5 +46,11 @@ enum ESCENE_NODE_TYPE
ESNT_ANY = MAKE_IRR_ID('a','n','y','_')
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,4 +1,5 @@
#pragma once
#ifndef __E_SHADER_TYPES_H_INCLUDED__
#define __E_SHADER_TYPES_H_INCLUDED__
#include "irrTypes.h"
@ -81,5 +82,9 @@ const c8 *const GEOMETRY_SHADER_TYPE_NAMES[] = {
"gs_4_0",
0 };
} // end namespace video
} // end namespace irr
#endif // __E_SHADER_TYPES_H_INCLUDED__

View File

@ -1,4 +1,5 @@
#pragma once
#ifndef __E_VERTEX_ATTRIBUTES_H_INCLUDED__
#define __E_VERTEX_ATTRIBUTES_H_INCLUDED__
namespace irr
{
@ -19,7 +20,8 @@ enum E_VERTEX_ATTRIBUTES
};
//! Array holding the built in vertex attribute names
const char *const sBuiltInVertexAttributeNames[] = {
const char* const sBuiltInVertexAttributeNames[] =
{
"inVertexPosition",
"inVertexNormal",
"inVertexColor",
@ -27,8 +29,10 @@ const char *const sBuiltInVertexAttributeNames[] = {
"inTexCoord1",
"inVertexTangent",
"inVertexBinormal",
0,
0
};
} // end namespace video
} // end namespace irr
#endif //__E_VERTEX_ATTRIBUTES_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_ANIMATED_MESH_H_INCLUDED__
#define __I_ANIMATED_MESH_H_INCLUDED__
#include "aabbox3d.h"
#include "IMesh.h"
@ -19,6 +20,7 @@ irr::scene::SMeshBuffer etc. */
class IAnimatedMesh : public IMesh
{
public:
//! Gets the frame count of the animated mesh.
/** Note that the play-time is usually getFrameCount()-1 as it stops as soon as the last frame-key is reached.
\return The amount of frames. If the amount is 1,
@ -67,3 +69,6 @@ public:
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_ANIMATED_MESH_SCENE_NODE_H_INCLUDED__
#define __I_ANIMATED_MESH_SCENE_NODE_H_INCLUDED__
#include "ISceneNode.h"
#include "IBoneSceneNode.h"
@ -24,6 +25,7 @@ enum E_JOINT_UPDATE_ON_RENDER
EJUOR_CONTROL
};
class IAnimatedMeshSceneNode;
//! Callback interface for catching events of ended animations.
@ -34,6 +36,7 @@ be notified if an animation playback has ended.
class IAnimationEndCallBack : public virtual IReferenceCounted
{
public:
//! Will be called when the animation playback has ended.
/** See IAnimatedMeshSceneNode::setAnimationEndCallback for
more information.
@ -45,12 +48,13 @@ public:
class IAnimatedMeshSceneNode : public ISceneNode
{
public:
//! Constructor
IAnimatedMeshSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) :
ISceneNode(parent, mgr, id, position, rotation, scale) {}
const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f))
: ISceneNode(parent, mgr, id, position, rotation, scale) {}
//! Destructor
virtual ~IAnimatedMeshSceneNode() {}
@ -163,7 +167,11 @@ public:
\param newManager An optional new scene manager.
\return The newly created clone of this node. */
virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) = 0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,13 +2,29 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_ATTRIBUTES_H_INCLUDED__
#define __I_ATTRIBUTES_H_INCLUDED__
#include "IReferenceCounted.h"
#include "EAttributes.h"
// not needed here but I can't be bothered to clean the transitive includes up.
#include "SColor.h"
#include "vector3d.h"
#include "vector2d.h"
#include "line2d.h"
#include "line3d.h"
#include "triangle3d.h"
#include "position2d.h"
#include "rect.h"
#include "dimension2d.h"
#include "matrix4.h"
#include "quaternion.h"
#include "plane3d.h"
#include "triangle3d.h"
#include "line2d.h"
#include "line3d.h"
#include "irrString.h"
#include "irrArray.h"
#include "EAttributes.h"
#include "path.h"
namespace irr
{
@ -23,6 +39,7 @@ namespace io
class IAttributes : public virtual IReferenceCounted
{
public:
//! Returns amount of attributes in this collection of attributes.
virtual u32 getAttributeCount() const = 0;
@ -38,6 +55,16 @@ public:
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) const = 0;
//! Returns the type string of the attribute
//! \param attributeName: String for the attribute type
//! \param defaultNotFound Value returned when attributeName was not found
virtual const wchar_t* getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound = L"unknown") const = 0;
//! Returns the type string of the attribute by index.
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
//! \param defaultNotFound Value returned for an invalid index
virtual const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") const = 0;
//! Returns if an attribute with a name exists
virtual bool existsAttribute(const c8* attributeName) const = 0;
@ -47,6 +74,7 @@ public:
//! Removes all attributes
virtual void clear() = 0;
/*
Integer Attribute
@ -97,6 +125,7 @@ public:
//! Sets an attribute as float value
virtual void setAttribute(s32 index, f32 value) = 0;
/*
Bool Attribute
*/
@ -119,7 +148,10 @@ public:
//! Sets an attribute as boolean value
virtual void setAttribute(s32 index, bool value) = 0;
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_BILLBOARD_SCENE_NODE_H_INCLUDED__
#define __I_BILLBOARD_SCENE_NODE_H_INCLUDED__
#include "ISceneNode.h"
@ -21,10 +22,11 @@ lensflares, particles and things like that.
class IBillboardSceneNode : public ISceneNode
{
public:
//! Constructor
IBillboardSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df &position = core::vector3df(0, 0, 0)) :
ISceneNode(parent, mgr, id, position) {}
const core::vector3df& position = core::vector3df(0,0,0))
: ISceneNode(parent, mgr, id, position) {}
//! Sets the size of the billboard, making it rectangular.
virtual void setSize(const core::dimension2d<f32>& size) = 0;
@ -88,3 +90,7 @@ public:
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_BONE_SCENE_NODE_H_INCLUDED__
#define __I_BONE_SCENE_NODE_H_INCLUDED__
#include "ISceneNode.h"
@ -40,18 +41,21 @@ enum E_BONE_SKINNING_SPACE
};
//! Names for bone animation modes
const c8 *const BoneAnimationModeNames[] = {
const c8* const BoneAnimationModeNames[] =
{
"automatic",
"animated",
"unanimated",
0,
};
//! Interface for bones used for skeletal animation.
/** Used with ISkinnedMesh and IAnimatedMeshSceneNode. */
class IBoneSceneNode : public ISceneNode
{
public:
IBoneSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id=-1) :
ISceneNode(parent, mgr, id),positionHint(-1),scaleHint(-1),rotationHint(-1) { }
@ -92,5 +96,9 @@ public:
s32 rotationHint;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_CAMERA_SCENE_NODE_H_INCLUDED__
#define __I_CAMERA_SCENE_NODE_H_INCLUDED__
#include "ISceneNode.h"
#include "IEventReceiver.h"
@ -22,13 +23,13 @@ on.
class ICameraSceneNode : public ISceneNode, public IEventReceiver
{
public:
//! Constructor
ICameraSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) :
ISceneNode(parent, mgr, id, position, rotation, scale),
IsOrthogonal(false) {}
const core::vector3df& scale = core::vector3df(1.0f,1.0f,1.0f))
: ISceneNode(parent, mgr, id, position, rotation, scale), IsOrthogonal(false) {}
//! Sets the projection matrix of the camera.
/** The core::matrix4 class has some methods to build a
@ -172,6 +173,7 @@ public:
virtual bool getTargetAndRotationBinding(void) const =0;
protected:
void cloneMembers(const ICameraSceneNode* toCopyFrom)
{
IsOrthogonal = toCopyFrom->IsOrthogonal;
@ -182,3 +184,6 @@ protected:
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __IRR_I_CONTEXT_MANAGER_H_INCLUDED__
#define __IRR_I_CONTEXT_MANAGER_H_INCLUDED__
#include "SExposedVideoData.h"
#include "SIrrCreationParameters.h"
@ -57,3 +58,6 @@ public:
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_CURSOR_CONTROL_H_INCLUDED__
#define __I_CURSOR_CONTROL_H_INCLUDED__
#include "IReferenceCounted.h"
#include "position2d.h"
@ -25,7 +26,7 @@ enum ECURSOR_ICON
ECI_HELP, // Arrow and question mark
ECI_IBEAM, // typical text-selection cursor
ECI_NO, // should not click icon
ECI_WAIT, // hourglass
ECI_WAIT, // hourclass
ECI_SIZEALL, // arrow in all directions
ECI_SIZENESW, // resizes in direction north-east or south-west
ECI_SIZENWSE, // resizes in direction north-west or south-east
@ -41,7 +42,8 @@ enum ECURSOR_ICON
};
//! Names for ECURSOR_ICON
const c8 *const GUICursorIconNames[ECI_COUNT + 1] = {
const c8* const GUICursorIconNames[ECI_COUNT+1] =
{
"normal",
"cross",
"hand",
@ -55,19 +57,19 @@ const c8 *const GUICursorIconNames[ECI_COUNT + 1] = {
"sizens",
"sizewe",
"sizeup",
0,
0
};
//! structure used to set sprites as cursors.
struct SCursorSprite
{
SCursorSprite() :
SpriteBank(0), SpriteId(-1)
SCursorSprite()
: SpriteBank(0), SpriteId(-1)
{
}
SCursorSprite(gui::IGUISpriteBank *spriteBank, s32 spriteId, const core::position2d<s32> &hotspot = (core::position2d<s32>(0, 0))) :
SpriteBank(spriteBank), SpriteId(spriteId), HotSpot(hotspot)
SCursorSprite( gui::IGUISpriteBank * spriteBank, s32 spriteId, const core::position2d<s32> &hotspot=(core::position2d<s32>(0,0)) )
: SpriteBank(spriteBank), SpriteId(spriteId), HotSpot(hotspot)
{
}
@ -95,6 +97,7 @@ enum ECURSOR_PLATFORM_BEHAVIOR
class ICursorControl : public virtual IReferenceCounted
{
public:
//! Changes the visible state of the mouse cursor.
/** \param visible: The new visible state. If true, the cursor will be visible,
if false, it will be invisible. */
@ -191,5 +194,9 @@ public:
virtual ECURSOR_PLATFORM_BEHAVIOR getPlatformBehavior() const { return ECPB_NONE; }
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_DUMMY_TRANSFORMATION_SCENE_NODE_H_INCLUDED__
#define __I_DUMMY_TRANSFORMATION_SCENE_NODE_H_INCLUDED__
#include "ISceneNode.h"
@ -22,9 +23,10 @@ joint scene nodes when playing skeletal animations.
class IDummyTransformationSceneNode : public ISceneNode
{
public:
//! Constructor
IDummyTransformationSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id) :
ISceneNode(parent, mgr, id) {}
IDummyTransformationSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id)
: ISceneNode(parent, mgr, id) {}
//! Returns a reference to the current relative transformation matrix.
/** This is the matrix, this scene node uses instead of scale, translation
@ -34,3 +36,7 @@ public:
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_EVENT_RECEIVER_H_INCLUDED__
#define __I_EVENT_RECEIVER_H_INCLUDED__
#include "ILogger.h"
#include "Keycodes.h"
@ -262,10 +263,6 @@ enum EGUI_EVENT_TYPE
//! A checkbox has changed its check state.
EGET_CHECKBOX_CHANGED,
//! A listbox would like to open.
/** You can prevent the listbox from opening by absorbing the event. */
EGET_LISTBOX_OPENED,
//! A new item in a listbox was selected.
/** NOTE: You also get this event currently when the same item was clicked again after more than 500 ms. */
EGET_LISTBOX_CHANGED,
@ -308,6 +305,7 @@ enum EGUI_EVENT_TYPE
};
} // end namespace gui
//! SEvents hold information about an event. See irr::IEventReceiver for details on event handling.
struct SEvent
{
@ -322,6 +320,7 @@ struct SEvent
//! Type of GUI Event
gui::EGUI_EVENT_TYPE EventType;
};
//! Any kind of mouse event.
@ -570,6 +569,7 @@ struct SEvent
struct SSystemEvent SystemEvent;
struct SApplicationEvent ApplicationEvent;
};
};
//! Interface of an object which can receive events.
@ -581,6 +581,7 @@ path it takes through the system. */
class IEventReceiver
{
public:
//! Destructor
virtual ~IEventReceiver() {}
@ -593,6 +594,7 @@ public:
virtual bool OnEvent(const SEvent& event) = 0;
};
//! Information on a joystick, returned from @ref irr::IrrlichtDevice::activateJoysticks()
struct SJoystickInfo
{
@ -629,4 +631,8 @@ struct SJoystickInfo
} PovHat;
}; // struct SJoystickInfo
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_FILE_ARCHIVE_H_INCLUDED__
#define __I_FILE_ARCHIVE_H_INCLUDED__
#include "IReadFile.h"
#include "IFileList.h"
@ -29,6 +30,21 @@ enum E_FILE_ARCHIVE_TYPE
//! A gzip archive
EFAT_GZIP = MAKE_IRR_ID('g','z','i','p'),
//! A virtual directory
EFAT_FOLDER = MAKE_IRR_ID('f','l','d','r'),
//! An ID Software PAK archive
EFAT_PAK = MAKE_IRR_ID('P','A','K', 0),
//! A Nebula Device archive
EFAT_NPK = MAKE_IRR_ID('N','P','K', 0),
//! A Tape ARchive
EFAT_TAR = MAKE_IRR_ID('T','A','R', 0),
//! A wad Archive, Quake2, Halflife
EFAT_WAD = MAKE_IRR_ID('W','A','D', 0),
//! An Android asset file archive
EFAT_ANDROID_ASSET = MAKE_IRR_ID('A','S','S','E'),
@ -40,6 +56,7 @@ enum E_FILE_ARCHIVE_TYPE
class IFileArchive : public virtual IReferenceCounted
{
public:
//! Opens a file based on its name
/** Creates and returns a new IReadFile for a file in the archive.
\param filename The file to open
@ -123,5 +140,9 @@ public:
virtual IFileArchive* createArchive(io::IReadFile* file, bool ignoreCase, bool ignorePaths) const =0;
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_FILE_LIST_H_INCLUDED__
#define __I_FILE_LIST_H_INCLUDED__
#include "IReferenceCounted.h"
#include "path.h"
@ -87,3 +88,7 @@ public:
} // end namespace irr
} // end namespace io
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_FILE_SYSTEM_H_INCLUDED__
#define __I_FILE_SYSTEM_H_INCLUDED__
#include "IReferenceCounted.h"
#include "IFileArchive.h"
@ -21,6 +22,7 @@ class IWriteFile;
class IFileList;
class IAttributes;
//! The FileSystem manages files and archives and provides access to them.
/** It manages where files are, so that modules which use the the IO do not
need to know where every file is located. A file could be in a .zip-Archive or
@ -28,6 +30,7 @@ as file on disk, using the IFileSystem makes no difference to this. */
class IFileSystem : public virtual IReferenceCounted
{
public:
//! Opens a file for read access.
/** \param filename: Name of file to open.
\return Pointer to the created file interface.
@ -75,6 +78,7 @@ public:
*/
virtual IWriteFile* createMemoryWriteFile(void* memory, s32 len, const path& fileName, bool deleteMemoryWhenDropped=false) =0;
//! Opens a file for write access.
/** \param filename: Name of file to open.
\param append: If the file already exist, all write operations are
@ -261,5 +265,9 @@ public:
virtual bool existFile(const path& filename) const =0;
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GPU_PROGRAMMING_SERVICES_H_INCLUDED__
#define __I_GPU_PROGRAMMING_SERVICES_H_INCLUDED__
#include "EShaderTypes.h"
#include "EMaterialTypes.h"
@ -27,6 +28,7 @@ class IShaderConstantSetCallBack;
class IGPUProgrammingServices
{
public:
//! Destructor
virtual ~IGPUProgrammingServices() {}
@ -153,7 +155,7 @@ public:
callback, baseMaterial, userData);
}
//! Like addHighLevelShaderMaterial(), but loads from files.
//! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
/** \param vertexShaderProgramFileName Text file containing the source
of the vertex shader program. Set to empty string if no vertex shader
shall be created.
@ -277,7 +279,7 @@ public:
callback, baseMaterial, userData);
}
//! Like addHighLevelShaderMaterial(), but loads from files.
//! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
/** \param vertexShaderProgram Text file handle containing the source
of the vertex shader program. Set to 0 if no vertex shader shall be
created.
@ -355,15 +357,99 @@ public:
callback, baseMaterial, userData);
}
//! Delete a shader material and associated data.
/**
After you have deleted a material it is invalid to still use and doing
so might result in a crash. The ID may be reused in the future when new
materials are added.
\param material Number of the material type. Must not be a built-in
material. */
virtual void deleteShaderMaterial(s32 material) = 0;
//! Adds a new ASM shader material renderer to the VideoDriver
/** Note that it is a good idea to call IVideoDriver::queryFeature() in
advance to check if the IVideoDriver supports the vertex and/or pixel
shader version your are using.
The material is added to the VideoDriver like with
IVideoDriver::addMaterialRenderer() and can be used like it had been
added with that method.
\param vertexShaderProgram String containing the source of the vertex
shader program. This can be 0 if no vertex program shall be used.
For DX8 programs, the will always input registers look like this: v0:
position, v1: normal, v2: color, v3: texture coordinates, v4: texture
coordinates 2 if available.
For DX9 programs, you can manually set the registers using the dcl_
statements.
\param pixelShaderProgram String containing the source of the pixel
shader program. This can be 0 if you don't want to use a pixel shader.
\param callback Pointer to an implementation of
IShaderConstantSetCallBack in which you can set the needed vertex and
pixel shader program constants. Set this to 0 if you don't need this.
\param baseMaterial Base material which renderstates will be used to
shade the material.
\param userData a user data int. This int can be set to any value and
will be set as parameter in the callback method when calling
OnSetConstants(). In this way it is easily possible to use the same
callback method for multiple materials and distinguish between them
during the call.
\return Returns the number of the material type which can be set in
SMaterial::MaterialType to use the renderer. -1 is returned if an
error occurred. -1 is returned for example if a vertex or pixel shader
program could not be compiled, the error strings are then printed out
into the error log, and can be caught with a custom event receiver. */
virtual s32 addShaderMaterial(const c8* vertexShaderProgram = 0,
const c8* pixelShaderProgram = 0,
IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0;
//! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
/** \param vertexShaderProgram Text file containing the source of the
vertex shader program. Set to 0 if no shader shall be created.
\param pixelShaderProgram Text file containing the source of the pixel
shader program. Set to 0 if no shader shall be created.
\param callback Pointer to an IShaderConstantSetCallback object to
which the OnSetConstants function is called.
\param baseMaterial baseMaterial
\param userData a user data int. This int can be set to any value and
will be set as parameter in the callback method when calling
OnSetConstants(). In this way it is easily possible to use the same
callback method for multiple materials and distinguish between them
during the call.
\return Returns the number of the material type which can be set in
SMaterial::MaterialType to use the renderer. -1 is returned if an
error occurred. -1 is returned for example if a vertex or pixel shader
program could not be compiled, the error strings are then printed out
into the error log, and can be caught with a custom event receiver. */
virtual s32 addShaderMaterialFromFiles(io::IReadFile* vertexShaderProgram,
io::IReadFile* pixelShaderProgram,
IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0;
//! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
/** \param vertexShaderProgramFileName Text file name containing the
source of the vertex shader program. Set to 0 if no shader shall be
created.
\param pixelShaderProgramFileName Text file name containing the source
of the pixel shader program. Set to 0 if no shader shall be created.
\param callback Pointer to an IShaderConstantSetCallback object on
which the OnSetConstants function is called.
\param baseMaterial baseMaterial
\param userData a user data int. This int can be set to any value and
will be set as parameter in the callback method when calling
OnSetConstants(). In this way it is easily possible to use the same
callback method for multiple materials and distinguish between them
during the call.
\return Returns the number of the material type which can be set in
SMaterial::MaterialType to use the renderer. -1 is returned if an
error occurred. -1 is returned for example if a vertex or pixel shader
program could not be compiled, the error strings are then printed out
into the error log, and can be caught with a custom event receiver. */
virtual s32 addShaderMaterialFromFiles(const io::path& vertexShaderProgramFileName,
const io::path& pixelShaderProgramFileName,
IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0;
};
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_BUTTON_H_INCLUDED__
#define __I_GUI_BUTTON_H_INCLUDED__
#include "IGUIElement.h"
@ -45,7 +46,8 @@ enum EGUI_BUTTON_STATE
};
//! Names for gui button state icons
const c8 *const GUIButtonStateNames[EGBS_COUNT + 1] = {
const c8* const GUIButtonStateNames[EGBS_COUNT+1] =
{
"buttonUp",
"buttonDown",
"buttonMouseOver",
@ -53,7 +55,7 @@ const c8 *const GUIButtonStateNames[EGBS_COUNT + 1] = {
"buttonFocused",
"buttonNotFocused",
"buttonDisabled",
0, // count
0 // count
};
//! State of buttons used for drawing texture images.
@ -86,7 +88,8 @@ enum EGUI_BUTTON_IMAGE_STATE
};
//! Names for gui button image states
const c8 *const GUIButtonImageStateNames[EGBIS_COUNT + 1] = {
const c8* const GUIButtonImageStateNames[EGBIS_COUNT+1] =
{
"Image", // not "ImageUp" as it otherwise breaks serialization of old files
"ImageUpOver",
"ImageUpFocused",
@ -96,7 +99,7 @@ const c8 *const GUIButtonImageStateNames[EGBIS_COUNT + 1] = {
"ImageDownFocused",
"ImageDownFocusedOver",
"ImageDisabled",
0, // count
0 // count
};
//! GUI Button interface.
@ -106,9 +109,10 @@ const c8 *const GUIButtonImageStateNames[EGBIS_COUNT + 1] = {
class IGUIButton : public IGUIElement
{
public:
//! constructor
IGUIButton(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_BUTTON, environment, parent, id, rectangle) {}
IGUIButton(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_BUTTON, environment, parent, id, rectangle) {}
//! Sets another skin independent font.
/** If this is set to zero, the button uses the font of the skin.
@ -184,6 +188,7 @@ public:
\param sourceRect: Position in the texture, where the image is located */
virtual void setPressedImage(video::ITexture* image, const core::rect<s32>& sourceRect) = 0;
//! Sets the sprite bank used by the button
/** NOTE: The spritebank itself is _not_ serialized so far. The sprites are serialized.
Which means after loading the gui you still have to set the spritebank manually. */
@ -255,5 +260,9 @@ public:
virtual bool getClickControlState() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_CHECKBOX_H_INCLUDED__
#define __I_GUI_CHECKBOX_H_INCLUDED__
#include "IGUIElement.h"
@ -18,9 +19,10 @@ namespace gui
class IGUICheckBox : public IGUIElement
{
public:
//! constructor
IGUICheckBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_CHECK_BOX, environment, parent, id, rectangle) {}
IGUICheckBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_CHECK_BOX, environment, parent, id, rectangle) {}
//! Set if box is checked.
virtual void setChecked(bool checked) = 0;
@ -41,7 +43,11 @@ public:
//! Checks if border drawing is enabled
/** \return true if border drawing is enabled, false otherwise */
virtual bool isDrawBorderEnabled() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_COMBO_BOX_H_INCLUDED__
#define __I_GUI_COMBO_BOX_H_INCLUDED__
#include "IGUIElement.h"
@ -18,9 +19,10 @@ namespace gui
class IGUIComboBox : public IGUIElement
{
public:
//! constructor
IGUIComboBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_COMBO_BOX, environment, parent, id, rectangle) {}
IGUIComboBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_COMBO_BOX, environment, parent, id, rectangle) {}
//! Returns amount of items in box
virtual u32 getItemCount() const = 0;
@ -50,10 +52,6 @@ public:
//! Sets the selected item. Set this to -1 if no item should be selected
virtual void setSelected(s32 idx) = 0;
//! Sets the selected item and emits a change event.
/** Set this to -1 if no item should be selected */
virtual void setAndSendSelected(s32 idx) = 0;
//! Sets text justification of the text area
/** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text.
@ -68,5 +66,9 @@ public:
virtual u32 getMaxSelectionRows() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_EDIT_BOX_H_INCLUDED__
#define __I_GUI_EDIT_BOX_H_INCLUDED__
#include "IGUIElement.h"
#include "SColor.h"
@ -22,9 +23,10 @@ class IGUIFont;
class IGUIEditBox : public IGUIElement
{
public:
//! constructor
IGUIEditBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_EDIT_BOX, environment, parent, id, rectangle) {}
IGUIEditBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_EDIT_BOX, environment, parent, id, rectangle) {}
//! Sets another skin independent font.
/** If this is set to zero, the button uses the font of the skin.
@ -147,5 +149,9 @@ public:
virtual irr::u32 getCursorBlinkTime() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_ELEMENT_H_INCLUDED__
#define __I_GUI_ELEMENT_H_INCLUDED__
#include "IReferenceCounted.h"
#include "rect.h"
@ -25,11 +26,11 @@ namespace gui
class IGUIElement : virtual public IReferenceCounted, public IEventReceiver
{
public:
//! Constructor
IGUIElement(EGUI_ELEMENT_TYPE type, IGUIEnvironment* environment, IGUIElement* parent,
s32 id, const core::rect<s32> &rectangle) :
Parent(0),
RelativeRect(rectangle), AbsoluteRect(rectangle),
s32 id, const core::rect<s32>& rectangle)
: Parent(0), RelativeRect(rectangle), AbsoluteRect(rectangle),
AbsoluteClippingRect(rectangle), DesiredRect(rectangle),
MaxSize(0,0), MinSize(1,1), IsVisible(true), IsEnabled(true),
IsSubElement(false), NoClip(false), ID(id), IsTabStop(false), TabOrder(-1), IsTabGroup(false),
@ -41,12 +42,14 @@ public:
#endif
// if we were given a parent to attach to
if (parent) {
if (parent)
{
parent->addChildToEnd(this);
recalculateAbsolutePosition(true);
}
}
//! Destructor
virtual ~IGUIElement()
{
@ -56,6 +59,7 @@ public:
}
}
//! Returns parent of this element.
IGUIElement* getParent() const
{
@ -68,11 +72,13 @@ public:
return RelativeRect;
}
//! Sets the relative rectangle of this element.
/** \param r The absolute position to set */
void setRelativePosition(const core::rect<s32>& r)
{
if (Parent) {
if (Parent)
{
const core::rect<s32>& r2 = Parent->getAbsolutePosition();
core::dimension2df d((f32)(r2.getSize().Width), (f32)(r2.getSize().Height));
@ -101,6 +107,7 @@ public:
setRelativePosition(rectangle);
}
//! Sets the relative rectangle of this element as a proportion of its parent's area.
/** \note This method used to be 'void setRelativePosition(const core::rect<f32>& r)'
\param r The rectangle to set, interpreted as a proportion of the parent's area.
@ -124,18 +131,21 @@ public:
updateAbsolutePosition();
}
//! Gets the absolute rectangle of this element
core::rect<s32> getAbsolutePosition() const
{
return AbsoluteRect;
}
//! Returns the visible area of the element.
core::rect<s32> getAbsoluteClippingRect() const
{
return AbsoluteClippingRect;
}
//! Sets whether the element will ignore its parent's clipping rectangle
/** \param noClip If true, the element will not be clipped by its parent's clipping rectangle. */
void setNotClipped(bool noClip)
@ -144,6 +154,7 @@ public:
updateAbsolutePosition();
}
//! Gets whether the element will ignore its parent's clipping rectangle
/** \return true if the element is not clipped by its parent's clipping rectangle. */
bool isNotClipped() const
@ -151,6 +162,7 @@ public:
return NoClip;
}
//! Sets the maximum size allowed for this element
/** If set to 0,0, there is no maximum size */
void setMaxSize(core::dimension2du size)
@ -159,6 +171,7 @@ public:
updateAbsolutePosition();
}
//! Sets the minimum size allowed for this element
void setMinSize(core::dimension2du size)
{
@ -170,6 +183,7 @@ public:
updateAbsolutePosition();
}
//! The alignment defines how the borders of this element will be positioned when the parent element is resized.
void setAlignment(EGUI_ALIGNMENT left, EGUI_ALIGNMENT right, EGUI_ALIGNMENT top, EGUI_ALIGNMENT bottom)
{
@ -178,7 +192,8 @@ public:
AlignTop = top;
AlignBottom = bottom;
if (Parent) {
if (Parent)
{
core::rect<s32> r(Parent->getAbsolutePosition());
core::dimension2df d((f32)r.getSize().Width, (f32)r.getSize().Height);
@ -224,11 +239,13 @@ public:
recalculateAbsolutePosition(false);
// update all children
for (auto child : Children) {
for (auto child : Children)
{
child->updateAbsolutePosition();
}
}
//! Returns the topmost GUI element at the specific position.
/**
This will check this GUI element and all of its descendants, so it
@ -245,12 +262,14 @@ public:
{
IGUIElement* target = 0;
if (isVisible()) {
if (isVisible())
{
// 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) {
while (it != ie)
{
target = (*it)->getElementFromPoint(point);
if (target)
return target;
@ -265,6 +284,7 @@ public:
return target;
}
//! Returns true if a point is within this element.
/** Elements with a shape other than a rectangle should override this method */
virtual bool isPointInside(const core::position2d<s32>& point) const
@ -272,10 +292,12 @@ public:
return AbsoluteClippingRect.isPointInside(point);
}
//! Adds a GUI element as new child of this element.
virtual void addChild(IGUIElement* child)
{
if (child && child != this) {
if ( child && child != this )
{
addChildToEnd(child);
child->updateAbsolutePosition();
}
@ -291,8 +313,7 @@ public:
}
//! Removes all children.
virtual void removeAllChildren()
{
virtual void removeAllChildren() {
while (!Children.empty()) {
auto child = Children.back();
child->remove();
@ -306,30 +327,36 @@ public:
Parent->removeChild(this);
}
//! Draws the element and its children.
virtual void draw()
{
if (isVisible()) {
if ( isVisible() )
{
for (auto child : Children)
child->draw();
}
}
//! animate the element and its children.
virtual void OnPostRender(u32 timeMs)
{
if (isVisible()) {
if ( isVisible() )
{
for (auto child : Children)
child->OnPostRender( timeMs );
}
}
//! Moves this element.
virtual void move(core::position2d<s32> absoluteMovement)
{
setRelativePosition(DesiredRect + absoluteMovement);
}
//! Returns true if element is visible.
virtual bool isVisible() const
{
@ -356,12 +383,14 @@ public:
IsVisible = visible;
}
//! Returns true if this element was created as part of its parent control
virtual bool isSubElement() const
{
return IsSubElement;
}
//! Sets whether this control was created as part of its parent.
/** For example, it is true when a scrollbar is part of a listbox.
SubElements are not saved to disk when calling guiEnvironment->saveGUI() */
@ -370,6 +399,7 @@ public:
IsSubElement = subElement;
}
//! If set to true, the focus will visit this element when using the tab key to cycle through elements.
/** If this element is a tab group (see isTabGroup/setTabGroup) then
ctrl+tab will be used instead. */
@ -378,43 +408,51 @@ public:
IsTabStop = enable;
}
//! Returns true if this element can be focused by navigating with the tab key
bool isTabStop() const
{
return IsTabStop;
}
//! Sets the priority of focus when using the tab key to navigate between a group of elements.
/** See setTabGroup, isTabGroup and getTabGroup for information on tab groups.
Elements with a lower number are focused first */
void setTabOrder(s32 index)
{
// negative = autonumber
if (index < 0) {
if (index < 0)
{
TabOrder = 0;
IGUIElement *el = getTabGroup();
while (IsTabGroup && el && el->Parent)
el = el->Parent;
IGUIElement *first=0, *closest=0;
if (el) {
if (el)
{
// find the highest element number
el->getNextElement(-1, true, IsTabGroup, first, closest, true, true);
if (first) {
if (first)
{
TabOrder = first->getTabOrder() + 1;
}
}
} else
}
else
TabOrder = index;
}
//! Returns the number in the tab order sequence
s32 getTabOrder() const
{
return TabOrder;
}
//! Sets whether this element is a container for a group of elements which can be navigated using the tab key.
/** For example, windows are tab groups.
Groups can be navigated using ctrl+tab, providing isTabStop is true. */
@ -423,12 +461,14 @@ public:
IsTabGroup = isGroup;
}
//! Returns true if this element is a tab group.
bool isTabGroup() const
{
return IsTabGroup;
}
//! Returns the container element which holds all elements in this element's tab group.
IGUIElement* getTabGroup()
{
@ -440,6 +480,7 @@ public:
return ret;
}
//! Returns true if element is enabled
/** Currently elements do _not_ care about parent-states.
So if you want to affect children you have to enable/disable them all.
@ -453,54 +494,63 @@ public:
return IsEnabled;
}
//! Sets the enabled state of this element.
virtual void setEnabled(bool enabled)
{
IsEnabled = enabled;
}
//! Sets the new caption of this element.
virtual void setText(const wchar_t* text)
{
Text = text;
}
//! Returns caption of this element.
virtual const wchar_t* getText() const
{
return Text.c_str();
}
//! Sets the new caption of this element.
virtual void setToolTipText(const wchar_t* text)
{
ToolTipText = text;
}
//! Returns caption of this element.
virtual const core::stringw& getToolTipText() const
{
return ToolTipText;
}
//! Returns id. Can be used to identify the element.
virtual s32 getID() const
{
return ID;
}
//! Sets the id of this element
virtual void setID(s32 id)
{
ID = id;
}
//! Called if an event happened.
bool OnEvent(const SEvent& event) override
{
return Parent ? Parent->OnEvent(event) : false;
}
//! Brings a child to front
/** \return True if successful, false if not. */
virtual bool bringToFront(IGUIElement* child)
@ -514,6 +564,7 @@ public:
return true;
}
//! Moves a child to the back, so it's siblings are drawn on top of it
/** \return True if successful, false if not. */
virtual bool sendToBack(IGUIElement* child)
@ -533,6 +584,7 @@ public:
return Children;
}
//! Finds the first element with the given id.
/** \param id: Id to search for.
\param searchchildren: Set this to true, if also children of this
@ -544,7 +596,8 @@ public:
{
IGUIElement* e = 0;
for (auto child : Children) {
for (auto child : Children)
{
if (child->getID() == id)
return child;
@ -558,21 +611,25 @@ public:
return e;
}
//! returns true if the given element is a child of this one.
//! \param child: The child element to check
bool isMyChild(IGUIElement* child) const
{
if (!child)
return false;
do {
do
{
if (child->Parent)
child = child->Parent;
} while (child->Parent && child != this);
return child == this;
}
//! searches elements to find the closest next element to tab to
/** \param startOrder: The TabOrder of the current element, -1 if none
\param reverse: true if searching for a lower number
@ -595,46 +652,62 @@ public:
s32 closestOrder, currentOrder;
while (it != Children.end()) {
while(it != Children.end())
{
// ignore invisible elements and their children
if ( ( (*it)->isVisible() || includeInvisible ) &&
(group == true || (*it)->isTabGroup() == false)) {
(group == true || (*it)->isTabGroup() == false) )
{
// ignore disabled, but children are checked (disabled is currently per element ignoring parent states)
if ((*it)->isEnabled() || includeDisabled) {
if ( (*it)->isEnabled() || includeDisabled )
{
// only check tab stops and those with the same group status
if ((*it)->isTabStop() && ((*it)->isTabGroup() == group)) {
if ((*it)->isTabStop() && ((*it)->isTabGroup() == group))
{
currentOrder = (*it)->getTabOrder();
// is this what we're looking for?
if (currentOrder == wanted) {
if (currentOrder == wanted)
{
closest = *it;
return true;
}
// is it closer than the current closest?
if (closest) {
if (closest)
{
closestOrder = closest->getTabOrder();
if ((reverse && currentOrder > closestOrder && currentOrder < startOrder) || (!reverse && currentOrder < closestOrder && currentOrder > startOrder)) {
if ( ( reverse && currentOrder > closestOrder && currentOrder < startOrder)
||(!reverse && currentOrder < closestOrder && currentOrder > startOrder))
{
closest = *it;
}
} else if ((reverse && currentOrder < startOrder) || (!reverse && currentOrder > startOrder)) {
}
else
if ( (reverse && currentOrder < startOrder) || (!reverse && currentOrder > startOrder) )
{
closest = *it;
}
// is it before the current first?
if (first) {
if (first)
{
closestOrder = first->getTabOrder();
if ((reverse && closestOrder < currentOrder) || (!reverse && closestOrder > currentOrder)) {
if ( (reverse && closestOrder < currentOrder) || (!reverse && closestOrder > currentOrder) )
{
first = *it;
}
} else {
}
else
{
first = *it;
}
}
}
// search within children
if ((*it)->getNextElement(startOrder, reverse, group, first, closest, includeInvisible, includeDisabled)) {
if ((*it)->getNextElement(startOrder, reverse, group, first, closest, includeInvisible, includeDisabled))
{
return true;
}
}
@ -643,6 +716,7 @@ public:
return false;
}
//! Returns the type of the gui element.
/** This is needed for the .NET wrapper but will be used
later for serializing and deserializing.
@ -667,6 +741,7 @@ public:
return type == Type;
}
//! Returns the type name of the gui element.
/** This is needed serializing elements. */
virtual const c8* getTypeName() const
@ -681,6 +756,7 @@ public:
return Name.c_str();
}
//! Sets the name of the element.
/** \param name New name of the gui element. */
virtual void setName(const c8* name)
@ -688,6 +764,7 @@ public:
Name = name;
}
//! Sets the name of the element.
/** \param name New name of the gui element. */
virtual void setName(const core::stringc& name)
@ -695,17 +772,20 @@ public:
Name = name;
}
//! Returns whether the element takes input from the IME
virtual bool acceptsIME()
{
return false;
}
protected:
// not virtual because needed in constructor
void addChildToEnd(IGUIElement* child)
{
if (child) {
if (child)
{
child->grab(); // prevent destruction when removed
child->remove(); // remove from old parent
child->LastParentRect = getAbsolutePosition();
@ -716,8 +796,7 @@ protected:
#ifndef NDEBUG
template<typename Iterator>
static size_t _fastSetChecksum(Iterator begin, Iterator end)
{
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) {
@ -735,7 +814,8 @@ protected:
const std::vector<IGUIElement*> &neworder)
{
assert(_fastSetChecksum(from, to) == _fastSetChecksum(neworder.begin(), neworder.end()));
for (auto e : neworder) {
for (auto e : neworder)
{
*from = e;
e->ParentPos = from;
++from;
@ -743,6 +823,7 @@ protected:
assert(from == to);
}
// not virtual because needed in constructor
void recalculateAbsolutePosition(bool recursive)
{
@ -750,15 +831,18 @@ protected:
core::rect<s32> parentAbsoluteClip;
f32 fw=0.f, fh=0.f;
if (Parent) {
if (Parent)
{
parentAbsolute = Parent->AbsoluteRect;
if (NoClip) {
if (NoClip)
{
IGUIElement* p=this;
while (p->Parent)
p = p->Parent;
parentAbsoluteClip = p->AbsoluteClippingRect;
} else
}
else
parentAbsoluteClip = Parent->AbsoluteClippingRect;
}
@ -771,7 +855,8 @@ protected:
if (AlignTop == EGUIA_SCALE || AlignBottom == EGUIA_SCALE)
fh = (f32)parentAbsolute.getHeight();
switch (AlignLeft) {
switch (AlignLeft)
{
case EGUIA_UPPERLEFT:
break;
case EGUIA_LOWERRIGHT:
@ -785,7 +870,8 @@ protected:
break;
}
switch (AlignRight) {
switch (AlignRight)
{
case EGUIA_UPPERLEFT:
break;
case EGUIA_LOWERRIGHT:
@ -799,7 +885,8 @@ protected:
break;
}
switch (AlignTop) {
switch (AlignTop)
{
case EGUIA_UPPERLEFT:
break;
case EGUIA_LOWERRIGHT:
@ -813,7 +900,8 @@ protected:
break;
}
switch (AlignBottom) {
switch (AlignBottom)
{
case EGUIA_UPPERLEFT:
break;
case EGUIA_LOWERRIGHT:
@ -854,15 +942,18 @@ protected:
LastParentRect = parentAbsolute;
if (recursive) {
if ( recursive )
{
// update all children
for (auto child : Children) {
for (auto child : Children)
{
child->recalculateAbsolutePosition(recursive);
}
}
}
protected:
//! List of all children of this element
std::list<IGUIElement*> Children;
@ -937,5 +1028,9 @@ protected:
EGUI_ELEMENT_TYPE Type;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_ENVIRONMENT_H_INCLUDED__
#define __I_GUI_ENVIRONMENT_H_INCLUDED__
#include "IReferenceCounted.h"
#include "IGUISkin.h"
@ -58,6 +59,7 @@ class IGUIWindow;
class IGUIEnvironment : public virtual IReferenceCounted
{
public:
//! Draws all gui elements by traversing the GUI environment starting at the root node.
/** \param When true ensure the GuiEnvironment (aka the RootGUIElement) has the same size as the current driver screensize.
Can be set to false to control that size yourself, p.E when not the full size should be used for UI. */
@ -151,6 +153,7 @@ public:
See IReferenceCounted::drop() for more information. */
virtual IGUISkin* createSkin(EGUI_SKIN_TYPE type) = 0;
//! Creates the image list from the given texture.
/** \param texture Texture to split into images
\param imageSize Dimension of each image
@ -410,5 +413,9 @@ public:
virtual void addToDeletionQueue(IGUIElement* element) = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_FILE_OPEN_DIALOG_H_INCLUDED__
#define __I_GUI_FILE_OPEN_DIALOG_H_INCLUDED__
#include "IGUIElement.h"
#include "path.h"
@ -23,9 +24,10 @@ namespace gui
class IGUIFileOpenDialog : public IGUIElement
{
public:
//! constructor
IGUIFileOpenDialog(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_FILE_OPEN_DIALOG, environment, parent, id, rectangle) {}
IGUIFileOpenDialog(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_FILE_OPEN_DIALOG, environment, parent, id, rectangle) {}
//! Returns the filename of the selected file converted to wide characters. Returns NULL if no file was selected.
virtual const wchar_t* getFileName() const = 0;
@ -40,5 +42,9 @@ public:
virtual const wchar_t* getDirectoryNameW() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_FONT_H_INCLUDED__
#define __I_GUI_FONT_H_INCLUDED__
#include "IReferenceCounted.h"
#include "SColor.h"
@ -38,6 +39,7 @@ enum EGUI_FONT_TYPE
class IGUIFont : public virtual IReferenceCounted
{
public:
//! Draws some text and clips it to the specified rectangle if wanted.
/** \param text: Text to draw
\param position: Rectangle specifying position where to draw the text.
@ -97,3 +99,6 @@ public:
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_FONT_BITMAP_H_INCLUDED__
#define __I_GUI_FONT_BITMAP_H_INCLUDED__
#include "IGUIFont.h"
@ -16,6 +17,7 @@ class IGUISpriteBank;
class IGUIFontBitmap : public IGUIFont
{
public:
//! Returns the type of this font
EGUI_FONT_TYPE getType() const override { return EGFT_BITMAP; }
@ -39,3 +41,6 @@ public:
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_IMAGE_H_INCLUDED__
#define __I_GUI_IMAGE_H_INCLUDED__
#include "IGUIElement.h"
@ -18,9 +19,10 @@ namespace gui
class IGUIImage : public IGUIElement
{
public:
//! constructor
IGUIImage(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_IMAGE, environment, parent, id, rectangle) {}
IGUIImage(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_IMAGE, environment, parent, id, rectangle) {}
//! Sets an image texture
virtual void setImage(video::ITexture* image) = 0;
@ -78,5 +80,8 @@ public:
virtual bool isDrawBackgroundEnabled() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,7 +1,8 @@
// This file is part of the "Irrlicht Engine".
// written by Reinhard Ostermeier, reinhard@nospam.r-ostermeier.de
#pragma once
#ifndef __I_GUI_IMAGE_LIST_H_INCLUDED__
#define __I_GUI_IMAGE_LIST_H_INCLUDED__
#include "IGUIElement.h"
#include "rect.h"
@ -16,6 +17,7 @@ namespace gui
class IGUIImageList : public virtual IReferenceCounted
{
public:
//! Destructor
virtual ~IGUIImageList() {};
@ -38,3 +40,6 @@ public:
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_LIST_BOX_H_INCLUDED__
#define __I_GUI_LIST_BOX_H_INCLUDED__
#include "IGUIElement.h"
#include "SColor.h"
@ -29,6 +30,7 @@ enum EGUI_LISTBOX_COLOR
EGUI_LBC_COUNT
};
//! Default list box GUI element.
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_LISTBOX_CHANGED
@ -38,8 +40,8 @@ class IGUIListBox : public IGUIElement
{
public:
//! constructor
IGUIListBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_LIST_BOX, environment, parent, id, rectangle) {}
IGUIListBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_LIST_BOX, environment, parent, id, rectangle) {}
//! returns amount of list items
virtual u32 getItemCount() const = 0;
@ -132,5 +134,9 @@ public:
virtual IGUIScrollBar* getVerticalScrollBar() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_SCROLL_BAR_H_INCLUDED__
#define __I_GUI_SCROLL_BAR_H_INCLUDED__
#include "IGUIElement.h"
@ -18,9 +19,10 @@ namespace gui
class IGUIScrollBar : public IGUIElement
{
public:
//! constructor
IGUIScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_SCROLL_BAR, environment, parent, id, rectangle) {}
IGUIScrollBar(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_SCROLL_BAR, environment, parent, id, rectangle) {}
//! sets the maximum value of the scrollbar.
virtual void setMax(s32 max) = 0;
@ -55,5 +57,9 @@ public:
virtual void setPos(s32 pos) = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_SKIN_H_INCLUDED__
#define __I_GUI_SKIN_H_INCLUDED__
#include "IReferenceCounted.h"
#include "EGUIAlignment.h"
@ -45,7 +46,8 @@ enum EGUI_SKIN_TYPE
};
//! Names for gui element types
const c8 *const GUISkinTypeNames[EGST_COUNT + 1] = {
const c8* const GUISkinTypeNames[EGST_COUNT+1] =
{
"windowsClassic",
"windowsMetallic",
"burning",
@ -53,6 +55,7 @@ const c8 *const GUISkinTypeNames[EGST_COUNT + 1] = {
0,
};
//! Enumeration for skin colors
enum EGUI_DEFAULT_COLOR
{
@ -113,7 +116,8 @@ enum EGUI_DEFAULT_COLOR
};
//! Names for default skin colors
const c8 *const GUISkinColorNames[EGDC_COUNT + 1] = {
const c8* const GUISkinColorNames[EGDC_COUNT+1] =
{
"3DDarkShadow",
"3DShadow",
"3DFace",
@ -197,8 +201,10 @@ enum EGUI_DEFAULT_SIZE
EGDS_COUNT
};
//! Names for default skin sizes
const c8 *const GUISkinSizeNames[EGDS_COUNT + 1] = {
const c8* const GUISkinSizeNames[EGDS_COUNT+1] =
{
"ScrollBarSize",
"MenuHeight",
"WindowButtonWidth",
@ -222,9 +228,10 @@ const c8 *const GUISkinSizeNames[EGDS_COUNT + 1] = {
"ButtonPressedTextOffsetY",
"ButtonPressedSpriteOffsetX",
"ButtonPressedSpriteOffsetY",
0,
0
};
enum EGUI_DEFAULT_TEXT
{
//! Text for the OK button on a message box
@ -249,7 +256,8 @@ enum EGUI_DEFAULT_TEXT
};
//! Names for default skin sizes
const c8 *const GUISkinTextNames[EGDT_COUNT + 1] = {
const c8* const GUISkinTextNames[EGDT_COUNT+1] =
{
"MessageBoxOkay",
"MessageBoxCancel",
"MessageBoxYes",
@ -258,7 +266,7 @@ const c8 *const GUISkinTextNames[EGDT_COUNT + 1] = {
"WindowButtonMaximize",
"WindowButtonMinimize",
"WindowButtonRestore",
0,
0
};
//! Customizable symbols for GUI
@ -316,7 +324,8 @@ enum EGUI_DEFAULT_ICON
EGDI_COUNT
};
const c8 *const GUISkinIconNames[EGDI_COUNT + 1] = {
const c8* const GUISkinIconNames[EGDI_COUNT+1] =
{
"windowMaximize",
"windowRestore",
"windowClose",
@ -340,7 +349,7 @@ const c8 *const GUISkinIconNames[EGDI_COUNT + 1] = {
"collapse",
"file",
"directory",
0,
0
};
// Customizable fonts
@ -361,19 +370,21 @@ enum EGUI_DEFAULT_FONT
EGDF_COUNT
};
const c8 *const GUISkinFontNames[EGDF_COUNT + 1] = {
const c8* const GUISkinFontNames[EGDF_COUNT+1] =
{
"defaultFont",
"buttonFont",
"windowFont",
"menuFont",
"tooltipFont",
0,
0
};
//! A skin modifies the look of the GUI elements.
class IGUISkin : virtual public IReferenceCounted
{
public:
//! returns default color
virtual video::SColor getColor(EGUI_DEFAULT_COLOR color) const = 0;
@ -561,5 +572,9 @@ public:
virtual EGUI_SKIN_TYPE getType() const { return EGST_UNKNOWN; }
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_SPRITE_BANK_H_INCLUDED__
#define __I_GUI_SPRITE_BANK_H_INCLUDED__
#include "IReferenceCounted.h"
#include "irrArray.h"
@ -24,13 +25,12 @@ namespace gui
// Note for implementer: Can't fix variable names to uppercase as this is a public interface used since a while
struct SGUISpriteFrame
{
SGUISpriteFrame() :
textureNumber(0), rectNumber(0)
SGUISpriteFrame() : textureNumber(0), rectNumber(0)
{
}
SGUISpriteFrame(u32 textureIndex, u32 positionIndex) :
textureNumber(textureIndex), rectNumber(positionIndex)
SGUISpriteFrame(u32 textureIndex, u32 positionIndex)
: textureNumber(textureIndex), rectNumber(positionIndex)
{
}
@ -45,10 +45,8 @@ struct SGUISpriteFrame
// Note for implementer: Can't fix variable names to uppercase as this is a public interface used since a while
struct SGUISprite
{
SGUISprite() :
frameTime(0) {}
SGUISprite(const SGUISpriteFrame &firstFrame) :
frameTime(0)
SGUISprite() : frameTime(0) {}
SGUISprite(const SGUISpriteFrame& firstFrame) : frameTime(0)
{
Frames.push_back(firstFrame);
}
@ -57,6 +55,7 @@ struct SGUISprite
u32 frameTime;
};
//! Sprite bank interface.
/** See http://http://irrlicht.sourceforge.net/forum//viewtopic.php?f=9&t=25742
* for more information how to use the spritebank.
@ -64,6 +63,7 @@ struct SGUISprite
class IGUISpriteBank : public virtual IReferenceCounted
{
public:
//! Returns the list of rectangles held by the sprite bank
virtual core::array< core::rect<s32> >& getPositions() = 0;
@ -134,5 +134,9 @@ public:
bool loop=true, bool center=false) = 0;
};
} // end namespace gui
} // end namespace irr
#endif // __I_GUI_SPRITE_BANK_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_STATIC_TEXT_H_INCLUDED__
#define __I_GUI_STATIC_TEXT_H_INCLUDED__
#include "IGUIElement.h"
#include "SColor.h"
@ -17,9 +18,10 @@ class IGUIFont;
class IGUIStaticText : public IGUIElement
{
public:
//! constructor
IGUIStaticText(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_STATIC_TEXT, environment, parent, id, rectangle) {}
IGUIStaticText(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_STATIC_TEXT, environment, parent, id, rectangle) {}
//! Sets another skin independent font.
/** If this is set to zero, the button uses the font of the skin.
@ -129,5 +131,9 @@ public:
virtual bool isRightToLeft() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_TAB_CONTROL_H_INCLUDED__
#define __I_GUI_TAB_CONTROL_H_INCLUDED__
#include "IGUIElement.h"
#include "SColor.h"
@ -21,9 +22,10 @@ class IGUITab;
class IGUITabControl : public IGUIElement
{
public:
//! constructor
IGUITabControl(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_TAB_CONTROL, environment, parent, id, rectangle) {}
IGUITabControl(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_TAB_CONTROL, environment, parent, id, rectangle) {}
//! Adds a tab
virtual IGUITab* addTab(const wchar_t* caption, s32 id=-1) = 0;
@ -122,9 +124,10 @@ public:
class IGUITab : public IGUIElement
{
public:
//! constructor
IGUITab(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_TAB, environment, parent, id, rectangle) {}
IGUITab(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_TAB, environment, parent, id, rectangle) {}
//! sets if the tab should draw its background
virtual void setDrawBackground(bool draw=true) = 0;
@ -147,3 +150,6 @@ public:
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_TOOL_BAR_H_INCLUDED__
#define __I_GUI_TOOL_BAR_H_INCLUDED__
#include "IGUIElement.h"
@ -20,9 +21,10 @@ class IGUIButton;
class IGUIToolBar : public IGUIElement
{
public:
//! constructor
IGUIToolBar(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_TOOL_BAR, environment, parent, id, rectangle) {}
IGUIToolBar(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_TOOL_BAR, environment, parent, id, rectangle) {}
//! Adds a button to the tool bar
virtual IGUIButton* addButton(s32 id=-1, const wchar_t* text=0,const wchar_t* tooltiptext=0,
@ -30,5 +32,9 @@ public:
bool isPushButton=false, bool useAlphaChannel=false) = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -2,13 +2,14 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_IMAGE_H_INCLUDED__
#define __I_IMAGE_H_INCLUDED__
#include "IReferenceCounted.h"
#include "position2d.h"
#include "rect.h"
#include "SColor.h"
#include <cstring>
#include <string.h>
namespace irr
{
@ -23,9 +24,13 @@ NOTE: Floating point formats are not well supported yet. Basically only getData(
class IImage : public virtual IReferenceCounted
{
public:
//! constructor
IImage(ECOLOR_FORMAT format, const core::dimension2d<u32>& size, bool deleteMemory) :
Format(format), Size(size), Data(0), MipMapsData(0), BytesPerPixel(0), Pitch(0), DeleteMemory(deleteMemory), DeleteMipMapsMemory(false)
#if defined(IRRLICHT_sRGB)
,Format_sRGB(1)
#endif
{
BytesPerPixel = getBitsPerPixelFromFormat(Format) / 8;
Pitch = BytesPerPixel * Size.Width;
@ -47,6 +52,18 @@ public:
return Format;
}
#if defined(IRRLICHT_sRGB)
//! Texture is linear/sRGB (should be part of ColorFormat: default yes)
int get_sRGB() const
{
return Format_sRGB;
}
void set_sRGB(int val)
{
Format_sRGB = val;
}
#endif
//! Returns width and height of image data.
const core::dimension2d<u32>& getDimension() const
{
@ -87,7 +104,8 @@ public:
//! Returns mask for red value of a pixel
u32 getRedMask() const
{
switch (Format) {
switch (Format)
{
case ECF_A1R5G5B5:
return 0x1F << 10;
case ECF_R5G6B5:
@ -104,7 +122,8 @@ public:
//! Returns mask for green value of a pixel
u32 getGreenMask() const
{
switch (Format) {
switch (Format)
{
case ECF_A1R5G5B5:
return 0x1F << 5;
case ECF_R5G6B5:
@ -121,7 +140,8 @@ public:
//! Returns mask for blue value of a pixel
u32 getBlueMask() const
{
switch (Format) {
switch (Format)
{
case ECF_A1R5G5B5:
return 0x1F;
case ECF_R5G6B5:
@ -138,7 +158,8 @@ public:
//! Returns mask for alpha value of a pixel
u32 getAlphaMask() const
{
switch (Format) {
switch (Format)
{
case ECF_A1R5G5B5:
return 0x1 << 15;
case ECF_R5G6B5:
@ -170,13 +191,15 @@ public:
return getMipMapsSize(Size, mipmapLevel);
}
//! Calculate mipmap size for a certain level
/** level 0 will be full image size. Every further level is half the size. */
static core::dimension2du getMipMapsSize(const core::dimension2du& sizeLevel0, u32 mipmapLevel)
{
core::dimension2du result(sizeLevel0);
u32 i=0;
while (i != mipmapLevel) {
while (i != mipmapLevel)
{
if (result.Width>1)
result.Width >>= 1;
if (result.Height>1)
@ -189,6 +212,7 @@ public:
return result;
}
//! Get mipmaps data.
/** Note that different mip levels are just behind each other in memory block.
So if you just get level 1 you also have the data for all other levels.
@ -196,12 +220,14 @@ public:
*/
void* getMipMapsData(irr::u32 mipLevel=1) const
{
if (MipMapsData && mipLevel > 0) {
if ( MipMapsData && mipLevel > 0)
{
size_t dataSize = 0;
core::dimension2du mipSize(Size);
u32 i = 1; // We want the start of data for this level, not end.
while (i != mipLevel) {
while (i != mipLevel)
{
if (mipSize.Width > 1)
mipSize.Width >>= 1;
@ -232,24 +258,31 @@ public:
destruction. */
void setMipMapsData(void* data, bool ownForeignMemory)
{
if (data != MipMapsData) {
if (DeleteMipMapsMemory) {
if (data != MipMapsData)
{
if (DeleteMipMapsMemory)
{
delete[] MipMapsData;
DeleteMipMapsMemory = false;
}
if (data) {
if (ownForeignMemory) {
if (data)
{
if (ownForeignMemory)
{
MipMapsData = static_cast<u8*>(data);
DeleteMipMapsMemory = false;
} else {
}
else
{
u32 dataSize = 0;
u32 width = Size.Width;
u32 height = Size.Height;
do {
do
{
if (width > 1)
width >>= 1;
@ -264,7 +297,9 @@ public:
DeleteMipMapsMemory = true;
}
} else {
}
else
{
MipMapsData = 0;
}
}
@ -317,7 +352,8 @@ public:
//! get the amount of Bits per Pixel of the given color format
static u32 getBitsPerPixelFromFormat(const ECOLOR_FORMAT format)
{
switch (format) {
switch(format)
{
case ECF_A1R5G5B5:
return 16;
case ECF_R5G6B5:
@ -326,6 +362,28 @@ public:
return 24;
case ECF_A8R8G8B8:
return 32;
case ECF_DXT1:
return 16;
case ECF_DXT2:
case ECF_DXT3:
case ECF_DXT4:
case ECF_DXT5:
return 32;
case ECF_PVRTC_RGB2:
return 12;
case ECF_PVRTC_ARGB2:
case ECF_PVRTC2_ARGB2:
return 16;
case ECF_PVRTC_RGB4:
return 24;
case ECF_PVRTC_ARGB4:
case ECF_PVRTC2_ARGB4:
return 32;
case ECF_ETC1:
case ECF_ETC2_RGB:
return 24;
case ECF_ETC2_ARGB:
return 32;
case ECF_D16:
return 16;
case ECF_D32:
@ -360,23 +418,81 @@ public:
//! calculate image data size in bytes for selected format, width and height.
static u32 getDataSizeFromFormat(ECOLOR_FORMAT format, u32 width, u32 height)
{
// non-compressed formats
u32 imageSize = getBitsPerPixelFromFormat(format) / 8 * width;
u32 imageSize = 0;
switch (format)
{
case ECF_DXT1:
imageSize = ((width + 3) / 4) * ((height + 3) / 4) * 8;
break;
case ECF_DXT2:
case ECF_DXT3:
case ECF_DXT4:
case ECF_DXT5:
imageSize = ((width + 3) / 4) * ((height + 3) / 4) * 16;
break;
case ECF_PVRTC_RGB2:
case ECF_PVRTC_ARGB2:
imageSize = (core::max_<u32>(width, 16) * core::max_<u32>(height, 8) * 2 + 7) / 8;
break;
case ECF_PVRTC_RGB4:
case ECF_PVRTC_ARGB4:
imageSize = (core::max_<u32>(width, 8) * core::max_<u32>(height, 8) * 4 + 7) / 8;
break;
case ECF_PVRTC2_ARGB2:
imageSize = core::ceil32(width / 8.0f) * core::ceil32(height / 4.0f) * 8;
break;
case ECF_PVRTC2_ARGB4:
case ECF_ETC1:
case ECF_ETC2_RGB:
imageSize = core::ceil32(width / 4.0f) * core::ceil32(height / 4.0f) * 8;
break;
case ECF_ETC2_ARGB:
imageSize = core::ceil32(width / 4.0f) * core::ceil32(height / 4.0f) * 16;
break;
default: // uncompressed formats
imageSize = getBitsPerPixelFromFormat(format) / 8 * width;
imageSize *= height;
break;
}
return imageSize;
}
// Define to check for all compressed image formats cases in a switch
#define IRR_CASE_IIMAGE_COMPRESSED_FORMAT\
case ECF_DXT1:\
case ECF_DXT2:\
case ECF_DXT3:\
case ECF_DXT4:\
case ECF_DXT5:\
case ECF_PVRTC_RGB2:\
case ECF_PVRTC_ARGB2:\
case ECF_PVRTC2_ARGB2:\
case ECF_PVRTC_RGB4:\
case ECF_PVRTC_ARGB4:\
case ECF_PVRTC2_ARGB4:\
case ECF_ETC1:\
case ECF_ETC2_RGB:\
case ECF_ETC2_ARGB:
//! check if this is compressed color format
static bool isCompressedFormat(const ECOLOR_FORMAT format)
{
switch(format)
{
IRR_CASE_IIMAGE_COMPRESSED_FORMAT
return true;
default:
return false;
}
}
//! check if the color format is only viable for depth/stencil textures
static bool isDepthFormat(const ECOLOR_FORMAT format)
{
switch (format) {
switch(format)
{
case ECF_D16:
case ECF_D32:
case ECF_D24S8:
@ -392,7 +508,8 @@ public:
if (isCompressedFormat(format))
return false;
switch (format) {
switch(format)
{
case ECF_R16F:
case ECF_G16R16F:
case ECF_A16B16G16R16F:
@ -406,6 +523,22 @@ public:
return false;
}
#if defined(PATCH_SUPERTUX_8_0_1_with_1_9_0)
static bool isRenderTargetOnlyFormat(const ECOLOR_FORMAT format)
{
switch (format)
{
case ECF_A1R5G5B5:
case ECF_R5G6B5:
case ECF_R8G8B8:
case ECF_A8R8G8B8:
return false;
default:
return true;
}
}
#endif
protected:
ECOLOR_FORMAT Format;
core::dimension2d<u32> Size;
@ -418,7 +551,15 @@ protected:
bool DeleteMemory;
bool DeleteMipMapsMemory;
#if defined(IRRLICHT_sRGB)
int Format_sRGB;
#endif
};
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_SURFACE_LOADER_H_INCLUDED__
#define __I_SURFACE_LOADER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "IImage.h"
@ -27,6 +28,7 @@ IVideoDriver::addExternalImageLoader() to the engine. */
class IImageLoader : public virtual IReferenceCounted
{
public:
//! Check if the file might be loaded by this class
/** Check is based on the file extension (e.g. ".tga")
\param filename Name of file to check.
@ -45,5 +47,9 @@ public:
virtual IImage* loadImage(io::IReadFile* file) const = 0;
};
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef _I_IMAGE_WRITER_H_INCLUDED__
#define _I_IMAGE_WRITER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "irrString.h"
@ -19,6 +20,7 @@ namespace video
{
class IImage;
//! Interface for writing software image data.
class IImageWriter : public IReferenceCounted
{
@ -38,3 +40,6 @@ public:
} // namespace video
} // namespace irr
#endif // _I_IMAGE_WRITER_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_INDEX_BUFFER_H_INCLUDED__
#define __I_INDEX_BUFFER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "irrArray.h"
@ -23,6 +24,7 @@ namespace scene
class IIndexBuffer : public virtual IReferenceCounted
{
public:
virtual void* getData() =0;
virtual video::E_INDEX_TYPE getType() const =0;
@ -55,5 +57,9 @@ public:
virtual u32 getChangedID() const = 0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_LOGGER_H_INCLUDED__
#define __I_LOGGER_H_INCLUDED__
#include "IReferenceCounted.h"
@ -18,7 +19,7 @@ enum ELOG_LEVEL
//! Used for printing information helpful in debugging
ELL_DEBUG,
//! Useful information to print. For example hardware info or something started/stopped.
//! Useful information to print. For example hardware infos or something started/stopped.
ELL_INFORMATION,
//! Warnings that something isn't as expected and can cause oddities
@ -32,10 +33,12 @@ enum ELOG_LEVEL
ELL_NONE
};
//! Interface for logging messages, warnings and errors
class ILogger : public virtual IReferenceCounted
{
public:
//! Destructor
virtual ~ILogger() {}
@ -70,6 +73,30 @@ public:
filtered with these levels. If you want to be a text displayed,
independent on what level filter is set, use ELL_NONE. */
virtual void log(const c8* text, const c8* hint, ELOG_LEVEL ll=ELL_INFORMATION) = 0;
virtual void log(const c8* text, const wchar_t* hint, ELOG_LEVEL ll=ELL_INFORMATION) = 0;
//! Prints out a text into the log
/** \param text: Text to print out.
\param hint: Additional info. This string is added after a " :" to the
string.
\param ll: Log level of the text. If the text is an error, set
it to ELL_ERROR, if it is warning set it to ELL_WARNING, and if it
is just an informational text, set it to ELL_INFORMATION. Texts are
filtered with these levels. If you want to be a text displayed,
independent on what level filter is set, use ELL_NONE. */
virtual void log(const wchar_t* text, const wchar_t* hint, ELOG_LEVEL ll=ELL_INFORMATION) = 0;
//! Prints out a text into the log
/** \param text: Text to print out.
\param ll: Log level of the text. If the text is an error, set
it to ELL_ERROR, if it is warning set it to ELL_WARNING, and if it
is just an informational text, set it to ELL_INFORMATION. Texts are
filtered with these levels. If you want to be a text displayed,
independent on what level filter is set, use ELL_NONE. */
virtual void log(const wchar_t* text, ELOG_LEVEL ll=ELL_INFORMATION) = 0;
};
} // end namespace
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MATERIAL_RENDERER_H_INCLUDED__
#define __I_MATERIAL_RENDERER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "SMaterial.h"
@ -24,6 +25,7 @@ engine with new materials. */
class IMaterialRenderer : public virtual IReferenceCounted
{
public:
//! Called by the IVideoDriver implementation the let the renderer set its needed render states.
/** This is called during the IVideoDriver::setMaterial() call.
When overriding this, you can set some renderstates or for example a
@ -97,5 +99,9 @@ public:
virtual IShaderConstantSetCallBack* getShaderConstantSetCallBack() const { return 0; }
};
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MATERIAL_RENDERER_SERVICES_H_INCLUDED__
#define __I_MATERIAL_RENDERER_SERVICES_H_INCLUDED__
#include "SMaterial.h"
#include "S3DVertex.h"
@ -14,10 +15,12 @@ namespace video
class IVideoDriver;
//! Interface providing some methods for changing advanced, internal states of a IVideoDriver.
class IMaterialRendererServices
{
public:
//! Destructor
virtual ~IMaterialRendererServices() {}
@ -35,11 +38,30 @@ public:
const SMaterial& lastMaterial,
bool resetAllRenderstates) = 0;
//! Return an index constant for the vertex shader based on a uniform variable name.
//! Return an index constant for the vertex shader based on a name.
virtual s32 getVertexShaderConstantID(const c8* name) = 0;
//! Sets a value for a vertex shader uniform variable.
/** \param index Index of the variable (as received from getVertexShaderConstantID)
//! Sets a constant for the vertex shader based on a name.
/** This can be used if you used a high level shader language like GLSL
or HLSL to create a shader. Example: If you created a shader which has
variables named 'mWorldViewProj' (containing the WorldViewProjection
matrix) and another one named 'fTime' containing one float, you can set
them in your IShaderConstantSetCallBack derived class like this:
\code
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
{
video::IVideoDriver* driver = services->getVideoDriver();
f32 time = (f32)os::Timer::getTime()/100000.0f;
services->setVertexShaderConstant("fTime", &time, 1);
core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION));
worldViewProj *= driver->getTransform(video::ETS_VIEW);
worldViewProj *= driver->getTransform(video::ETS_WORLD);
services->setVertexShaderConstant("mWorldViewProj", worldViewProj.M, 16);
}
\endcode
\param index Index of the variable
\param floats Pointer to array of floats
\param count Amount of floats in array.
\return True if successful.
@ -50,16 +72,27 @@ public:
virtual bool setVertexShaderConstant(s32 index, const s32* ints, int count) = 0;
//! Uint interface for the above.
/* NOTE: UINT only works with GLSL, not supported for other shaders.
Also GLES drivers in Irrlicht do not support it as this needs at least GLES 3.0.
*/
virtual bool setVertexShaderConstant(s32 index, const u32* ints, int count) = 0;
//! Return an index constant for the pixel shader for the given uniform variable name
//! Sets a vertex shader constant.
/** Can be used if you created a shader using pixel/vertex shader
assembler or ARB_fragment_program or ARB_vertex_program.
\param data: Data to be set in the constants
\param startRegister: First register to be set
\param constantAmount: Amount of registers to be set. One register consists of 4 floats. */
virtual void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) = 0;
//! Return an index constant for the pixel shader based on a name.
virtual s32 getPixelShaderConstantID(const c8* name) = 0;
//! Sets a value for the given pixel shader uniform variable
//! Sets a constant for the pixel shader based on a name.
/** This can be used if you used a high level shader language like GLSL
or HLSL to create a shader. See setVertexShaderConstant() for an
example on how to use this.
\param index Index of the variable (as received from getPixelShaderConstantID)
\param index Index of the variable
\param floats Pointer to array of floats
\param count Amount of floats in array.
\return True if successful. */
@ -69,8 +102,19 @@ public:
virtual bool setPixelShaderConstant(s32 index, const s32* ints, int count) = 0;
//! Uint interface for the above.
/* NOTE: UINT only works with GLSL, not supported for other shaders.
Also GLES drivers in Irrlicht do not support it as this needs at least GLES 3.0.
*/
virtual bool setPixelShaderConstant(s32 index, const u32* ints, int count) = 0;
//! Sets a pixel shader constant.
/** Can be used if you created a shader using pixel/vertex shader
assembler or ARB_fragment_program or ARB_vertex_program.
\param data Data to be set in the constants
\param startRegister First register to be set.
\param constantAmount Amount of registers to be set. One register consists of 4 floats. */
virtual void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) = 0;
//! Get pointer to the IVideoDriver interface
/** \return Pointer to the IVideoDriver interface */
virtual IVideoDriver* getVideoDriver() = 0;
@ -78,3 +122,6 @@ public:
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MEMORY_READ_FILE_H_INCLUDED__
#define __I_MEMORY_READ_FILE_H_INCLUDED__
#include "IReadFile.h"
@ -25,3 +26,6 @@ public:
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MESH_H_INCLUDED__
#define __I_MESH_H_INCLUDED__
#include "IReferenceCounted.h"
#include "SMaterial.h"
@ -59,6 +60,7 @@ enum E_ANIMATED_MESH_TYPE
EAMT_STATIC
};
class IMeshBuffer;
//! Class which holds the geometry of an object.
@ -69,6 +71,7 @@ A mesh is usually added to an IMeshSceneNode in order to be rendered.
class IMesh : public virtual IReferenceCounted
{
public:
//! Get the amount of mesh buffers.
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
virtual u32 getMeshBufferCount() const = 0;
@ -121,3 +124,6 @@ public:
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MESH_BUFFER_H_INCLUDED__
#define __I_MESH_BUFFER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "SMaterial.h"
@ -38,6 +39,7 @@ the current code block anymore.
class IMeshBuffer : public virtual IReferenceCounted
{
public:
//! Get the material of this meshbuffer
/** \return Material of this buffer. */
virtual video::SMaterial& getMaterial() = 0;
@ -118,6 +120,11 @@ public:
\param numIndices Number of indices in array. */
virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) = 0;
//! Append the meshbuffer to the current buffer
/** Only works for compatible vertex types
\param other Buffer to append to this one. */
virtual void append(const IMeshBuffer* const other) = 0;
//! get the current hardware mapping hint
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const = 0;
@ -156,27 +163,23 @@ public:
virtual u32 getPrimitiveCount() const
{
const u32 indexCount = getIndexCount();
switch (getPrimitiveType()) {
case scene::EPT_POINTS:
return indexCount;
case scene::EPT_LINE_STRIP:
return indexCount - 1;
case scene::EPT_LINE_LOOP:
return indexCount;
case scene::EPT_LINES:
return indexCount / 2;
case scene::EPT_TRIANGLE_STRIP:
return (indexCount - 2);
case scene::EPT_TRIANGLE_FAN:
return (indexCount - 2);
case scene::EPT_TRIANGLES:
return indexCount / 3;
case scene::EPT_POINT_SPRITES:
return indexCount;
switch (getPrimitiveType())
{
case scene::EPT_POINTS: return indexCount;
case scene::EPT_LINE_STRIP: return indexCount-1;
case scene::EPT_LINE_LOOP: return indexCount;
case scene::EPT_LINES: return indexCount/2;
case scene::EPT_TRIANGLE_STRIP: return (indexCount-2);
case scene::EPT_TRIANGLE_FAN: return (indexCount-2);
case scene::EPT_TRIANGLES: return indexCount/3;
case scene::EPT_POINT_SPRITES: return indexCount;
}
return 0;
}
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MESH_CACHE_H_INCLUDED__
#define __I_MESH_CACHE_H_INCLUDED__
#include "IReferenceCounted.h"
#include "path.h"
@ -26,6 +27,7 @@ to remove them and to iterate through already loaded meshes. */
class IMeshCache : public virtual IReferenceCounted
{
public:
//! Destructor
virtual ~IMeshCache() {}
@ -127,5 +129,9 @@ public:
virtual void clearUnusedMeshes() = 0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MESH_LOADER_H_INCLUDED__
#define __I_MESH_LOADER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "path.h"
@ -25,6 +26,7 @@ ISceneManager::addExternalMeshLoader() to the engine. */
class IMeshLoader : public virtual IReferenceCounted
{
public:
//! Constructor
IMeshLoader() {}
@ -46,5 +48,8 @@ public:
virtual IAnimatedMesh* createMesh(io::IReadFile* file) = 0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MESH_MANIPULATOR_H_INCLUDED__
#define __I_MESH_MANIPULATOR_H_INCLUDED__
#include "IReferenceCounted.h"
#include "vector3d.h"
@ -28,6 +29,7 @@ animations during runtime.
class IMeshManipulator : public virtual IReferenceCounted
{
public:
//! Recalculates all normals of the mesh.
/** \param mesh: Mesh on which the operation is performed.
\param smooth: If the normals shall be smoothed.
@ -98,6 +100,7 @@ public:
return apply_(func, buffer, boundingBoxUpdate, func);
}
//! Apply a manipulator on the Mesh
/** \param func A functor defining the mesh manipulation.
\param mesh The Mesh to apply the manipulator to.
@ -110,9 +113,11 @@ public:
return true;
bool result = true;
core::aabbox3df bufferbox;
for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) {
for (u32 i=0; i<mesh->getMeshBufferCount(); ++i)
{
result &= apply(func, mesh->getMeshBuffer(i), boundingBoxUpdate);
if (boundingBoxUpdate) {
if (boundingBoxUpdate)
{
if (0==i)
bufferbox.reset(mesh->getMeshBuffer(i)->getBoundingBox());
else
@ -138,22 +143,31 @@ protected:
return true;
core::aabbox3df bufferbox;
for (u32 i = 0; i < buffer->getVertexCount(); ++i) {
switch (buffer->getVertexType()) {
case video::EVT_STANDARD: {
for (u32 i=0; i<buffer->getVertexCount(); ++i)
{
switch (buffer->getVertexType())
{
case video::EVT_STANDARD:
{
video::S3DVertex* verts = (video::S3DVertex*)buffer->getVertices();
func(verts[i]);
} break;
case video::EVT_2TCOORDS: {
}
break;
case video::EVT_2TCOORDS:
{
video::S3DVertex2TCoords* verts = (video::S3DVertex2TCoords*)buffer->getVertices();
func(verts[i]);
} break;
case video::EVT_TANGENTS: {
}
break;
case video::EVT_TANGENTS:
{
video::S3DVertexTangents* verts = (video::S3DVertexTangents*)buffer->getVertices();
func(verts[i]);
} break;
}
if (boundingBoxUpdate) {
break;
}
if (boundingBoxUpdate)
{
if (0==i)
bufferbox.reset(buffer->getPosition(0));
else
@ -168,3 +182,6 @@ protected:
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MESH_SCENE_NODE_H_INCLUDED__
#define __I_MESH_SCENE_NODE_H_INCLUDED__
#include "ISceneNode.h"
@ -13,18 +14,20 @@ namespace scene
class IMesh;
//! A scene node displaying a static mesh
class IMeshSceneNode : public ISceneNode
{
public:
//! Constructor
/** Use setMesh() to set the mesh to display.
*/
IMeshSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1, 1, 1)) :
ISceneNode(parent, mgr, id, position, rotation, scale) {}
const core::vector3df& scale = core::vector3df(1,1,1))
: ISceneNode(parent, mgr, id, position, rotation, scale) {}
//! Sets a new mesh to display
/** \param mesh Mesh to display. */
@ -48,3 +51,7 @@ public:
} // end namespace scene
} // end namespace irr
#endif

58
include/IMeshWriter.h Normal file
View File

@ -0,0 +1,58 @@
// 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_MESH_WRITER_H_INCLUDED__
#define __IRR_I_MESH_WRITER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "EMeshWriterEnums.h"
namespace irr
{
namespace io
{
class IWriteFile;
} // end namespace io
namespace scene
{
class IMesh;
//! Interface for writing meshes
class IMeshWriter : public virtual IReferenceCounted
{
public:
//! Destructor
virtual ~IMeshWriter() {}
//! Get the type of the mesh writer
/** For own implementations, use MAKE_IRR_ID as shown in the
EMESH_WRITER_TYPE enumeration to return your own unique mesh
type id.
\return Type of the mesh writer. */
virtual EMESH_WRITER_TYPE getType() const = 0;
//! Write a static mesh.
/** \param file File handle to write the mesh to.
\param mesh Pointer to mesh to be written.
\param flags Optional flags to set properties of the writer.
\return True if successful */
virtual bool writeMesh(io::IWriteFile* file, scene::IMesh* mesh,
s32 flags=EMWF_NONE) = 0;
// Writes an animated mesh
// for future use, only b3d writer is able to write animated meshes currently and that was implemented using the writeMesh above.
/* \return Returns true if successful */
//virtual bool writeAnimatedMesh(io::IWriteFile* file,
// scene::IAnimatedMesh* mesh,
// s32 flags=EMWF_NONE) = 0;
};
} // end namespace
} // end namespace
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_OS_OPERATOR_H_INCLUDED__
#define __I_OS_OPERATOR_H_INCLUDED__
#include "IReferenceCounted.h"
#include "irrString.h"
@ -10,11 +11,11 @@
namespace irr
{
//! The OSOperator provides OS-specific methods and information.
//! The Operating system operator provides operation system specific methods and information.
class IOSOperator : public virtual IReferenceCounted
{
public:
//! Get the current OS version as string.
//! Get the current operation system version as string.
virtual const core::stringc& getOperatingSystemVersion() const = 0;
//! Copies text to the clipboard
@ -40,6 +41,9 @@ public:
\param availableBytes: will contain the available memory in Kilobytes (1024 B)
\return True if successful, false if not */
virtual bool getSystemMemory(u32* totalBytes, u32* availableBytes) const = 0;
};
} // end namespace
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_READ_FILE_H_INCLUDED__
#define __I_READ_FILE_H_INCLUDED__
#include "IReferenceCounted.h"
#include "coreutil.h"
@ -55,3 +56,6 @@ IReadFile *createLimitReadFile(const io::path &fileName, IReadFile *alreadyOpene
} // end namespace io
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_IREFERENCE_COUNTED_H_INCLUDED__
#define __I_IREFERENCE_COUNTED_H_INCLUDED__
#include "irrTypes.h"
@ -40,9 +41,10 @@ is stored somewhere by the driver.
class IReferenceCounted
{
public:
//! Constructor.
IReferenceCounted() :
DebugName(0), ReferenceCounter(1)
IReferenceCounted()
: DebugName(0), ReferenceCounter(1)
{
}
@ -117,7 +119,8 @@ public:
_IRR_DEBUG_BREAK_IF(ReferenceCounter <= 0)
--ReferenceCounter;
if (!ReferenceCounter) {
if (!ReferenceCounter)
{
delete this;
return true;
}
@ -142,6 +145,7 @@ public:
}
protected:
//! Sets the debug name of the object.
/** The Debugname may only be set and changed by the object
itself. This method should only be used in Debug mode.
@ -152,6 +156,7 @@ protected:
}
private:
//! The debug name.
const c8* DebugName;
@ -160,3 +165,6 @@ private:
};
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_RENDER_TARGET_H_INCLUDED__
#define __I_RENDER_TARGET_H_INCLUDED__
#include "IReferenceCounted.h"
#include "EDriverTypes.h"
@ -29,9 +30,9 @@ enum E_CUBE_SURFACE
class IRenderTarget : public virtual IReferenceCounted
{
public:
//! constructor
IRenderTarget() :
DepthStencil(0), DriverType(EDT_NULL)
IRenderTarget() : DepthStencil(0), DriverType(EDT_NULL)
{
}
@ -69,9 +70,12 @@ public:
//! You can pass getDepthStencil() for depthStencil if you don't want to change that one
void setTexture(ITexture* texture, ITexture* depthStencil)
{
if (texture) {
if ( texture )
{
setTextures(&texture, 1, depthStencil);
} else {
}
else
{
setTextures(0, 0, depthStencil);
}
}
@ -79,9 +83,12 @@ public:
//! Set one cube surface texture.
void setTexture(ITexture* texture, ITexture* depthStencil, E_CUBE_SURFACE cubeSurface)
{
if (texture) {
if ( texture )
{
setTextures(&texture, 1, depthStencil, &cubeSurface, 1);
} else {
}
else
{
setTextures(0, 0, depthStencil, &cubeSurface, 1);
}
}
@ -93,6 +100,7 @@ public:
}
protected:
//! Set multiple textures.
// NOTE: working with pointers instead of arrays to avoid unnecessary memory allocations for the single textures case
virtual void setTextures(ITexture* const * textures, u32 numTextures, ITexture* depthStencil, const E_CUBE_SURFACE* cubeSurfaces=0, u32 numCubeSurfaces=0) = 0;
@ -117,3 +125,5 @@ private:
}
}
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_SCENE_COLLISION_MANAGER_H_INCLUDED__
#define __I_SCENE_COLLISION_MANAGER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "position2d.h"
@ -18,6 +19,7 @@ class ICameraSceneNode;
class ISceneCollisionManager : public virtual IReferenceCounted
{
public:
//! Returns a 3d ray which would go through the 2d screen coordinates.
/** \param pos: Screen coordinates in pixels.
\param camera: Camera from which the ray starts. If null, the
@ -27,7 +29,10 @@ public:
would be behind the 2d screen coordinates. */
virtual core::line3d<f32> getRayFromScreenCoordinates(
const core::position2d<s32>& pos, const ICameraSceneNode* camera = 0) = 0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_SCENE_MANAGER_H_INCLUDED__
#define __I_SCENE_MANAGER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "irrArray.h"
@ -12,6 +13,7 @@
#include "dimension2d.h"
#include "SColor.h"
#include "ESceneNodeTypes.h"
#include "EMeshWriterEnums.h"
#include "SceneParameters.h"
#include "ISkinnedMesh.h"
@ -107,6 +109,7 @@ class ISceneCollisionManager;
class IMeshLoader;
class IMeshManipulator;
class IMeshSceneNode;
class IMeshWriter;
class ISceneNode;
class ISceneNodeFactory;
@ -126,7 +129,8 @@ addExternalMeshLoader() to add new formats to the engine.
class ISceneManager : public virtual IReferenceCounted
{
public:
//! Get pointer to an animatable mesh. Loads the file if not loaded already.
//! Get pointer to an animateable mesh. Loads the file if not loaded already.
/**
* If you want to remove a loaded mesh from the cache again, use removeMesh().
* Currently there are the following mesh formats supported:
@ -505,7 +509,7 @@ public:
//! Clear all nodes which are currently registered for rendering
/** Usually you don't have to care about this as drawAll will clear nodes
after rendering them. But sometimes you might have to manually reset this.
after rendering them. But sometimes you might have to manully reset this.
For example when you deleted nodes between registering and rendering. */
virtual void clearAllRegisteredNodesForRendering() = 0;
@ -599,6 +603,11 @@ public:
See IReferenceCounted::drop() for more information. */
virtual ISceneManager* createNewSceneManager(bool cloneContent=false) = 0;
//! Get a mesh writer implementation if available
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
for details. */
virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type) = 0;
//! Get a skinned mesh, which is not available as header-only code
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
for details. */
@ -628,5 +637,9 @@ public:
virtual bool isCulled(const ISceneNode* node) const =0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_SCENE_NODE_H_INCLUDED__
#define __I_SCENE_NODE_H_INCLUDED__
#include "IReferenceCounted.h"
#include "ESceneNodeTypes.h"
@ -13,9 +14,7 @@
#include "aabbox3d.h"
#include "matrix4.h"
#include "IAttributes.h"
#include <list>
#include <optional>
namespace irr
{
@ -38,13 +37,13 @@ a walking character on a moving platform on a moving ship.
class ISceneNode : virtual public IReferenceCounted
{
public:
//! Constructor
ISceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id=-1,
const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) :
RelativeTranslation(position),
RelativeRotation(rotation), RelativeScale(scale),
const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f))
: RelativeTranslation(position), RelativeRotation(rotation), RelativeScale(scale),
Parent(0), SceneManager(mgr), ID(id),
AutomaticCullingState(EAC_BOX), DebugDataVisible(EDS_OFF),
IsVisible(true), IsDebugObject(false)
@ -55,6 +54,7 @@ public:
updateAbsolutePosition();
}
//! Destructor
virtual ~ISceneNode()
{
@ -62,9 +62,10 @@ public:
removeAll();
}
//! This method is called just before the rendering process of the whole scene.
/** Nodes may register themselves in the render pipeline during this call,
precalculate the geometry which should be rendered, and prevent their
precalculate the geometry which should be renderered, and prevent their
children from being able to register themselves if they are clipped by simply
not calling their OnRegisterSceneNode method.
If you are implementing your own scene node, you should overwrite this method
@ -78,13 +79,15 @@ public:
*/
virtual void OnRegisterSceneNode()
{
if (IsVisible) {
if (IsVisible)
{
ISceneNodeList::iterator it = Children.begin();
for (; it != Children.end(); ++it)
(*it)->OnRegisterSceneNode();
}
}
//! OnAnimate() is called just before rendering the whole scene.
/** Nodes may calculate or store animations here, and may do other useful things,
depending on what they are. Also, OnAnimate() should be called for all
@ -93,7 +96,8 @@ public:
\param timeMs Current time in milliseconds. */
virtual void OnAnimate(u32 timeMs)
{
if (IsVisible) {
if (IsVisible)
{
// update absolute position
updateAbsolutePosition();
@ -105,23 +109,35 @@ public:
}
}
//! Renders the node.
virtual void render() = 0;
//! Returns the name of the node.
/** \return Name as character string. */
virtual const std::optional<std::string> &getName() const
virtual const c8* getName() const
{
return Name;
return Name.c_str();
}
//! Sets the name of the node.
/** \param name New name of the scene node. */
virtual void setName(const std::optional<std::string> &name)
virtual void setName(const c8* name)
{
Name = name;
}
//! Sets the name of the node.
/** \param name New name of the scene node. */
virtual void setName(const core::stringc& name)
{
Name = name;
}
//! Get the axis aligned, not transformed bounding box of this node.
/** This means that if this node is an animated 3d character,
moving in a room, the bounding box will always be around the
@ -132,6 +148,7 @@ public:
\return The non-transformed bounding box. */
virtual const core::aabbox3d<f32>& getBoundingBox() const = 0;
//! Get the axis aligned, transformed and animated absolute bounding box of this node.
/** Note: The result is still an axis-aligned bounding box, so it's size
changes with rotation.
@ -168,6 +185,7 @@ public:
return AbsoluteTransformation;
}
//! Returns the relative transformation of the scene node.
/** The relative transformation is stored internally as 3
vectors: translation, rotation and scale. To get the relative
@ -179,7 +197,8 @@ public:
mat.setRotationDegrees(RelativeRotation);
mat.setTranslation(RelativeTranslation);
if (RelativeScale != core::vector3df(1.f, 1.f, 1.f)) {
if (RelativeScale != core::vector3df(1.f,1.f,1.f))
{
core::matrix4 smat;
smat.setScale(RelativeScale);
mat *= smat;
@ -188,6 +207,7 @@ public:
return mat;
}
//! Returns whether the node should be visible (if all of its parents are visible).
/** This is only an option set by the user, but has nothing to
do with geometry culling
@ -222,6 +242,7 @@ public:
IsVisible = isVisible;
}
//! Get the id of the scene node.
/** This id can be used to identify the node.
\return The id. */
@ -230,6 +251,7 @@ public:
return ID;
}
//! Sets the id of the scene node.
/** This id can be used to identify the node.
\param id The new id. */
@ -238,59 +260,66 @@ public:
ID = id;
}
//! Adds a child to this scene node.
/** If the scene node already has a parent it is first removed
from the other parent.
\param child A pointer to the new child. */
virtual void addChild(ISceneNode* child)
{
if (child && (child != this)) {
if (child && (child != this))
{
// Change scene manager?
if (SceneManager != child->SceneManager)
child->setSceneManager(SceneManager);
child->grab();
child->remove(); // remove from old parent
// Note: This iterator is not invalidated until we erase it.
child->ThisIterator = Children.insert(Children.end(), child);
Children.push_back(child);
child->Parent = this;
}
}
//! Removes a child from this scene node.
/**
/** If found in the children list, the child pointer is also
dropped and might be deleted if no other grab exists.
\param child A pointer to the child which shall be removed.
\return True if the child was removed, and false if not,
e.g. because it belongs to a different parent or no parent. */
e.g. because it couldn't be found in the children list. */
virtual bool removeChild(ISceneNode* child)
{
if (child->Parent != this)
return false;
// The iterator must be set since the parent is not null.
_IRR_DEBUG_BREAK_IF(!child->ThisIterator.has_value());
auto it = *child->ThisIterator;
child->ThisIterator = std::nullopt;
child->Parent = nullptr;
child->drop();
ISceneNodeList::iterator it = Children.begin();
for (; it != Children.end(); ++it)
if ((*it) == child)
{
(*it)->Parent = 0;
(*it)->drop();
Children.erase(it);
return true;
}
return false;
}
//! Removes all children of this scene node
/** The scene nodes found in the children list are also dropped
and might be deleted if no other grab exists on them.
*/
virtual void removeAll()
{
for (auto &child : Children) {
child->Parent = nullptr;
child->ThisIterator = std::nullopt;
child->drop();
ISceneNodeList::iterator it = Children.begin();
for (; it != Children.end(); ++it)
{
(*it)->Parent = 0;
(*it)->drop();
}
Children.clear();
}
//! Removes this scene node from the scene
/** If no other grab exists for this node, it will be deleted.
*/
@ -300,6 +329,7 @@ public:
Parent->removeChild(this);
}
//! Returns the material based on the zero based index i.
/** To get the amount of materials used by this scene node, use
getMaterialCount(). This function is needed for inserting the
@ -313,6 +343,7 @@ public:
return video::IdentityMaterial;
}
//! Get amount of materials used by this scene node.
/** \return Current amount of materials of this scene node. */
virtual u32 getMaterialCount() const
@ -320,17 +351,18 @@ public:
return 0;
}
//! Execute a function on all materials of this scene node.
/** Useful for setting material properties, e.g. if you want the whole
mesh to be affected by light. */
template <typename F>
void forEachMaterial(F &&fn)
{
void forEachMaterial(F &&fn) {
for (u32 i = 0; i < getMaterialCount(); i++) {
fn(getMaterial(i));
}
}
//! Gets the scale of the scene node relative to its parent.
/** This is the scale of this node relative to its parent.
If you want the absolute scale, use
@ -341,6 +373,7 @@ public:
return RelativeScale;
}
//! Sets the relative scale of the scene node.
/** \param scale New scale of the node, relative to its parent. */
virtual void setScale(const core::vector3df& scale)
@ -348,6 +381,7 @@ public:
RelativeScale = scale;
}
//! Gets the rotation of the node relative to its parent.
/** Note that this is the relative rotation of the node.
If you want the absolute rotation, use
@ -358,6 +392,7 @@ public:
return RelativeRotation;
}
//! Sets the rotation of the node relative to its parent.
/** This only modifies the relative rotation of the node.
\param rotation New rotation of the node in degrees. */
@ -366,6 +401,7 @@ public:
RelativeRotation = rotation;
}
//! Gets the position of the node relative to its parent.
/** Note that the position is relative to the parent. If you want
the position in world coordinates, use getAbsolutePosition() instead.
@ -375,6 +411,7 @@ public:
return RelativeTranslation;
}
//! Sets the position of the node relative to its parent.
/** Note that the position is relative to the parent.
\param newpos New relative position of the scene node. */
@ -383,6 +420,7 @@ public:
RelativeTranslation = newpos;
}
//! Gets the absolute position of the node in world coordinates.
/** If you want the position of the node relative to its parent,
use getPosition() instead.
@ -397,6 +435,7 @@ public:
return AbsoluteTransformation.getTranslation();
}
//! Set a culling style or disable culling completely.
/** Box cullling (EAC_BOX) is set by default. Note that not
all SceneNodes support culling and that some nodes always cull
@ -408,6 +447,7 @@ public:
AutomaticCullingState = state;
}
//! Gets the automatic culling state.
/** \return The automatic culling state. */
u32 getAutomaticCulling() const
@ -415,6 +455,7 @@ public:
return AutomaticCullingState;
}
//! Sets if debug data like bounding boxes should be drawn.
/** A bitwise OR of the types from @ref irr::scene::E_DEBUG_SCENE_TYPE.
Please note that not all scene nodes support all debug data types.
@ -432,6 +473,7 @@ public:
return DebugDataVisible;
}
//! Sets if this scene node is a debug object.
/** Debug objects have some special properties, for example they can be easily
excluded from collision detection or from serialization, etc. */
@ -440,6 +482,7 @@ public:
IsDebugObject = debugObject;
}
//! Returns if this scene node is a debug object.
/** Debug objects have some special properties, for example they can be easily
excluded from collision detection or from serialization, etc.
@ -449,6 +492,7 @@ public:
return IsDebugObject;
}
//! Returns a const reference to the list of all children.
/** \return The list of all children of this node. */
const std::list<ISceneNode*>& getChildren() const
@ -456,6 +500,7 @@ public:
return Children;
}
//! Changes the parent of the scene node.
/** \param newParent The new parent to be used. */
virtual void setParent(ISceneNode* newParent)
@ -463,24 +508,30 @@ public:
grab();
remove();
if (newParent)
newParent->addChild(this);
Parent = newParent;
if (Parent)
Parent->addChild(this);
drop();
}
//! Updates the absolute position based on the relative and the parents position
/** Note: This does not recursively update the parents absolute positions, so if you have a deeper
hierarchy you might want to update the parents first.*/
virtual void updateAbsolutePosition()
{
if (Parent) {
if (Parent)
{
AbsoluteTransformation =
Parent->getAbsoluteTransformation() * getRelativeTransformation();
} else
}
else
AbsoluteTransformation = getRelativeTransformation();
}
//! Returns the parent of this scene node
/** \return A pointer to the parent. */
scene::ISceneNode* getParent() const
@ -488,6 +539,7 @@ public:
return Parent;
}
//! Returns type of the scene node
/** \return The type of this node. */
virtual ESCENE_NODE_TYPE getType() const
@ -509,6 +561,7 @@ public:
virtual ISceneManager* getSceneManager(void) const { return SceneManager; }
protected:
//! A clone function for the ISceneNode members.
/** This method can be used by clone() implementations of
derived classes
@ -551,7 +604,7 @@ protected:
}
//! Name of the scene node.
std::optional<std::string> Name;
core::stringc Name;
//! Absolute transformation of the node.
core::matrix4 AbsoluteTransformation;
@ -565,15 +618,12 @@ protected:
//! Relative scale of the scene node.
core::vector3df RelativeScale;
//! List of all children of this node
std::list<ISceneNode *> Children;
//! Iterator pointing to this node in the parent's child list.
std::optional<ISceneNodeList::iterator> ThisIterator;
//! Pointer to the parent
ISceneNode* Parent;
//! List of all children of this node
std::list<ISceneNode*> Children;
//! Pointer to the scene manager
ISceneManager* SceneManager;
@ -593,5 +643,9 @@ protected:
bool IsDebugObject;
};
} // end namespace scene
} // end namespace irr
#endif

Some files were not shown because too many files have changed in this diff Show More