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: jobs:
linux-gl: linux-gl:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
container:
image: ubuntu:bionic
env: { LANG: "C.UTF-8" }
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update apt-get update
sudo apt-get install g++ cmake libxi-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy apt-get install g++ cmake libxi-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
- name: Build - name: Build
run: | run: |
cmake . -DUSE_SDL2=OFF cmake .
make VERBOSE=1 -j2 make VERBOSE=1 -j2
- name: Test
run: |
ctest --output-on-failure
- name: Package - name: Package
run: | run: |
make DESTDIR=$PWD/_install install make DESTDIR=$PWD/_install install
tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local . tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local .
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v3
with: with:
name: irrlicht-linux name: irrlicht-linux
path: ./irrlicht-linux.tar.gz path: ./irrlicht-linux.tar.gz
linux-gles: linux-gles:
# Xvfb test is broken on 20.04 for unknown reasons (not our bug) runs-on: ubuntu-latest
runs-on: ubuntu-22.04 container:
image: ubuntu:bionic
env: { LANG: "C.UTF-8" }
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update apt-get update
sudo apt-get install g++ cmake libxi-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy apt-get install g++ cmake libxi-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
- name: Build - name: Build
run: | run: |
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 make -j2
- name: Test (headless) - name: Test (headless)
@ -61,17 +62,20 @@ jobs:
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest ogles2 LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest ogles2
linux-sdl: linux-sdl:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
container:
image: ubuntu:jammy
env: { LANG: "C.UTF-8" }
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update apt-get update
sudo apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev -qyy apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
- name: Build - name: Build
run: | run: |
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON -DCMAKE_BUILD_TYPE=Debug cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON
make -j2 make -j2
- name: Test (headless) - name: Test (headless)
@ -80,14 +84,16 @@ jobs:
./AutomatedTest null ./AutomatedTest null
linux-sdl-gl3: linux-sdl-gl3:
# Xvfb test is broken on 20.04 for unknown reasons (not our bug) runs-on: ubuntu-latest
runs-on: ubuntu-22.04 container:
image: ubuntu:jammy
env: { LANG: "C.UTF-8" }
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update apt-get update
sudo apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
- name: Build - name: Build
run: | run: |
@ -105,13 +111,16 @@ jobs:
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest opengl3 LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest opengl3
linux-sdl-gles2: linux-sdl-gles2:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
container:
image: ubuntu:jammy
env: { LANG: "C.UTF-8" }
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update apt-get update
sudo apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
- name: Build - name: Build
run: | run: |
@ -130,7 +139,7 @@ jobs:
mingw: mingw:
name: "MinGW ${{matrix.config.variant}}${{matrix.config.extras}}" name: "MinGW ${{matrix.config.variant}}${{matrix.config.extras}}"
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@ -140,21 +149,22 @@ jobs:
- {variant: win32, arch: i686, extras: "-sdl"} - {variant: win32, arch: i686, extras: "-sdl"}
- {variant: win64, arch: x86_64, extras: "-sdl"} - {variant: win64, arch: x86_64, extras: "-sdl"}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install compiler - name: Install compiler
run: | run: |
sudo apt-get update && sudo apt-get install cmake -qyy sudo apt-get update && sudo apt-get install cmake -qyy
./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 - name: Build
run: | run: |
./scripts/ci-build-mingw.sh package ./scripts/ci-build-mingw.sh package
env: env:
CC: ${{matrix.config.arch}}-w64-mingw32-clang CC: ${{matrix.config.arch}}-w64-mingw32-gcc
CXX: ${{matrix.config.arch}}-w64-mingw32-clang++ CXX: ${{matrix.config.arch}}-w64-mingw32-g++
extras: ${{matrix.config.extras}} extras: ${{matrix.config.extras}}
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v3
with: with:
name: irrlicht-${{matrix.config.variant}}${{matrix.config.extras}} name: irrlicht-${{matrix.config.variant}}${{matrix.config.extras}}
path: ./irrlicht-${{matrix.config.variant}}${{matrix.config.extras}}.zip path: ./irrlicht-${{matrix.config.variant}}${{matrix.config.extras}}.zip
@ -162,14 +172,11 @@ jobs:
macos: macos:
runs-on: macos-latest runs-on: macos-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
brew update --auto-update brew update
brew install cmake libpng jpeg brew install cmake libpng jpeg
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Build - name: Build
run: | run: |
@ -180,30 +187,13 @@ jobs:
run: | run: |
./bin/OSX/AutomatedTest null ./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: msvc:
name: VS 2019 ${{ matrix.config.arch }} ${{ matrix.sdl.label }} name: VS 2019 ${{ matrix.config.arch }} ${{ matrix.sdl.label }}
runs-on: windows-2019 runs-on: windows-2019
env: env:
VCPKG_VERSION: 8eb57355a4ffb410a2e94c07b4dca2dffbee8e50 VCPKG_VERSION: 14e7bb4ae24616ec54ff6b2f6ef4e8659434ea44
# 2023.10.19 # 2022.05.10
vcpkg_packages: zlib libpng libjpeg-turbo vcpkg_packages: zlib libpng libjpeg-turbo opengl-registry
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@ -220,7 +210,6 @@ jobs:
- -
use: FALSE use: FALSE
label: '(no SDL)' label: '(no SDL)'
vcpkg_packages: opengl-registry
- -
use: TRUE use: TRUE
label: '(with SDL)' label: '(with SDL)'
@ -228,7 +217,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v3
- name: Restore from cache and run vcpkg - name: Restore from cache and run vcpkg
uses: lukka/run-vcpkg@v7 uses: lukka/run-vcpkg@v7
@ -261,50 +250,7 @@ jobs:
run: move include artifact/ run: move include artifact/
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v3
with: with:
name: msvc-${{ matrix.config.arch }}-${{matrix.sdl.use}} name: msvc-${{ matrix.config.arch }}
path: artifact/ 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 }}

3
.gitignore vendored
View File

@ -5,7 +5,6 @@ install_manifest.txt
IrrlichtMtConfig.cmake IrrlichtMtConfig.cmake
IrrlichtMtConfigVersion.cmake IrrlichtMtConfigVersion.cmake
IrrlichtMtTargets.cmake IrrlichtMtTargets.cmake
CTestTestfile.cmake
Makefile Makefile
libs/* libs/*
*.so* *.so*
@ -22,4 +21,4 @@ scripts/glext.h
*visualstudio/ *visualstudio/
# vscode cmake plugin # vscode cmake plugin
build/* build/*

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 project(Irrlicht
VERSION 1.9.0.${IRRLICHTMT_REVISION} VERSION 1.9.0.${IRRLICHTMT_REVISION}
@ -9,9 +16,6 @@ project(Irrlicht
message(STATUS "*** Building IrrlichtMt ${PROJECT_VERSION} ***") message(STATUS "*** Building IrrlichtMt ${PROJECT_VERSION} ***")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(GNUInstallDirs) include(GNUInstallDirs)
if(ANDROID) if(ANDROID)
@ -34,9 +38,7 @@ if(NOT CMAKE_BUILD_TYPE)
endif() endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
enable_testing() add_subdirectory(source/Irrlicht)
add_subdirectory(src)
add_subdirectory(test)
option(BUILD_EXAMPLES "Build example applications" FALSE) option(BUILD_EXAMPLES "Build example applications" FALSE)
if(BUILD_EXAMPLES) if(BUILD_EXAMPLES)

View File

@ -1,11 +1,5 @@
@PACKAGE_INIT@ @PACKAGE_INIT@
include(CMakeFindDependencyMacro)
if(NOT TARGET IrrlichtMt::IrrlichtMt) 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") include("${CMAKE_CURRENT_LIST_DIR}/IrrlichtMtTargets.cmake")
endif() 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 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. This is a fork by the [Minetest](https://github.com/minetest) developers that was stripped-down and customized specifically for use in 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.
It is intentionally not compatible to upstream and is planned to be eventually absorbed into Minetest. It is intentionally not compatible to upstream and is planned to be eventually absorbed into Minetest.
Build Build
@ -23,7 +16,6 @@ The following libraries are required to be installed:
* OpenGL * OpenGL
* or on mobile: OpenGL ES (can be optionally enabled on desktop too) * or on mobile: OpenGL ES (can be optionally enabled on desktop too)
* on Unix: X11 * on Unix: X11
* SDL2 (see below)
Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the following options are available: Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the following options are available:
* `BUILD_SHARED_LIBS` (default: `ON`) - Build IrrlichtMt as a shared library * `BUILD_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_OPENGL3` (default: `OFF`) - Enable OpenGL 3+ driver
* `ENABLE_GLES1` - Enable OpenGL ES driver, legacy * `ENABLE_GLES1` - Enable OpenGL ES driver, legacy
* `ENABLE_GLES2` - Enable OpenGL ES 2+ driver * `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: 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: 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: 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

@ -1,154 +1,162 @@
#include <iostream> #include <iostream>
#include <irrlicht.h> #include <irrlicht.h>
#include "exampleHelper.h" #include "exampleHelper.h"
using namespace irr; using namespace irr;
static IrrlichtDevice *device = nullptr; static IrrlichtDevice *device = nullptr;
static int test_fail = 0; static int test_fail = 0;
void test_irr_array(); void test_irr_array();
void test_irr_string(); void test_irr_string();
static video::E_DRIVER_TYPE chooseDriver(core::stringc arg_) static video::E_DRIVER_TYPE chooseDriver(core::stringc arg_)
{ {
if (arg_ == "null") if (arg_ == "null")
return video::EDT_NULL; return video::EDT_NULL;
if (arg_ == "ogles1") if (arg_ == "ogles1")
return video::EDT_OGLES1; return video::EDT_OGLES1;
if (arg_ == "ogles2") if (arg_ == "ogles2")
return video::EDT_OGLES2; return video::EDT_OGLES2;
if (arg_ == "opengl") if (arg_ == "opengl")
return video::EDT_OPENGL; return video::EDT_OPENGL;
if (arg_ == "opengl3") if (arg_ == "opengl3")
return video::EDT_OPENGL3; return video::EDT_OPENGL3;
std::cerr << "Unknown driver type: " << arg_.c_str() << ". Trying OpenGL." << std::endl; std::cerr << "Unknown driver type: " << arg_.c_str() << ". Trying OpenGL." << std::endl;
return video::EDT_OPENGL; return video::EDT_OPENGL;
} }
static inline void check(bool ok, const char *msg) 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); 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; std::cout << "Running unit tests:" << std::endl;
try { try {
test_irr_array(); test_irr_array();
test_irr_string(); test_irr_string();
} catch (const std::exception &e) { } catch (const std::exception &e) {
std::cerr << e.what() << std::endl; std::cerr << e.what() << std::endl;
test_fail++; test_fail++;
} }
std::cout << std::endl; std::cout << std::endl;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
run_unit_tests(); run_unit_tests();
SIrrlichtCreationParameters p; SIrrlichtCreationParameters p;
p.DriverType = chooseDriver(argc > 1 ? argv[1] : ""); p.DriverType = chooseDriver(argc > 1 ? argv[1] : "");
p.WindowSize = core::dimension2du(640, 480); p.WindowSize = core::dimension2du(640, 480);
p.Vsync = true; p.Vsync = true;
p.LoggingLevel = ELL_DEBUG; p.LoggingLevel = ELL_DEBUG;
device = createDeviceEx(p); device = createDeviceEx(p);
if (!device) if (!device)
return 1; return 1;
{ {
u32 total = 0; u32 total = 0;
device->getOSOperator()->getSystemMemory(&total, nullptr); device->getOSOperator()->getSystemMemory(&total, nullptr);
core::stringc message = core::stringc("Total RAM in MiB: ") + core::stringc(total >> 10); core::stringc message = core::stringc("Total RAM in MiB: ") + core::stringc(total >> 10);
device->getLogger()->log(message.c_str(), ELL_INFORMATION); device->getLogger()->log(message.c_str(), ELL_INFORMATION);
check(total > 130 * 1024, "RAM amount"); check(total > 130 * 1024, "RAM amount");
} }
device->setWindowCaption(L"Hello World!"); device->setWindowCaption(L"Hello World!");
device->setResizable(true); device->setResizable(true);
video::IVideoDriver *driver = device->getVideoDriver(); video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager *smgr = device->getSceneManager(); scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment *guienv = device->getGUIEnvironment(); gui::IGUIEnvironment* guienv = device->getGUIEnvironment();
guienv->addStaticText(L"sample text", core::rect<s32>(10, 10, 110, 22), false); guienv->addStaticText(L"sample text", core::rect<s32>(10,10,110,22), false);
gui::IGUIButton *button = guienv->addButton( gui::IGUIButton* button = guienv->addButton(
core::rect<s32>(10, 30, 110, 30 + 32), 0, -1, L"sample button", core::rect<s32>(10,30,110,30 + 32), 0, -1, L"sample button",
L"sample tooltip"); L"sample tooltip");
gui::IGUIEditBox *editbox = guienv->addEditBox(L"", gui::IGUIEditBox* editbox = guienv->addEditBox(L"",
core::rect<s32>(10, 70, 60, 70 + 16)); core::rect<s32>(10,70,60,70 + 16));
const io::path mediaPath = getExampleMediaPath(); const io::path mediaPath = getExampleMediaPath();
auto mesh_file = device->getFileSystem()->createAndOpenFile(mediaPath + "coolguy_opt.x"); auto mesh_file = device->getFileSystem()->createAndOpenFile(mediaPath + "coolguy_opt.x");
check(mesh_file, "mesh file loading"); check(mesh_file, "mesh file loading");
scene::IAnimatedMesh *mesh = smgr->getMesh(mesh_file); scene::IAnimatedMesh* mesh = smgr->getMesh(mesh_file);
check(mesh, "mesh loading"); check(mesh, "mesh loading");
if (mesh_file) if (mesh_file)
mesh_file->drop(); mesh_file->drop();
if (mesh) { if (mesh)
video::ITexture *tex = driver->getTexture(mediaPath + "cooltexture.png"); {
check(tex, "texture loading"); video::ITexture* tex = driver->getTexture(mediaPath + "cooltexture.png");
scene::IAnimatedMeshSceneNode *node = smgr->addAnimatedMeshSceneNode(mesh); check(tex, "texture loading");
if (node) { scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
node->forEachMaterial([tex](video::SMaterial &mat) { if (node)
mat.Lighting = false; {
mat.setTexture(0, tex); node->forEachMaterial([tex] (video::SMaterial &mat) {
}); mat.Lighting = false;
node->setFrameLoop(0, 29); mat.setTexture(0, tex);
node->setAnimationSpeed(30); });
} node->setFrameLoop(0, 29);
} node->setAnimationSpeed(30);
}
smgr->addCameraSceneNode(0, core::vector3df(0, 4, 5), core::vector3df(0, 2, 0)); }
s32 n = 0; smgr->addCameraSceneNode(0, core::vector3df(0,4,5), core::vector3df(0,2,0));
SEvent event;
device->getTimer()->start(); s32 n = 0;
SEvent event;
while (device->run()) { device->getTimer()->start();
if (device->getTimer()->getTime() >= 1000) {
device->getTimer()->setTime(0); while (device->run())
++n; {
if (n == 1) { // Tooltip display if (device->getTimer()->getTime() >= 1000)
bzero(&event, sizeof(SEvent)); {
event.EventType = irr::EET_MOUSE_INPUT_EVENT; device->getTimer()->setTime(0);
event.MouseInput.Event = irr::EMIE_MOUSE_MOVED; ++n;
event.MouseInput.X = button->getAbsolutePosition().getCenter().X; if (n == 1) // Tooltip display
event.MouseInput.Y = button->getAbsolutePosition().getCenter().Y; {
device->postEventFromUser(event); bzero(&event, sizeof(SEvent));
} else if (n == 2) // Text input focus event.EventType = irr::EET_MOUSE_INPUT_EVENT;
guienv->setFocus(editbox); event.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
else if (n == 3) { // Keypress for Text input event.MouseInput.X = button->getAbsolutePosition().getCenter().X;
bzero(&event, sizeof(SEvent)); event.MouseInput.Y = button->getAbsolutePosition().getCenter().Y;
event.EventType = irr::EET_KEY_INPUT_EVENT; device->postEventFromUser(event);
event.KeyInput.Char = L'a'; }
event.KeyInput.Key = KEY_KEY_A; else if (n == 2) // Text input focus
event.KeyInput.PressedDown = true; guienv->setFocus(editbox);
device->postEventFromUser(event); else if (n == 3) // Keypress for Text input
event.KeyInput.PressedDown = false; {
device->postEventFromUser(event); bzero(&event, sizeof(SEvent));
} else event.EventType = irr::EET_KEY_INPUT_EVENT;
device->closeDevice(); event.KeyInput.Char = L'a';
} event.KeyInput.Key = KEY_KEY_A;
event.KeyInput.PressedDown = true;
driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, device->postEventFromUser(event);
video::SColor(255, 100, 100, 150)); event.KeyInput.PressedDown = false;
smgr->drawAll(); device->postEventFromUser(event);
guienv->drawAll(); }
driver->endScene(); else
} device->closeDevice();
}
check(core::stringw(L"a") == editbox->getText(), "EditBox text");
driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH,
device->getLogger()->log("Done.", ELL_INFORMATION); video::SColor(255,100,100,150));
device->drop(); smgr->drawAll();
return test_fail > 0 ? 1 : 0; guienv->drawAll();
} driver->endScene();
}
check(core::stringw(L"a") == editbox->getText(), "EditBox text");
device->getLogger()->log("Done.", ELL_INFORMATION);
device->drop();
return test_fail > 0 ? 1 : 0;
}

View File

@ -4,8 +4,7 @@
using namespace irr; using namespace irr;
using core::array; using core::array;
static void test_basics() static void test_basics() {
{
array<int> v; array<int> v;
v.push_back(1); // 1 v.push_back(1); // 1
v.push_front(2); // 2, 1 v.push_front(2); // 2, 1
@ -58,8 +57,7 @@ static void test_basics()
UASSERTEQ(v.size(), 2); 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 // Populate the array with 0, 1, 2, ..., 100, 100, 99, 98, 97, ..., 0
array<int> arr; array<int> arr;
for (int i = 0; i <= 100; i++) for (int i = 0; i <= 100; i++)
@ -77,15 +75,14 @@ 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 };
const auto &values = {3, 5, 1, 2, 5, 10, 19, 9, 7, 1, 2, 5, 8, 15};
array<int> arr; array<int> arr;
for (int value : values) { for (int value : values) {
arr.push_back(value); arr.push_back(value);
} }
// Test the const form first, it uses a linear search without sorting // Test the const form first, it uses a linear search without sorting
const array<int> &carr = arr; const array<int> & carr = arr;
UASSERTEQ(carr.binary_search(20), -1); UASSERTEQ(carr.binary_search(20), -1);
UASSERTEQ(carr.binary_search(0), -1); UASSERTEQ(carr.binary_search(0), -1);
UASSERTEQ(carr.binary_search(1), 2); UASSERTEQ(carr.binary_search(1), 2);

View File

@ -3,31 +3,28 @@
#include <exception> #include <exception>
#include <iostream> #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 // Asserts the comparison specified by CMP is true, or fails the current unit test
#define UASSERTCMP(CMP, actual, expected) \ #define UASSERTCMP(CMP, actual, expected) do { \
do { \ const auto &a = (actual); \
const auto &a = (actual); \ const auto &e = (expected); \
const auto &e = (expected); \ if (!CMP(a, e)) { \
if (!CMP(a, e)) { \ std::cout \
std::cout \ << "Test assertion failed: " << #actual << " " << #CMP << " " \
<< "Test assertion failed: " << #actual << " " << #CMP << " " \ << #expected << std::endl \
<< #expected << std::endl \ << " at " << __FILE__ << ":" << __LINE__ << std::endl \
<< " at " << __FILE__ << ":" << __LINE__ << std::endl \ << " actual: " << a << std::endl << " expected: " \
<< " actual: " << a << std::endl \ << e << std::endl; \
<< " expected: " \ throw TestFailedException(); \
<< e << std::endl; \ } \
throw TestFailedException(); \ } while (0)
} \
} while (0)
#define CMPEQ(a, e) (a == e) #define CMPEQ(a, e) (a == e)
#define CMPTRUE(a, e) (a) #define CMPTRUE(a, e) (a)
#define CMPNE(a, e) (a != e) #define CMPNE(a, e) (a != e)
#define UASSERTEQ(actual, expected) UASSERTCMP(CMPEQ, actual, expected) #define UASSERTEQ(actual, expected) UASSERTCMP(CMPEQ, actual, expected)
#define UASSERTNE(actual, nexpected) UASSERTCMP(CMPNE, actual, nexpected) #define UASSERTNE(actual, nexpected) UASSERTCMP(CMPNE, actual, nexpected)
#define UASSERT(actual) UASSERTCMP(CMPTRUE, actual, true) #define UASSERT(actual) UASSERTCMP(CMPTRUE, actual, true)

View File

@ -38,7 +38,7 @@ static void test_basics()
UASSERTSTR(s, "abcdef"); UASSERTSTR(s, "abcdef");
s = L"abcdef"; s = L"abcdef";
UASSERTSTR(s, "abcdef"); UASSERTSTR(s, "abcdef");
s = static_cast<const char *>(nullptr); s = static_cast<const char*>(nullptr);
UASSERTSTR(s, ""); UASSERTSTR(s, "");
// operator+ // operator+
s = s + stringc("foo"); s = s + stringc("foo");
@ -163,37 +163,27 @@ static void test_methods()
UASSERTSTR(res[0], "a"); UASSERTSTR(res[0], "a");
UASSERTSTR(res[2], ""); UASSERTSTR(res[2], "");
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
UASSERTSTR(res[2 * i + 1], ","); UASSERTSTR(res[2*i+1], ",");
} }
static void test_conv() static void test_conv()
{ {
// locale-independent // assumes Unicode and UTF-8 locale
setlocale(LC_CTYPE, "");
stringw out; stringw out;
utf8ToWString(out, "†††"); multibyteToWString(out, "†††");
UASSERTEQ(out.size(), 3); UASSERTEQ(out.size(), 3);
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
UASSERTEQ(static_cast<u16>(out[i]), 0x2020); UASSERTEQ(static_cast<u16>(out[i]), 0x2020);
stringc out2; stringc out2;
wStringToUTF8(out2, L"†††"); wStringToMultibyte(out2, L"†††");
UASSERTEQ(out2.size(), 9); UASSERTEQ(out2.size(), 9);
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
UASSERTEQ(static_cast<u8>(out2[3 * i]), 0xe2); UASSERTEQ(static_cast<u8>(out2[3*i]), 0xe2);
UASSERTEQ(static_cast<u8>(out2[3 * i + 1]), 0x80); UASSERTEQ(static_cast<u8>(out2[3*i+1]), 0x80);
UASSERTEQ(static_cast<u8>(out2[3 * i + 2]), 0xa0); 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() void test_irr_string()

View File

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

@ -1,274 +1,330 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "irrArray.h"
#include "IMeshBuffer.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
//! Template implementation of the IMeshBuffer interface {
template <class T> //! Template implementation of the IMeshBuffer interface
class CMeshBuffer : public IMeshBuffer template <class T>
{ class CMeshBuffer : public IMeshBuffer
public: {
//! Default constructor for empty meshbuffer public:
CMeshBuffer() : //! Default constructor for empty meshbuffer
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)
#ifdef _DEBUG , MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)
setDebugName("CMeshBuffer"); , HWBuffer(NULL)
#endif , PrimitiveType(EPT_TRIANGLES)
} {
#ifdef _DEBUG
//! Get material of this meshbuffer setDebugName("CMeshBuffer");
/** \return Material of this buffer */ #endif
const video::SMaterial &getMaterial() const override }
{
return Material;
} //! Get material of this meshbuffer
/** \return Material of this buffer */
//! Get material of this meshbuffer const video::SMaterial& getMaterial() const override
/** \return Material of this buffer */ {
video::SMaterial &getMaterial() override return Material;
{ }
return Material;
}
//! Get material of this meshbuffer
//! Get pointer to vertices /** \return Material of this buffer */
/** \return Pointer to vertices. */ video::SMaterial& getMaterial() override
const void *getVertices() const override {
{ return Material;
return Vertices.const_pointer(); }
}
//! Get pointer to vertices //! Get pointer to vertices
/** \return Pointer to vertices. */ /** \return Pointer to vertices. */
void *getVertices() override const void* getVertices() const override
{ {
return Vertices.pointer(); return Vertices.const_pointer();
} }
//! Get number of vertices
/** \return Number of vertices. */ //! Get pointer to vertices
u32 getVertexCount() const override /** \return Pointer to vertices. */
{ void* getVertices() override
return Vertices.size(); {
} return Vertices.pointer();
}
//! Get type of index data which is stored in this meshbuffer.
/** \return Index type of this buffer. */
video::E_INDEX_TYPE getIndexType() const override //! Get number of vertices
{ /** \return Number of vertices. */
return video::EIT_16BIT; u32 getVertexCount() const override
} {
return Vertices.size();
//! Get pointer to indices }
/** \return Pointer to indices. */
const u16 *getIndices() const override //! Get type of index data which is stored in this meshbuffer.
{ /** \return Index type of this buffer. */
return Indices.const_pointer(); video::E_INDEX_TYPE getIndexType() const override
} {
return video::EIT_16BIT;
//! Get pointer to indices }
/** \return Pointer to indices. */
u16 *getIndices() override //! Get pointer to indices
{ /** \return Pointer to indices. */
return Indices.pointer(); const u16* getIndices() const override
} {
return Indices.const_pointer();
//! Get number of indices }
/** \return Number of indices. */
u32 getIndexCount() const override
{ //! Get pointer to indices
return Indices.size(); /** \return Pointer to indices. */
} u16* getIndices() override
{
//! Get the axis aligned bounding box return Indices.pointer();
/** \return Axis aligned bounding box of this buffer. */ }
const core::aabbox3d<f32> &getBoundingBox() const override
{
return BoundingBox; //! Get number of indices
} /** \return Number of indices. */
u32 getIndexCount() const override
//! Set the axis aligned bounding box {
/** \param box New axis aligned bounding box for this buffer. */ return Indices.size();
//! set user axis aligned bounding box }
void setBoundingBox(const core::aabbox3df &box) override
{
BoundingBox = box; //! Get the axis aligned bounding box
} /** \return Axis aligned bounding box of this buffer. */
const core::aabbox3d<f32>& getBoundingBox() const override
//! Recalculate the bounding box. {
/** should be called if the mesh changed. */ return BoundingBox;
void recalculateBoundingBox() override }
{
if (!Vertices.empty()) {
BoundingBox.reset(Vertices[0].Pos); //! Set the axis aligned bounding box
const irr::u32 vsize = Vertices.size(); /** \param box New axis aligned bounding box for this buffer. */
for (u32 i = 1; i < vsize; ++i) //! set user axis aligned bounding box
BoundingBox.addInternalPoint(Vertices[i].Pos); void setBoundingBox(const core::aabbox3df& box) override
} else {
BoundingBox.reset(0, 0, 0); BoundingBox = box;
} }
//! Get type of vertex data stored in this buffer.
/** \return Type of vertex data. */ //! Recalculate the bounding box.
video::E_VERTEX_TYPE getVertexType() const override /** should be called if the mesh changed. */
{ void recalculateBoundingBox() override
return T::getType(); {
} if (!Vertices.empty())
{
//! returns position of vertex i BoundingBox.reset(Vertices[0].Pos);
const core::vector3df &getPosition(u32 i) const override const irr::u32 vsize = Vertices.size();
{ for (u32 i=1; i<vsize; ++i)
return Vertices[i].Pos; BoundingBox.addInternalPoint(Vertices[i].Pos);
} }
else
//! returns position of vertex i BoundingBox.reset(0,0,0);
core::vector3df &getPosition(u32 i) override
{ }
return Vertices[i].Pos;
}
//! Get type of vertex data stored in this buffer.
//! returns normal of vertex i /** \return Type of vertex data. */
const core::vector3df &getNormal(u32 i) const override video::E_VERTEX_TYPE getVertexType() const override
{ {
return Vertices[i].Normal; return T::getType();
} }
//! returns normal of vertex i //! returns position of vertex i
core::vector3df &getNormal(u32 i) override const core::vector3df& getPosition(u32 i) const override
{ {
return Vertices[i].Normal; return Vertices[i].Pos;
} }
//! returns texture coord of vertex i //! returns position of vertex i
const core::vector2df &getTCoords(u32 i) const override core::vector3df& getPosition(u32 i) override
{ {
return Vertices[i].TCoords; return Vertices[i].Pos;
} }
//! returns texture coord of vertex i //! returns normal of vertex i
core::vector2df &getTCoords(u32 i) override const core::vector3df& getNormal(u32 i) const override
{ {
return Vertices[i].TCoords; return Vertices[i].Normal;
} }
//! Append the vertices and indices to the current buffer //! returns normal of vertex i
/** Only works for compatible types, i.e. either the same type core::vector3df& getNormal(u32 i) override
or the main buffer is of standard type. Otherwise, behavior is {
undefined. return Vertices[i].Normal;
*/ }
void append(const void *const vertices, u32 numVertices, const u16 *const indices, u32 numIndices) override
{ //! returns texture coord of vertex i
if (vertices == getVertices()) const core::vector2df& getTCoords(u32 i) const override
return; {
return Vertices[i].TCoords;
const u32 vertexCount = getVertexCount(); }
u32 i;
//! returns texture coord of vertex i
Vertices.reallocate(vertexCount + numVertices); core::vector2df& getTCoords(u32 i) override
for (i = 0; i < numVertices; ++i) { {
Vertices.push_back(static_cast<const T *>(vertices)[i]); return Vertices[i].TCoords;
BoundingBox.addInternalPoint(static_cast<const T *>(vertices)[i].Pos); }
}
Indices.reallocate(getIndexCount() + numIndices); //! Append the vertices and indices to the current buffer
for (i = 0; i < numIndices; ++i) { /** Only works for compatible types, i.e. either the same type
Indices.push_back(indices[i] + vertexCount); or the main buffer is of standard type. Otherwise, behavior is
} undefined.
} */
void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) override
//! get the current hardware mapping hint {
E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const override if (vertices == getVertices())
{ return;
return MappingHint_Vertex;
} const u32 vertexCount = getVertexCount();
u32 i;
//! get the current hardware mapping hint
E_HARDWARE_MAPPING getHardwareMappingHint_Index() const override Vertices.reallocate(vertexCount+numVertices);
{ for (i=0; i<numVertices; ++i)
return MappingHint_Index; {
} Vertices.push_back(static_cast<const T*>(vertices)[i]);
BoundingBox.addInternalPoint(static_cast<const T*>(vertices)[i].Pos);
//! set the hardware mapping hint, for driver }
void setHardwareMappingHint(E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer = EBT_VERTEX_AND_INDEX) override
{ Indices.reallocate(getIndexCount()+numIndices);
if (Buffer == EBT_VERTEX_AND_INDEX || Buffer == EBT_VERTEX) for (i=0; i<numIndices; ++i)
MappingHint_Vertex = NewMappingHint; {
if (Buffer == EBT_VERTEX_AND_INDEX || Buffer == EBT_INDEX) Indices.push_back(indices[i]+vertexCount);
MappingHint_Index = NewMappingHint; }
} }
//! Describe what kind of primitive geometry is used by the meshbuffer
void setPrimitiveType(E_PRIMITIVE_TYPE type) override //! Append the meshbuffer to the current buffer
{ /** Only works for compatible types, i.e. either the same type
PrimitiveType = type; or the main buffer is of standard type. Otherwise, behavior is
} undefined.
\param other Meshbuffer to be appended to this one.
//! Get the kind of primitive geometry which is used by the meshbuffer */
E_PRIMITIVE_TYPE getPrimitiveType() const override void append(const IMeshBuffer* const other) override
{ {
return PrimitiveType; /*
} if (this==other)
return;
//! flags the mesh as changed, reloads hardware buffers
void setDirty(E_BUFFER_TYPE Buffer = EBT_VERTEX_AND_INDEX) override const u32 vertexCount = getVertexCount();
{ u32 i;
if (Buffer == EBT_VERTEX_AND_INDEX || Buffer == EBT_VERTEX)
++ChangedID_Vertex; Vertices.reallocate(vertexCount+other->getVertexCount());
if (Buffer == EBT_VERTEX_AND_INDEX || Buffer == EBT_INDEX) for (i=0; i<other->getVertexCount(); ++i)
++ChangedID_Index; {
} Vertices.push_back(reinterpret_cast<const T*>(other->getVertices())[i]);
}
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ Indices.reallocate(getIndexCount()+other->getIndexCount());
u32 getChangedID_Vertex() const override { return ChangedID_Vertex; } for (i=0; i<other->getIndexCount(); ++i)
{
//! Get the currently used ID for identification of changes. Indices.push_back(other->getIndices()[i]+vertexCount);
/** This shouldn't be used for anything outside the VideoDriver. */ }
u32 getChangedID_Index() const override { return ChangedID_Index; } BoundingBox.addInternalBox(other->getBoundingBox());
*/
void setHWBuffer(void *ptr) const override }
{
HWBuffer = ptr;
} //! get the current hardware mapping hint
E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const override
void *getHWBuffer() const override {
{ return MappingHint_Vertex;
return HWBuffer; }
}
//! get the current hardware mapping hint
u32 ChangedID_Vertex; E_HARDWARE_MAPPING getHardwareMappingHint_Index() const override
u32 ChangedID_Index; {
return MappingHint_Index;
//! hardware mapping hint }
E_HARDWARE_MAPPING MappingHint_Vertex;
E_HARDWARE_MAPPING MappingHint_Index; //! set the hardware mapping hint, for driver
mutable void *HWBuffer; void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) override
{
//! Material for this meshbuffer. if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
video::SMaterial Material; MappingHint_Vertex=NewMappingHint;
//! Vertices of this buffer if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
core::array<T> Vertices; MappingHint_Index=NewMappingHint;
//! Indices into the vertices of this buffer. }
core::array<u16> Indices;
//! Bounding box of this meshbuffer. //! Describe what kind of primitive geometry is used by the meshbuffer
core::aabbox3d<f32> BoundingBox; void setPrimitiveType(E_PRIMITIVE_TYPE type) override
//! Primitive type used for rendering (triangles, lines, ...) {
E_PRIMITIVE_TYPE PrimitiveType; PrimitiveType = type;
}; }
//! Standard meshbuffer //! Get the kind of primitive geometry which is used by the meshbuffer
typedef CMeshBuffer<video::S3DVertex> SMeshBuffer; E_PRIMITIVE_TYPE getPrimitiveType() const override
//! Meshbuffer with two texture coords per vertex, e.g. for lightmaps {
typedef CMeshBuffer<video::S3DVertex2TCoords> SMeshBufferLightMap; return PrimitiveType;
//! Meshbuffer with vertices having tangents stored, e.g. for normal mapping }
typedef CMeshBuffer<video::S3DVertexTangents> SMeshBufferTangents;
} // end namespace scene //! flags the mesh as changed, reloads hardware buffers
} // end namespace irr void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) override
{
if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
++ChangedID_Vertex;
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
++ChangedID_Index;
}
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
u32 getChangedID_Vertex() const override {return ChangedID_Vertex;}
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
u32 getChangedID_Index() const override {return ChangedID_Index;}
void setHWBuffer(void *ptr) const override {
HWBuffer = ptr;
}
void *getHWBuffer() const override {
return HWBuffer;
}
u32 ChangedID_Vertex;
u32 ChangedID_Index;
//! hardware mapping hint
E_HARDWARE_MAPPING MappingHint_Vertex;
E_HARDWARE_MAPPING MappingHint_Index;
mutable void *HWBuffer;
//! Material for this meshbuffer.
video::SMaterial Material;
//! Vertices of this buffer
core::array<T> Vertices;
//! Indices into the vertices of this buffer.
core::array<u16> Indices;
//! Bounding box of this meshbuffer.
core::aabbox3d<f32> BoundingBox;
//! Primitive type used for rendering (triangles, lines, ...)
E_PRIMITIVE_TYPE PrimitiveType;
};
//! Standard meshbuffer
typedef CMeshBuffer<video::S3DVertex> SMeshBuffer;
//! Meshbuffer with two texture coords per vertex, e.g. for lightmaps
typedef CMeshBuffer<video::S3DVertex2TCoords> SMeshBufferLightMap;
//! Meshbuffer with vertices having tangents stored, e.g. for normal mapping
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

@ -1,32 +1,101 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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
{ namespace irr
namespace io {
{ namespace io
{
//! Types of attributes available for IAttributes
enum E_ATTRIBUTE_TYPE //! Types of attributes available for IAttributes
{ enum E_ATTRIBUTE_TYPE
// integer attribute {
EAT_INT = 0, // integer attribute
EAT_INT = 0,
// float attribute
EAT_FLOAT, // float attribute
EAT_FLOAT,
// boolean attribute
EAT_BOOL, // string attribute
EAT_STRING,
// known attribute type count
EAT_COUNT, // boolean attribute
EAT_BOOL,
// unknown attribute
EAT_UNKNOWN // enumeration attribute
}; EAT_ENUM,
} // end namespace io // color attribute
} // end namespace irr 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,
// unknown attribute
EAT_UNKNOWN
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -1,35 +1,41 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
{
//! An enumeration for all types of automatic culling for built-in scene nodes
enum E_CULLING_TYPE //! An enumeration for all types of automatic culling for built-in scene nodes
{ enum E_CULLING_TYPE
EAC_OFF = 0, {
EAC_BOX = 1, EAC_OFF = 0,
EAC_FRUSTUM_BOX = 2, EAC_BOX = 1,
EAC_FRUSTUM_SPHERE = 4, EAC_FRUSTUM_BOX = 2,
EAC_OCC_QUERY = 8 EAC_FRUSTUM_SPHERE = 4,
}; EAC_OCC_QUERY = 8
};
//! Names for culling type
const c8 *const AutomaticCullingNames[] = { //! Names for culling type
"false", const c8* const AutomaticCullingNames[] =
"box", // camera box against node box {
"frustum_box", // camera frustum against node box "false",
"frustum_sphere", // camera frustum against node sphere "box", // camera box against node box
"occ_query", // occlusion query "frustum_box", // camera frustum against node box
0, "frustum_sphere", // camera frustum against node sphere
}; "occ_query", // occlusion query
0
} // end namespace scene };
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif // __E_CULLING_TYPES_H_INCLUDED__

View File

@ -1,41 +1,47 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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
{ namespace irr
namespace scene {
{ namespace scene
{
//! An enumeration for all types of debug data for built-in scene nodes (flags)
enum E_DEBUG_SCENE_TYPE //! An enumeration for all types of debug data for built-in scene nodes (flags)
{ enum E_DEBUG_SCENE_TYPE
//! No Debug Data ( Default ) {
EDS_OFF = 0, //! No Debug Data ( Default )
EDS_OFF = 0,
//! Show Bounding Boxes of SceneNode
EDS_BBOX = 1, //! Show Bounding Boxes of SceneNode
EDS_BBOX = 1,
//! Show Vertex Normals
EDS_NORMALS = 2, //! Show Vertex Normals
EDS_NORMALS = 2,
//! Shows Skeleton/Tags
EDS_SKELETON = 4, //! Shows Skeleton/Tags
EDS_SKELETON = 4,
//! Overlays Mesh Wireframe
EDS_MESH_WIRE_OVERLAY = 8, //! Overlays Mesh Wireframe
EDS_MESH_WIRE_OVERLAY = 8,
//! Show Bounding Boxes of all MeshBuffers
EDS_BBOX_BUFFERS = 32, //! Show Bounding Boxes of all MeshBuffers
EDS_BBOX_BUFFERS = 32,
//! EDS_BBOX | EDS_BBOX_BUFFERS
EDS_BBOX_ALL = EDS_BBOX | EDS_BBOX_BUFFERS, //! EDS_BBOX | EDS_BBOX_BUFFERS
EDS_BBOX_ALL = EDS_BBOX | EDS_BBOX_BUFFERS,
//! Show all debug infos
EDS_FULL = 0xffffffff //! Show all debug infos
}; EDS_FULL = 0xffffffff
};
} // end namespace scene
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif // __E_DEBUG_SCENE_TYPES_H_INCLUDED__

View File

@ -1,46 +1,50 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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
{ namespace irr
{
//! An enum for the different device types supported by the Irrlicht Engine.
enum E_DEVICE_TYPE //! An enum for the different device types supported by the Irrlicht Engine.
{ enum E_DEVICE_TYPE
{
//! A device native to Microsoft Windows
/** This device uses the Win32 API and works in all versions of Windows. */ //! A device native to Microsoft Windows
EIDT_WIN32, /** This device uses the Win32 API and works in all versions of Windows. */
EIDT_WIN32,
//! A device native to Unix style operating systems.
/** This device uses the X11 windowing system and works in Linux, Solaris, FreeBSD, OSX and //! A device native to Unix style operating systems.
other operating systems which support X11. */ /** This device uses the X11 windowing system and works in Linux, Solaris, FreeBSD, OSX and
EIDT_X11, other operating systems which support X11. */
EIDT_X11,
//! A device native to Mac OSX
/** This device uses Apple's Cocoa API and works in Mac OSX 10.2 and above. */ //! A device native to Mac OSX
EIDT_OSX, /** This device uses Apple's Cocoa API and works in Mac OSX 10.2 and above. */
EIDT_OSX,
//! A device which uses Simple DirectMedia Layer
/** The SDL device works under all platforms supported by SDL but first must be compiled //! A device which uses Simple DirectMedia Layer
in by setting the USE_SDL2 CMake option to ON */ /** The SDL device works under all platforms supported by SDL but first must be compiled
EIDT_SDL, in by setting the USE_SDL2 CMake option to ON */
EIDT_SDL,
//! This selection allows Irrlicht to choose the best device from the ones available.
/** If this selection is chosen then Irrlicht will try to use the IrrlichtDevice native //! This selection allows Irrlicht to choose the best device from the ones available.
to your operating system. If this is unavailable then the X11, SDL and then console device /** If this selection is chosen then Irrlicht will try to use the IrrlichtDevice native
will be tried. This ensures that Irrlicht will run even if your platform is unsupported, to your operating system. If this is unavailable then the X11, SDL and then console device
although it may not be able to render anything. */ will be tried. This ensures that Irrlicht will run even if your platform is unsupported,
EIDT_BEST, although it may not be able to render anything. */
EIDT_BEST,
//! A device for Android platforms
/** Best used with embedded devices and mobile systems. //! A device for Android platforms
Does not need X11 or other graphical subsystems. /** Best used with embedded devices and mobile systems.
May support hw-acceleration via OpenGL-ES */ Does not need X11 or other graphical subsystems.
EIDT_ANDROID, May support hw-acceleration via OpenGL-ES */
}; EIDT_ANDROID,
};
} // end namespace irr
} // end namespace irr
#endif // __E_DEVICE_TYPES_H_INCLUDED__

View File

@ -1,137 +1,157 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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
{ namespace irr
namespace video {
{ namespace video
{
//! enumeration for querying features of the video driver.
enum E_VIDEO_DRIVER_FEATURE //! enumeration for querying features of the video driver.
{ enum E_VIDEO_DRIVER_FEATURE
//! Is driver able to render to a surface? {
EVDF_RENDER_TO_TARGET = 0, //! Is driver able to render to a surface?
EVDF_RENDER_TO_TARGET = 0,
//! Is hardware transform and lighting supported?
EVDF_HARDWARE_TL, //! Is hardware transform and lighting supported?
EVDF_HARDWARE_TL,
//! Are multiple textures per material possible?
EVDF_MULTITEXTURE, //! Are multiple textures per material possible?
EVDF_MULTITEXTURE,
//! Is driver able to render with a bilinear filter applied?
EVDF_BILINEAR_FILTER, //! Is driver able to render with a bilinear filter applied?
EVDF_BILINEAR_FILTER,
//! Can the driver handle mip maps?
EVDF_MIP_MAP, //! Can the driver handle mip maps?
EVDF_MIP_MAP,
//! Can the driver update mip maps automatically?
EVDF_MIP_MAP_AUTO_UPDATE, //! Can the driver update mip maps automatically?
EVDF_MIP_MAP_AUTO_UPDATE,
//! Are stencilbuffers switched on and does the device support stencil buffers?
EVDF_STENCIL_BUFFER, //! Are stencilbuffers switched on and does the device support stencil buffers?
EVDF_STENCIL_BUFFER,
//! Is Vertex Shader 1.1 supported?
EVDF_VERTEX_SHADER_1_1, //! Is Vertex Shader 1.1 supported?
EVDF_VERTEX_SHADER_1_1,
//! Is Vertex Shader 2.0 supported?
EVDF_VERTEX_SHADER_2_0, //! Is Vertex Shader 2.0 supported?
EVDF_VERTEX_SHADER_2_0,
//! Is Vertex Shader 3.0 supported?
EVDF_VERTEX_SHADER_3_0, //! Is Vertex Shader 3.0 supported?
EVDF_VERTEX_SHADER_3_0,
//! Is Pixel Shader 1.1 supported?
EVDF_PIXEL_SHADER_1_1, //! Is Pixel Shader 1.1 supported?
EVDF_PIXEL_SHADER_1_1,
//! Is Pixel Shader 1.2 supported?
EVDF_PIXEL_SHADER_1_2, //! Is Pixel Shader 1.2 supported?
EVDF_PIXEL_SHADER_1_2,
//! Is Pixel Shader 1.3 supported?
EVDF_PIXEL_SHADER_1_3, //! Is Pixel Shader 1.3 supported?
EVDF_PIXEL_SHADER_1_3,
//! Is Pixel Shader 1.4 supported?
EVDF_PIXEL_SHADER_1_4, //! Is Pixel Shader 1.4 supported?
EVDF_PIXEL_SHADER_1_4,
//! Is Pixel Shader 2.0 supported?
EVDF_PIXEL_SHADER_2_0, //! Is Pixel Shader 2.0 supported?
EVDF_PIXEL_SHADER_2_0,
//! Is Pixel Shader 3.0 supported?
EVDF_PIXEL_SHADER_3_0, //! Is Pixel Shader 3.0 supported?
EVDF_PIXEL_SHADER_3_0,
//! Are ARB vertex programs v1.0 supported?
EVDF_ARB_VERTEX_PROGRAM_1, //! Are ARB vertex programs v1.0 supported?
EVDF_ARB_VERTEX_PROGRAM_1,
//! Are ARB fragment programs v1.0 supported?
EVDF_ARB_FRAGMENT_PROGRAM_1, //! Are ARB fragment programs v1.0 supported?
EVDF_ARB_FRAGMENT_PROGRAM_1,
//! Is GLSL supported?
EVDF_ARB_GLSL, //! Is GLSL supported?
EVDF_ARB_GLSL,
//! Is HLSL supported?
EVDF_HLSL, //! Is HLSL supported?
EVDF_HLSL,
//! Are non-square textures supported?
EVDF_TEXTURE_NSQUARE, //! Are non-square textures supported?
EVDF_TEXTURE_NSQUARE,
//! Are non-power-of-two textures supported?
EVDF_TEXTURE_NPOT, //! Are non-power-of-two textures supported?
EVDF_TEXTURE_NPOT,
//! Are framebuffer objects supported?
EVDF_FRAMEBUFFER_OBJECT, //! Are framebuffer objects supported?
EVDF_FRAMEBUFFER_OBJECT,
//! Are vertex buffer objects supported?
EVDF_VERTEX_BUFFER_OBJECT, //! Are vertex buffer objects supported?
EVDF_VERTEX_BUFFER_OBJECT,
//! Supports Alpha To Coverage
EVDF_ALPHA_TO_COVERAGE, //! Supports Alpha To Coverage
EVDF_ALPHA_TO_COVERAGE,
//! Supports Color masks (disabling color planes in output)
EVDF_COLOR_MASK, //! Supports Color masks (disabling color planes in output)
EVDF_COLOR_MASK,
//! Supports multiple render targets at once
EVDF_MULTIPLE_RENDER_TARGETS, //! Supports multiple render targets at once
EVDF_MULTIPLE_RENDER_TARGETS,
//! Supports separate blend settings for multiple render targets
EVDF_MRT_BLEND, //! Supports separate blend settings for multiple render targets
EVDF_MRT_BLEND,
//! Supports separate color masks for multiple render targets
EVDF_MRT_COLOR_MASK, //! Supports separate color masks for multiple render targets
EVDF_MRT_COLOR_MASK,
//! Supports separate blend functions for multiple render targets
EVDF_MRT_BLEND_FUNC, //! Supports separate blend functions for multiple render targets
EVDF_MRT_BLEND_FUNC,
//! Supports geometry shaders
EVDF_GEOMETRY_SHADER, //! Supports geometry shaders
EVDF_GEOMETRY_SHADER,
//! Supports occlusion queries
EVDF_OCCLUSION_QUERY, //! Supports occlusion queries
EVDF_OCCLUSION_QUERY,
//! Supports polygon offset/depth bias for avoiding z-fighting
EVDF_POLYGON_OFFSET, //! Supports polygon offset/depth bias for avoiding z-fighting
EVDF_POLYGON_OFFSET,
//! Support for different blend functions. Without, only ADD is available
EVDF_BLEND_OPERATIONS, //! Support for different blend functions. Without, only ADD is available
EVDF_BLEND_OPERATIONS,
//! Support for separate blending for RGB and Alpha.
EVDF_BLEND_SEPARATE, //! Support for separate blending for RGB and Alpha.
EVDF_BLEND_SEPARATE,
//! Support for texture coord transformation via texture matrix
EVDF_TEXTURE_MATRIX, //! Support for texture coord transformation via texture matrix
EVDF_TEXTURE_MATRIX,
//! Support for cube map textures.
EVDF_TEXTURE_CUBEMAP, //! Support for DXTn compressed textures.
EVDF_TEXTURE_COMPRESSED_DXT,
//! Support for filtering across different faces of the cubemap
EVDF_TEXTURE_CUBEMAP_SEAMLESS, //! Support for PVRTC compressed textures.
EVDF_TEXTURE_COMPRESSED_PVRTC,
//! Support for clamping vertices beyond far-plane to depth instead of capping them.
EVDF_DEPTH_CLAMP, //! Support for PVRTC2 compressed textures.
EVDF_TEXTURE_COMPRESSED_PVRTC2,
//! Only used for counting the elements of this enum
EVDF_COUNT //! Support for ETC1 compressed textures.
}; EVDF_TEXTURE_COMPRESSED_ETC1,
} // end namespace video //! Support for ETC2 compressed textures.
} // end namespace irr EVDF_TEXTURE_COMPRESSED_ETC2,
//! Support for cube map textures.
EVDF_TEXTURE_CUBEMAP,
//! Support for filtering across different faces of the cubemap
EVDF_TEXTURE_CUBEMAP_SEAMLESS,
//! Support for clamping vertices beyond far-plane to depth instead of capping them.
EVDF_DEPTH_CLAMP,
//! Only used for counting the elements of this enum
EVDF_COUNT
};
} // end namespace video
} // end namespace irr
#endif

View File

@ -1,44 +1,48 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
{
//! An enum for all types of drivers the Irrlicht Engine supports.
enum E_DRIVER_TYPE //! An enum for all types of drivers the Irrlicht Engine supports.
{ enum E_DRIVER_TYPE
//! Null driver, useful for applications to run the engine without visualization. {
/** The null device is able to load textures, but does not //! Null driver, useful for applications to run the engine without visualization.
render and display any graphics. */ /** The null device is able to load textures, but does not
EDT_NULL, render and display any graphics. */
EDT_NULL,
//! OpenGL device, available on most platforms.
/** Performs hardware accelerated rendering of 3D and 2D //! OpenGL device, available on most platforms.
primitives. */ /** Performs hardware accelerated rendering of 3D and 2D
EDT_OPENGL, primitives. */
EDT_OPENGL,
//! OpenGL-ES 1.x driver, for embedded and mobile systems
EDT_OGLES1, //! OpenGL-ES 1.x driver, for embedded and mobile systems
EDT_OGLES1,
//! OpenGL-ES 2.x driver, for embedded and mobile systems
/** Supports shaders etc. */ //! OpenGL-ES 2.x driver, for embedded and mobile systems
EDT_OGLES2, /** Supports shaders etc. */
EDT_OGLES2,
//! WebGL1 friendly subset of OpenGL-ES 2.x driver for Emscripten
EDT_WEBGL1, //! WebGL1 friendly subset of OpenGL-ES 2.x driver for Emscripten
EDT_WEBGL1,
EDT_OPENGL3,
EDT_OPENGL3,
//! No driver, just for counting the elements
EDT_COUNT //! No driver, just for counting the elements
}; EDT_COUNT
};
} // end namespace video
} // end namespace irr } // end namespace video
} // end namespace irr
#endif

View File

@ -1,34 +1,38 @@
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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
{ namespace irr
namespace gui {
{ namespace gui
{
//! Bitflags for defining the the focus behavior of the gui
// (all names start with SET as we might add REMOVE flags later to control that behavior as well) //! Bitflags for defining the the focus behavior of the gui
enum EFOCUS_FLAG // (all names start with SET as we might add REMOVE flags later to control that behavior as well)
{ enum EFOCUS_FLAG
//! When set the focus changes when the left mouse-button got clicked while over an element {
EFF_SET_ON_LMOUSE_DOWN = 0x1, //! When set the focus changes when the left mouse-button got clicked while over an element
EFF_SET_ON_LMOUSE_DOWN = 0x1,
//! When set the focus changes when the right mouse-button got clicked while over an element
//! Note that elements usually don't care about right-click and that won't change with this flag //! When set the focus changes when the right mouse-button got clicked while over an element
//! This is mostly to allow taking away focus from elements with right-mouse additionally. //! Note that elements usually don't care about right-click and that won't change with this flag
EFF_SET_ON_RMOUSE_DOWN = 0x2, //! This is mostly to allow taking away focus from elements with right-mouse additionally.
EFF_SET_ON_RMOUSE_DOWN = 0x2,
//! When set the focus changes when the mouse-cursor is over an element
EFF_SET_ON_MOUSE_OVER = 0x4, //! When set the focus changes when the mouse-cursor is over an element
EFF_SET_ON_MOUSE_OVER = 0x4,
//! When set the focus can be changed with TAB-key combinations.
EFF_SET_ON_TAB = 0x8, //! When set the focus can be changed with TAB-key combinations.
EFF_SET_ON_TAB = 0x8,
//! When set it's possible to set the focus to disabled elements.
EFF_CAN_FOCUS_DISABLED = 0x16 //! When set it's possible to set the focus to disabled elements.
}; EFF_CAN_FOCUS_DISABLED = 0x16
};
} // namespace gui
} // namespace irr } // namespace gui
} // namespace irr
#endif

View File

@ -1,35 +1,39 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
enum EGUI_ALIGNMENT {
{ enum EGUI_ALIGNMENT
//! Aligned to parent's top or left side (default) {
EGUIA_UPPERLEFT = 0, //! Aligned to parent's top or left side (default)
//! Aligned to parent's bottom or right side EGUIA_UPPERLEFT=0,
EGUIA_LOWERRIGHT, //! Aligned to parent's bottom or right side
//! Aligned to the center of parent EGUIA_LOWERRIGHT,
EGUIA_CENTER, //! Aligned to the center of parent
//! Stretched to fit parent EGUIA_CENTER,
EGUIA_SCALE //! Stretched to fit parent
}; EGUIA_SCALE
};
//! Names for alignments
const c8 *const GUIAlignmentNames[] = { //! Names for alignments
"upperLeft", const c8* const GUIAlignmentNames[] =
"lowerRight", {
"center", "upperLeft",
"scale", "lowerRight",
0, "center",
}; "scale",
0
} // namespace gui };
} // namespace irr
} // namespace gui
} // namespace irr
#endif // __E_GUI_ALIGNMENT_H_INCLUDED__

View File

@ -1,133 +1,141 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
{
//! List of all basic Irrlicht GUI elements.
/** An IGUIElement returns this when calling IGUIElement::getType(); */ //! List of all basic Irrlicht GUI elements.
enum EGUI_ELEMENT_TYPE /** An IGUIElement returns this when calling IGUIElement::getType(); */
{ enum EGUI_ELEMENT_TYPE
//! A button (IGUIButton) {
EGUIET_BUTTON = 0, //! A button (IGUIButton)
EGUIET_BUTTON = 0,
//! A check box (IGUICheckBox)
EGUIET_CHECK_BOX, //! A check box (IGUICheckBox)
EGUIET_CHECK_BOX,
//! A combo box (IGUIComboBox)
EGUIET_COMBO_BOX, //! A combo box (IGUIComboBox)
EGUIET_COMBO_BOX,
//! A context menu (IGUIContextMenu)
EGUIET_CONTEXT_MENU, //! A context menu (IGUIContextMenu)
EGUIET_CONTEXT_MENU,
//! A menu (IGUIMenu)
EGUIET_MENU, //! A menu (IGUIMenu)
EGUIET_MENU,
//! An edit box (IGUIEditBox)
EGUIET_EDIT_BOX, //! An edit box (IGUIEditBox)
EGUIET_EDIT_BOX,
//! A file open dialog (IGUIFileOpenDialog)
EGUIET_FILE_OPEN_DIALOG, //! A file open dialog (IGUIFileOpenDialog)
EGUIET_FILE_OPEN_DIALOG,
//! A color select open dialog (IGUIColorSelectDialog)
EGUIET_COLOR_SELECT_DIALOG, //! A color select open dialog (IGUIColorSelectDialog)
EGUIET_COLOR_SELECT_DIALOG,
//! A in/out fader (IGUIInOutFader)
EGUIET_IN_OUT_FADER, //! A in/out fader (IGUIInOutFader)
EGUIET_IN_OUT_FADER,
//! An image (IGUIImage)
EGUIET_IMAGE, //! An image (IGUIImage)
EGUIET_IMAGE,
//! A list box (IGUIListBox)
EGUIET_LIST_BOX, //! A list box (IGUIListBox)
EGUIET_LIST_BOX,
//! A mesh viewer (IGUIMeshViewer)
EGUIET_MESH_VIEWER, //! A mesh viewer (IGUIMeshViewer)
EGUIET_MESH_VIEWER,
//! A message box (IGUIWindow)
EGUIET_MESSAGE_BOX, //! A message box (IGUIWindow)
EGUIET_MESSAGE_BOX,
//! A modal screen
EGUIET_MODAL_SCREEN, //! A modal screen
EGUIET_MODAL_SCREEN,
//! A scroll bar (IGUIScrollBar)
EGUIET_SCROLL_BAR, //! A scroll bar (IGUIScrollBar)
EGUIET_SCROLL_BAR,
//! A spin box (IGUISpinBox)
EGUIET_SPIN_BOX, //! A spin box (IGUISpinBox)
EGUIET_SPIN_BOX,
//! A static text (IGUIStaticText)
EGUIET_STATIC_TEXT, //! A static text (IGUIStaticText)
EGUIET_STATIC_TEXT,
//! A tab (IGUITab)
EGUIET_TAB, //! A tab (IGUITab)
EGUIET_TAB,
//! A tab control
EGUIET_TAB_CONTROL, //! A tab control
EGUIET_TAB_CONTROL,
//! A Table
EGUIET_TABLE, //! A Table
EGUIET_TABLE,
//! A tool bar (IGUIToolBar)
EGUIET_TOOL_BAR, //! A tool bar (IGUIToolBar)
EGUIET_TOOL_BAR,
//! A Tree View
EGUIET_TREE_VIEW, //! A Tree View
EGUIET_TREE_VIEW,
//! A window
EGUIET_WINDOW, //! A window
EGUIET_WINDOW,
//! Unknown type.
EGUIET_ELEMENT, //! Unknown type.
EGUIET_ELEMENT,
//! The root of the GUI
EGUIET_ROOT, //! The root of the GUI
EGUIET_ROOT,
//! Not an element, amount of elements in there
EGUIET_COUNT, //! Not an element, amount of elements in there
EGUIET_COUNT,
//! This enum is never used, it only forces the compiler to compile this enumeration to 32 bit.
EGUIET_FORCE_32_BIT = 0x7fffffff //! This enum is never used, it only forces the compiler to compile this enumeration to 32 bit.
EGUIET_FORCE_32_BIT = 0x7fffffff
};
};
//! Names for built-in element types
const c8 *const GUIElementTypeNames[] = { //! Names for built-in element types
"button", const c8* const GUIElementTypeNames[] =
"checkBox", {
"comboBox", "button",
"contextMenu", "checkBox",
"menu", "comboBox",
"editBox", "contextMenu",
"fileOpenDialog", "menu",
"colorSelectDialog", "editBox",
"inOutFader", "fileOpenDialog",
"image", "colorSelectDialog",
"listBox", "inOutFader",
"meshViewer", "image",
"messageBox", "listBox",
"modalScreen", "meshViewer",
"scrollBar", "messageBox",
"spinBox", "modalScreen",
"staticText", "scrollBar",
"tab", "spinBox",
"tabControl", "staticText",
"table", "tab",
"toolBar", "tabControl",
"treeview", "table",
"window", "toolBar",
"element", "treeview",
"root", "window",
"profiler", "element",
0, "root",
}; "profiler",
0
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,40 +1,44 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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
{ namespace irr
namespace scene {
{ namespace scene
{
enum E_HARDWARE_MAPPING
{ enum E_HARDWARE_MAPPING
//! Don't store on the hardware {
EHM_NEVER = 0, //! Don't store on the hardware
EHM_NEVER=0,
//! Rarely changed, usually stored completely on the hardware
EHM_STATIC, //! Rarely changed, usually stored completely on the hardware
EHM_STATIC,
//! Sometimes changed, driver optimized placement
EHM_DYNAMIC, //! Sometimes changed, driver optimized placement
EHM_DYNAMIC,
//! Always changed, cache optimizing on the GPU
EHM_STREAM //! Always changed, cache optimizing on the GPU
}; EHM_STREAM
};
enum E_BUFFER_TYPE
{ enum E_BUFFER_TYPE
//! Does not change anything {
EBT_NONE = 0, //! Does not change anything
//! Change the vertex mapping EBT_NONE=0,
EBT_VERTEX, //! Change the vertex mapping
//! Change the index mapping EBT_VERTEX,
EBT_INDEX, //! Change the index mapping
//! Change both vertex and index mapping to the same value EBT_INDEX,
EBT_VERTEX_AND_INDEX //! Change both vertex and index mapping to the same value
}; EBT_VERTEX_AND_INDEX
};
} // end namespace scene
} // end namespace irr } // end namespace scene
} // end namespace irr
#endif

View File

@ -1,82 +1,87 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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
{ namespace irr
namespace video {
{ namespace video
{
//! Material properties
enum E_MATERIAL_PROP //! Material properties
{ enum E_MATERIAL_PROP
//! Corresponds to SMaterial::Wireframe. {
EMP_WIREFRAME = 0x1, //! Corresponds to SMaterial::Wireframe.
EMP_WIREFRAME = 0x1,
//! Corresponds to SMaterial::PointCloud.
EMP_POINTCLOUD = 0x2, //! Corresponds to SMaterial::PointCloud.
EMP_POINTCLOUD = 0x2,
//! Corresponds to SMaterial::GouraudShading.
EMP_GOURAUD_SHADING = 0x4, //! Corresponds to SMaterial::GouraudShading.
EMP_GOURAUD_SHADING = 0x4,
//! Corresponds to SMaterial::Lighting.
EMP_LIGHTING = 0x8, //! Corresponds to SMaterial::Lighting.
EMP_LIGHTING = 0x8,
//! Corresponds to SMaterial::ZBuffer.
EMP_ZBUFFER = 0x10, //! Corresponds to SMaterial::ZBuffer.
EMP_ZBUFFER = 0x10,
//! Corresponds to SMaterial::ZWriteEnable.
EMP_ZWRITE_ENABLE = 0x20, //! Corresponds to SMaterial::ZWriteEnable.
EMP_ZWRITE_ENABLE = 0x20,
//! Corresponds to SMaterial::BackfaceCulling.
EMP_BACK_FACE_CULLING = 0x40, //! Corresponds to SMaterial::BackfaceCulling.
EMP_BACK_FACE_CULLING = 0x40,
//! Corresponds to SMaterial::FrontfaceCulling.
EMP_FRONT_FACE_CULLING = 0x80, //! Corresponds to SMaterial::FrontfaceCulling.
EMP_FRONT_FACE_CULLING = 0x80,
//! Corresponds to SMaterialLayer::MinFilter.
EMP_MIN_FILTER = 0x100, //! Corresponds to SMaterialLayer::MinFilter.
EMP_MIN_FILTER = 0x100,
//! Corresponds to SMaterialLayer::MagFilter.
EMP_MAG_FILTER = 0x200, //! Corresponds to SMaterialLayer::MagFilter.
EMP_MAG_FILTER = 0x200,
//! Corresponds to SMaterialLayer::AnisotropicFilter.
EMP_ANISOTROPIC_FILTER = 0x400, //! Corresponds to SMaterialLayer::AnisotropicFilter.
EMP_ANISOTROPIC_FILTER = 0x400,
//! Corresponds to SMaterial::FogEnable.
EMP_FOG_ENABLE = 0x800, //! Corresponds to SMaterial::FogEnable.
EMP_FOG_ENABLE = 0x800,
//! Corresponds to SMaterial::NormalizeNormals.
EMP_NORMALIZE_NORMALS = 0x1000, //! Corresponds to SMaterial::NormalizeNormals.
EMP_NORMALIZE_NORMALS = 0x1000,
//! Corresponds to SMaterialLayer::TextureWrapU, TextureWrapV and
//! TextureWrapW. //! Corresponds to SMaterialLayer::TextureWrapU, TextureWrapV and
EMP_TEXTURE_WRAP = 0x2000, //! TextureWrapW.
EMP_TEXTURE_WRAP = 0x2000,
//! Corresponds to SMaterial::AntiAliasing.
EMP_ANTI_ALIASING = 0x4000, //! Corresponds to SMaterial::AntiAliasing.
EMP_ANTI_ALIASING = 0x4000,
//! Corresponds to SMaterial::ColorMask.
EMP_COLOR_MASK = 0x8000, //! Corresponds to SMaterial::ColorMask.
EMP_COLOR_MASK = 0x8000,
//! Corresponds to SMaterial::ColorMaterial.
EMP_COLOR_MATERIAL = 0x10000, //! Corresponds to SMaterial::ColorMaterial.
EMP_COLOR_MATERIAL = 0x10000,
//! Corresponds to SMaterial::UseMipMaps.
EMP_USE_MIP_MAPS = 0x20000, //! Corresponds to SMaterial::UseMipMaps.
EMP_USE_MIP_MAPS = 0x20000,
//! Corresponds to SMaterial::BlendOperation.
EMP_BLEND_OPERATION = 0x40000, //! Corresponds to SMaterial::BlendOperation.
EMP_BLEND_OPERATION = 0x40000,
//! Corresponds to SMaterial::PolygonOffsetFactor, PolygonOffsetDirection,
//! PolygonOffsetDepthBias and PolygonOffsetSlopeScale. //! Corresponds to SMaterial::PolygonOffsetFactor, PolygonOffsetDirection,
EMP_POLYGON_OFFSET = 0x80000, //! PolygonOffsetDepthBias and PolygonOffsetSlopeScale.
EMP_POLYGON_OFFSET = 0x80000,
//! Corresponds to SMaterial::BlendFactor.
EMP_BLEND_FACTOR = 0x100000, //! Corresponds to SMaterial::BlendFactor.
}; EMP_BLEND_FACTOR = 0x100000,
};
} // end namespace video
} // end namespace irr } // end namespace video
} // end namespace irr
#endif // __E_MATERIAL_PROPS_H_INCLUDED__

View File

@ -1,74 +1,75 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once #ifndef __E_MATERIAL_TYPES_H_INCLUDED__
#define __E_MATERIAL_TYPES_H_INCLUDED__
#include "irrTypes.h"
namespace irr
namespace irr {
{ namespace video
namespace video {
{
//! Abstracted and easy to use fixed function/programmable pipeline material modes.
//! Abstracted and easy to use fixed function/programmable pipeline material modes. enum E_MATERIAL_TYPE
enum E_MATERIAL_TYPE {
{ //! Standard solid material.
//! Standard solid material. /** Only first texture is used, which is supposed to be the
/** Only first texture is used, which is supposed to be the diffuse material. */
diffuse material. */ EMT_SOLID = 0,
EMT_SOLID = 0,
//! Makes the material transparent based on the texture alpha channel.
//! Makes the material transparent based on the texture alpha channel. /** The final color is blended together from the destination
/** The final color is blended together from the destination color and the texture color, using the alpha channel value as
color and the texture color, using the alpha channel value as blend factor. Only first texture is used. If you are using
blend factor. Only first texture is used. If you are using this material with small textures, it is a good idea to load
this material with small textures, it is a good idea to load the texture in 32 bit mode
the texture in 32 bit mode (video::IVideoDriver::setTextureCreationFlag()). Also, an alpha
(video::IVideoDriver::setTextureCreationFlag()). Also, an alpha ref is used, which can be manipulated using
ref is used, which can be manipulated using SMaterial::MaterialTypeParam. This value controls how sharp the
SMaterial::MaterialTypeParam. This value controls how sharp the edges become when going from a transparent to a solid spot on
edges become when going from a transparent to a solid spot on the texture. */
the texture. */ EMT_TRANSPARENT_ALPHA_CHANNEL,
EMT_TRANSPARENT_ALPHA_CHANNEL,
//! Makes the material transparent based on the texture alpha channel.
//! Makes the material transparent based on the texture alpha channel. /** If the alpha channel value is greater than 127, a
/** If the alpha channel value is greater than 127, a pixel is written to the target, otherwise not. This
pixel is written to the target, otherwise not. This material does not use alpha blending and is a lot faster
material does not use alpha blending and is a lot faster than EMT_TRANSPARENT_ALPHA_CHANNEL. It is ideal for drawing
than EMT_TRANSPARENT_ALPHA_CHANNEL. It is ideal for drawing stuff like leaves of plants, because the borders are not
stuff like leaves of plants, because the borders are not blurry but sharp. Only first texture is used. If you are
blurry but sharp. Only first texture is used. If you are using this material with small textures and 3d object, it
using this material with small textures and 3d object, it is a good idea to load the texture in 32 bit mode
is a good idea to load the texture in 32 bit mode (video::IVideoDriver::setTextureCreationFlag()). */
(video::IVideoDriver::setTextureCreationFlag()). */ EMT_TRANSPARENT_ALPHA_CHANNEL_REF,
EMT_TRANSPARENT_ALPHA_CHANNEL_REF,
//! Makes the material transparent based on the vertex alpha value.
//! Makes the material transparent based on the vertex alpha value. EMT_TRANSPARENT_VERTEX_ALPHA,
EMT_TRANSPARENT_VERTEX_ALPHA,
//! BlendFunc = source * sourceFactor + dest * destFactor ( E_BLEND_FUNC )
//! BlendFunc = source * sourceFactor + dest * destFactor ( E_BLEND_FUNC ) /** Using only first texture. Generic blending method.
/** Using only first texture. Generic blending method. The blend function is set to SMaterial::MaterialTypeParam with
The blend function is set to SMaterial::MaterialTypeParam with pack_textureBlendFunc (for 2D) or pack_textureBlendFuncSeparate (for 3D). */
pack_textureBlendFunc (for 2D) or pack_textureBlendFuncSeparate (for 3D). */ EMT_ONETEXTURE_BLEND,
EMT_ONETEXTURE_BLEND,
//! This value is not used. It only forces this enumeration to compile to 32 bit.
//! This value is not used. It only forces this enumeration to compile to 32 bit. EMT_FORCE_32BIT = 0x7fffffff
EMT_FORCE_32BIT = 0x7fffffff };
};
//! Array holding the built in material type names
//! Array holding the built in material type names const char* const sBuiltInMaterialTypeNames[] =
const char *const sBuiltInMaterialTypeNames[] = { {
"solid", "solid",
"trans_alphach", "trans_alphach",
"trans_alphach_ref", "trans_alphach_ref",
"trans_vertex_alpha", "trans_vertex_alpha",
"onetexture_blend", "onetexture_blend",
0, 0
}; };
constexpr u32 numBuiltInMaterials = } // end namespace video
sizeof(sBuiltInMaterialTypeNames) / sizeof(char *) - 1; } // end namespace irr
} // 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

@ -1,43 +1,47 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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
{ namespace irr
namespace scene {
{ namespace scene
{
//! Enumeration for all primitive types there are.
enum E_PRIMITIVE_TYPE //! Enumeration for all primitive types there are.
{ enum E_PRIMITIVE_TYPE
//! All vertices are non-connected points. {
EPT_POINTS = 0, //! All vertices are non-connected points.
EPT_POINTS=0,
//! All vertices form a single connected line.
EPT_LINE_STRIP, //! All vertices form a single connected line.
EPT_LINE_STRIP,
//! Just as LINE_STRIP, but the last and the first vertex is also connected.
EPT_LINE_LOOP, //! Just as LINE_STRIP, but the last and the first vertex is also connected.
EPT_LINE_LOOP,
//! Every two vertices are connected creating n/2 lines.
EPT_LINES, //! Every two vertices are connected creating n/2 lines.
EPT_LINES,
//! After the first two vertices each vertex defines a new triangle.
//! Always the two last and the new one form a new triangle. //! After the first two vertices each vertex defines a new triangle.
EPT_TRIANGLE_STRIP, //! Always the two last and the new one form a new triangle.
EPT_TRIANGLE_STRIP,
//! After the first two vertices each vertex defines a new triangle.
//! All around the common first vertex. //! After the first two vertices each vertex defines a new triangle.
EPT_TRIANGLE_FAN, //! All around the common first vertex.
EPT_TRIANGLE_FAN,
//! Explicitly set all vertices for each triangle.
EPT_TRIANGLES, //! Explicitly set all vertices for each triangle.
EPT_TRIANGLES,
//! The single vertices are expanded to quad billboards on the GPU.
EPT_POINT_SPRITES //! The single vertices are expanded to quad billboards on the GPU.
}; EPT_POINT_SPRITES
};
} // end namespace scene
} // end namespace irr } // end namespace scene
} // end namespace irr
#endif

View File

@ -1,30 +1,34 @@
// Copyright (C) Michael Zeilfelder // Copyright (C) Michael Zeilfelder
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace io {
{ namespace io
{
//! An enumeration for different class types implementing IReadFile
enum EREAD_FILE_TYPE //! An enumeration for different class types implementing IReadFile
{ enum EREAD_FILE_TYPE
//! CReadFile {
ERFT_READ_FILE = MAKE_IRR_ID('r', 'e', 'a', 'd'), //! CReadFile
ERFT_READ_FILE = MAKE_IRR_ID('r','e','a','d'),
//! CMemoryReadFile
ERFT_MEMORY_READ_FILE = MAKE_IRR_ID('r', 'm', 'e', 'm'), //! CMemoryReadFile
ERFT_MEMORY_READ_FILE = MAKE_IRR_ID('r','m','e','m'),
//! CLimitReadFile
ERFT_LIMIT_READ_FILE = MAKE_IRR_ID('r', 'l', 'i', 'm'), //! CLimitReadFile
ERFT_LIMIT_READ_FILE = MAKE_IRR_ID('r','l','i','m'),
//! Unknown type
EFIT_UNKNOWN = MAKE_IRR_ID('u', 'n', 'k', 'n') //! Unknown type
}; EFIT_UNKNOWN = MAKE_IRR_ID('u','n','k','n')
} // end namespace io };
} // end namespace irr } // end namespace io
} // end namespace irr
#endif

View File

@ -1,49 +1,56 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
{
//! An enumeration for all types of built-in scene nodes
/** A scene node type is represented by a four character code //! An enumeration for all types of built-in scene nodes
such as 'cube' or 'mesh' instead of simple numbers, to avoid /** A scene node type is represented by a four character code
name clashes with external scene nodes.*/ such as 'cube' or 'mesh' instead of simple numbers, to avoid
enum ESCENE_NODE_TYPE name clashes with external scene nodes.*/
{ enum ESCENE_NODE_TYPE
//! of type CSceneManager (note that ISceneManager is not(!) an ISceneNode) {
ESNT_SCENE_MANAGER = MAKE_IRR_ID('s', 'm', 'n', 'g'), //! of type CSceneManager (note that ISceneManager is not(!) an ISceneNode)
ESNT_SCENE_MANAGER = MAKE_IRR_ID('s','m','n','g'),
//! Mesh Scene Node
ESNT_MESH = MAKE_IRR_ID('m', 'e', 's', 'h'), //! Mesh Scene Node
ESNT_MESH = MAKE_IRR_ID('m','e','s','h'),
//! Empty Scene Node
ESNT_EMPTY = MAKE_IRR_ID('e', 'm', 't', 'y'), //! Empty Scene Node
ESNT_EMPTY = MAKE_IRR_ID('e','m','t','y'),
//! Dummy Transformation Scene Node
ESNT_DUMMY_TRANSFORMATION = MAKE_IRR_ID('d', 'm', 'm', 'y'), //! Dummy Transformation Scene Node
ESNT_DUMMY_TRANSFORMATION = MAKE_IRR_ID('d','m','m','y'),
//! Camera Scene Node
ESNT_CAMERA = MAKE_IRR_ID('c', 'a', 'm', '_'), //! Camera Scene Node
ESNT_CAMERA = MAKE_IRR_ID('c','a','m','_'),
//! Billboard Scene Node
ESNT_BILLBOARD = MAKE_IRR_ID('b', 'i', 'l', 'l'), //! Billboard Scene Node
ESNT_BILLBOARD = MAKE_IRR_ID('b','i','l','l'),
//! Animated Mesh Scene Node
ESNT_ANIMATED_MESH = MAKE_IRR_ID('a', 'm', 's', 'h'), //! Animated Mesh Scene Node
ESNT_ANIMATED_MESH = MAKE_IRR_ID('a','m','s','h'),
//! Unknown scene node
ESNT_UNKNOWN = MAKE_IRR_ID('u', 'n', 'k', 'n'), //! Unknown scene node
ESNT_UNKNOWN = MAKE_IRR_ID('u','n','k','n'),
//! Will match with any scene node when checking types
ESNT_ANY = MAKE_IRR_ID('a', 'n', 'y', '_') //! Will match with any scene node when checking types
}; ESNT_ANY = MAKE_IRR_ID('a','n','y','_')
};
} // end namespace scene
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,85 +1,90 @@
#pragma once #ifndef __E_SHADER_TYPES_H_INCLUDED__
#define __E_SHADER_TYPES_H_INCLUDED__
#include "irrTypes.h"
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
{
//! Compile target enumeration for the addHighLevelShaderMaterial() method.
enum E_VERTEX_SHADER_TYPE //! Compile target enumeration for the addHighLevelShaderMaterial() method.
{ enum E_VERTEX_SHADER_TYPE
EVST_VS_1_1 = 0, {
EVST_VS_2_0, EVST_VS_1_1 = 0,
EVST_VS_2_a, EVST_VS_2_0,
EVST_VS_3_0, EVST_VS_2_a,
EVST_VS_4_0, EVST_VS_3_0,
EVST_VS_4_1, EVST_VS_4_0,
EVST_VS_5_0, EVST_VS_4_1,
EVST_VS_5_0,
//! This is not a type, but a value indicating how much types there are.
EVST_COUNT //! This is not a type, but a value indicating how much types there are.
}; EVST_COUNT
};
//! Names for all vertex shader types, each entry corresponds to a E_VERTEX_SHADER_TYPE entry.
const c8 *const VERTEX_SHADER_TYPE_NAMES[] = { //! Names for all vertex shader types, each entry corresponds to a E_VERTEX_SHADER_TYPE entry.
"vs_1_1", const c8* const VERTEX_SHADER_TYPE_NAMES[] = {
"vs_2_0", "vs_1_1",
"vs_2_a", "vs_2_0",
"vs_3_0", "vs_2_a",
"vs_4_0", "vs_3_0",
"vs_4_1", "vs_4_0",
"vs_5_0", "vs_4_1",
0}; "vs_5_0",
0 };
//! Compile target enumeration for the addHighLevelShaderMaterial() method.
enum E_PIXEL_SHADER_TYPE //! Compile target enumeration for the addHighLevelShaderMaterial() method.
{ enum E_PIXEL_SHADER_TYPE
EPST_PS_1_1 = 0, {
EPST_PS_1_2, EPST_PS_1_1 = 0,
EPST_PS_1_3, EPST_PS_1_2,
EPST_PS_1_4, EPST_PS_1_3,
EPST_PS_2_0, EPST_PS_1_4,
EPST_PS_2_a, EPST_PS_2_0,
EPST_PS_2_b, EPST_PS_2_a,
EPST_PS_3_0, EPST_PS_2_b,
EPST_PS_4_0, EPST_PS_3_0,
EPST_PS_4_1, EPST_PS_4_0,
EPST_PS_5_0, EPST_PS_4_1,
EPST_PS_5_0,
//! This is not a type, but a value indicating how much types there are.
EPST_COUNT //! This is not a type, but a value indicating how much types there are.
}; EPST_COUNT
};
//! Names for all pixel shader types, each entry corresponds to a E_PIXEL_SHADER_TYPE entry.
const c8 *const PIXEL_SHADER_TYPE_NAMES[] = { //! Names for all pixel shader types, each entry corresponds to a E_PIXEL_SHADER_TYPE entry.
"ps_1_1", const c8* const PIXEL_SHADER_TYPE_NAMES[] = {
"ps_1_2", "ps_1_1",
"ps_1_3", "ps_1_2",
"ps_1_4", "ps_1_3",
"ps_2_0", "ps_1_4",
"ps_2_a", "ps_2_0",
"ps_2_b", "ps_2_a",
"ps_3_0", "ps_2_b",
"ps_4_0", "ps_3_0",
"ps_4_1", "ps_4_0",
"ps_5_0", "ps_4_1",
0}; "ps_5_0",
0 };
//! Enum for supported geometry shader types
enum E_GEOMETRY_SHADER_TYPE //! Enum for supported geometry shader types
{ enum E_GEOMETRY_SHADER_TYPE
EGST_GS_4_0 = 0, {
EGST_GS_4_0 = 0,
//! This is not a type, but a value indicating how much types there are.
EGST_COUNT //! This is not a type, but a value indicating how much types there are.
}; EGST_COUNT
};
//! String names for supported geometry shader types
const c8 *const GEOMETRY_SHADER_TYPE_NAMES[] = { //! String names for supported geometry shader types
"gs_4_0", const c8* const GEOMETRY_SHADER_TYPE_NAMES[] = {
0}; "gs_4_0",
0 };
} // end namespace video
} // end namespace irr
} // end namespace video
} // end namespace irr
#endif // __E_SHADER_TYPES_H_INCLUDED__

View File

@ -1,34 +1,38 @@
#pragma once #ifndef __E_VERTEX_ATTRIBUTES_H_INCLUDED__
#define __E_VERTEX_ATTRIBUTES_H_INCLUDED__
namespace irr
{ namespace irr
namespace video {
{ namespace video
{
//! Enumeration for all vertex attributes there are.
enum E_VERTEX_ATTRIBUTES //! Enumeration for all vertex attributes there are.
{ enum E_VERTEX_ATTRIBUTES
EVA_POSITION = 0, {
EVA_NORMAL, EVA_POSITION = 0,
EVA_COLOR, EVA_NORMAL,
EVA_TCOORD0, EVA_COLOR,
EVA_TCOORD1, EVA_TCOORD0,
EVA_TANGENT, EVA_TCOORD1,
EVA_BINORMAL, EVA_TANGENT,
EVA_COUNT EVA_BINORMAL,
}; EVA_COUNT
};
//! Array holding the built in vertex attribute names
const char *const sBuiltInVertexAttributeNames[] = { //! Array holding the built in vertex attribute names
"inVertexPosition", const char* const sBuiltInVertexAttributeNames[] =
"inVertexNormal", {
"inVertexColor", "inVertexPosition",
"inTexCoord0", "inVertexNormal",
"inTexCoord1", "inVertexColor",
"inVertexTangent", "inTexCoord0",
"inVertexBinormal", "inTexCoord1",
0, "inVertexTangent",
}; "inVertexBinormal",
0
} // end namespace video };
} // end namespace irr
} // end namespace video
} // end namespace irr
#endif //__E_VERTEX_ATTRIBUTES_H_INCLUDED__

View File

@ -1,69 +1,74 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "aabbox3d.h"
#include "IMesh.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
//! Interface for an animated mesh. {
/** There are already simple implementations of this interface available so //! Interface for an animated mesh.
you don't have to implement this interface on your own if you need to: /** There are already simple implementations of this interface available so
You might want to use irr::scene::SAnimatedMesh, irr::scene::SMesh, you don't have to implement this interface on your own if you need to:
irr::scene::SMeshBuffer etc. */ You might want to use irr::scene::SAnimatedMesh, irr::scene::SMesh,
class IAnimatedMesh : public IMesh irr::scene::SMeshBuffer etc. */
{ class IAnimatedMesh : public IMesh
public: {
//! Gets the frame count of the animated mesh. public:
/** 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, //! Gets the frame count of the animated mesh.
it is a static, non animated mesh. */ /** Note that the play-time is usually getFrameCount()-1 as it stops as soon as the last frame-key is reached.
virtual u32 getFrameCount() const = 0; \return The amount of frames. If the amount is 1,
it is a static, non animated mesh. */
//! Gets the animation speed of the animated mesh. virtual u32 getFrameCount() const = 0;
/** \return The number of frames per second to play the
animation with by default. If the amount is 0, //! Gets the animation speed of the animated mesh.
it is a static, non animated mesh. */ /** \return The number of frames per second to play the
virtual f32 getAnimationSpeed() const = 0; animation with by default. If the amount is 0,
it is a static, non animated mesh. */
//! Sets the animation speed of the animated mesh. virtual f32 getAnimationSpeed() const = 0;
/** \param fps Number of frames per second to play the
animation with by default. If the amount is 0, //! Sets the animation speed of the animated mesh.
it is not animated. The actual speed is set in the /** \param fps Number of frames per second to play the
scene node the mesh is instantiated in.*/ animation with by default. If the amount is 0,
virtual void setAnimationSpeed(f32 fps) = 0; it is not animated. The actual speed is set in the
scene node the mesh is instantiated in.*/
//! Returns the IMesh interface for a frame. virtual void setAnimationSpeed(f32 fps) =0;
/** \param frame: Frame number as zero based index. The maximum
frame number is getFrameCount() - 1; //! Returns the IMesh interface for a frame.
\param detailLevel: Level of detail. 0 is the lowest, 255 the /** \param frame: Frame number as zero based index. The maximum
highest level of detail. Most meshes will ignore the detail level. frame number is getFrameCount() - 1;
\param startFrameLoop: Because some animated meshes (.MD2) are \param detailLevel: Level of detail. 0 is the lowest, 255 the
blended between 2 static frames, and maybe animated in a loop, highest level of detail. Most meshes will ignore the detail level.
the startFrameLoop and the endFrameLoop have to be defined, to \param startFrameLoop: Because some animated meshes (.MD2) are
prevent the animation to be blended between frames which are blended between 2 static frames, and maybe animated in a loop,
outside of this loop. the startFrameLoop and the endFrameLoop have to be defined, to
If startFrameLoop and endFrameLoop are both -1, they are ignored. prevent the animation to be blended between frames which are
\param endFrameLoop: see startFrameLoop. outside of this loop.
\return Returns the animated mesh based on a detail level. */ If startFrameLoop and endFrameLoop are both -1, they are ignored.
virtual IMesh *getMesh(s32 frame, s32 detailLevel = 255, s32 startFrameLoop = -1, s32 endFrameLoop = -1) = 0; \param endFrameLoop: see startFrameLoop.
\return Returns the animated mesh based on a detail level. */
//! Returns the type of the animated mesh. virtual IMesh* getMesh(s32 frame, s32 detailLevel=255, s32 startFrameLoop=-1, s32 endFrameLoop=-1) = 0;
/** In most cases it is not necessary to use this method.
This is useful for making a safe downcast. For example, //! Returns the type of the animated mesh.
if getMeshType() returns EAMT_MD2 it's safe to cast the /** In most cases it is not necessary to use this method.
IAnimatedMesh to IAnimatedMeshMD2. This is useful for making a safe downcast. For example,
\returns Type of the mesh. */ if getMeshType() returns EAMT_MD2 it's safe to cast the
E_ANIMATED_MESH_TYPE getMeshType() const override IAnimatedMesh to IAnimatedMeshMD2.
{ \returns Type of the mesh. */
return EAMT_UNKNOWN; E_ANIMATED_MESH_TYPE getMeshType() const override
} {
}; return EAMT_UNKNOWN;
}
} // end namespace scene };
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,169 +1,177 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "ISceneNode.h"
#include "IAnimatedMesh.h" #include "IBoneSceneNode.h"
#include "IAnimatedMesh.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
enum E_JOINT_UPDATE_ON_RENDER {
{ enum E_JOINT_UPDATE_ON_RENDER
//! do nothing {
EJUOR_NONE = 0, //! do nothing
EJUOR_NONE = 0,
//! get joints positions from the mesh (for attached nodes, etc)
EJUOR_READ, //! get joints positions from the mesh (for attached nodes, etc)
EJUOR_READ,
//! control joint positions in the mesh (eg. ragdolls, or set the animation from animateJoints() )
EJUOR_CONTROL //! control joint positions in the mesh (eg. ragdolls, or set the animation from animateJoints() )
}; EJUOR_CONTROL
};
class IAnimatedMeshSceneNode;
//! Callback interface for catching events of ended animations. class IAnimatedMeshSceneNode;
/** Implement this interface and use
IAnimatedMeshSceneNode::setAnimationEndCallback to be able to //! Callback interface for catching events of ended animations.
be notified if an animation playback has ended. /** Implement this interface and use
**/ IAnimatedMeshSceneNode::setAnimationEndCallback to be able to
class IAnimationEndCallBack : public virtual IReferenceCounted be notified if an animation playback has ended.
{ **/
public: class IAnimationEndCallBack : public virtual IReferenceCounted
//! Will be called when the animation playback has ended. {
/** See IAnimatedMeshSceneNode::setAnimationEndCallback for public:
more information.
\param node: Node of which the animation has ended. */ //! Will be called when the animation playback has ended.
virtual void OnAnimationEnd(IAnimatedMeshSceneNode *node) = 0; /** See IAnimatedMeshSceneNode::setAnimationEndCallback for
}; more information.
\param node: Node of which the animation has ended. */
//! Scene node capable of displaying an animated mesh. virtual void OnAnimationEnd(IAnimatedMeshSceneNode* node) = 0;
class IAnimatedMeshSceneNode : public ISceneNode };
{
public: //! Scene node capable of displaying an animated mesh.
//! Constructor class IAnimatedMeshSceneNode : public ISceneNode
IAnimatedMeshSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id, {
const core::vector3df &position = core::vector3df(0, 0, 0), public:
const core::vector3df &rotation = core::vector3df(0, 0, 0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) : //! Constructor
ISceneNode(parent, mgr, id, position, rotation, scale) {} IAnimatedMeshSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df& position = core::vector3df(0,0,0),
//! Destructor const core::vector3df& rotation = core::vector3df(0,0,0),
virtual ~IAnimatedMeshSceneNode() {} const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f))
: ISceneNode(parent, mgr, id, position, rotation, scale) {}
//! Sets the current frame number.
/** From now on the animation is played from this frame. //! Destructor
\param frame: Number of the frame to let the animation be started from. virtual ~IAnimatedMeshSceneNode() {}
The frame number must be a valid frame number of the IMesh used by this
scene node. Set IAnimatedMesh::getMesh() for details. */ //! Sets the current frame number.
virtual void setCurrentFrame(f32 frame) = 0; /** From now on the animation is played from this frame.
\param frame: Number of the frame to let the animation be started from.
//! Sets the frame numbers between the animation is looped. The frame number must be a valid frame number of the IMesh used by this
/** The default is 0 to getFrameCount()-1 of the mesh. scene node. Set IAnimatedMesh::getMesh() for details. */
Number of played frames is end-start. virtual void setCurrentFrame(f32 frame) = 0;
It interpolates toward the last frame but stops when it is reached.
It does not interpolate back to start even when looping. //! Sets the frame numbers between the animation is looped.
Looping animations should ensure last and first frame-key are identical. /** The default is 0 to getFrameCount()-1 of the mesh.
\param begin: Start frame number of the loop. Number of played frames is end-start.
\param end: End frame number of the loop. It interpolates toward the last frame but stops when it is reached.
\return True if successful, false if not. */ It does not interpolate back to start even when looping.
virtual bool setFrameLoop(s32 begin, s32 end) = 0; Looping animations should ensure last and first frame-key are identical.
\param begin: Start frame number of the loop.
//! Sets the speed with which the animation is played. \param end: End frame number of the loop.
/** \param framesPerSecond: Frames per second played. */ \return True if successful, false if not. */
virtual void setAnimationSpeed(f32 framesPerSecond) = 0; virtual bool setFrameLoop(s32 begin, s32 end) = 0;
//! Gets the speed with which the animation is played. //! Sets the speed with which the animation is played.
/** \return Frames per second played. */ /** \param framesPerSecond: Frames per second played. */
virtual f32 getAnimationSpeed() const = 0; virtual void setAnimationSpeed(f32 framesPerSecond) = 0;
//! Get a pointer to a joint in the mesh (if the mesh is a bone based mesh). //! Gets the speed with which the animation is played.
/** With this method it is possible to attach scene nodes to /** \return Frames per second played. */
joints for example possible to attach a weapon to the left hand virtual f32 getAnimationSpeed() const =0;
of an animated model. This example shows how:
\code //! Get a pointer to a joint in the mesh (if the mesh is a bone based mesh).
ISceneNode* hand = /** With this method it is possible to attach scene nodes to
yourAnimatedMeshSceneNode->getJointNode("LeftHand"); joints for example possible to attach a weapon to the left hand
hand->addChild(weaponSceneNode); of an animated model. This example shows how:
\endcode \code
Please note that the joint returned by this method may not exist ISceneNode* hand =
before this call and the joints in the node were created by it. yourAnimatedMeshSceneNode->getJointNode("LeftHand");
\param jointName: Name of the joint. hand->addChild(weaponSceneNode);
\return Pointer to the scene node which represents the joint \endcode
with the specified name. Returns 0 if the contained mesh is not Please note that the joint returned by this method may not exist
an skinned mesh or the name of the joint could not be found. */ before this call and the joints in the node were created by it.
virtual IBoneSceneNode *getJointNode(const c8 *jointName) = 0; \param jointName: Name of the joint.
\return Pointer to the scene node which represents the joint
//! same as getJointNode(const c8* jointName), but based on id with the specified name. Returns 0 if the contained mesh is not
virtual IBoneSceneNode *getJointNode(u32 jointID) = 0; an skinned mesh or the name of the joint could not be found. */
virtual IBoneSceneNode* getJointNode(const c8* jointName)=0;
//! Gets joint count.
/** \return Amount of joints in the mesh. */ //! same as getJointNode(const c8* jointName), but based on id
virtual u32 getJointCount() const = 0; virtual IBoneSceneNode* getJointNode(u32 jointID) = 0;
//! Returns the currently displayed frame number. //! Gets joint count.
virtual f32 getFrameNr() const = 0; /** \return Amount of joints in the mesh. */
//! Returns the current start frame number. virtual u32 getJointCount() const = 0;
virtual s32 getStartFrame() const = 0;
//! Returns the current end frame number. //! Returns the currently displayed frame number.
virtual s32 getEndFrame() const = 0; virtual f32 getFrameNr() const = 0;
//! Returns the current start frame number.
//! Sets looping mode which is on by default. virtual s32 getStartFrame() const = 0;
/** If set to false, animations will not be played looped. */ //! Returns the current end frame number.
virtual void setLoopMode(bool playAnimationLooped) = 0; virtual s32 getEndFrame() const = 0;
//! returns the current loop mode //! Sets looping mode which is on by default.
/** When true the animations are played looped */ /** If set to false, animations will not be played looped. */
virtual bool getLoopMode() const = 0; virtual void setLoopMode(bool playAnimationLooped) = 0;
//! Sets a callback interface which will be called if an animation playback has ended. //! returns the current loop mode
/** Set this to 0 to disable the callback again. /** When true the animations are played looped */
Please note that this will only be called when in non looped virtual bool getLoopMode() const = 0;
mode, see IAnimatedMeshSceneNode::setLoopMode(). */
virtual void setAnimationEndCallback(IAnimationEndCallBack *callback = 0) = 0; //! Sets a callback interface which will be called if an animation playback has ended.
/** Set this to 0 to disable the callback again.
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style. Please note that this will only be called when in non looped
/** In this way it is possible to change the materials a mesh mode, see IAnimatedMeshSceneNode::setLoopMode(). */
causing all mesh scene nodes referencing this mesh to change virtual void setAnimationEndCallback(IAnimationEndCallBack* callback=0) = 0;
too. */
virtual void setReadOnlyMaterials(bool readonly) = 0; //! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
/** In this way it is possible to change the materials a mesh
//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style causing all mesh scene nodes referencing this mesh to change
virtual bool isReadOnlyMaterials() const = 0; too. */
virtual void setReadOnlyMaterials(bool readonly) = 0;
//! Sets a new mesh
virtual void setMesh(IAnimatedMesh *mesh) = 0; //! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
virtual bool isReadOnlyMaterials() const = 0;
//! Returns the current mesh
virtual IAnimatedMesh *getMesh(void) = 0; //! Sets a new mesh
virtual void setMesh(IAnimatedMesh* mesh) = 0;
//! Set how the joints should be updated on render
virtual void setJointMode(E_JOINT_UPDATE_ON_RENDER mode) = 0; //! Returns the current mesh
virtual IAnimatedMesh* getMesh(void) = 0;
//! Sets the transition time in seconds
/** Note: This needs to enable joints, and setJointmode set to //! Set how the joints should be updated on render
EJUOR_CONTROL. You must call animateJoints(), or the mesh will virtual void setJointMode(E_JOINT_UPDATE_ON_RENDER mode)=0;
not animate. */
virtual void setTransitionTime(f32 Time) = 0; //! Sets the transition time in seconds
/** Note: This needs to enable joints, and setJointmode set to
//! animates the joints in the mesh based on the current frame. EJUOR_CONTROL. You must call animateJoints(), or the mesh will
/** Also takes in to account transitions. */ not animate. */
virtual void animateJoints(bool CalculateAbsolutePositions = true) = 0; virtual void setTransitionTime(f32 Time) =0;
//! render mesh ignoring its transformation. //! animates the joints in the mesh based on the current frame.
/** Culling is unaffected. */ /** Also takes in to account transitions. */
virtual void setRenderFromIdentity(bool On) = 0; virtual void animateJoints(bool CalculateAbsolutePositions=true) = 0;
//! Creates a clone of this scene node and its children. //! render mesh ignoring its transformation.
/** \param newParent An optional new parent. /** Culling is unaffected. */
\param newManager An optional new scene manager. virtual void setRenderFromIdentity( bool On )=0;
\return The newly created clone of this node. */
virtual ISceneNode *clone(ISceneNode *newParent = 0, ISceneManager *newManager = 0) = 0; //! Creates a clone of this scene node and its children.
}; /** \param newParent An optional new parent.
\param newManager An optional new scene manager.
} // end namespace scene \return The newly created clone of this node. */
} // end namespace irr virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) = 0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,125 +1,157 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "SColor.h"
// not needed here but I can't be bothered to clean the transitive includes up. #include "vector3d.h"
#include "quaternion.h" #include "vector2d.h"
#include "line2d.h"
namespace irr #include "line3d.h"
{ #include "triangle3d.h"
namespace video #include "position2d.h"
{ #include "rect.h"
class ITexture; #include "dimension2d.h"
} // end namespace video #include "matrix4.h"
namespace io #include "quaternion.h"
{ #include "plane3d.h"
#include "triangle3d.h"
//! Provides a generic interface for attributes and their values and the possibility to serialize them #include "line2d.h"
class IAttributes : public virtual IReferenceCounted #include "line3d.h"
{ #include "irrString.h"
public: #include "irrArray.h"
//! Returns amount of attributes in this collection of attributes. #include "EAttributes.h"
virtual u32 getAttributeCount() const = 0; #include "path.h"
//! Returns attribute name by index. namespace irr
//! \param index: Index value, must be between 0 and getAttributeCount()-1. {
virtual const c8 *getAttributeName(s32 index) const = 0; namespace video
{
//! Returns the type of an attribute class ITexture;
//! \param attributeName: Name for the attribute } // end namespace video
virtual E_ATTRIBUTE_TYPE getAttributeType(const c8 *attributeName) const = 0; namespace io
{
//! Returns attribute type by index.
//! \param index: Index value, must be between 0 and getAttributeCount()-1. //! Provides a generic interface for attributes and their values and the possibility to serialize them
virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) const = 0; class IAttributes : public virtual IReferenceCounted
{
//! Returns if an attribute with a name exists public:
virtual bool existsAttribute(const c8 *attributeName) const = 0;
//! Returns amount of attributes in this collection of attributes.
//! Returns attribute index from name, -1 if not found virtual u32 getAttributeCount() const = 0;
virtual s32 findAttribute(const c8 *attributeName) const = 0;
//! Returns attribute name by index.
//! Removes all attributes //! \param index: Index value, must be between 0 and getAttributeCount()-1.
virtual void clear() = 0; virtual const c8* getAttributeName(s32 index) const = 0;
/* //! Returns the type of an attribute
//! \param attributeName: Name for the attribute
Integer Attribute virtual E_ATTRIBUTE_TYPE getAttributeType(const c8* attributeName) const = 0;
*/ //! Returns attribute type by index.
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
//! Adds an attribute as integer virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) const = 0;
virtual void addInt(const c8 *attributeName, s32 value) = 0;
//! Returns the type string of the attribute
//! Sets an attribute as integer value //! \param attributeName: String for the attribute type
virtual void setAttribute(const c8 *attributeName, s32 value) = 0; //! \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;
//! Gets an attribute as integer value
//! \param attributeName: Name of the attribute to get. //! Returns the type string of the attribute by index.
//! \param defaultNotFound Value returned when attributeName was not found //! \param index: Index value, must be between 0 and getAttributeCount()-1.
//! \return Returns value of the attribute previously set by setAttribute() //! \param defaultNotFound Value returned for an invalid index
virtual s32 getAttributeAsInt(const c8 *attributeName, irr::s32 defaultNotFound = 0) const = 0; virtual const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") const = 0;
//! Gets an attribute as integer value //! Returns if an attribute with a name exists
//! \param index: Index value, must be between 0 and getAttributeCount()-1. virtual bool existsAttribute(const c8* attributeName) const = 0;
virtual s32 getAttributeAsInt(s32 index) const = 0;
//! Returns attribute index from name, -1 if not found
//! Sets an attribute as integer value virtual s32 findAttribute(const c8* attributeName) const = 0;
virtual void setAttribute(s32 index, s32 value) = 0;
//! Removes all attributes
/* virtual void clear() = 0;
Float Attribute
/*
*/
Integer Attribute
//! Adds an attribute as float
virtual void addFloat(const c8 *attributeName, f32 value) = 0; */
//! Sets a attribute as float value //! Adds an attribute as integer
virtual void setAttribute(const c8 *attributeName, f32 value) = 0; virtual void addInt(const c8* attributeName, s32 value) = 0;
//! Gets an attribute as float value //! Sets an attribute as integer value
//! \param attributeName: Name of the attribute to get. virtual void setAttribute(const c8* attributeName, s32 value) = 0;
//! \param defaultNotFound Value returned when attributeName was not found
//! \return Returns value of the attribute previously set by setAttribute() //! Gets an attribute as integer value
virtual f32 getAttributeAsFloat(const c8 *attributeName, irr::f32 defaultNotFound = 0.f) const = 0; //! \param attributeName: Name of the attribute to get.
//! \param defaultNotFound Value returned when attributeName was not found
//! Gets an attribute as float value //! \return Returns value of the attribute previously set by setAttribute()
//! \param index: Index value, must be between 0 and getAttributeCount()-1. virtual s32 getAttributeAsInt(const c8* attributeName, irr::s32 defaultNotFound=0) const = 0;
virtual f32 getAttributeAsFloat(s32 index) const = 0;
//! Gets an attribute as integer value
//! Sets an attribute as float value //! \param index: Index value, must be between 0 and getAttributeCount()-1.
virtual void setAttribute(s32 index, f32 value) = 0; virtual s32 getAttributeAsInt(s32 index) const = 0;
/* //! Sets an attribute as integer value
Bool Attribute virtual void setAttribute(s32 index, s32 value) = 0;
*/
/*
//! Adds an attribute as bool
virtual void addBool(const c8 *attributeName, bool value) = 0; Float Attribute
//! Sets an attribute as boolean value */
virtual void setAttribute(const c8 *attributeName, bool value) = 0;
//! Adds an attribute as float
//! Gets an attribute as boolean value virtual void addFloat(const c8* attributeName, f32 value) = 0;
//! \param attributeName: Name of the attribute to get.
//! \param defaultNotFound Value returned when attributeName was not found //! Sets a attribute as float value
//! \return Returns value of the attribute previously set by setAttribute() virtual void setAttribute(const c8* attributeName, f32 value) = 0;
virtual bool getAttributeAsBool(const c8 *attributeName, bool defaultNotFound = false) const = 0;
//! Gets an attribute as float value
//! Gets an attribute as boolean value //! \param attributeName: Name of the attribute to get.
//! \param index: Index value, must be between 0 and getAttributeCount()-1. //! \param defaultNotFound Value returned when attributeName was not found
virtual bool getAttributeAsBool(s32 index) const = 0; //! \return Returns value of the attribute previously set by setAttribute()
virtual f32 getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound=0.f) const = 0;
//! Sets an attribute as boolean value
virtual void setAttribute(s32 index, bool value) = 0; //! Gets an attribute as float value
}; //! \param index: Index value, must be between 0 and getAttributeCount()-1.
virtual f32 getAttributeAsFloat(s32 index) const = 0;
} // end namespace io
} // end namespace irr //! Sets an attribute as float value
virtual void setAttribute(s32 index, f32 value) = 0;
/*
Bool Attribute
*/
//! Adds an attribute as bool
virtual void addBool(const c8* attributeName, bool value) = 0;
//! Sets an attribute as boolean value
virtual void setAttribute(const c8* attributeName, bool value) = 0;
//! Gets an attribute as boolean value
//! \param attributeName: Name of the attribute to get.
//! \param defaultNotFound Value returned when attributeName was not found
//! \return Returns value of the attribute previously set by setAttribute()
virtual bool getAttributeAsBool(const c8* attributeName, bool defaultNotFound=false) const = 0;
//! Gets an attribute as boolean value
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
virtual bool getAttributeAsBool(s32 index) const = 0;
//! Sets an attribute as boolean value
virtual void setAttribute(s32 index, bool value) = 0;
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -1,90 +1,96 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "ISceneNode.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
class ICameraSceneNode; {
class IMeshBuffer; class ICameraSceneNode;
class IMeshBuffer;
//! A billboard scene node.
/** A billboard is like a 3d sprite: A 2d element, //! A billboard scene node.
which always looks to the camera. It is usually used for explosions, fire, /** A billboard is like a 3d sprite: A 2d element,
lensflares, particles and things like that. which always looks to the camera. It is usually used for explosions, fire,
*/ lensflares, particles and things like that.
class IBillboardSceneNode : public ISceneNode */
{ class IBillboardSceneNode : public ISceneNode
public: {
//! Constructor public:
IBillboardSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id,
const core::vector3df &position = core::vector3df(0, 0, 0)) : //! Constructor
ISceneNode(parent, mgr, id, position) {} IBillboardSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df& position = core::vector3df(0,0,0))
//! Sets the size of the billboard, making it rectangular. : ISceneNode(parent, mgr, id, position) {}
virtual void setSize(const core::dimension2d<f32> &size) = 0;
//! Sets the size of the billboard, making it rectangular.
//! Sets the size of the billboard with independent widths of the bottom and top edges. virtual void setSize(const core::dimension2d<f32>& size) = 0;
/** \param[in] height The height of the billboard.
\param[in] bottomEdgeWidth The width of the bottom edge of the billboard. //! Sets the size of the billboard with independent widths of the bottom and top edges.
\param[in] topEdgeWidth The width of the top edge of the billboard. /** \param[in] height The height of the billboard.
*/ \param[in] bottomEdgeWidth The width of the bottom edge of the billboard.
virtual void setSize(f32 height, f32 bottomEdgeWidth, f32 topEdgeWidth) = 0; \param[in] topEdgeWidth The width of the top edge of the billboard.
*/
//! Returns the size of the billboard. virtual void setSize(f32 height, f32 bottomEdgeWidth, f32 topEdgeWidth) = 0;
/** This will return the width of the bottom edge of the billboard.
Use getWidths() to retrieve the bottom and top edges independently. //! Returns the size of the billboard.
\return Size of the billboard. /** This will return the width of the bottom edge of the billboard.
*/ Use getWidths() to retrieve the bottom and top edges independently.
virtual const core::dimension2d<f32> &getSize() const = 0; \return Size of the billboard.
*/
//! Gets the size of the the billboard and handles independent top and bottom edge widths correctly. virtual const core::dimension2d<f32>& getSize() const = 0;
/** \param[out] height The height of the billboard.
\param[out] bottomEdgeWidth The width of the bottom edge of the billboard. //! Gets the size of the the billboard and handles independent top and bottom edge widths correctly.
\param[out] topEdgeWidth The width of the top edge of the billboard. /** \param[out] height The height of the billboard.
*/ \param[out] bottomEdgeWidth The width of the bottom edge of the billboard.
virtual void getSize(f32 &height, f32 &bottomEdgeWidth, f32 &topEdgeWidth) const = 0; \param[out] topEdgeWidth The width of the top edge of the billboard.
*/
//! Set the color of all vertices of the billboard virtual void getSize(f32& height, f32& bottomEdgeWidth, f32& topEdgeWidth) const =0;
/** \param[in] overallColor Color to set */
virtual void setColor(const video::SColor &overallColor) = 0; //! Set the color of all vertices of the billboard
/** \param[in] overallColor Color to set */
//! Set the color of the top and bottom vertices of the billboard virtual void setColor(const video::SColor& overallColor) = 0;
/** \param[in] topColor Color to set the top vertices
\param[in] bottomColor Color to set the bottom vertices */ //! Set the color of the top and bottom vertices of the billboard
virtual void setColor(const video::SColor &topColor, /** \param[in] topColor Color to set the top vertices
const video::SColor &bottomColor) = 0; \param[in] bottomColor Color to set the bottom vertices */
virtual void setColor(const video::SColor& topColor,
//! Gets the color of the top and bottom vertices of the billboard const video::SColor& bottomColor) = 0;
/** \param[out] topColor Stores the color of the top vertices
\param[out] bottomColor Stores the color of the bottom vertices */ //! Gets the color of the top and bottom vertices of the billboard
virtual void getColor(video::SColor &topColor, /** \param[out] topColor Stores the color of the top vertices
video::SColor &bottomColor) const = 0; \param[out] bottomColor Stores the color of the bottom vertices */
virtual void getColor(video::SColor& topColor,
//! Get the real boundingbox used by the billboard, which can depend on the active camera. video::SColor& bottomColor) const = 0;
/** The boundingbox returned will use absolute coordinates.
The billboard orients itself toward the camera and some only update in render(). //! Get the real boundingbox used by the billboard, which can depend on the active camera.
So we don't know the real boundingboxes before that. Which would be too late for culling. /** The boundingbox returned will use absolute coordinates.
That is why the usual getBoundingBox will return a "safe" boundingbox which is guaranteed The billboard orients itself toward the camera and some only update in render().
to contain the billboard. While this function can return the real one. */ So we don't know the real boundingboxes before that. Which would be too late for culling.
virtual const core::aabbox3d<f32> &getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode *camera) = 0; That is why the usual getBoundingBox will return a "safe" boundingbox which is guaranteed
to contain the billboard. While this function can return the real one. */
//! Get the amount of mesh buffers. virtual const core::aabbox3d<f32>& getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode* camera) = 0;
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
virtual u32 getMeshBufferCount() const = 0; //! Get the amount of mesh buffers.
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
//! Get pointer to a mesh buffer. virtual u32 getMeshBufferCount() const = 0;
/** NOTE: Positions and normals of this meshbuffers are re-calculated before rendering.
So this is mainly useful to access/modify the uv-coordinates. //! Get pointer to a mesh buffer.
\param nr: Zero based index of the mesh buffer. /** NOTE: Positions and normals of this meshbuffers are re-calculated before rendering.
\return Pointer to the mesh buffer or 0 if there is no such mesh buffer. */ So this is mainly useful to access/modify the uv-coordinates.
virtual IMeshBuffer *getMeshBuffer(u32 nr) const = 0; \param nr: Zero based index of the mesh buffer.
}; \return Pointer to the mesh buffer or 0 if there is no such mesh buffer. */
virtual IMeshBuffer* getMeshBuffer(u32 nr) const = 0;
} // end namespace scene };
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,96 +1,104 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "ISceneNode.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
{
//! Enumeration for different bone animation modes
enum E_BONE_ANIMATION_MODE //! Enumeration for different bone animation modes
{ enum E_BONE_ANIMATION_MODE
//! The bone is usually animated, unless it's parent is not animated {
EBAM_AUTOMATIC = 0, //! The bone is usually animated, unless it's parent is not animated
EBAM_AUTOMATIC=0,
//! The bone is animated by the skin, if it's parent is not animated then animation will resume from this bone onward
EBAM_ANIMATED, //! The bone is animated by the skin, if it's parent is not animated then animation will resume from this bone onward
EBAM_ANIMATED,
//! The bone is not animated by the skin
EBAM_UNANIMATED, //! The bone is not animated by the skin
EBAM_UNANIMATED,
//! Not an animation mode, just here to count the available modes
EBAM_COUNT //! Not an animation mode, just here to count the available modes
EBAM_COUNT
};
};
enum E_BONE_SKINNING_SPACE
{ enum E_BONE_SKINNING_SPACE
//! local skinning, standard {
EBSS_LOCAL = 0, //! local skinning, standard
EBSS_LOCAL=0,
//! global skinning
EBSS_GLOBAL, //! global skinning
EBSS_GLOBAL,
EBSS_COUNT
}; EBSS_COUNT
};
//! Names for bone animation modes
const c8 *const BoneAnimationModeNames[] = { //! Names for bone animation modes
"automatic", const c8* const BoneAnimationModeNames[] =
"animated", {
"unanimated", "automatic",
0, "animated",
}; "unanimated",
0,
//! Interface for bones used for skeletal animation. };
/** Used with ISkinnedMesh and IAnimatedMeshSceneNode. */
class IBoneSceneNode : public ISceneNode
{ //! Interface for bones used for skeletal animation.
public: /** Used with ISkinnedMesh and IAnimatedMeshSceneNode. */
IBoneSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id = -1) : class IBoneSceneNode : public ISceneNode
ISceneNode(parent, mgr, id), positionHint(-1), scaleHint(-1), rotationHint(-1) {} {
public:
//! Get the index of the bone
virtual u32 getBoneIndex() const = 0; IBoneSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id=-1) :
ISceneNode(parent, mgr, id),positionHint(-1),scaleHint(-1),rotationHint(-1) { }
//! Sets the animation mode of the bone.
/** \return True if successful. (Unused) */ //! Get the index of the bone
virtual bool setAnimationMode(E_BONE_ANIMATION_MODE mode) = 0; virtual u32 getBoneIndex() const = 0;
//! Gets the current animation mode of the bone //! Sets the animation mode of the bone.
virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0; /** \return True if successful. (Unused) */
virtual bool setAnimationMode(E_BONE_ANIMATION_MODE mode) = 0;
//! Get the axis aligned bounding box of this node
const core::aabbox3d<f32> &getBoundingBox() const override = 0; //! Gets the current animation mode of the bone
virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0;
//! Returns the relative transformation of the scene node.
// virtual core::matrix4 getRelativeTransformation() const = 0; //! Get the axis aligned bounding box of this node
const core::aabbox3d<f32>& getBoundingBox() const override = 0;
//! The animation method.
void OnAnimate(u32 timeMs) override = 0; //! Returns the relative transformation of the scene node.
//virtual core::matrix4 getRelativeTransformation() const = 0;
//! The render method.
/** Does nothing as bones are not visible. */ //! The animation method.
void render() override {} void OnAnimate(u32 timeMs) override =0;
//! How the relative transformation of the bone is used //! The render method.
virtual void setSkinningSpace(E_BONE_SKINNING_SPACE space) = 0; /** Does nothing as bones are not visible. */
void render() override { }
//! How the relative transformation of the bone is used
virtual E_BONE_SKINNING_SPACE getSkinningSpace() const = 0; //! How the relative transformation of the bone is used
virtual void setSkinningSpace( E_BONE_SKINNING_SPACE space ) =0;
//! Updates the absolute position based on the relative and the parents position
virtual void updateAbsolutePositionOfAllChildren() = 0; //! How the relative transformation of the bone is used
virtual E_BONE_SKINNING_SPACE getSkinningSpace() const =0;
s32 positionHint;
s32 scaleHint; //! Updates the absolute position based on the relative and the parents position
s32 rotationHint; virtual void updateAbsolutePositionOfAllChildren()=0;
};
s32 positionHint;
} // end namespace scene s32 scaleHint;
} // end namespace irr s32 rotationHint;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,184 +1,189 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "ISceneNode.h"
#include "IEventReceiver.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
struct SViewFrustum; {
struct SViewFrustum;
//! Scene Node which is a (controllable) camera.
/** The whole scene will be rendered from the cameras point of view. //! Scene Node which is a (controllable) camera.
Because the ICameraSceneNode is a SceneNode, it can be attached to any /** The whole scene will be rendered from the cameras point of view.
other scene node, and will follow its parents movement, rotation and so Because the ICameraSceneNode is a SceneNode, it can be attached to any
on. other scene node, and will follow its parents movement, rotation and so
*/ on.
class ICameraSceneNode : public ISceneNode, public IEventReceiver */
{ class ICameraSceneNode : public ISceneNode, public IEventReceiver
public: {
//! Constructor public:
ICameraSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id,
const core::vector3df &position = core::vector3df(0, 0, 0), //! Constructor
const core::vector3df &rotation = core::vector3df(0, 0, 0), ICameraSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) : const core::vector3df& position = core::vector3df(0,0,0),
ISceneNode(parent, mgr, id, position, rotation, scale), const core::vector3df& rotation = core::vector3df(0,0,0),
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 //! Sets the projection matrix of the camera.
projection matrix. e.g: /** The core::matrix4 class has some methods to build a
core::matrix4::buildProjectionMatrixPerspectiveFovLH. projection matrix. e.g:
Note that the matrix will only stay as set by this method until core::matrix4::buildProjectionMatrixPerspectiveFovLH.
one of the following Methods are called: setNearValue, Note that the matrix will only stay as set by this method until
setFarValue, setAspectRatio, setFOV. one of the following Methods are called: setNearValue,
NOTE: The frustum is not updated before render() is called setFarValue, setAspectRatio, setFOV.
unless you explicitly call updateMatrices() NOTE: The frustum is not updated before render() is called
\param projection The new projection matrix of the camera. unless you explicitly call updateMatrices()
\param isOrthogonal Set this to true if the matrix is an \param projection The new projection matrix of the camera.
orthogonal one (e.g. from matrix4::buildProjectionMatrixOrtho). \param isOrthogonal Set this to true if the matrix is an
*/ orthogonal one (e.g. from matrix4::buildProjectionMatrixOrtho).
virtual void setProjectionMatrix(const core::matrix4 &projection, bool isOrthogonal = false) = 0; */
virtual void setProjectionMatrix(const core::matrix4& projection, bool isOrthogonal=false) =0;
//! Gets the current projection matrix of the camera.
/** \return The current projection matrix of the camera. */ //! Gets the current projection matrix of the camera.
virtual const core::matrix4 &getProjectionMatrix() const = 0; /** \return The current projection matrix of the camera. */
virtual const core::matrix4& getProjectionMatrix() const =0;
//! Gets the current view matrix of the camera.
/** \return The current view matrix of the camera. */ //! Gets the current view matrix of the camera.
virtual const core::matrix4 &getViewMatrix() const = 0; /** \return The current view matrix of the camera. */
virtual const core::matrix4& getViewMatrix() const =0;
//! Sets a custom view matrix affector.
/** The matrix passed here, will be multiplied with the view //! Sets a custom view matrix affector.
matrix when it gets updated. This allows for custom camera /** The matrix passed here, will be multiplied with the view
setups like, for example, a reflection camera. matrix when it gets updated. This allows for custom camera
\param affector The affector matrix. */ setups like, for example, a reflection camera.
virtual void setViewMatrixAffector(const core::matrix4 &affector) = 0; \param affector The affector matrix. */
virtual void setViewMatrixAffector(const core::matrix4& affector) =0;
//! Get the custom view matrix affector.
/** \return The affector matrix. */ //! Get the custom view matrix affector.
virtual const core::matrix4 &getViewMatrixAffector() const = 0; /** \return The affector matrix. */
virtual const core::matrix4& getViewMatrixAffector() const =0;
//! It is possible to send mouse and key events to the camera.
/** Most cameras may ignore this input, but camera scene nodes //! It is possible to send mouse and key events to the camera.
which are created for example with /** Most cameras may ignore this input, but camera scene nodes
ISceneManager::addCameraSceneNodeMaya or which are created for example with
ISceneManager::addCameraSceneNodeFPS, may want to get ISceneManager::addCameraSceneNodeMaya or
this input for changing their position, look at target or ISceneManager::addCameraSceneNodeFPS, may want to get
whatever. */ this input for changing their position, look at target or
bool OnEvent(const SEvent &event) override = 0; whatever. */
bool OnEvent(const SEvent& event) override =0;
//! Sets the look at target of the camera
/** If the camera's target and rotation are bound ( @see //! Sets the look at target of the camera
bindTargetAndRotation() ) then calling this will also change /** If the camera's target and rotation are bound ( @see
the camera's scene node rotation to match the target. bindTargetAndRotation() ) then calling this will also change
Note that setTarget uses the current absolute position the camera's scene node rotation to match the target.
internally, so if you changed setPosition since last rendering you must Note that setTarget uses the current absolute position
call updateAbsolutePosition before using this function. internally, so if you changed setPosition since last rendering you must
\param pos Look at target of the camera, in world co-ordinates. */ call updateAbsolutePosition before using this function.
virtual void setTarget(const core::vector3df &pos) = 0; \param pos Look at target of the camera, in world co-ordinates. */
virtual void setTarget(const core::vector3df& pos) =0;
//! Sets the rotation of the node.
/** This only modifies the relative rotation of the node. //! Sets the rotation of the node.
If the camera's target and rotation are bound ( @see /** This only modifies the relative rotation of the node.
bindTargetAndRotation() ) then calling this will also change If the camera's target and rotation are bound ( @see
the camera's target to match the rotation. bindTargetAndRotation() ) then calling this will also change
\param rotation New rotation of the node in degrees. */ the camera's target to match the rotation.
void setRotation(const core::vector3df &rotation) override = 0; \param rotation New rotation of the node in degrees. */
void setRotation(const core::vector3df& rotation) override =0;
//! Gets the current look at target of the camera
/** \return The current look at target of the camera, in world co-ordinates */ //! Gets the current look at target of the camera
virtual const core::vector3df &getTarget() const = 0; /** \return The current look at target of the camera, in world co-ordinates */
virtual const core::vector3df& getTarget() const =0;
//! Sets the up vector of the camera.
/** \param pos: New upvector of the camera. */ //! Sets the up vector of the camera.
virtual void setUpVector(const core::vector3df &pos) = 0; /** \param pos: New upvector of the camera. */
virtual void setUpVector(const core::vector3df& pos) =0;
//! Gets the up vector of the camera.
/** \return The up vector of the camera, in world space. */ //! Gets the up vector of the camera.
virtual const core::vector3df &getUpVector() const = 0; /** \return The up vector of the camera, in world space. */
virtual const core::vector3df& getUpVector() const =0;
//! Gets the value of the near plane of the camera.
/** \return The value of the near plane of the camera. */ //! Gets the value of the near plane of the camera.
virtual f32 getNearValue() const = 0; /** \return The value of the near plane of the camera. */
virtual f32 getNearValue() const =0;
//! Gets the value of the far plane of the camera.
/** \return The value of the far plane of the camera. */ //! Gets the value of the far plane of the camera.
virtual f32 getFarValue() const = 0; /** \return The value of the far plane of the camera. */
virtual f32 getFarValue() const =0;
//! Gets the aspect ratio of the camera.
/** \return The aspect ratio of the camera. */ //! Gets the aspect ratio of the camera.
virtual f32 getAspectRatio() const = 0; /** \return The aspect ratio of the camera. */
virtual f32 getAspectRatio() const =0;
//! Gets the field of view of the camera.
/** \return The field of view of the camera in radians. */ //! Gets the field of view of the camera.
virtual f32 getFOV() const = 0; /** \return The field of view of the camera in radians. */
virtual f32 getFOV() const =0;
//! Sets the value of the near clipping plane. (default: 1.0f)
/** \param zn: New z near value. */ //! Sets the value of the near clipping plane. (default: 1.0f)
virtual void setNearValue(f32 zn) = 0; /** \param zn: New z near value. */
virtual void setNearValue(f32 zn) =0;
//! Sets the value of the far clipping plane (default: 2000.0f)
/** \param zf: New z far value. */ //! Sets the value of the far clipping plane (default: 2000.0f)
virtual void setFarValue(f32 zf) = 0; /** \param zf: New z far value. */
virtual void setFarValue(f32 zf) =0;
//! Sets the aspect ratio (default: 4.0f / 3.0f)
/** \param aspect: New aspect ratio. */ //! Sets the aspect ratio (default: 4.0f / 3.0f)
virtual void setAspectRatio(f32 aspect) = 0; /** \param aspect: New aspect ratio. */
virtual void setAspectRatio(f32 aspect) =0;
//! Sets the field of view (Default: PI / 2.5f)
/** \param fovy: New field of view in radians. */ //! Sets the field of view (Default: PI / 2.5f)
virtual void setFOV(f32 fovy) = 0; /** \param fovy: New field of view in radians. */
virtual void setFOV(f32 fovy) =0;
//! Get the view frustum.
/** \return The current view frustum. */ //! Get the view frustum.
virtual const SViewFrustum *getViewFrustum() const = 0; /** \return The current view frustum. */
virtual const SViewFrustum* getViewFrustum() const =0;
//! Disables or enables the camera to get key or mouse inputs.
/** If this is set to true, the camera will respond to key //! Disables or enables the camera to get key or mouse inputs.
inputs otherwise not. */ /** If this is set to true, the camera will respond to key
virtual void setInputReceiverEnabled(bool enabled) = 0; inputs otherwise not. */
virtual void setInputReceiverEnabled(bool enabled) =0;
//! Checks if the input receiver of the camera is currently enabled.
virtual bool isInputReceiverEnabled() const = 0; //! Checks if the input receiver of the camera is currently enabled.
virtual bool isInputReceiverEnabled() const =0;
//! Checks if a camera is orthogonal.
virtual bool isOrthogonal() const //! Checks if a camera is orthogonal.
{ virtual bool isOrthogonal() const
return IsOrthogonal; {
} return IsOrthogonal;
}
//! Binds the camera scene node's rotation to its target position and vice versa, or unbinds them.
/** When bound, calling setRotation() will update the camera's //! Binds the camera scene node's rotation to its target position and vice versa, or unbinds them.
target position to be along its +Z axis, and likewise calling /** When bound, calling setRotation() will update the camera's
setTarget() will update its rotation so that its +Z axis will target position to be along its +Z axis, and likewise calling
point at the target point. FPS camera use this binding by setTarget() will update its rotation so that its +Z axis will
default; other cameras do not. point at the target point. FPS camera use this binding by
\param bound True to bind the camera's scene node rotation default; other cameras do not.
and targeting, false to unbind them. \param bound True to bind the camera's scene node rotation
@see getTargetAndRotationBinding() */ and targeting, false to unbind them.
virtual void bindTargetAndRotation(bool bound) = 0; @see getTargetAndRotationBinding() */
virtual void bindTargetAndRotation(bool bound) =0;
//! Updates the matrices without uploading them to the driver
virtual void updateMatrices() = 0; //! Updates the matrices without uploading them to the driver
virtual void updateMatrices() = 0;
//! Queries if the camera scene node's rotation and its target position are bound together.
/** @see bindTargetAndRotation() */ //! Queries if the camera scene node's rotation and its target position are bound together.
virtual bool getTargetAndRotationBinding(void) const = 0; /** @see bindTargetAndRotation() */
virtual bool getTargetAndRotationBinding(void) const =0;
protected:
void cloneMembers(const ICameraSceneNode *toCopyFrom) protected:
{
IsOrthogonal = toCopyFrom->IsOrthogonal; void cloneMembers(const ICameraSceneNode* toCopyFrom)
} {
IsOrthogonal = toCopyFrom->IsOrthogonal;
bool IsOrthogonal; }
};
bool IsOrthogonal;
} // end namespace scene };
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,59 +1,63 @@
// Copyright (C) 2013-2015 Patryk Nadrowski // Copyright (C) 2013-2015 Patryk Nadrowski
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "SExposedVideoData.h"
#include <string> #include "SIrrCreationParameters.h"
#include <string>
namespace irr
{ namespace irr
namespace video {
{ namespace video
// For system specific window contexts (used for OpenGL) {
class IContextManager : public virtual IReferenceCounted // For system specific window contexts (used for OpenGL)
{ class IContextManager : public virtual IReferenceCounted
public: {
//! Initialize manager with device creation parameters and device window (passed as exposed video data) public:
virtual bool initialize(const SIrrlichtCreationParameters &params, const SExposedVideoData &data) = 0; //! Initialize manager with device creation parameters and device window (passed as exposed video data)
virtual bool initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data) =0;
//! Terminate manager, any cleanup that is left over. Manager needs a new initialize to be usable again
virtual void terminate() = 0; //! Terminate manager, any cleanup that is left over. Manager needs a new initialize to be usable again
virtual void terminate() =0;
//! Create surface based on current window set
virtual bool generateSurface() = 0; //! Create surface based on current window set
virtual bool generateSurface() =0;
//! Destroy current surface
virtual void destroySurface() = 0; //! Destroy current surface
virtual void destroySurface() =0;
//! Create context based on current surface
virtual bool generateContext() = 0; //! Create context based on current surface
virtual bool generateContext() =0;
//! Destroy current context
virtual void destroyContext() = 0; //! Destroy current context
virtual void destroyContext() =0;
//! Get current context
virtual const SExposedVideoData &getContext() const = 0; //! Get current context
virtual const SExposedVideoData& getContext() const =0;
//! Change render context, disable old and activate new defined by videoData
//\param restorePrimaryOnZero When true: restore original driver context when videoData is set to 0 values. //! Change render context, disable old and activate new defined by videoData
// When false: resets the context when videoData is set to 0 values. //\param restorePrimaryOnZero When true: restore original driver context when videoData is set to 0 values.
/** This is mostly used internally by IVideoDriver::beginScene(). // When false: resets the context when videoData is set to 0 values.
But if you want to switch threads which access your OpenGL driver you will have to /** This is mostly used internally by IVideoDriver::beginScene().
call this function as follows: But if you want to switch threads which access your OpenGL driver you will have to
Old thread gives up context with: activateContext(irr::video::SExposedVideoData()); call this function as follows:
New thread takes over context with: activateContext(videoDriver->getExposedVideoData()); Old thread gives up context with: activateContext(irr::video::SExposedVideoData());
Note that only 1 thread at a time may access an OpenGL context. */ New thread takes over context with: activateContext(videoDriver->getExposedVideoData());
virtual bool activateContext(const SExposedVideoData &videoData, bool restorePrimaryOnZero = false) = 0; Note that only 1 thread at a time may access an OpenGL context. */
virtual bool activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero=false) =0;
//! Get the address of any OpenGL procedure (including core procedures).
virtual void *getProcAddress(const std::string &procName) = 0; //! Get the address of any OpenGL procedure (including core procedures).
virtual void* getProcAddress(const std::string &procName) =0;
//! Swap buffers.
virtual bool swapBuffers() = 0; //! Swap buffers.
}; virtual bool swapBuffers() =0;
};
} // end namespace video
} // end namespace irr } // end namespace video
} // end namespace irr
#endif

View File

@ -1,195 +1,202 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "rect.h" #include "position2d.h"
#include "rect.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
{
class IGUISpriteBank;
class IGUISpriteBank;
//! Default icons for cursors
enum ECURSOR_ICON //! Default icons for cursors
{ enum ECURSOR_ICON
// Following cursors might be system specific, or might use an Irrlicht icon-set. No guarantees so far. {
ECI_NORMAL, // arrow // Following cursors might be system specific, or might use an Irrlicht icon-set. No guarantees so far.
ECI_CROSS, // Crosshair ECI_NORMAL, // arrow
ECI_HAND, // Hand ECI_CROSS, // Crosshair
ECI_HELP, // Arrow and question mark ECI_HAND, // Hand
ECI_IBEAM, // typical text-selection cursor ECI_HELP, // Arrow and question mark
ECI_NO, // should not click icon ECI_IBEAM, // typical text-selection cursor
ECI_WAIT, // hourglass ECI_NO, // should not click icon
ECI_SIZEALL, // arrow in all directions ECI_WAIT, // hourclass
ECI_SIZENESW, // resizes in direction north-east or south-west ECI_SIZEALL, // arrow in all directions
ECI_SIZENWSE, // resizes in direction north-west or south-east ECI_SIZENESW, // resizes in direction north-east or south-west
ECI_SIZENS, // resizes in direction north or south ECI_SIZENWSE, // resizes in direction north-west or south-east
ECI_SIZEWE, // resizes in direction west or east ECI_SIZENS, // resizes in direction north or south
ECI_UP, // up-arrow ECI_SIZEWE, // resizes in direction west or east
ECI_UP, // up-arrow
// Implementer note: Should we add system specific cursors, which use guaranteed the system icons,
// then I would recommend using a naming scheme like ECI_W32_CROSS, ECI_X11_CROSSHAIR and adding those // Implementer note: Should we add system specific cursors, which use guaranteed the system icons,
// additionally. // then I would recommend using a naming scheme like ECI_W32_CROSS, ECI_X11_CROSSHAIR and adding those
// additionally.
ECI_COUNT // maximal of defined cursors. Note that higher values can be created at runtime
}; ECI_COUNT // maximal of defined cursors. Note that higher values can be created at runtime
};
//! Names for ECURSOR_ICON
const c8 *const GUICursorIconNames[ECI_COUNT + 1] = { //! Names for ECURSOR_ICON
"normal", const c8* const GUICursorIconNames[ECI_COUNT+1] =
"cross", {
"hand", "normal",
"help", "cross",
"ibeam", "hand",
"no", "help",
"wait", "ibeam",
"sizeall", "no",
"sizenesw", "wait",
"sizenwse", "sizeall",
"sizens", "sizenesw",
"sizewe", "sizenwse",
"sizeup", "sizens",
0, "sizewe",
}; "sizeup",
0
//! structure used to set sprites as cursors. };
struct SCursorSprite
{ //! structure used to set sprites as cursors.
SCursorSprite() : struct 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)
{
IGUISpriteBank *SpriteBank; }
s32 SpriteId;
core::position2d<s32> HotSpot; IGUISpriteBank * SpriteBank;
}; s32 SpriteId;
core::position2d<s32> HotSpot;
//! platform specific behavior flags for the cursor };
enum ECURSOR_PLATFORM_BEHAVIOR
{ //! platform specific behavior flags for the cursor
//! default - no platform specific behavior enum ECURSOR_PLATFORM_BEHAVIOR
ECPB_NONE = 0, {
//! default - no platform specific behavior
//! On X11 try caching cursor updates as XQueryPointer calls can be expensive. ECPB_NONE = 0,
/** Update cursor positions only when the irrlicht timer has been updated or the timer is stopped.
This means you usually get one cursor update per device->run() which will be fine in most cases. //! On X11 try caching cursor updates as XQueryPointer calls can be expensive.
See this forum-thread for a more detailed explanation: /** Update cursor positions only when the irrlicht timer has been updated or the timer is stopped.
http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=45525 This means you usually get one cursor update per device->run() which will be fine in most cases.
*/ See this forum-thread for a more detailed explanation:
ECPB_X11_CACHE_UPDATES = 1 http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=45525
}; */
ECPB_X11_CACHE_UPDATES = 1
//! Interface to manipulate the mouse cursor. };
class ICursorControl : public virtual IReferenceCounted
{ //! Interface to manipulate the mouse cursor.
public: class ICursorControl : public virtual IReferenceCounted
//! Changes the visible state of the mouse cursor. {
/** \param visible: The new visible state. If true, the cursor will be visible, public:
if false, it will be invisible. */
virtual void setVisible(bool visible) = 0; //! Changes the visible state of the mouse cursor.
/** \param visible: The new visible state. If true, the cursor will be visible,
//! Returns if the cursor is currently visible. if false, it will be invisible. */
/** \return True if the cursor flag is set to visible, false if not. */ virtual void setVisible(bool visible) = 0;
virtual bool isVisible() const = 0;
//! Returns if the cursor is currently visible.
//! Sets the new position of the cursor. /** \return True if the cursor flag is set to visible, false if not. */
/** The position must be virtual bool isVisible() const = 0;
between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is
the top left corner and (1.0f, 1.0f) is the bottom right corner of the //! Sets the new position of the cursor.
render window. /** The position must be
\param pos New position of the cursor. */ between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is
virtual void setPosition(const core::position2d<f32> &pos) = 0; the top left corner and (1.0f, 1.0f) is the bottom right corner of the
render window.
//! Sets the new position of the cursor. \param pos New position of the cursor. */
/** The position must be virtual void setPosition(const core::position2d<f32> &pos) = 0;
between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is
the top left corner and (1.0f, 1.0f) is the bottom right corner of the //! Sets the new position of the cursor.
render window. /** The position must be
\param x New x-coord of the cursor. between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is
\param y New x-coord of the cursor. */ the top left corner and (1.0f, 1.0f) is the bottom right corner of the
virtual void setPosition(f32 x, f32 y) = 0; render window.
\param x New x-coord of the cursor.
//! Sets the new position of the cursor. \param y New x-coord of the cursor. */
/** \param pos: New position of the cursor. The coordinates are pixel units. */ virtual void setPosition(f32 x, f32 y) = 0;
virtual void setPosition(const core::position2d<s32> &pos) = 0;
//! Sets the new position of the cursor.
//! Sets the new position of the cursor. /** \param pos: New position of the cursor. The coordinates are pixel units. */
/** \param x New x-coord of the cursor. The coordinates are pixel units. virtual void setPosition(const core::position2d<s32> &pos) = 0;
\param y New y-coord of the cursor. The coordinates are pixel units. */
virtual void setPosition(s32 x, s32 y) = 0; //! Sets the new position of the cursor.
/** \param x New x-coord of the cursor. The coordinates are pixel units.
//! Returns the current position of the mouse cursor. \param y New y-coord of the cursor. The coordinates are pixel units. */
/** \param updateCursor When true ask system/OS for current cursor position. virtual void setPosition(s32 x, s32 y) = 0;
When false return the last known (buffered) position ( this is useful to
check what has become of a setPosition call with float numbers). //! Returns the current position of the mouse cursor.
\return Returns the current position of the cursor. The returned position /** \param updateCursor When true ask system/OS for current cursor position.
is the position of the mouse cursor in pixel units. */ When false return the last known (buffered) position ( this is useful to
virtual const core::position2d<s32> &getPosition(bool updateCursor = true) = 0; check what has become of a setPosition call with float numbers).
\return Returns the current position of the cursor. The returned position
//! Returns the current position of the mouse cursor. is the position of the mouse cursor in pixel units. */
/** \param updateCursor When true ask system/OS for current cursor position. virtual const core::position2d<s32>& getPosition(bool updateCursor=true) = 0;
When false return the last known (buffered) position (this is
useful to check what has become of a setPosition call with float numbers //! Returns the current position of the mouse cursor.
and is often different from the values you passed in setPosition). /** \param updateCursor When true ask system/OS for current cursor position.
\return Returns the current position of the cursor. The returned position When false return the last known (buffered) position (this is
is a value between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is useful to check what has become of a setPosition call with float numbers
the top left corner and (1.0f, 1.0f) is the bottom right corner of the and is often different from the values you passed in setPosition).
render window. */ \return Returns the current position of the cursor. The returned position
virtual core::position2d<f32> getRelativePosition(bool updateCursor = true) = 0; is a value between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is
the top left corner and (1.0f, 1.0f) is the bottom right corner of the
//! Sets an absolute reference rect for setting and retrieving the cursor position. render window. */
/** If this rect is set, the cursor position is not being calculated relative to virtual core::position2d<f32> getRelativePosition(bool updateCursor=true) = 0;
the rendering window but to this rect. You can set the rect pointer to 0 to disable
this feature again. This feature is useful when rendering into parts of foreign windows //! Sets an absolute reference rect for setting and retrieving the cursor position.
for example in an editor. /** If this rect is set, the cursor position is not being calculated relative to
\param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/ the rendering window but to this rect. You can set the rect pointer to 0 to disable
virtual void setReferenceRect(core::rect<s32> *rect = 0) = 0; this feature again. This feature is useful when rendering into parts of foreign windows
for example in an editor.
//! Internally fixes the mouse position, and reports relative mouse movement compared to the old position \param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/
/** Specific to SDL */ virtual void setReferenceRect(core::rect<s32>* rect=0) = 0;
virtual void setRelativeMode(bool relative){};
//! Internally fixes the mouse position, and reports relative mouse movement compared to the old position
//! Sets the active cursor icon /** Specific to SDL */
/** Setting cursor icons is so far only supported on Win32 and Linux */ virtual void setRelativeMode(bool relative) {};
virtual void setActiveIcon(ECURSOR_ICON iconId) {}
//! Sets the active cursor icon
//! Gets the currently active icon /** Setting cursor icons is so far only supported on Win32 and Linux */
virtual ECURSOR_ICON getActiveIcon() const { return gui::ECI_NORMAL; } virtual void setActiveIcon(ECURSOR_ICON iconId) {}
//! Add a custom sprite as cursor icon. //! Gets the currently active icon
/** \return Identification for the icon */ virtual ECURSOR_ICON getActiveIcon() const { return gui::ECI_NORMAL; }
virtual ECURSOR_ICON addIcon(const gui::SCursorSprite &icon) { return gui::ECI_NORMAL; }
//! Add a custom sprite as cursor icon.
//! replace a cursor icon. /** \return Identification for the icon */
/** Changing cursor icons is so far only supported on Win32 and Linux virtual ECURSOR_ICON addIcon(const gui::SCursorSprite& icon) { return gui::ECI_NORMAL; }
Note that this only changes the icons within your application, system cursors outside your
application will not be affected. //! replace a cursor icon.
*/ /** Changing cursor icons is so far only supported on Win32 and Linux
virtual void changeIcon(ECURSOR_ICON iconId, const gui::SCursorSprite &sprite) {} Note that this only changes the icons within your application, system cursors outside your
application will not be affected.
//! Return a system-specific size which is supported for cursors. Larger icons will fail, smaller icons might work. */
virtual core::dimension2di getSupportedIconSize() const { return core::dimension2di(0, 0); } virtual void changeIcon(ECURSOR_ICON iconId, const gui::SCursorSprite& sprite) {}
//! Set platform specific behavior flags. //! Return a system-specific size which is supported for cursors. Larger icons will fail, smaller icons might work.
virtual void setPlatformBehavior(ECURSOR_PLATFORM_BEHAVIOR behavior) {} virtual core::dimension2di getSupportedIconSize() const { return core::dimension2di(0,0); }
//! Return platform specific behavior. //! Set platform specific behavior flags.
/** \return Behavior set by setPlatformBehavior or ECPB_NONE for platforms not implementing specific behaviors. virtual void setPlatformBehavior(ECURSOR_PLATFORM_BEHAVIOR behavior) {}
*/
virtual ECURSOR_PLATFORM_BEHAVIOR getPlatformBehavior() const { return ECPB_NONE; } //! Return platform specific behavior.
}; /** \return Behavior set by setPlatformBehavior or ECPB_NONE for platforms not implementing specific behaviors.
*/
} // end namespace gui virtual ECURSOR_PLATFORM_BEHAVIOR getPlatformBehavior() const { return ECPB_NONE; }
} // end namespace irr };
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,36 +1,42 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "ISceneNode.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
{
//! Dummy scene node for adding additional transformations to the scene graph.
/** This scene node does not render itself, and does not respond to set/getPosition, //! Dummy scene node for adding additional transformations to the scene graph.
set/getRotation and set/getScale. Its just a simple scene node that takes a /** This scene node does not render itself, and does not respond to set/getPosition,
matrix as relative transformation, making it possible to insert any transformation set/getRotation and set/getScale. Its just a simple scene node that takes a
anywhere into the scene graph. matrix as relative transformation, making it possible to insert any transformation
This scene node is for example used by the IAnimatedMeshSceneNode for emulating anywhere into the scene graph.
joint scene nodes when playing skeletal animations. This scene node is for example used by the IAnimatedMeshSceneNode for emulating
*/ joint scene nodes when playing skeletal animations.
class IDummyTransformationSceneNode : public ISceneNode */
{ class IDummyTransformationSceneNode : public ISceneNode
public: {
//! Constructor public:
IDummyTransformationSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id) :
ISceneNode(parent, mgr, id) {} //! Constructor
IDummyTransformationSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id)
//! Returns a reference to the current relative transformation matrix. : ISceneNode(parent, mgr, id) {}
/** This is the matrix, this scene node uses instead of scale, translation
and rotation. */ //! Returns a reference to the current relative transformation matrix.
virtual core::matrix4 &getRelativeTransformationMatrix() = 0; /** This is the matrix, this scene node uses instead of scale, translation
}; and rotation. */
virtual core::matrix4& getRelativeTransformationMatrix() = 0;
} // end namespace scene };
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,127 +1,148 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt/ Thomas Alten // Copyright (C) 2002-2012 Nikolaus Gebhardt/ Thomas Alten
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReadFile.h"
#include "IFileList.h"
namespace irr
{ namespace irr
{
namespace io
{ namespace io
{
//! FileSystemType: which filesystem should be used for e.g. browsing
enum EFileSystemType //! FileSystemType: which filesystem should be used for e.g. browsing
{ enum EFileSystemType
FILESYSTEM_NATIVE = 0, // Native OS FileSystem {
FILESYSTEM_VIRTUAL // Virtual FileSystem FILESYSTEM_NATIVE = 0, // Native OS FileSystem
}; FILESYSTEM_VIRTUAL // Virtual FileSystem
};
//! Contains the different types of archives
enum E_FILE_ARCHIVE_TYPE //! Contains the different types of archives
{ enum E_FILE_ARCHIVE_TYPE
//! A PKZIP archive {
EFAT_ZIP = MAKE_IRR_ID('Z', 'I', 'P', 0), //! A PKZIP archive
EFAT_ZIP = MAKE_IRR_ID('Z','I','P', 0),
//! A gzip archive
EFAT_GZIP = MAKE_IRR_ID('g', 'z', 'i', 'p'), //! A gzip archive
EFAT_GZIP = MAKE_IRR_ID('g','z','i','p'),
//! An Android asset file archive
EFAT_ANDROID_ASSET = MAKE_IRR_ID('A', 'S', 'S', 'E'), //! A virtual directory
EFAT_FOLDER = MAKE_IRR_ID('f','l','d','r'),
//! The type of this archive is unknown
EFAT_UNKNOWN = MAKE_IRR_ID('u', 'n', 'k', 'n') //! An ID Software PAK archive
}; EFAT_PAK = MAKE_IRR_ID('P','A','K', 0),
//! The FileArchive manages archives and provides access to files inside them. //! A Nebula Device archive
class IFileArchive : public virtual IReferenceCounted EFAT_NPK = MAKE_IRR_ID('N','P','K', 0),
{
public: //! A Tape ARchive
//! Opens a file based on its name EFAT_TAR = MAKE_IRR_ID('T','A','R', 0),
/** Creates and returns a new IReadFile for a file in the archive.
\param filename The file to open //! A wad Archive, Quake2, Halflife
\return Returns A pointer to the created file on success, EFAT_WAD = MAKE_IRR_ID('W','A','D', 0),
or 0 on failure. */
virtual IReadFile *createAndOpenFile(const path &filename) = 0; //! An Android asset file archive
EFAT_ANDROID_ASSET = MAKE_IRR_ID('A','S','S','E'),
//! Opens a file based on its position in the file list.
/** Creates and returns //! The type of this archive is unknown
\param index The zero based index of the file. EFAT_UNKNOWN = MAKE_IRR_ID('u','n','k','n')
\return Returns a pointer to the created file on success, or 0 on failure. */ };
virtual IReadFile *createAndOpenFile(u32 index) = 0;
//! The FileArchive manages archives and provides access to files inside them.
//! Returns the complete file tree class IFileArchive : public virtual IReferenceCounted
/** \return Returns the complete directory tree for the archive, {
including all files and folders */ public:
virtual const IFileList *getFileList() const = 0;
//! Opens a file based on its name
//! get the archive type /** Creates and returns a new IReadFile for a file in the archive.
virtual E_FILE_ARCHIVE_TYPE getType() const { return EFAT_UNKNOWN; } \param filename The file to open
\return Returns A pointer to the created file on success,
//! return the name (id) of the file Archive or 0 on failure. */
virtual const io::path &getArchiveName() const = 0; virtual IReadFile* createAndOpenFile(const path& filename) =0;
//! Add a directory in the archive and all it's files to the FileList //! Opens a file based on its position in the file list.
/** Only needed for file-archives which have no information about their own /** Creates and returns
directory structure. In that case the user must add directories manually. \param index The zero based index of the file.
Currently this is necessary for archives of type EFAT_ANDROID_ASSET. \return Returns a pointer to the created file on success, or 0 on failure. */
The root-path itself is already set by the engine. virtual IReadFile* createAndOpenFile(u32 index) =0;
If directories are not added manually opening files might still work,
but checks if file exists will fail. //! Returns the complete file tree
*/ /** \return Returns the complete directory tree for the archive,
virtual void addDirectoryToFileList(const io::path &filename) {} including all files and folders */
virtual const IFileList* getFileList() const =0;
//! An optionally used password string
/** This variable is publicly accessible from the interface in order to //! get the archive type
avoid single access patterns to this place, and hence allow some more virtual E_FILE_ARCHIVE_TYPE getType() const { return EFAT_UNKNOWN; }
obscurity.
*/ //! return the name (id) of the file Archive
core::stringc Password; virtual const io::path& getArchiveName() const =0;
};
//! Add a directory in the archive and all it's files to the FileList
//! Class which is able to create an archive from a file. /** Only needed for file-archives which have no information about their own
/** If you want the Irrlicht Engine be able to load archives of directory structure. In that case the user must add directories manually.
currently unsupported file formats (e.g .wad), then implement Currently this is necessary for archives of type EFAT_ANDROID_ASSET.
this and add your new Archive loader with The root-path itself is already set by the engine.
IFileSystem::addArchiveLoader() to the engine. */ If directories are not added manually opening files might still work,
class IArchiveLoader : public virtual IReferenceCounted but checks if file exists will fail.
{ */
public: virtual void addDirectoryToFileList(const io::path &filename) {}
//! Check if the file might be loaded by this class
/** Check based on the file extension (e.g. ".zip") //! An optionally used password string
\param filename Name of file to check. /** This variable is publicly accessible from the interface in order to
\return True if file seems to be loadable. */ avoid single access patterns to this place, and hence allow some more
virtual bool isALoadableFileFormat(const path &filename) const = 0; obscurity.
*/
//! Check if the file might be loaded by this class core::stringc Password;
/** This check may look into the file. };
\param file File handle to check.
\return True if file seems to be loadable. */ //! Class which is able to create an archive from a file.
virtual bool isALoadableFileFormat(io::IReadFile *file) const = 0; /** If you want the Irrlicht Engine be able to load archives of
currently unsupported file formats (e.g .wad), then implement
//! Check to see if the loader can create archives of this type. this and add your new Archive loader with
/** Check based on the archive type. IFileSystem::addArchiveLoader() to the engine. */
\param fileType The archive type to check. class IArchiveLoader : public virtual IReferenceCounted
\return True if the archive loader supports this type, false if not */ {
virtual bool isALoadableFileFormat(E_FILE_ARCHIVE_TYPE fileType) const = 0; public:
//! Check if the file might be loaded by this class
//! Creates an archive from the filename /** Check based on the file extension (e.g. ".zip")
/** \param filename File to use. \param filename Name of file to check.
\param ignoreCase Searching is performed without regarding the case \return True if file seems to be loadable. */
\param ignorePaths Files are searched for without checking for the directories virtual bool isALoadableFileFormat(const path& filename) const =0;
\return Pointer to newly created archive, or 0 upon error. */
virtual IFileArchive *createArchive(const path &filename, bool ignoreCase, bool ignorePaths) const = 0; //! Check if the file might be loaded by this class
/** This check may look into the file.
//! Creates an archive from the file \param file File handle to check.
/** \param file File handle to use. \return True if file seems to be loadable. */
\param ignoreCase Searching is performed without regarding the case virtual bool isALoadableFileFormat(io::IReadFile* file) const =0;
\param ignorePaths Files are searched for without checking for the directories
\return Pointer to newly created archive, or 0 upon error. */ //! Check to see if the loader can create archives of this type.
virtual IFileArchive *createArchive(io::IReadFile *file, bool ignoreCase, bool ignorePaths) const = 0; /** Check based on the archive type.
}; \param fileType The archive type to check.
\return True if the archive loader supports this type, false if not */
} // end namespace io virtual bool isALoadableFileFormat(E_FILE_ARCHIVE_TYPE fileType) const =0;
} // end namespace irr
//! Creates an archive from the filename
/** \param filename File to use.
\param ignoreCase Searching is performed without regarding the case
\param ignorePaths Files are searched for without checking for the directories
\return Pointer to newly created archive, or 0 upon error. */
virtual IFileArchive* createArchive(const path& filename, bool ignoreCase, bool ignorePaths) const =0;
//! Creates an archive from the file
/** \param file File handle to use.
\param ignoreCase Searching is performed without regarding the case
\param ignorePaths Files are searched for without checking for the directories
\return Pointer to newly created archive, or 0 upon error. */
virtual IFileArchive* createArchive(io::IReadFile* file, bool ignoreCase, bool ignorePaths) const =0;
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -1,89 +1,94 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "path.h"
namespace irr
{ namespace irr
namespace io {
{ namespace io
{
//! Provides a list of files and folders.
/** File lists usually contain a list of all files in a given folder, //! Provides a list of files and folders.
but can also contain a complete directory structure. */ /** File lists usually contain a list of all files in a given folder,
class IFileList : public virtual IReferenceCounted but can also contain a complete directory structure. */
{ class IFileList : public virtual IReferenceCounted
public: {
//! Get the number of files in the filelist. public:
/** \return Amount of files and directories in the file list. */ //! Get the number of files in the filelist.
virtual u32 getFileCount() const = 0; /** \return Amount of files and directories in the file list. */
virtual u32 getFileCount() const = 0;
//! Gets the name of a file in the list, based on an index.
/** The path is not included in this name. Use getFullFileName for this. //! Gets the name of a file in the list, based on an index.
\param index is the zero based index of the file which name should /** The path is not included in this name. Use getFullFileName for this.
be returned. The index must be less than the amount getFileCount() returns. \param index is the zero based index of the file which name should
\return File name of the file. Returns 0, if an error occurred. */ be returned. The index must be less than the amount getFileCount() returns.
virtual const io::path &getFileName(u32 index) const = 0; \return File name of the file. Returns 0, if an error occurred. */
virtual const io::path& getFileName(u32 index) const = 0;
//! Gets the full name of a file in the list including the path, based on an index.
/** \param index is the zero based index of the file which name should //! Gets the full name of a file in the list including the path, based on an index.
be returned. The index must be less than the amount getFileCount() returns. /** \param index is the zero based index of the file which name should
\return File name of the file. Returns 0 if an error occurred. */ be returned. The index must be less than the amount getFileCount() returns.
virtual const io::path &getFullFileName(u32 index) const = 0; \return File name of the file. Returns 0 if an error occurred. */
virtual const io::path& getFullFileName(u32 index) const = 0;
//! Returns the size of a file in the file list, based on an index.
/** \param index is the zero based index of the file which should be returned. //! Returns the size of a file in the file list, based on an index.
The index must be less than the amount getFileCount() returns. /** \param index is the zero based index of the file which should be returned.
\return The size of the file in bytes. */ The index must be less than the amount getFileCount() returns.
virtual u32 getFileSize(u32 index) const = 0; \return The size of the file in bytes. */
virtual u32 getFileSize(u32 index) const = 0;
//! Returns the file offset of a file in the file list, based on an index.
/** \param index is the zero based index of the file which should be returned. //! Returns the file offset of a file in the file list, based on an index.
The index must be less than the amount getFileCount() returns. /** \param index is the zero based index of the file which should be returned.
\return The offset of the file in bytes. */ The index must be less than the amount getFileCount() returns.
virtual u32 getFileOffset(u32 index) const = 0; \return The offset of the file in bytes. */
virtual u32 getFileOffset(u32 index) const = 0;
//! Returns the ID of a file in the file list, based on an index.
/** This optional ID can be used to link the file list entry to information held //! Returns the ID of a file in the file list, based on an index.
elsewhere. For example this could be an index in an IFileArchive, linking the entry /** This optional ID can be used to link the file list entry to information held
to its data offset, uncompressed size and CRC. elsewhere. For example this could be an index in an IFileArchive, linking the entry
\param index is the zero based index of the file which should be returned. to its data offset, uncompressed size and CRC.
The index must be less than the amount getFileCount() returns. \param index is the zero based index of the file which should be returned.
\return The ID of the file. */ The index must be less than the amount getFileCount() returns.
virtual u32 getID(u32 index) const = 0; \return The ID of the file. */
virtual u32 getID(u32 index) const = 0;
//! Check if the file is a directory
/** \param index The zero based index which will be checked. The index //! Check if the file is a directory
must be less than the amount getFileCount() returns. /** \param index The zero based index which will be checked. The index
\return True if the file is a directory, else false. */ must be less than the amount getFileCount() returns.
virtual bool isDirectory(u32 index) const = 0; \return True if the file is a directory, else false. */
virtual bool isDirectory(u32 index) const = 0;
//! Searches for a file or folder in the list
/** Searches for a file by name //! Searches for a file or folder in the list
\param filename The name of the file to search for. /** Searches for a file by name
\param isFolder True if you are searching for a directory path, false if you are searching for a file \param filename The name of the file to search for.
\return Returns the index of the file in the file list, or -1 if \param isFolder True if you are searching for a directory path, false if you are searching for a file
no matching name name was found. */ \return Returns the index of the file in the file list, or -1 if
virtual s32 findFile(const io::path &filename, bool isFolder = false) const = 0; no matching name name was found. */
virtual s32 findFile(const io::path& filename, bool isFolder=false) const = 0;
//! Returns the base path of the file list
virtual const io::path &getPath() const = 0; //! Returns the base path of the file list
virtual const io::path& getPath() const = 0;
//! Add as a file or folder to the list
/** \param fullPath The file name including path, from the root of the file list. //! Add as a file or folder to the list
\param isDirectory True if this is a directory rather than a file. /** \param fullPath The file name including path, from the root of the file list.
\param offset The file offset inside an archive \param isDirectory True if this is a directory rather than a file.
\param size The size of the file in bytes. \param offset The file offset inside an archive
\param id The ID of the file in the archive which owns it */ \param size The size of the file in bytes.
virtual u32 addItem(const io::path &fullPath, u32 offset, u32 size, bool isDirectory, u32 id = 0) = 0; \param id The ID of the file in the archive which owns it */
virtual u32 addItem(const io::path& fullPath, u32 offset, u32 size, bool isDirectory, u32 id=0) = 0;
//! Sorts the file list. You should call this after adding any items to the file list
virtual void sort() = 0; //! Sorts the file list. You should call this after adding any items to the file list
}; virtual void sort() = 0;
};
} // end namespace irr
} // end namespace io } // end namespace irr
} // end namespace io
#endif

View File

@ -1,265 +1,273 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "IFileArchive.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
class IVideoDriver; {
} // end namespace video class IVideoDriver;
namespace io } // end namespace video
{ namespace io
{
class IReadFile;
class IWriteFile; class IReadFile;
class IFileList; class IWriteFile;
class IAttributes; 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 //! The FileSystem manages files and archives and provides access to them.
as file on disk, using the IFileSystem makes no difference to this. */ /** It manages where files are, so that modules which use the the IO do not
class IFileSystem : public virtual IReferenceCounted need to know where every file is located. A file could be in a .zip-Archive or
{ as file on disk, using the IFileSystem makes no difference to this. */
public: class IFileSystem : public virtual IReferenceCounted
//! Opens a file for read access. {
/** \param filename: Name of file to open. public:
\return Pointer to the created file interface.
The returned pointer should be dropped when no longer needed. //! Opens a file for read access.
See IReferenceCounted::drop() for more information. */ /** \param filename: Name of file to open.
virtual IReadFile *createAndOpenFile(const path &filename) = 0; \return Pointer to the created file interface.
The returned pointer should be dropped when no longer needed.
//! Creates an IReadFile interface for accessing memory like a file. See IReferenceCounted::drop() for more information. */
/** This allows you to use a pointer to memory where an IReadFile is requested. virtual IReadFile* createAndOpenFile(const path& filename) =0;
\param memory: A pointer to the start of the file in memory
\param len: The length of the memory in bytes //! Creates an IReadFile interface for accessing memory like a file.
\param fileName: The name given to this file /** This allows you to use a pointer to memory where an IReadFile is requested.
\param deleteMemoryWhenDropped: True if the memory should be deleted \param memory: A pointer to the start of the file in memory
along with the IReadFile when it is dropped. \param len: The length of the memory in bytes
\return Pointer to the created file interface. \param fileName: The name given to this file
The returned pointer should be dropped when no longer needed. \param deleteMemoryWhenDropped: True if the memory should be deleted
See IReferenceCounted::drop() for more information. along with the IReadFile when it is dropped.
*/ \return Pointer to the created file interface.
virtual IReadFile *createMemoryReadFile(const void *memory, s32 len, const path &fileName, bool deleteMemoryWhenDropped = false) = 0; The returned pointer should be dropped when no longer needed.
See IReferenceCounted::drop() for more information.
//! Creates an IReadFile interface for accessing files inside files. */
/** This is useful e.g. for archives. virtual IReadFile* createMemoryReadFile(const void* memory, s32 len, const path& fileName, bool deleteMemoryWhenDropped=false) =0;
\param fileName: The name given to this file
\param alreadyOpenedFile: Pointer to the enclosing file //! Creates an IReadFile interface for accessing files inside files.
\param pos: Start of the file inside alreadyOpenedFile /** This is useful e.g. for archives.
\param areaSize: The length of the file \param fileName: The name given to this file
\return A pointer to the created file interface. \param alreadyOpenedFile: Pointer to the enclosing file
The returned pointer should be dropped when no longer needed. \param pos: Start of the file inside alreadyOpenedFile
See IReferenceCounted::drop() for more information. \param areaSize: The length of the file
*/ \return A pointer to the created file interface.
virtual IReadFile *createLimitReadFile(const path &fileName, The returned pointer should be dropped when no longer needed.
IReadFile *alreadyOpenedFile, long pos, long areaSize) = 0; See IReferenceCounted::drop() for more information.
*/
//! Creates an IWriteFile interface for accessing memory like a file. virtual IReadFile* createLimitReadFile(const path& fileName,
/** This allows you to use a pointer to memory where an IWriteFile is requested. IReadFile* alreadyOpenedFile, long pos, long areaSize) =0;
You are responsible for allocating enough memory.
\param memory: A pointer to the start of the file in memory (allocated by you) //! Creates an IWriteFile interface for accessing memory like a file.
\param len: The length of the memory in bytes /** This allows you to use a pointer to memory where an IWriteFile is requested.
\param fileName: The name given to this file You are responsible for allocating enough memory.
\param deleteMemoryWhenDropped: True if the memory should be deleted \param memory: A pointer to the start of the file in memory (allocated by you)
along with the IWriteFile when it is dropped. \param len: The length of the memory in bytes
\return Pointer to the created file interface. \param fileName: The name given to this file
The returned pointer should be dropped when no longer needed. \param deleteMemoryWhenDropped: True if the memory should be deleted
See IReferenceCounted::drop() for more information. along with the IWriteFile when it is dropped.
*/ \return Pointer to the created file interface.
virtual IWriteFile *createMemoryWriteFile(void *memory, s32 len, const path &fileName, bool deleteMemoryWhenDropped = false) = 0; The returned pointer should be dropped when no longer needed.
See IReferenceCounted::drop() for more information.
//! Opens a file for write access. */
/** \param filename: Name of file to open. virtual IWriteFile* createMemoryWriteFile(void* memory, s32 len, const path& fileName, bool deleteMemoryWhenDropped=false) =0;
\param append: If the file already exist, all write operations are
appended to the file.
\return Pointer to the created file interface. 0 is returned, if the //! Opens a file for write access.
file could not created or opened for writing. /** \param filename: Name of file to open.
The returned pointer should be dropped when no longer needed. \param append: If the file already exist, all write operations are
See IReferenceCounted::drop() for more information. */ appended to the file.
virtual IWriteFile *createAndWriteFile(const path &filename, bool append = false) = 0; \return Pointer to the created file interface. 0 is returned, if the
file could not created or opened for writing.
//! Adds an archive to the file system. The returned pointer should be dropped when no longer needed.
/** After calling this, the Irrlicht Engine will also search and open See IReferenceCounted::drop() for more information. */
files directly from this archive. This is useful for hiding data from virtual IWriteFile* createAndWriteFile(const path& filename, bool append=false) =0;
the end user, speeding up file access and making it possible to access
for example Quake3 .pk3 files, which are just renamed .zip files. By //! Adds an archive to the file system.
default Irrlicht supports ZIP, PAK, TAR, PNK, and directories as /** After calling this, the Irrlicht Engine will also search and open
archives. You can provide your own archive types by implementing files directly from this archive. This is useful for hiding data from
IArchiveLoader and passing an instance to addArchiveLoader. the end user, speeding up file access and making it possible to access
Irrlicht supports AES-encrypted zip files, and the advanced compression for example Quake3 .pk3 files, which are just renamed .zip files. By
techniques lzma and bzip2. default Irrlicht supports ZIP, PAK, TAR, PNK, and directories as
\param filename: Filename of the archive to add to the file system. archives. You can provide your own archive types by implementing
\param ignoreCase: If set to true, files in the archive can be accessed without IArchiveLoader and passing an instance to addArchiveLoader.
writing all letters in the right case. Irrlicht supports AES-encrypted zip files, and the advanced compression
\param ignorePaths: If set to true, files in the added archive can be accessed techniques lzma and bzip2.
without its complete path. \param filename: Filename of the archive to add to the file system.
\param archiveType: If no specific E_FILE_ARCHIVE_TYPE is selected then \param ignoreCase: If set to true, files in the archive can be accessed without
the type of archive will depend on the extension of the file name. If writing all letters in the right case.
you use a different extension then you can use this parameter to force \param ignorePaths: If set to true, files in the added archive can be accessed
a specific type of archive. without its complete path.
\param password An optional password, which is used in case of encrypted archives. \param archiveType: If no specific E_FILE_ARCHIVE_TYPE is selected then
\param retArchive A pointer that will be set to the archive that is added. the type of archive will depend on the extension of the file name. If
\return True if the archive was added successfully, false if not. */ you use a different extension then you can use this parameter to force
virtual bool addFileArchive(const path &filename, bool ignoreCase = true, a specific type of archive.
bool ignorePaths = true, \param password An optional password, which is used in case of encrypted archives.
E_FILE_ARCHIVE_TYPE archiveType = EFAT_UNKNOWN, \param retArchive A pointer that will be set to the archive that is added.
const core::stringc &password = "", \return True if the archive was added successfully, false if not. */
IFileArchive **retArchive = 0) = 0; virtual bool addFileArchive(const path& filename, bool ignoreCase=true,
bool ignorePaths=true,
//! Adds an archive to the file system. E_FILE_ARCHIVE_TYPE archiveType=EFAT_UNKNOWN,
/** After calling this, the Irrlicht Engine will also search and open const core::stringc& password="",
files directly from this archive. This is useful for hiding data from IFileArchive** retArchive=0) =0;
the end user, speeding up file access and making it possible to access
for example Quake3 .pk3 files, which are just renamed .zip files. By //! Adds an archive to the file system.
default Irrlicht supports ZIP, PAK, TAR, PNK, and directories as /** After calling this, the Irrlicht Engine will also search and open
archives. You can provide your own archive types by implementing files directly from this archive. This is useful for hiding data from
IArchiveLoader and passing an instance to addArchiveLoader. the end user, speeding up file access and making it possible to access
Irrlicht supports AES-encrypted zip files, and the advanced compression for example Quake3 .pk3 files, which are just renamed .zip files. By
techniques lzma and bzip2. default Irrlicht supports ZIP, PAK, TAR, PNK, and directories as
If you want to add a directory as an archive, prefix its name with a archives. You can provide your own archive types by implementing
slash in order to let Irrlicht recognize it as a folder mount (mypath/). IArchiveLoader and passing an instance to addArchiveLoader.
Using this technique one can build up a search order, because archives Irrlicht supports AES-encrypted zip files, and the advanced compression
are read first, and can be used more easily with relative filenames. techniques lzma and bzip2.
\param file: Archive to add to the file system. If you want to add a directory as an archive, prefix its name with a
\param ignoreCase: If set to true, files in the archive can be accessed without slash in order to let Irrlicht recognize it as a folder mount (mypath/).
writing all letters in the right case. Using this technique one can build up a search order, because archives
\param ignorePaths: If set to true, files in the added archive can be accessed are read first, and can be used more easily with relative filenames.
without its complete path. \param file: Archive to add to the file system.
\param archiveType: If no specific E_FILE_ARCHIVE_TYPE is selected then \param ignoreCase: If set to true, files in the archive can be accessed without
the type of archive will depend on the extension of the file name. If writing all letters in the right case.
you use a different extension then you can use this parameter to force \param ignorePaths: If set to true, files in the added archive can be accessed
a specific type of archive. without its complete path.
\param password An optional password, which is used in case of encrypted archives. \param archiveType: If no specific E_FILE_ARCHIVE_TYPE is selected then
\param retArchive A pointer that will be set to the archive that is added. the type of archive will depend on the extension of the file name. If
\return True if the archive was added successfully, false if not. */ you use a different extension then you can use this parameter to force
virtual bool addFileArchive(IReadFile *file, bool ignoreCase = true, a specific type of archive.
bool ignorePaths = true, \param password An optional password, which is used in case of encrypted archives.
E_FILE_ARCHIVE_TYPE archiveType = EFAT_UNKNOWN, \param retArchive A pointer that will be set to the archive that is added.
const core::stringc &password = "", \return True if the archive was added successfully, false if not. */
IFileArchive **retArchive = 0) = 0; virtual bool addFileArchive(IReadFile* file, bool ignoreCase=true,
bool ignorePaths=true,
//! Adds an archive to the file system. E_FILE_ARCHIVE_TYPE archiveType=EFAT_UNKNOWN,
/** \param archive: The archive to add to the file system. const core::stringc& password="",
\return True if the archive was added successfully, false if not. */ IFileArchive** retArchive=0) =0;
virtual bool addFileArchive(IFileArchive *archive) = 0;
//! Adds an archive to the file system.
//! Get the number of archives currently attached to the file system /** \param archive: The archive to add to the file system.
virtual u32 getFileArchiveCount() const = 0; \return True if the archive was added successfully, false if not. */
virtual bool addFileArchive(IFileArchive* archive) =0;
//! Removes an archive from the file system.
/** This will close the archive and free any file handles, but will not //! Get the number of archives currently attached to the file system
close resources which have already been loaded and are now cached, for virtual u32 getFileArchiveCount() const =0;
example textures and meshes.
\param index: The index of the archive to remove //! Removes an archive from the file system.
\return True on success, false on failure */ /** This will close the archive and free any file handles, but will not
virtual bool removeFileArchive(u32 index) = 0; close resources which have already been loaded and are now cached, for
example textures and meshes.
//! Removes an archive from the file system. \param index: The index of the archive to remove
/** This will close the archive and free any file handles, but will not \return True on success, false on failure */
close resources which have already been loaded and are now cached, for virtual bool removeFileArchive(u32 index) =0;
example textures and meshes. Note that a relative filename might be
interpreted differently on each call, depending on the current working //! Removes an archive from the file system.
directory. In case you want to remove an archive that was added using /** This will close the archive and free any file handles, but will not
a relative path name, you have to change to the same working directory close resources which have already been loaded and are now cached, for
again. This means, that the filename given on creation is not an example textures and meshes. Note that a relative filename might be
identifier for the archive, but just a usual filename that is used for interpreted differently on each call, depending on the current working
locating the archive to work with. directory. In case you want to remove an archive that was added using
\param filename The archive pointed to by the name will be removed a relative path name, you have to change to the same working directory
\return True on success, false on failure */ again. This means, that the filename given on creation is not an
virtual bool removeFileArchive(const path &filename) = 0; identifier for the archive, but just a usual filename that is used for
locating the archive to work with.
//! Removes an archive from the file system. \param filename The archive pointed to by the name will be removed
/** This will close the archive and free any file handles, but will not \return True on success, false on failure */
close resources which have already been loaded and are now cached, for virtual bool removeFileArchive(const path& filename) =0;
example textures and meshes.
\param archive The archive to remove. //! Removes an archive from the file system.
\return True on success, false on failure */ /** This will close the archive and free any file handles, but will not
virtual bool removeFileArchive(const IFileArchive *archive) = 0; close resources which have already been loaded and are now cached, for
example textures and meshes.
//! Changes the search order of attached archives. \param archive The archive to remove.
/** \return True on success, false on failure */
\param sourceIndex: The index of the archive to change virtual bool removeFileArchive(const IFileArchive* archive) =0;
\param relative: The relative change in position, archives with a lower index are searched first */
virtual bool moveFileArchive(u32 sourceIndex, s32 relative) = 0; //! Changes the search order of attached archives.
/**
//! Get the archive at a given index. \param sourceIndex: The index of the archive to change
virtual IFileArchive *getFileArchive(u32 index) = 0; \param relative: The relative change in position, archives with a lower index are searched first */
virtual bool moveFileArchive(u32 sourceIndex, s32 relative) =0;
//! Adds an external archive loader to the engine.
/** Use this function to add support for new archive types to the //! Get the archive at a given index.
engine, for example proprietary or encrypted file storage. */ virtual IFileArchive* getFileArchive(u32 index) =0;
virtual void addArchiveLoader(IArchiveLoader *loader) = 0;
//! Adds an external archive loader to the engine.
//! Gets the number of archive loaders currently added /** Use this function to add support for new archive types to the
virtual u32 getArchiveLoaderCount() const = 0; engine, for example proprietary or encrypted file storage. */
virtual void addArchiveLoader(IArchiveLoader* loader) =0;
//! Retrieve the given archive loader
/** \param index The index of the loader to retrieve. This parameter is an 0-based //! Gets the number of archive loaders currently added
array index. virtual u32 getArchiveLoaderCount() const = 0;
\return A pointer to the specified loader, 0 if the index is incorrect. */
virtual IArchiveLoader *getArchiveLoader(u32 index) const = 0; //! Retrieve the given archive loader
/** \param index The index of the loader to retrieve. This parameter is an 0-based
//! Get the current working directory. array index.
/** \return Current working directory as a string. */ \return A pointer to the specified loader, 0 if the index is incorrect. */
virtual const path &getWorkingDirectory() = 0; virtual IArchiveLoader* getArchiveLoader(u32 index) const = 0;
//! Changes the current working directory. //! Get the current working directory.
/** \param newDirectory: A string specifying the new working directory. /** \return Current working directory as a string. */
The string is operating system dependent. Under Windows it has virtual const path& getWorkingDirectory() =0;
the form "<drive>:\<directory>\<sudirectory>\<..>". An example would be: "C:\Windows\"
\return True if successful, otherwise false. */ //! Changes the current working directory.
virtual bool changeWorkingDirectoryTo(const path &newDirectory) = 0; /** \param newDirectory: A string specifying the new working directory.
The string is operating system dependent. Under Windows it has
//! Converts a relative path to an absolute (unique) path, resolving symbolic links if required the form "<drive>:\<directory>\<sudirectory>\<..>". An example would be: "C:\Windows\"
/** \param filename Possibly relative file or directory name to query. \return True if successful, otherwise false. */
\result Absolute filename which points to the same file. */ virtual bool changeWorkingDirectoryTo(const path& newDirectory) =0;
virtual path getAbsolutePath(const path &filename) const = 0;
//! Converts a relative path to an absolute (unique) path, resolving symbolic links if required
//! Get the directory a file is located in. /** \param filename Possibly relative file or directory name to query.
/** \param filename: The file to get the directory from. \result Absolute filename which points to the same file. */
\return String containing the directory of the file. */ virtual path getAbsolutePath(const path& filename) const =0;
virtual path getFileDir(const path &filename) const = 0;
//! Get the directory a file is located in.
//! Get the base part of a filename, i.e. the name without the directory part. /** \param filename: The file to get the directory from.
/** If no directory is prefixed, the full name is returned. \return String containing the directory of the file. */
\param filename: The file to get the basename from virtual path getFileDir(const path& filename) const =0;
\param keepExtension True if filename with extension is returned otherwise everything
after the final '.' is removed as well. */ //! Get the base part of a filename, i.e. the name without the directory part.
virtual path getFileBasename(const path &filename, bool keepExtension = true) const = 0; /** If no directory is prefixed, the full name is returned.
\param filename: The file to get the basename from
//! flatten a path and file name for example: "/you/me/../." becomes "/you" \param keepExtension True if filename with extension is returned otherwise everything
virtual path &flattenFilename(path &directory, const path &root = "/") const = 0; after the final '.' is removed as well. */
virtual path getFileBasename(const path& filename, bool keepExtension=true) const =0;
//! Get the relative filename, relative to the given directory
virtual path getRelativeFilename(const path &filename, const path &directory) const = 0; //! flatten a path and file name for example: "/you/me/../." becomes "/you"
virtual path& flattenFilename(path& directory, const path& root="/") const =0;
//! Creates a list of files and directories in the current working directory and returns it.
/** \return a Pointer to the created IFileList is returned. After the list has been used //! Get the relative filename, relative to the given directory
it has to be deleted using its IFileList::drop() method. virtual path getRelativeFilename(const path& filename, const path& directory) const =0;
See IReferenceCounted::drop() for more information. */
virtual IFileList *createFileList() = 0; //! Creates a list of files and directories in the current working directory and returns it.
/** \return a Pointer to the created IFileList is returned. After the list has been used
//! Creates an empty filelist it has to be deleted using its IFileList::drop() method.
/** \return a Pointer to the created IFileList is returned. After the list has been used See IReferenceCounted::drop() for more information. */
it has to be deleted using its IFileList::drop() method. virtual IFileList* createFileList() =0;
See IReferenceCounted::drop() for more information. */
virtual IFileList *createEmptyFileList(const io::path &path, bool ignoreCase, bool ignorePaths) = 0; //! Creates an empty filelist
/** \return a Pointer to the created IFileList is returned. After the list has been used
//! Set the active type of file system. it has to be deleted using its IFileList::drop() method.
virtual EFileSystemType setFileListSystem(EFileSystemType listType) = 0; See IReferenceCounted::drop() for more information. */
virtual IFileList* createEmptyFileList(const io::path& path, bool ignoreCase, bool ignorePaths) =0;
//! Determines if a file exists and could be opened.
/** \param filename is the string identifying the file which should be tested for existence. //! Set the active type of file system.
\return True if file exists, and false if it does not exist or an error occurred. */ virtual EFileSystemType setFileListSystem(EFileSystemType listType) =0;
virtual bool existFile(const path &filename) const = 0;
}; //! Determines if a file exists and could be opened.
/** \param filename is the string identifying the file which should be tested for existence.
} // end namespace io \return True if file exists, and false if it does not exist or an error occurred. */
} // end namespace irr virtual bool existFile(const path& filename) const =0;
};
} // end namespace io
} // end namespace irr
#endif

View File

@ -1,369 +1,455 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "EShaderTypes.h"
#include "EPrimitiveTypes.h" #include "EMaterialTypes.h"
#include "path.h" #include "EPrimitiveTypes.h"
#include "path.h"
namespace irr
{ namespace irr
{
namespace io
{ namespace io
class IReadFile; {
} // end namespace io class IReadFile;
} // end namespace io
namespace video
{ namespace video
{
class IVideoDriver;
class IShaderConstantSetCallBack; class IVideoDriver;
class IShaderConstantSetCallBack;
//! Interface making it possible to create and use programs running on the GPU.
class IGPUProgrammingServices //! Interface making it possible to create and use programs running on the GPU.
{ class IGPUProgrammingServices
public: {
//! Destructor public:
virtual ~IGPUProgrammingServices() {}
//! Destructor
//! Adds a new high-level shading material renderer to the VideoDriver. virtual ~IGPUProgrammingServices() {}
/** Currently only HLSL/D3D9 and GLSL/OpenGL are supported.
\param vertexShaderProgram String containing the source of the vertex //! Adds a new high-level shading material renderer to the VideoDriver.
shader program. This can be 0 if no vertex program shall be used. /** Currently only HLSL/D3D9 and GLSL/OpenGL are supported.
\param vertexShaderEntryPointName Name of the entry function of the \param vertexShaderProgram String containing the source of the vertex
vertexShaderProgram (p.e. "main") shader program. This can be 0 if no vertex program shall be used.
\param vsCompileTarget Vertex shader version the high level shader \param vertexShaderEntryPointName Name of the entry function of the
shall be compiled to. vertexShaderProgram (p.e. "main")
\param pixelShaderProgram String containing the source of the pixel \param vsCompileTarget Vertex shader version the high level shader
shader program. This can be 0 if no pixel shader shall be used. shall be compiled to.
\param pixelShaderEntryPointName Entry name of the function of the \param pixelShaderProgram String containing the source of the pixel
pixelShaderProgram (p.e. "main") shader program. This can be 0 if no pixel shader shall be used.
\param psCompileTarget Pixel shader version the high level shader \param pixelShaderEntryPointName Entry name of the function of the
shall be compiled to. pixelShaderProgram (p.e. "main")
\param geometryShaderProgram String containing the source of the \param psCompileTarget Pixel shader version the high level shader
geometry shader program. This can be 0 if no geometry shader shall be shall be compiled to.
used. \param geometryShaderProgram String containing the source of the
\param geometryShaderEntryPointName Entry name of the function of the geometry shader program. This can be 0 if no geometry shader shall be
geometryShaderProgram (p.e. "main") used.
\param gsCompileTarget Geometry shader version the high level shader \param geometryShaderEntryPointName Entry name of the function of the
shall be compiled to. geometryShaderProgram (p.e. "main")
\param inType Type of vertices passed to geometry shader \param gsCompileTarget Geometry shader version the high level shader
\param outType Type of vertices created by geometry shader shall be compiled to.
\param verticesOut Maximal number of vertices created by geometry \param inType Type of vertices passed to geometry shader
shader. If 0, maximal number supported is assumed. \param outType Type of vertices created by geometry shader
\param callback Pointer to an implementation of \param verticesOut Maximal number of vertices created by geometry
IShaderConstantSetCallBack in which you can set the needed vertex, shader. If 0, maximal number supported is assumed.
pixel, and geometry shader program constants. Set this to 0 if you \param callback Pointer to an implementation of
don't need this. IShaderConstantSetCallBack in which you can set the needed vertex,
\param baseMaterial Base material which renderstates will be used to pixel, and geometry shader program constants. Set this to 0 if you
shade the material. don't need this.
\param userData a user data int. This int can be set to any value and \param baseMaterial Base material which renderstates will be used to
will be set as parameter in the callback method when calling shade the material.
OnSetConstants(). In this way it is easily possible to use the same \param userData a user data int. This int can be set to any value and
callback method for multiple materials and distinguish between them will be set as parameter in the callback method when calling
during the call. OnSetConstants(). In this way it is easily possible to use the same
\return Number of the material type which can be set in callback method for multiple materials and distinguish between them
SMaterial::MaterialType to use the renderer. -1 is returned if an error during the call.
occurred, e.g. if a shader program could not be compiled or a compile \return Number of the material type which can be set in
target is not reachable. The error strings are then printed to the SMaterial::MaterialType to use the renderer. -1 is returned if an error
error log and can be caught with a custom event receiver. */ occurred, e.g. if a shader program could not be compiled or a compile
virtual s32 addHighLevelShaderMaterial( target is not reachable. The error strings are then printed to the
const c8 *vertexShaderProgram, error log and can be caught with a custom event receiver. */
const c8 *vertexShaderEntryPointName, virtual s32 addHighLevelShaderMaterial(
E_VERTEX_SHADER_TYPE vsCompileTarget, const c8* vertexShaderProgram,
const c8 *pixelShaderProgram, const c8* vertexShaderEntryPointName,
const c8 *pixelShaderEntryPointName, E_VERTEX_SHADER_TYPE vsCompileTarget,
E_PIXEL_SHADER_TYPE psCompileTarget, const c8* pixelShaderProgram,
const c8 *geometryShaderProgram, const c8* pixelShaderEntryPointName,
const c8 *geometryShaderEntryPointName = "main", E_PIXEL_SHADER_TYPE psCompileTarget,
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, const c8* geometryShaderProgram,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, const c8* geometryShaderEntryPointName = "main",
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
u32 verticesOut = 0, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
IShaderConstantSetCallBack *callback = 0, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, u32 verticesOut = 0,
s32 userData = 0) = 0; IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
//! convenience function for use without geometry shaders s32 userData = 0) = 0;
s32 addHighLevelShaderMaterial(
const c8 *vertexShaderProgram, //! convenience function for use without geometry shaders
const c8 *vertexShaderEntryPointName = "main", s32 addHighLevelShaderMaterial(
E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, const c8* vertexShaderProgram,
const c8 *pixelShaderProgram = 0, const c8* vertexShaderEntryPointName="main",
const c8 *pixelShaderEntryPointName = "main", E_VERTEX_SHADER_TYPE vsCompileTarget=EVST_VS_1_1,
E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, const c8* pixelShaderProgram=0,
IShaderConstantSetCallBack *callback = 0, const c8* pixelShaderEntryPointName="main",
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_PIXEL_SHADER_TYPE psCompileTarget=EPST_PS_1_1,
s32 userData = 0) IShaderConstantSetCallBack* callback=0,
{ E_MATERIAL_TYPE baseMaterial=video::EMT_SOLID,
return addHighLevelShaderMaterial( s32 userData=0)
vertexShaderProgram, vertexShaderEntryPointName, {
vsCompileTarget, pixelShaderProgram, return addHighLevelShaderMaterial(
pixelShaderEntryPointName, psCompileTarget, vertexShaderProgram, vertexShaderEntryPointName,
0, "main", EGST_GS_4_0, vsCompileTarget, pixelShaderProgram,
scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0, pixelShaderEntryPointName, psCompileTarget,
callback, baseMaterial, userData); 0, "main", EGST_GS_4_0,
} scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0,
callback, baseMaterial, userData);
//! convenience function for use with many defaults, without geometry shader }
/** All shader names are set to "main" and compile targets are shader
type 1.1. //! convenience function for use with many defaults, without geometry shader
*/ /** All shader names are set to "main" and compile targets are shader
s32 addHighLevelShaderMaterial( type 1.1.
const c8 *vertexShaderProgram, */
const c8 *pixelShaderProgram = 0, s32 addHighLevelShaderMaterial(
IShaderConstantSetCallBack *callback = 0, const c8* vertexShaderProgram,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, const c8* pixelShaderProgram=0,
s32 userData = 0) IShaderConstantSetCallBack* callback=0,
{ E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
return addHighLevelShaderMaterial( s32 userData=0)
vertexShaderProgram, "main", {
EVST_VS_1_1, pixelShaderProgram, return addHighLevelShaderMaterial(
"main", EPST_PS_1_1, vertexShaderProgram, "main",
0, "main", EGST_GS_4_0, EVST_VS_1_1, pixelShaderProgram,
scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0, "main", EPST_PS_1_1,
callback, baseMaterial, userData); 0, "main", EGST_GS_4_0,
} scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0,
callback, baseMaterial, userData);
//! convenience function for use with many defaults, with geometry shader }
/** All shader names are set to "main" and compile targets are shader
type 1.1 and geometry shader 4.0. //! convenience function for use with many defaults, with geometry shader
*/ /** All shader names are set to "main" and compile targets are shader
s32 addHighLevelShaderMaterial( type 1.1 and geometry shader 4.0.
const c8 *vertexShaderProgram, */
const c8 *pixelShaderProgram = 0, s32 addHighLevelShaderMaterial(
const c8 *geometryShaderProgram = 0, const c8* vertexShaderProgram,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, const c8* pixelShaderProgram = 0,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, const c8* geometryShaderProgram = 0,
u32 verticesOut = 0, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
IShaderConstantSetCallBack *callback = 0, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, u32 verticesOut = 0,
s32 userData = 0) IShaderConstantSetCallBack* callback = 0,
{ E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
return addHighLevelShaderMaterial( s32 userData = 0 )
vertexShaderProgram, "main", {
EVST_VS_1_1, pixelShaderProgram, return addHighLevelShaderMaterial(
"main", EPST_PS_1_1, vertexShaderProgram, "main",
geometryShaderProgram, "main", EGST_GS_4_0, EVST_VS_1_1, pixelShaderProgram,
inType, outType, verticesOut, "main", EPST_PS_1_1,
callback, baseMaterial, userData); geometryShaderProgram, "main", EGST_GS_4_0,
} inType, outType, verticesOut,
callback, baseMaterial, userData);
//! Like addHighLevelShaderMaterial(), but loads from files. }
/** \param vertexShaderProgramFileName Text file containing the source
of the vertex shader program. Set to empty string if no vertex shader //! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
shall be created. /** \param vertexShaderProgramFileName Text file containing the source
\param vertexShaderEntryPointName Name of the entry function of the of the vertex shader program. Set to empty string if no vertex shader
vertexShaderProgram (p.e. "main") shall be created.
\param vsCompileTarget Vertex shader version the high level shader \param vertexShaderEntryPointName Name of the entry function of the
shall be compiled to. vertexShaderProgram (p.e. "main")
\param pixelShaderProgramFileName Text file containing the source of \param vsCompileTarget Vertex shader version the high level shader
the pixel shader program. Set to empty string if no pixel shader shall shall be compiled to.
be created. \param pixelShaderProgramFileName Text file containing the source of
\param pixelShaderEntryPointName Entry name of the function of the the pixel shader program. Set to empty string if no pixel shader shall
pixelShaderProgram (p.e. "main") be created.
\param psCompileTarget Pixel shader version the high level shader \param pixelShaderEntryPointName Entry name of the function of the
shall be compiled to. pixelShaderProgram (p.e. "main")
\param geometryShaderProgramFileName Name of the source of \param psCompileTarget Pixel shader version the high level shader
the geometry shader program. Set to empty string if no geometry shader shall be compiled to.
shall be created. \param geometryShaderProgramFileName Name of the source of
\param geometryShaderEntryPointName Entry name of the function of the the geometry shader program. Set to empty string if no geometry shader
geometryShaderProgram (p.e. "main") shall be created.
\param gsCompileTarget Geometry shader version the high level shader \param geometryShaderEntryPointName Entry name of the function of the
shall be compiled to. geometryShaderProgram (p.e. "main")
\param inType Type of vertices passed to geometry shader \param gsCompileTarget Geometry shader version the high level shader
\param outType Type of vertices created by geometry shader shall be compiled to.
\param verticesOut Maximal number of vertices created by geometry \param inType Type of vertices passed to geometry shader
shader. If 0, maximal number supported is assumed. \param outType Type of vertices created by geometry shader
\param callback Pointer to an implementation of \param verticesOut Maximal number of vertices created by geometry
IShaderConstantSetCallBack in which you can set the needed vertex, shader. If 0, maximal number supported is assumed.
pixel, and geometry shader program constants. Set this to 0 if you \param callback Pointer to an implementation of
don't need this. IShaderConstantSetCallBack in which you can set the needed vertex,
\param baseMaterial Base material which renderstates will be used to pixel, and geometry shader program constants. Set this to 0 if you
shade the material. don't need this.
\param userData a user data int. This int can be set to any value and \param baseMaterial Base material which renderstates will be used to
will be set as parameter in the callback method when calling shade the material.
OnSetConstants(). In this way it is easily possible to use the same \param userData a user data int. This int can be set to any value and
callback method for multiple materials and distinguish between them will be set as parameter in the callback method when calling
during the call. OnSetConstants(). In this way it is easily possible to use the same
\return Number of the material type which can be set in callback method for multiple materials and distinguish between them
SMaterial::MaterialType to use the renderer. -1 is returned if an error during the call.
occurred, e.g. if a shader program could not be compiled or a compile \return Number of the material type which can be set in
target is not reachable. The error strings are then printed to the SMaterial::MaterialType to use the renderer. -1 is returned if an error
error log and can be caught with a custom event receiver. */ occurred, e.g. if a shader program could not be compiled or a compile
virtual s32 addHighLevelShaderMaterialFromFiles( target is not reachable. The error strings are then printed to the
const io::path &vertexShaderProgramFileName, error log and can be caught with a custom event receiver. */
const c8 *vertexShaderEntryPointName, virtual s32 addHighLevelShaderMaterialFromFiles(
E_VERTEX_SHADER_TYPE vsCompileTarget, const io::path& vertexShaderProgramFileName,
const io::path &pixelShaderProgramFileName, const c8* vertexShaderEntryPointName,
const c8 *pixelShaderEntryPointName, E_VERTEX_SHADER_TYPE vsCompileTarget,
E_PIXEL_SHADER_TYPE psCompileTarget, const io::path& pixelShaderProgramFileName,
const io::path &geometryShaderProgramFileName, const c8* pixelShaderEntryPointName,
const c8 *geometryShaderEntryPointName = "main", E_PIXEL_SHADER_TYPE psCompileTarget,
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, const io::path& geometryShaderProgramFileName,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, const c8* geometryShaderEntryPointName = "main",
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
u32 verticesOut = 0, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
IShaderConstantSetCallBack *callback = 0, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, u32 verticesOut = 0,
s32 userData = 0) = 0; IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
//! convenience function for use without geometry shaders s32 userData = 0) = 0;
s32 addHighLevelShaderMaterialFromFiles(
const io::path &vertexShaderProgramFileName, //! convenience function for use without geometry shaders
const c8 *vertexShaderEntryPointName = "main", s32 addHighLevelShaderMaterialFromFiles(
E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, const io::path& vertexShaderProgramFileName,
const io::path &pixelShaderProgramFileName = "", const c8* vertexShaderEntryPointName = "main",
const c8 *pixelShaderEntryPointName = "main", E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1,
E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, const io::path& pixelShaderProgramFileName = "",
IShaderConstantSetCallBack *callback = 0, const c8* pixelShaderEntryPointName = "main",
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1,
s32 userData = 0) IShaderConstantSetCallBack* callback = 0,
{ E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
return addHighLevelShaderMaterialFromFiles( s32 userData = 0)
vertexShaderProgramFileName, vertexShaderEntryPointName, {
vsCompileTarget, pixelShaderProgramFileName, return addHighLevelShaderMaterialFromFiles(
pixelShaderEntryPointName, psCompileTarget, vertexShaderProgramFileName, vertexShaderEntryPointName,
"", "main", EGST_GS_4_0, vsCompileTarget, pixelShaderProgramFileName,
scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0, pixelShaderEntryPointName, psCompileTarget,
callback, baseMaterial, userData); "", "main", EGST_GS_4_0,
} scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0,
callback, baseMaterial, userData);
//! convenience function for use with many defaults, without geometry shader }
/** All shader names are set to "main" and compile targets are shader
type 1.1. //! convenience function for use with many defaults, without geometry shader
*/ /** All shader names are set to "main" and compile targets are shader
s32 addHighLevelShaderMaterialFromFiles( type 1.1.
const io::path &vertexShaderProgramFileName, */
const io::path &pixelShaderProgramFileName = "", s32 addHighLevelShaderMaterialFromFiles(
IShaderConstantSetCallBack *callback = 0, const io::path& vertexShaderProgramFileName,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, const io::path& pixelShaderProgramFileName = "",
s32 userData = 0) IShaderConstantSetCallBack* callback = 0,
{ E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
return addHighLevelShaderMaterialFromFiles( s32 userData = 0 )
vertexShaderProgramFileName, "main", {
EVST_VS_1_1, pixelShaderProgramFileName, return addHighLevelShaderMaterialFromFiles(
"main", EPST_PS_1_1, vertexShaderProgramFileName, "main",
"", "main", EGST_GS_4_0, EVST_VS_1_1, pixelShaderProgramFileName,
scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0, "main", EPST_PS_1_1,
callback, baseMaterial, userData); "", "main", EGST_GS_4_0,
} scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0,
callback, baseMaterial, userData);
//! convenience function for use with many defaults, with geometry shader }
/** All shader names are set to "main" and compile targets are shader
type 1.1 and geometry shader 4.0. //! convenience function for use with many defaults, with geometry shader
*/ /** All shader names are set to "main" and compile targets are shader
s32 addHighLevelShaderMaterialFromFiles( type 1.1 and geometry shader 4.0.
const io::path &vertexShaderProgramFileName, */
const io::path &pixelShaderProgramFileName = "", s32 addHighLevelShaderMaterialFromFiles(
const io::path &geometryShaderProgramFileName = "", const io::path& vertexShaderProgramFileName,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, const io::path& pixelShaderProgramFileName = "",
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, const io::path& geometryShaderProgramFileName = "",
u32 verticesOut = 0, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
IShaderConstantSetCallBack *callback = 0, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, u32 verticesOut = 0,
s32 userData = 0) IShaderConstantSetCallBack* callback = 0,
{ E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
return addHighLevelShaderMaterialFromFiles( s32 userData = 0 )
vertexShaderProgramFileName, "main", {
EVST_VS_1_1, pixelShaderProgramFileName, return addHighLevelShaderMaterialFromFiles(
"main", EPST_PS_1_1, vertexShaderProgramFileName, "main",
geometryShaderProgramFileName, "main", EGST_GS_4_0, EVST_VS_1_1, pixelShaderProgramFileName,
inType, outType, verticesOut, "main", EPST_PS_1_1,
callback, baseMaterial, userData); geometryShaderProgramFileName, "main", EGST_GS_4_0,
} inType, outType, verticesOut,
callback, baseMaterial, userData);
//! Like addHighLevelShaderMaterial(), 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 //! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
created. /** \param vertexShaderProgram Text file handle containing the source
\param vertexShaderEntryPointName Name of the entry function of the of the vertex shader program. Set to 0 if no vertex shader shall be
vertexShaderProgram created.
\param vsCompileTarget Vertex shader version the high level shader \param vertexShaderEntryPointName Name of the entry function of the
shall be compiled to. vertexShaderProgram
\param pixelShaderProgram Text file handle containing the source of \param vsCompileTarget Vertex shader version the high level shader
the pixel shader program. Set to 0 if no pixel shader shall be created. shall be compiled to.
\param pixelShaderEntryPointName Entry name of the function of the \param pixelShaderProgram Text file handle containing the source of
pixelShaderProgram (p.e. "main") the pixel shader program. Set to 0 if no pixel shader shall be created.
\param psCompileTarget Pixel shader version the high level shader \param pixelShaderEntryPointName Entry name of the function of the
shall be compiled to. pixelShaderProgram (p.e. "main")
\param geometryShaderProgram Text file handle containing the source of \param psCompileTarget Pixel shader version the high level shader
the geometry shader program. Set to 0 if no geometry shader shall be shall be compiled to.
created. \param geometryShaderProgram Text file handle containing the source of
\param geometryShaderEntryPointName Entry name of the function of the the geometry shader program. Set to 0 if no geometry shader shall be
geometryShaderProgram (p.e. "main") created.
\param gsCompileTarget Geometry shader version the high level shader \param geometryShaderEntryPointName Entry name of the function of the
shall be compiled to. geometryShaderProgram (p.e. "main")
\param inType Type of vertices passed to geometry shader \param gsCompileTarget Geometry shader version the high level shader
\param outType Type of vertices created by geometry shader shall be compiled to.
\param verticesOut Maximal number of vertices created by geometry \param inType Type of vertices passed to geometry shader
shader. If 0, maximal number supported is assumed. \param outType Type of vertices created by geometry shader
\param callback Pointer to an implementation of \param verticesOut Maximal number of vertices created by geometry
IShaderConstantSetCallBack in which you can set the needed vertex and shader. If 0, maximal number supported is assumed.
pixel shader program constants. Set this to 0 if you don't need this. \param callback Pointer to an implementation of
\param baseMaterial Base material which renderstates will be used to IShaderConstantSetCallBack in which you can set the needed vertex and
shade the material. pixel shader program constants. Set this to 0 if you don't need this.
\param userData a user data int. This int can be set to any value and \param baseMaterial Base material which renderstates will be used to
will be set as parameter in the callback method when calling shade the material.
OnSetConstants(). In this way it is easily possible to use the same \param userData a user data int. This int can be set to any value and
callback method for multiple materials and distinguish between them will be set as parameter in the callback method when calling
during the call. OnSetConstants(). In this way it is easily possible to use the same
\return Number of the material type which can be set in callback method for multiple materials and distinguish between them
SMaterial::MaterialType to use the renderer. -1 is returned if an during the call.
error occurred, e.g. if a shader program could not be compiled or a \return Number of the material type which can be set in
compile target is not reachable. The error strings are then printed to SMaterial::MaterialType to use the renderer. -1 is returned if an
the error log and can be caught with a custom event receiver. */ error occurred, e.g. if a shader program could not be compiled or a
virtual s32 addHighLevelShaderMaterialFromFiles( compile target is not reachable. The error strings are then printed to
io::IReadFile *vertexShaderProgram, the error log and can be caught with a custom event receiver. */
const c8 *vertexShaderEntryPointName, virtual s32 addHighLevelShaderMaterialFromFiles(
E_VERTEX_SHADER_TYPE vsCompileTarget, io::IReadFile* vertexShaderProgram,
io::IReadFile *pixelShaderProgram, const c8* vertexShaderEntryPointName,
const c8 *pixelShaderEntryPointName, E_VERTEX_SHADER_TYPE vsCompileTarget,
E_PIXEL_SHADER_TYPE psCompileTarget, io::IReadFile* pixelShaderProgram,
io::IReadFile *geometryShaderProgram, const c8* pixelShaderEntryPointName,
const c8 *geometryShaderEntryPointName = "main", E_PIXEL_SHADER_TYPE psCompileTarget,
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, io::IReadFile* geometryShaderProgram,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, const c8* geometryShaderEntryPointName = "main",
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
u32 verticesOut = 0, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
IShaderConstantSetCallBack *callback = 0, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, u32 verticesOut = 0,
s32 userData = 0) = 0; IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
//! convenience function for use without geometry shaders s32 userData = 0) = 0;
s32 addHighLevelShaderMaterialFromFiles(
io::IReadFile *vertexShaderProgram, //! convenience function for use without geometry shaders
const c8 *vertexShaderEntryPointName = "main", s32 addHighLevelShaderMaterialFromFiles(
E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, io::IReadFile* vertexShaderProgram,
io::IReadFile *pixelShaderProgram = 0, const c8* vertexShaderEntryPointName = "main",
const c8 *pixelShaderEntryPointName = "main", E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1,
E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, io::IReadFile* pixelShaderProgram = 0,
IShaderConstantSetCallBack *callback = 0, const c8* pixelShaderEntryPointName = "main",
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1,
s32 userData = 0) IShaderConstantSetCallBack* callback = 0,
{ E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
return addHighLevelShaderMaterialFromFiles( s32 userData = 0)
vertexShaderProgram, vertexShaderEntryPointName, {
vsCompileTarget, pixelShaderProgram, return addHighLevelShaderMaterialFromFiles(
pixelShaderEntryPointName, psCompileTarget, vertexShaderProgram, vertexShaderEntryPointName,
0, "main", EGST_GS_4_0, vsCompileTarget, pixelShaderProgram,
scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0, pixelShaderEntryPointName, psCompileTarget,
callback, baseMaterial, userData); 0, "main", EGST_GS_4_0,
} scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0,
callback, baseMaterial, userData);
//! Delete a shader material and associated data. }
/**
After you have deleted a material it is invalid to still use and doing //! Adds a new ASM shader material renderer to the VideoDriver
so might result in a crash. The ID may be reused in the future when new /** Note that it is a good idea to call IVideoDriver::queryFeature() in
materials are added. advance to check if the IVideoDriver supports the vertex and/or pixel
\param material Number of the material type. Must not be a built-in shader version your are using.
material. */
virtual void deleteShaderMaterial(s32 material) = 0; The material is added to the VideoDriver like with
}; IVideoDriver::addMaterialRenderer() and can be used like it had been
added with that method.
} // end namespace video \param vertexShaderProgram String containing the source of the vertex
} // end namespace irr 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

@ -1,259 +1,268 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IGUIElement.h"
namespace irr
{ namespace irr
{
namespace video
{ namespace video
class ITexture; {
} // end namespace video class ITexture;
} // end namespace video
namespace gui
{ namespace gui
class IGUIFont; {
class IGUISpriteBank; class IGUIFont;
class IGUISpriteBank;
//! Current state of buttons used for drawing sprites.
//! Note that up to 3 states can be active at the same time: //! Current state of buttons used for drawing sprites.
//! EGBS_BUTTON_UP or EGBS_BUTTON_DOWN //! Note that up to 3 states can be active at the same time:
//! EGBS_BUTTON_MOUSE_OVER or EGBS_BUTTON_MOUSE_OFF //! EGBS_BUTTON_UP or EGBS_BUTTON_DOWN
//! EGBS_BUTTON_FOCUSED or EGBS_BUTTON_NOT_FOCUSED //! EGBS_BUTTON_MOUSE_OVER or EGBS_BUTTON_MOUSE_OFF
enum EGUI_BUTTON_STATE //! EGBS_BUTTON_FOCUSED or EGBS_BUTTON_NOT_FOCUSED
{ enum EGUI_BUTTON_STATE
//! The button is not pressed. {
EGBS_BUTTON_UP = 0, //! The button is not pressed.
//! The button is currently pressed down. EGBS_BUTTON_UP=0,
EGBS_BUTTON_DOWN, //! The button is currently pressed down.
//! The mouse cursor is over the button EGBS_BUTTON_DOWN,
EGBS_BUTTON_MOUSE_OVER, //! The mouse cursor is over the button
//! The mouse cursor is not over the button EGBS_BUTTON_MOUSE_OVER,
EGBS_BUTTON_MOUSE_OFF, //! The mouse cursor is not over the button
//! The button has the focus EGBS_BUTTON_MOUSE_OFF,
EGBS_BUTTON_FOCUSED, //! The button has the focus
//! The button doesn't have the focus EGBS_BUTTON_FOCUSED,
EGBS_BUTTON_NOT_FOCUSED, //! The button doesn't have the focus
//! The button is disabled All other states are ignored in that case. EGBS_BUTTON_NOT_FOCUSED,
EGBS_BUTTON_DISABLED, //! The button is disabled All other states are ignored in that case.
//! not used, counts the number of enumerated items EGBS_BUTTON_DISABLED,
EGBS_COUNT //! not used, counts the number of enumerated items
}; EGBS_COUNT
};
//! Names for gui button state icons
const c8 *const GUIButtonStateNames[EGBS_COUNT + 1] = { //! Names for gui button state icons
"buttonUp", const c8* const GUIButtonStateNames[EGBS_COUNT+1] =
"buttonDown", {
"buttonMouseOver", "buttonUp",
"buttonMouseOff", "buttonDown",
"buttonFocused", "buttonMouseOver",
"buttonNotFocused", "buttonMouseOff",
"buttonDisabled", "buttonFocused",
0, // count "buttonNotFocused",
}; "buttonDisabled",
0 // count
//! State of buttons used for drawing texture images. };
//! Note that only a single state is active at a time
//! Also when no image is defined for a state it will use images from another state //! State of buttons used for drawing texture images.
//! and if that state is not set from the replacement for that,etc. //! Note that only a single state is active at a time
//! So in many cases setting EGBIS_IMAGE_UP and EGBIS_IMAGE_DOWN is sufficient. //! Also when no image is defined for a state it will use images from another state
enum EGUI_BUTTON_IMAGE_STATE //! and if that state is not set from the replacement for that,etc.
{ //! So in many cases setting EGBIS_IMAGE_UP and EGBIS_IMAGE_DOWN is sufficient.
//! When no other states have images they will all use this one. enum EGUI_BUTTON_IMAGE_STATE
EGBIS_IMAGE_UP, {
//! When not set EGBIS_IMAGE_UP is used. //! When no other states have images they will all use this one.
EGBIS_IMAGE_UP_MOUSEOVER, EGBIS_IMAGE_UP,
//! When not set EGBIS_IMAGE_UP_MOUSEOVER is used. //! When not set EGBIS_IMAGE_UP is used.
EGBIS_IMAGE_UP_FOCUSED, EGBIS_IMAGE_UP_MOUSEOVER,
//! When not set EGBIS_IMAGE_UP_FOCUSED is used. //! When not set EGBIS_IMAGE_UP_MOUSEOVER is used.
EGBIS_IMAGE_UP_FOCUSED_MOUSEOVER, EGBIS_IMAGE_UP_FOCUSED,
//! When not set EGBIS_IMAGE_UP is used. //! When not set EGBIS_IMAGE_UP_FOCUSED is used.
EGBIS_IMAGE_DOWN, EGBIS_IMAGE_UP_FOCUSED_MOUSEOVER,
//! When not set EGBIS_IMAGE_DOWN is used. //! When not set EGBIS_IMAGE_UP is used.
EGBIS_IMAGE_DOWN_MOUSEOVER, EGBIS_IMAGE_DOWN,
//! When not set EGBIS_IMAGE_DOWN_MOUSEOVER is used. //! When not set EGBIS_IMAGE_DOWN is used.
EGBIS_IMAGE_DOWN_FOCUSED, EGBIS_IMAGE_DOWN_MOUSEOVER,
//! When not set EGBIS_IMAGE_DOWN_FOCUSED is used. //! When not set EGBIS_IMAGE_DOWN_MOUSEOVER is used.
EGBIS_IMAGE_DOWN_FOCUSED_MOUSEOVER, EGBIS_IMAGE_DOWN_FOCUSED,
//! When not set EGBIS_IMAGE_UP or EGBIS_IMAGE_DOWN are used (depending on button state). //! When not set EGBIS_IMAGE_DOWN_FOCUSED is used.
EGBIS_IMAGE_DISABLED, EGBIS_IMAGE_DOWN_FOCUSED_MOUSEOVER,
//! not used, counts the number of enumerated items //! When not set EGBIS_IMAGE_UP or EGBIS_IMAGE_DOWN are used (depending on button state).
EGBIS_COUNT EGBIS_IMAGE_DISABLED,
}; //! not used, counts the number of enumerated items
EGBIS_COUNT
//! Names for gui button image states };
const c8 *const GUIButtonImageStateNames[EGBIS_COUNT + 1] = {
"Image", // not "ImageUp" as it otherwise breaks serialization of old files //! Names for gui button image states
"ImageUpOver", const c8* const GUIButtonImageStateNames[EGBIS_COUNT+1] =
"ImageUpFocused", {
"ImageUpFocusedOver", "Image", // not "ImageUp" as it otherwise breaks serialization of old files
"PressedImage", // not "ImageDown" as it otherwise breaks serialization of old files "ImageUpOver",
"ImageDownOver", "ImageUpFocused",
"ImageDownFocused", "ImageUpFocusedOver",
"ImageDownFocusedOver", "PressedImage", // not "ImageDown" as it otherwise breaks serialization of old files
"ImageDisabled", "ImageDownOver",
0, // count "ImageDownFocused",
}; "ImageDownFocusedOver",
"ImageDisabled",
//! GUI Button interface. 0 // count
/** \par This element can create the following events of type EGUI_EVENT_TYPE: };
\li EGET_BUTTON_CLICKED
*/ //! GUI Button interface.
class IGUIButton : public IGUIElement /** \par This element can create the following events of type EGUI_EVENT_TYPE:
{ \li EGET_BUTTON_CLICKED
public: */
//! constructor class IGUIButton : public IGUIElement
IGUIButton(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : {
IGUIElement(EGUIET_BUTTON, environment, parent, id, rectangle) {} public:
//! Sets another skin independent font. //! constructor
/** If this is set to zero, the button uses the font of the skin. IGUIButton(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
\param font: New font to set. */ : IGUIElement(EGUIET_BUTTON, environment, parent, id, rectangle) {}
virtual void setOverrideFont(IGUIFont *font = 0) = 0;
//! Sets another skin independent font.
//! Gets the override font (if any) /** If this is set to zero, the button uses the font of the skin.
/** \return The override font (may be 0) */ \param font: New font to set. */
virtual IGUIFont *getOverrideFont(void) const = 0; virtual void setOverrideFont(IGUIFont* font=0) = 0;
//! Get the font which is used right now for drawing //! Gets the override font (if any)
/** Currently this is the override font when one is set and the /** \return The override font (may be 0) */
font of the active skin otherwise */ virtual IGUIFont* getOverrideFont(void) const = 0;
virtual IGUIFont *getActiveFont() const = 0;
//! Get the font which is used right now for drawing
//! Sets another color for the button text. /** Currently this is the override font when one is set and the
/** When set, this color is used instead of EGDC_BUTTON_TEXT/EGDC_GRAY_TEXT. font of the active skin otherwise */
You don't need to call enableOverrideColor(true), that's done by this function. virtual IGUIFont* getActiveFont() const = 0;
If you want the the color of the skin back, call enableOverrideColor(false);
\param color: New color of the text. */ //! Sets another color for the button text.
virtual void setOverrideColor(video::SColor color) = 0; /** When set, this color is used instead of EGDC_BUTTON_TEXT/EGDC_GRAY_TEXT.
You don't need to call enableOverrideColor(true), that's done by this function.
//! Gets the override color If you want the the color of the skin back, call enableOverrideColor(false);
/** \return: The override color */ \param color: New color of the text. */
virtual video::SColor getOverrideColor(void) const = 0; virtual void setOverrideColor(video::SColor color) = 0;
//! Gets the currently used text color //! Gets the override color
/** Either a skin-color for the current state or the override color */ /** \return: The override color */
virtual video::SColor getActiveColor() const = 0; virtual video::SColor getOverrideColor(void) const = 0;
//! Sets if the button text should use the override color or the color in the gui skin. //! Gets the currently used text color
/** \param enable: If set to true, the override color, which can be set /** Either a skin-color for the current state or the override color */
with IGUIStaticText::setOverrideColor is used, otherwise the virtual video::SColor getActiveColor() const = 0;
EGDC_BUTTON_TEXT or EGDC_GRAY_TEXT color of the skin. */
virtual void enableOverrideColor(bool enable) = 0; //! Sets if the button text should use the override color or the color in the gui skin.
/** \param enable: If set to true, the override color, which can be set
//! Checks if an override color is enabled with IGUIStaticText::setOverrideColor is used, otherwise the
/** \return true if the override color is enabled, false otherwise */ EGDC_BUTTON_TEXT or EGDC_GRAY_TEXT color of the skin. */
virtual bool isOverrideColorEnabled(void) const = 0; virtual void enableOverrideColor(bool enable) = 0;
//! Sets an image which should be displayed on the button when it is in the given state. //! Checks if an override color is enabled
/** Only one image-state can be active at a time. Images are drawn below sprites. /** \return true if the override color is enabled, false otherwise */
If a state is without image it will try to use images from other states as described virtual bool isOverrideColorEnabled(void) const = 0;
in ::EGUI_BUTTON_IMAGE_STATE.
Images are a little less flexible than sprites, but easier to use. //! Sets an image which should be displayed on the button when it is in the given state.
\param state: One of ::EGUI_BUTTON_IMAGE_STATE /** Only one image-state can be active at a time. Images are drawn below sprites.
\param image: Image to be displayed or NULL to remove the image If a state is without image it will try to use images from other states as described
\param sourceRect: Source rectangle on the image texture. When width or height are 0 then the full texture-size is used (default). */ in ::EGUI_BUTTON_IMAGE_STATE.
virtual void setImage(EGUI_BUTTON_IMAGE_STATE state, video::ITexture *image = 0, const core::rect<s32> &sourceRect = core::rect<s32>(0, 0, 0, 0)) = 0; Images are a little less flexible than sprites, but easier to use.
\param state: One of ::EGUI_BUTTON_IMAGE_STATE
//! Sets an image which should be displayed on the button when it is in normal state. \param image: Image to be displayed or NULL to remove the image
/** This is identical to calling setImage(EGBIS_IMAGE_UP, image); and might be deprecated in future revisions. \param sourceRect: Source rectangle on the image texture. When width or height are 0 then the full texture-size is used (default). */
\param image: Image to be displayed */ virtual void setImage(EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image=0, const core::rect<s32>& sourceRect=core::rect<s32>(0,0,0,0)) = 0;
virtual void setImage(video::ITexture *image = 0) = 0;
//! Sets an image which should be displayed on the button when it is in normal state.
//! Sets a background image for the button when it is in normal state. /** This is identical to calling setImage(EGBIS_IMAGE_UP, image); and might be deprecated in future revisions.
/** This is identical to calling setImage(EGBIS_IMAGE_UP, image, sourceRect); and might be deprecated in future revisions. \param image: Image to be displayed */
\param image: Texture containing the image to be displayed virtual void setImage(video::ITexture* image=0) = 0;
\param sourceRect: Position in the texture, where the image is located.
When width or height are 0 then the full texture-size is used */ //! Sets a background image for the button when it is in normal state.
virtual void setImage(video::ITexture *image, const core::rect<s32> &sourceRect) = 0; /** This is identical to calling setImage(EGBIS_IMAGE_UP, image, sourceRect); and might be deprecated in future revisions.
\param image: Texture containing the image to be displayed
//! Sets a background image for the button when it is in pressed state. \param sourceRect: Position in the texture, where the image is located.
/** This is identical to calling setImage(EGBIS_IMAGE_DOWN, image); and might be deprecated in future revisions. When width or height are 0 then the full texture-size is used */
If no images is specified for the pressed state via virtual void setImage(video::ITexture* image, const core::rect<s32>& sourceRect) = 0;
setPressedImage(), this image is also drawn in pressed state.
\param image: Image to be displayed */ //! Sets a background image for the button when it is in pressed state.
virtual void setPressedImage(video::ITexture *image = 0) = 0; /** This is identical to calling setImage(EGBIS_IMAGE_DOWN, image); and might be deprecated in future revisions.
If no images is specified for the pressed state via
//! Sets an image which should be displayed on the button when it is in pressed state. setPressedImage(), this image is also drawn in pressed state.
/** This is identical to calling setImage(EGBIS_IMAGE_DOWN, image, sourceRect); and might be deprecated in future revisions. \param image: Image to be displayed */
\param image: Texture containing the image to be displayed virtual void setPressedImage(video::ITexture* image=0) = 0;
\param sourceRect: Position in the texture, where the image is located */
virtual void setPressedImage(video::ITexture *image, const core::rect<s32> &sourceRect) = 0; //! Sets an image which should be displayed on the button when it is in pressed state.
/** This is identical to calling setImage(EGBIS_IMAGE_DOWN, image, sourceRect); and might be deprecated in future revisions.
//! Sets the sprite bank used by the button \param image: Texture containing the image to be displayed
/** NOTE: The spritebank itself is _not_ serialized so far. The sprites are serialized. \param sourceRect: Position in the texture, where the image is located */
Which means after loading the gui you still have to set the spritebank manually. */ virtual void setPressedImage(video::ITexture* image, const core::rect<s32>& sourceRect) = 0;
virtual void setSpriteBank(IGUISpriteBank *bank = 0) = 0;
//! Sets the animated sprite for a specific button state //! Sets the sprite bank used by the button
/** Several sprites can be drawn at the same time. /** NOTE: The spritebank itself is _not_ serialized so far. The sprites are serialized.
Sprites can be animated. Which means after loading the gui you still have to set the spritebank manually. */
Sprites are drawn above the images. virtual void setSpriteBank(IGUISpriteBank* bank=0) = 0;
\param index: Number of the sprite within the sprite bank, use -1 for no sprite
\param state: State of the button to set the sprite for //! Sets the animated sprite for a specific button state
\param index: The sprite number from the current sprite bank /** Several sprites can be drawn at the same time.
\param color: The color of the sprite Sprites can be animated.
\param loop: True if the animation should loop, false if not Sprites are drawn above the images.
\param scale: True if the sprite should scale to button size, false if not */ \param index: Number of the sprite within the sprite bank, use -1 for no sprite
virtual void setSprite(EGUI_BUTTON_STATE state, s32 index, \param state: State of the button to set the sprite for
video::SColor color = video::SColor(255, 255, 255, 255), bool loop = false, bool scale = false) = 0; \param index: The sprite number from the current sprite bank
\param color: The color of the sprite
//! Get the sprite-index for the given state or -1 when no sprite is set \param loop: True if the animation should loop, false if not
virtual s32 getSpriteIndex(EGUI_BUTTON_STATE state) const = 0; \param scale: True if the sprite should scale to button size, false if not */
virtual void setSprite(EGUI_BUTTON_STATE state, s32 index,
//! Get the sprite color for the given state. Color is only used when a sprite is set. video::SColor color=video::SColor(255,255,255,255), bool loop=false, bool scale=false) = 0;
virtual video::SColor getSpriteColor(EGUI_BUTTON_STATE state) const = 0;
//! Get the sprite-index for the given state or -1 when no sprite is set
//! Returns if the sprite in the given state does loop virtual s32 getSpriteIndex(EGUI_BUTTON_STATE state) const = 0;
virtual bool getSpriteLoop(EGUI_BUTTON_STATE state) const = 0;
//! Get the sprite color for the given state. Color is only used when a sprite is set.
//! Returns if the sprite in the given state is scaled virtual video::SColor getSpriteColor(EGUI_BUTTON_STATE state) const = 0;
virtual bool getSpriteScale(EGUI_BUTTON_STATE state) const = 0;
//! Returns if the sprite in the given state does loop
//! Sets if the button should behave like a push button. virtual bool getSpriteLoop(EGUI_BUTTON_STATE state) const = 0;
/** Which means it can be in two states: Normal or Pressed. With a click on the button,
the user can change the state of the button. */ //! Returns if the sprite in the given state is scaled
virtual void setIsPushButton(bool isPushButton = true) = 0; virtual bool getSpriteScale(EGUI_BUTTON_STATE state) const = 0;
//! Sets the pressed state of the button if this is a pushbutton //! Sets if the button should behave like a push button.
virtual void setPressed(bool pressed = true) = 0; /** Which means it can be in two states: Normal or Pressed. With a click on the button,
the user can change the state of the button. */
//! Returns if the button is currently pressed virtual void setIsPushButton(bool isPushButton=true) = 0;
virtual bool isPressed() const = 0;
//! Sets the pressed state of the button if this is a pushbutton
//! Sets if the alpha channel should be used for drawing background images on the button (default is false) virtual void setPressed(bool pressed=true) = 0;
virtual void setUseAlphaChannel(bool useAlphaChannel = true) = 0;
//! Returns if the button is currently pressed
//! Returns if the alpha channel should be used for drawing background images on the button virtual bool isPressed() const = 0;
virtual bool isAlphaChannelUsed() const = 0;
//! Sets if the alpha channel should be used for drawing background images on the button (default is false)
//! Returns whether the button is a push button virtual void setUseAlphaChannel(bool useAlphaChannel=true) = 0;
virtual bool isPushButton() const = 0;
//! Returns if the alpha channel should be used for drawing background images on the button
//! Sets if the button should use the skin to draw its border and button face (default is true) virtual bool isAlphaChannelUsed() const = 0;
virtual void setDrawBorder(bool border = true) = 0;
//! Returns whether the button is a push button
//! Returns if the border and button face are being drawn using the skin virtual bool isPushButton() const = 0;
virtual bool isDrawingBorder() const = 0;
//! Sets if the button should use the skin to draw its border and button face (default is true)
//! Sets if the button should scale the button images to fit virtual void setDrawBorder(bool border=true) = 0;
virtual void setScaleImage(bool scaleImage = true) = 0;
//! Returns if the border and button face are being drawn using the skin
//! Checks whether the button scales the used images virtual bool isDrawingBorder() const = 0;
virtual bool isScalingImage() const = 0;
//! Sets if the button should scale the button images to fit
//! Get if the shift key was pressed in last EGET_BUTTON_CLICKED event virtual void setScaleImage(bool scaleImage=true) = 0;
/** Generated together with event, so info is available in the event-receiver. */
virtual bool getClickShiftState() const = 0; //! Checks whether the button scales the used images
virtual bool isScalingImage() const = 0;
//! Get if the control key was pressed in last EGET_BUTTON_CLICKED event
/** Generated together with event, so info is available in the event-receiver. */ //! Get if the shift key was pressed in last EGET_BUTTON_CLICKED event
virtual bool getClickControlState() const = 0; /** Generated together with event, so info is available in the event-receiver. */
}; virtual bool getClickShiftState() const = 0;
} // end namespace gui //! Get if the control key was pressed in last EGET_BUTTON_CLICKED event
} // end namespace irr /** Generated together with event, so info is available in the event-receiver. */
virtual bool getClickControlState() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,47 +1,53 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IGUIElement.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
{
//! GUI Check box interface.
/** \par This element can create the following events of type EGUI_EVENT_TYPE: //! GUI Check box interface.
\li EGET_CHECKBOX_CHANGED /** \par This element can create the following events of type EGUI_EVENT_TYPE:
*/ \li EGET_CHECKBOX_CHANGED
class IGUICheckBox : public IGUIElement */
{ class IGUICheckBox : public IGUIElement
public: {
//! constructor public:
IGUICheckBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_CHECK_BOX, environment, parent, id, rectangle) {} //! constructor
IGUICheckBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! Set if box is checked. : IGUIElement(EGUIET_CHECK_BOX, environment, parent, id, rectangle) {}
virtual void setChecked(bool checked) = 0;
//! Set if box is checked.
//! Returns true if box is checked. virtual void setChecked(bool checked) = 0;
virtual bool isChecked() const = 0;
//! Returns true if box is checked.
//! Sets whether to draw the background virtual bool isChecked() const = 0;
virtual void setDrawBackground(bool draw) = 0;
//! Sets whether to draw the background
//! Checks if background drawing is enabled virtual void setDrawBackground(bool draw) = 0;
/** \return true if background drawing is enabled, false otherwise */
virtual bool isDrawBackgroundEnabled() const = 0; //! Checks if background drawing is enabled
/** \return true if background drawing is enabled, false otherwise */
//! Sets whether to draw the border virtual bool isDrawBackgroundEnabled() const = 0;
virtual void setDrawBorder(bool draw) = 0;
//! Sets whether to draw the border
//! Checks if border drawing is enabled virtual void setDrawBorder(bool draw) = 0;
/** \return true if border drawing is enabled, false otherwise */
virtual bool isDrawBorderEnabled() const = 0; //! 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 };
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,72 +1,74 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IGUIElement.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
{
//! Combobox widget
/** \par This element can create the following events of type EGUI_EVENT_TYPE: //! Combobox widget
\li EGET_COMBO_BOX_CHANGED /** \par This element can create the following events of type EGUI_EVENT_TYPE:
*/ \li EGET_COMBO_BOX_CHANGED
class IGUIComboBox : public IGUIElement */
{ class IGUIComboBox : public IGUIElement
public: {
//! constructor public:
IGUIComboBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_COMBO_BOX, environment, parent, id, rectangle) {} //! constructor
IGUIComboBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! Returns amount of items in box : IGUIElement(EGUIET_COMBO_BOX, environment, parent, id, rectangle) {}
virtual u32 getItemCount() const = 0;
//! Returns amount of items in box
//! Returns string of an item. the idx may be a value from 0 to itemCount-1 virtual u32 getItemCount() const = 0;
virtual const wchar_t *getItem(u32 idx) const = 0;
//! Returns string of an item. the idx may be a value from 0 to itemCount-1
//! Returns item data of an item. the idx may be a value from 0 to itemCount-1 virtual const wchar_t* getItem(u32 idx) const = 0;
virtual u32 getItemData(u32 idx) const = 0;
//! Returns item data of an item. the idx may be a value from 0 to itemCount-1
//! Returns index based on item data virtual u32 getItemData(u32 idx) const = 0;
virtual s32 getIndexForItemData(u32 data) const = 0;
//! Returns index based on item data
//! Adds an item and returns the index of it virtual s32 getIndexForItemData(u32 data ) const = 0;
virtual u32 addItem(const wchar_t *text, u32 data = 0) = 0;
//! Adds an item and returns the index of it
//! Removes an item from the combo box. virtual u32 addItem(const wchar_t* text, u32 data = 0) = 0;
/** Warning. This will change the index of all following items */
virtual void removeItem(u32 idx) = 0; //! Removes an item from the combo box.
/** Warning. This will change the index of all following items */
//! Deletes all items in the combo box virtual void removeItem(u32 idx) = 0;
virtual void clear() = 0;
//! Deletes all items in the combo box
//! Returns id of selected item. returns -1 if no item is selected. virtual void clear() = 0;
virtual s32 getSelected() const = 0;
//! Returns id of selected item. returns -1 if no item is selected.
//! Sets the selected item. Set this to -1 if no item should be selected virtual s32 getSelected() const = 0;
virtual void setSelected(s32 idx) = 0;
//! Sets the selected item. Set this to -1 if no item should be selected
//! Sets the selected item and emits a change event. virtual void setSelected(s32 idx) = 0;
/** 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),
//! Sets text justification of the text area EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text.
/** \param horizontal: EGUIA_UPPERLEFT for left justified (default), \param vertical: EGUIA_UPPERLEFT to align with top edge,
EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text. EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text (default). */
\param vertical: EGUIA_UPPERLEFT to align with top edge, virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0;
EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text (default). */
virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0; //! Set the maximal number of rows for the selection listbox
virtual void setMaxSelectionRows(u32 max) = 0;
//! Set the maximal number of rows for the selection listbox
virtual void setMaxSelectionRows(u32 max) = 0; //! Get the maximal number of rows for the selection listbox
virtual u32 getMaxSelectionRows() const = 0;
//! Get the maximal number of rows for the selection listbox };
virtual u32 getMaxSelectionRows() const = 0;
};
} // end namespace gui
} // end namespace gui } // end namespace irr
} // end namespace irr
#endif

View File

@ -1,151 +1,157 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IGUIElement.h"
#include "SColor.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
class IGUIFont; {
class IGUIFont;
//! Single line edit box for editing simple text.
/** \par This element can create the following events of type EGUI_EVENT_TYPE: //! Single line edit box for editing simple text.
\li EGET_EDITBOX_ENTER /** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_EDITBOX_CHANGED \li EGET_EDITBOX_ENTER
\li EGET_EDITBOX_MARKING_CHANGED \li EGET_EDITBOX_CHANGED
*/ \li EGET_EDITBOX_MARKING_CHANGED
class IGUIEditBox : public IGUIElement */
{ class IGUIEditBox : public IGUIElement
public: {
//! constructor public:
IGUIEditBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_EDIT_BOX, environment, parent, id, rectangle) {} //! constructor
IGUIEditBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! Sets another skin independent font. : IGUIElement(EGUIET_EDIT_BOX, environment, parent, id, rectangle) {}
/** If this is set to zero, the button uses the font of the skin.
\param font: New font to set. */ //! Sets another skin independent font.
virtual void setOverrideFont(IGUIFont *font = 0) = 0; /** If this is set to zero, the button uses the font of the skin.
\param font: New font to set. */
//! Gets the override font (if any) virtual void setOverrideFont(IGUIFont* font=0) = 0;
/** \return The override font (may be 0) */
virtual IGUIFont *getOverrideFont() const = 0; //! Gets the override font (if any)
/** \return The override font (may be 0) */
//! Get the font which is used right now for drawing virtual IGUIFont* getOverrideFont() const = 0;
/** Currently this is the override font when one is set and the
font of the active skin otherwise */ //! Get the font which is used right now for drawing
virtual IGUIFont *getActiveFont() const = 0; /** Currently this is the override font when one is set and the
font of the active skin otherwise */
//! Sets another color for the text. virtual IGUIFont* getActiveFont() const = 0;
/** If set, the edit box does not use the EGDC_BUTTON_TEXT color defined
in the skin, but the set color instead. You don't need to call //! Sets another color for the text.
IGUIEditBox::enableOverrrideColor(true) after this, this is done /** If set, the edit box does not use the EGDC_BUTTON_TEXT color defined
by this function. in the skin, but the set color instead. You don't need to call
If you set a color, and you want the text displayed with the color IGUIEditBox::enableOverrrideColor(true) after this, this is done
of the skin again, call IGUIEditBox::enableOverrideColor(false); by this function.
\param color: New color of the text. */ If you set a color, and you want the text displayed with the color
virtual void setOverrideColor(video::SColor color) = 0; of the skin again, call IGUIEditBox::enableOverrideColor(false);
\param color: New color of the text. */
//! Gets the override color virtual void setOverrideColor(video::SColor color) = 0;
virtual video::SColor getOverrideColor() const = 0;
//! Gets the override color
//! Sets if the text should use the override color or the color in the gui skin. virtual video::SColor getOverrideColor() const = 0;
/** \param enable: If set to true, the override color, which can be set
with IGUIEditBox::setOverrideColor is used, otherwise the //! Sets if the text should use the override color or the color in the gui skin.
EGDC_BUTTON_TEXT color of the skin. */ /** \param enable: If set to true, the override color, which can be set
virtual void enableOverrideColor(bool enable) = 0; with IGUIEditBox::setOverrideColor is used, otherwise the
EGDC_BUTTON_TEXT color of the skin. */
//! Checks if an override color is enabled virtual void enableOverrideColor(bool enable) = 0;
/** \return true if the override color is enabled, false otherwise */
virtual bool isOverrideColorEnabled(void) const = 0; //! Checks if an override color is enabled
/** \return true if the override color is enabled, false otherwise */
//! Sets whether to draw the background virtual bool isOverrideColorEnabled(void) const = 0;
virtual void setDrawBackground(bool draw) = 0;
//! Sets whether to draw the background
//! Checks if background drawing is enabled virtual void setDrawBackground(bool draw) = 0;
/** \return true if background drawing is enabled, false otherwise */
virtual bool isDrawBackgroundEnabled() const = 0; //! Checks if background drawing is enabled
/** \return true if background drawing is enabled, false otherwise */
//! Turns the border on or off virtual bool isDrawBackgroundEnabled() const = 0;
/** \param border: true if you want the border to be drawn, false if not */
virtual void setDrawBorder(bool border) = 0; //! Turns the border on or off
/** \param border: true if you want the border to be drawn, false if not */
//! Checks if border drawing is enabled virtual void setDrawBorder(bool border) = 0;
/** \return true if border drawing is enabled, false otherwise */
virtual bool isDrawBorderEnabled() const = 0; //! Checks if border drawing is enabled
/** \return true if border drawing is enabled, false otherwise */
//! Sets text justification mode virtual bool isDrawBorderEnabled() const = 0;
/** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text. //! Sets text justification mode
\param vertical: EGUIA_UPPERLEFT to align with top edge, /** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text (default). */ EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text.
virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0; \param vertical: EGUIA_UPPERLEFT to align with top edge,
EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text (default). */
//! Enables or disables word wrap. virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0;
/** \param enable: If set to true, words going over one line are
broken to the next line. */ //! Enables or disables word wrap.
virtual void setWordWrap(bool enable) = 0; /** \param enable: If set to true, words going over one line are
broken to the next line. */
//! Checks if word wrap is enabled virtual void setWordWrap(bool enable) = 0;
/** \return true if word wrap is enabled, false otherwise */
virtual bool isWordWrapEnabled() const = 0; //! Checks if word wrap is enabled
/** \return true if word wrap is enabled, false otherwise */
//! Enables or disables newlines. virtual bool isWordWrapEnabled() const = 0;
/** \param enable: If set to true, the EGET_EDITBOX_ENTER event will not be fired,
instead a newline character will be inserted. */ //! Enables or disables newlines.
virtual void setMultiLine(bool enable) = 0; /** \param enable: If set to true, the EGET_EDITBOX_ENTER event will not be fired,
instead a newline character will be inserted. */
//! Checks if multi line editing is enabled virtual void setMultiLine(bool enable) = 0;
/** \return true if multi-line is enabled, false otherwise */
virtual bool isMultiLineEnabled() const = 0; //! Checks if multi line editing is enabled
/** \return true if multi-line is enabled, false otherwise */
//! Enables or disables automatic scrolling with cursor position virtual bool isMultiLineEnabled() const = 0;
/** \param enable: If set to true, the text will move around with the cursor position */
virtual void setAutoScroll(bool enable) = 0; //! Enables or disables automatic scrolling with cursor position
/** \param enable: If set to true, the text will move around with the cursor position */
//! Checks to see if automatic scrolling is enabled virtual void setAutoScroll(bool enable) = 0;
/** \return true if automatic scrolling is enabled, false if not */
virtual bool isAutoScrollEnabled() const = 0; //! Checks to see if automatic scrolling is enabled
/** \return true if automatic scrolling is enabled, false if not */
//! Sets whether the edit box is a password box. Setting this to true will virtual bool isAutoScrollEnabled() const = 0;
/** disable MultiLine, WordWrap and the ability to copy with ctrl+c or ctrl+x
\param passwordBox: true to enable password, false to disable //! Sets whether the edit box is a password box. Setting this to true will
\param passwordChar: the character that is displayed instead of letters */ /** disable MultiLine, WordWrap and the ability to copy with ctrl+c or ctrl+x
virtual void setPasswordBox(bool passwordBox, wchar_t passwordChar = L'*') = 0; \param passwordBox: true to enable password, false to disable
\param passwordChar: the character that is displayed instead of letters */
//! Returns true if the edit box is currently a password box. virtual void setPasswordBox(bool passwordBox, wchar_t passwordChar = L'*') = 0;
virtual bool isPasswordBox() const = 0;
//! Returns true if the edit box is currently a password box.
//! Gets the size area of the text in the edit box virtual bool isPasswordBox() const = 0;
/** \return The size in pixels of the text */
virtual core::dimension2du getTextDimension() = 0; //! Gets the size area of the text in the edit box
/** \return The size in pixels of the text */
//! Sets the maximum amount of characters which may be entered in the box. virtual core::dimension2du getTextDimension() = 0;
/** \param max: Maximum amount of characters. If 0, the character amount is
infinity. */ //! Sets the maximum amount of characters which may be entered in the box.
virtual void setMax(u32 max) = 0; /** \param max: Maximum amount of characters. If 0, the character amount is
infinity. */
//! Returns maximum amount of characters, previously set by setMax(); virtual void setMax(u32 max) = 0;
virtual u32 getMax() const = 0;
//! Returns maximum amount of characters, previously set by setMax();
//! Set the character used for the cursor. virtual u32 getMax() const = 0;
/** By default it's "_" */
virtual void setCursorChar(const wchar_t cursorChar) = 0; //! Set the character used for the cursor.
/** By default it's "_" */
//! Get the character used for the cursor. virtual void setCursorChar(const wchar_t cursorChar) = 0;
virtual wchar_t getCursorChar() const = 0;
//! Get the character used for the cursor.
//! Set the blinktime for the cursor. 2x blinktime is one full cycle. virtual wchar_t getCursorChar() const = 0;
//** \param timeMs Blinktime in milliseconds. When set to 0 the cursor is constantly on without blinking */
virtual void setCursorBlinkTime(irr::u32 timeMs) = 0; //! Set the blinktime for the cursor. 2x blinktime is one full cycle.
//** \param timeMs Blinktime in milliseconds. When set to 0 the cursor is constantly on without blinking */
//! Get the cursor blinktime virtual void setCursorBlinkTime(irr::u32 timeMs) = 0;
virtual irr::u32 getCursorBlinkTime() const = 0;
}; //! Get the cursor blinktime
virtual irr::u32 getCursorBlinkTime() const = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,414 +1,421 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "rect.h" #include "IGUISkin.h"
#include "EFocusFlags.h" #include "rect.h"
#include "IEventReceiver.h" #include "EFocusFlags.h"
#include "path.h" #include "IEventReceiver.h"
#include "path.h"
namespace irr
{ namespace irr
class IOSOperator; {
class IEventReceiver; class IOSOperator;
class IEventReceiver;
namespace io
{ namespace io
class IReadFile; {
class IWriteFile; class IReadFile;
class IFileSystem; class IWriteFile;
} // end namespace io class IFileSystem;
namespace video } // end namespace io
{ namespace video
class IVideoDriver; {
class ITexture; class IVideoDriver;
} // end namespace video class ITexture;
} // end namespace video
namespace gui
{ namespace gui
{
class IGUIElement;
class IGUIFont; class IGUIElement;
class IGUISpriteBank; class IGUIFont;
class IGUIScrollBar; class IGUISpriteBank;
class IGUIImage; class IGUIScrollBar;
class IGUICheckBox; class IGUIImage;
class IGUIListBox; class IGUICheckBox;
class IGUIImageList; class IGUIListBox;
class IGUIFileOpenDialog; class IGUIImageList;
class IGUIStaticText; class IGUIFileOpenDialog;
class IGUIEditBox; class IGUIStaticText;
class IGUITabControl; class IGUIEditBox;
class IGUITab; class IGUITabControl;
class IGUIComboBox; class IGUITab;
class IGUIButton; class IGUIComboBox;
class IGUIWindow; class IGUIButton;
class IGUIWindow;
//! GUI Environment. Used as factory and manager of all other GUI elements.
/** \par This element can create the following events of type EGUI_EVENT_TYPE (which are passed on to focused sub-elements): //! GUI Environment. Used as factory and manager of all other GUI elements.
\li EGET_ELEMENT_FOCUS_LOST /** \par This element can create the following events of type EGUI_EVENT_TYPE (which are passed on to focused sub-elements):
\li EGET_ELEMENT_FOCUSED \li EGET_ELEMENT_FOCUS_LOST
\li EGET_ELEMENT_LEFT \li EGET_ELEMENT_FOCUSED
\li EGET_ELEMENT_HOVERED \li EGET_ELEMENT_LEFT
*/ \li EGET_ELEMENT_HOVERED
class IGUIEnvironment : public virtual IReferenceCounted */
{ class IGUIEnvironment : public virtual IReferenceCounted
public: {
//! Draws all gui elements by traversing the GUI environment starting at the root node. public:
/** \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. */ //! Draws all gui elements by traversing the GUI environment starting at the root node.
virtual void drawAll(bool useScreenSize = true) = 0; /** \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. */
//! Sets the focus to an element. virtual void drawAll(bool useScreenSize=true) = 0;
/** Causes a EGET_ELEMENT_FOCUS_LOST event followed by a
EGET_ELEMENT_FOCUSED event. If someone absorbed either of the events, //! Sets the focus to an element.
then the focus will not be changed. /** Causes a EGET_ELEMENT_FOCUS_LOST event followed by a
\param element Pointer to the element which shall get the focus. EGET_ELEMENT_FOCUSED event. If someone absorbed either of the events,
\return True on success, false on failure */ then the focus will not be changed.
virtual bool setFocus(IGUIElement *element) = 0; \param element Pointer to the element which shall get the focus.
\return True on success, false on failure */
//! Returns the element which holds the focus. virtual bool setFocus(IGUIElement* element) = 0;
/** \return Pointer to the element with focus. */
virtual IGUIElement *getFocus() const = 0; //! Returns the element which holds the focus.
/** \return Pointer to the element with focus. */
//! Returns the element which was last under the mouse cursor virtual IGUIElement* getFocus() const = 0;
/** NOTE: This information is updated _after_ the user-eventreceiver
received it's mouse-events. To find the hovered element while catching //! Returns the element which was last under the mouse cursor
mouse events you have to use instead: /** NOTE: This information is updated _after_ the user-eventreceiver
IGUIEnvironment::getRootGUIElement()->getElementFromPoint(mousePos); received it's mouse-events. To find the hovered element while catching
\return Pointer to the element under the mouse. */ mouse events you have to use instead:
virtual IGUIElement *getHovered() const = 0; IGUIEnvironment::getRootGUIElement()->getElementFromPoint(mousePos);
\return Pointer to the element under the mouse. */
//! Removes the focus from an element. virtual IGUIElement* getHovered() const = 0;
/** Causes a EGET_ELEMENT_FOCUS_LOST event. If the event is absorbed
then the focus will not be changed. //! Removes the focus from an element.
\param element Pointer to the element which shall lose the focus. /** Causes a EGET_ELEMENT_FOCUS_LOST event. If the event is absorbed
\return True on success, false on failure */ then the focus will not be changed.
virtual bool removeFocus(IGUIElement *element) = 0; \param element Pointer to the element which shall lose the focus.
\return True on success, false on failure */
//! Returns whether the element has focus virtual bool removeFocus(IGUIElement* element) = 0;
/** \param element Pointer to the element which is tested.
\param checkSubElements When true and focus is on a sub-element of element then it will still count as focused and return true //! Returns whether the element has focus
\return True if the element has focus, else false. */ /** \param element Pointer to the element which is tested.
virtual bool hasFocus(const IGUIElement *element, bool checkSubElements = false) const = 0; \param checkSubElements When true and focus is on a sub-element of element then it will still count as focused and return true
\return True if the element has focus, else false. */
//! Returns the current video driver. virtual bool hasFocus(const IGUIElement* element, bool checkSubElements=false) const = 0;
/** \return Pointer to the video driver. */
virtual video::IVideoDriver *getVideoDriver() const = 0; //! Returns the current video driver.
/** \return Pointer to the video driver. */
//! Returns the file system. virtual video::IVideoDriver* getVideoDriver() const = 0;
/** \return Pointer to the file system. */
virtual io::IFileSystem *getFileSystem() const = 0; //! Returns the file system.
/** \return Pointer to the file system. */
//! returns a pointer to the OS operator virtual io::IFileSystem* getFileSystem() const = 0;
/** \return Pointer to the OS operator. */
virtual IOSOperator *getOSOperator() const = 0; //! returns a pointer to the OS operator
/** \return Pointer to the OS operator. */
//! Removes all elements from the environment. virtual IOSOperator* getOSOperator() const = 0;
virtual void clear() = 0;
//! Removes all elements from the environment.
//! Posts an input event to the environment. virtual void clear() = 0;
/** Usually you do not have to
use this method, it is used by the engine internally. //! Posts an input event to the environment.
\param event The event to post. /** Usually you do not have to
\return True if succeeded, else false. */ use this method, it is used by the engine internally.
virtual bool postEventFromUser(const SEvent &event) = 0; \param event The event to post.
\return True if succeeded, else false. */
//! This sets a new event receiver for gui events. virtual bool postEventFromUser(const SEvent& event) = 0;
/** Usually you do not have to
use this method, it is used by the engine internally. //! This sets a new event receiver for gui events.
\param evr Pointer to the new receiver. */ /** Usually you do not have to
virtual void setUserEventReceiver(IEventReceiver *evr) = 0; use this method, it is used by the engine internally.
\param evr Pointer to the new receiver. */
//! Returns pointer to the current gui skin. virtual void setUserEventReceiver(IEventReceiver* evr) = 0;
/** \return Pointer to the GUI skin. */
virtual IGUISkin *getSkin() const = 0; //! Returns pointer to the current gui skin.
/** \return Pointer to the GUI skin. */
//! Sets a new GUI Skin virtual IGUISkin* getSkin() const = 0;
/** You can use this to change the appearance of the whole GUI
Environment. You can set one of the built-in skins or implement your //! Sets a new GUI Skin
own class derived from IGUISkin and enable it using this method. /** You can use this to change the appearance of the whole GUI
To set for example the built-in Windows classic skin, use the following Environment. You can set one of the built-in skins or implement your
code: own class derived from IGUISkin and enable it using this method.
\code To set for example the built-in Windows classic skin, use the following
gui::IGUISkin* newskin = environment->createSkin(gui::EGST_WINDOWS_CLASSIC); code:
environment->setSkin(newskin); \code
newskin->drop(); gui::IGUISkin* newskin = environment->createSkin(gui::EGST_WINDOWS_CLASSIC);
\endcode environment->setSkin(newskin);
\param skin New skin to use. newskin->drop();
*/ \endcode
virtual void setSkin(IGUISkin *skin) = 0; \param skin New skin to use.
*/
//! Creates a new GUI Skin based on a template. virtual void setSkin(IGUISkin* skin) = 0;
/** Use setSkin() to set the created skin.
\param type The type of the new skin. //! Creates a new GUI Skin based on a template.
\return Pointer to the created skin. /** Use setSkin() to set the created skin.
If you no longer need it, you should call IGUISkin::drop(). \param type The type of the new skin.
See IReferenceCounted::drop() for more information. */ \return Pointer to the created skin.
virtual IGUISkin *createSkin(EGUI_SKIN_TYPE type) = 0; If you no longer need it, you should call IGUISkin::drop().
See IReferenceCounted::drop() for more information. */
//! Creates the image list from the given texture. virtual IGUISkin* createSkin(EGUI_SKIN_TYPE type) = 0;
/** \param texture Texture to split into images
\param imageSize Dimension of each image
\param useAlphaChannel Flag whether alpha channel of the texture should be honored. //! Creates the image list from the given texture.
\return Pointer to the font. Returns 0 if the font could not be loaded. /** \param texture Texture to split into images
This pointer should not be dropped. See IReferenceCounted::drop() for \param imageSize Dimension of each image
more information. */ \param useAlphaChannel Flag whether alpha channel of the texture should be honored.
virtual IGUIImageList *createImageList(video::ITexture *texture, \return Pointer to the font. Returns 0 if the font could not be loaded.
core::dimension2d<s32> imageSize, This pointer should not be dropped. See IReferenceCounted::drop() for
bool useAlphaChannel) = 0; more information. */
virtual IGUIImageList* createImageList( video::ITexture* texture,
//! Returns pointer to the font with the specified filename. core::dimension2d<s32> imageSize,
/** Loads the font if it was not loaded before. bool useAlphaChannel ) = 0;
\param filename Filename of the Font.
\return Pointer to the font. Returns 0 if the font could not be loaded. //! Returns pointer to the font with the specified filename.
This pointer should not be dropped. See IReferenceCounted::drop() for /** Loads the font if it was not loaded before.
more information. */ \param filename Filename of the Font.
virtual IGUIFont *getFont(const io::path &filename) = 0; \return Pointer to the font. Returns 0 if the font could not be loaded.
This pointer should not be dropped. See IReferenceCounted::drop() for
//! Adds an externally loaded font to the font list. more information. */
/** This method allows to attach an already loaded font to the list of virtual IGUIFont* getFont(const io::path& filename) = 0;
existing fonts. The font is grabbed if non-null and adding was successful.
\param name Name the font should be stored as. //! Adds an externally loaded font to the font list.
\param font Pointer to font to add. /** This method allows to attach an already loaded font to the list of
\return Pointer to the font stored. This can differ from given parameter if the name previously existed. */ existing fonts. The font is grabbed if non-null and adding was successful.
virtual IGUIFont *addFont(const io::path &name, IGUIFont *font) = 0; \param name Name the font should be stored as.
\param font Pointer to font to add.
//! remove loaded font \return Pointer to the font stored. This can differ from given parameter if the name previously existed. */
virtual void removeFont(IGUIFont *font) = 0; virtual IGUIFont* addFont(const io::path& name, IGUIFont* font) = 0;
//! Returns the default built-in font. //! remove loaded font
/** \return Pointer to the default built-in font. virtual void removeFont(IGUIFont* font) = 0;
This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */ //! Returns the default built-in font.
virtual IGUIFont *getBuiltInFont() const = 0; /** \return Pointer to the default built-in font.
This pointer should not be dropped. See IReferenceCounted::drop() for
//! Returns pointer to the sprite bank which was added with addEmptySpriteBank more information. */
/** TODO: This should load files in the future, but not implemented so far. virtual IGUIFont* getBuiltInFont() const = 0;
\param filename Name of a spritebank added with addEmptySpriteBank
\return Pointer to the sprite bank. Returns 0 if it could not be loaded. //! Returns pointer to the sprite bank which was added with addEmptySpriteBank
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ /** TODO: This should load files in the future, but not implemented so far.
virtual IGUISpriteBank *getSpriteBank(const io::path &filename) = 0; \param filename Name of a spritebank added with addEmptySpriteBank
\return Pointer to the sprite bank. Returns 0 if it could not be loaded.
//! Adds an empty sprite bank to the manager This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
/** \param name Name of the new sprite bank. virtual IGUISpriteBank* getSpriteBank(const io::path& filename) = 0;
\return Pointer to the sprite bank.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ //! Adds an empty sprite bank to the manager
virtual IGUISpriteBank *addEmptySpriteBank(const io::path &name) = 0; /** \param name Name of the new sprite bank.
\return Pointer to the sprite bank.
//! Returns the root gui element. This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
/** This is the first gui element, the (direct or indirect) parent of all virtual IGUISpriteBank* addEmptySpriteBank(const io::path& name) = 0;
other gui elements. It is a valid IGUIElement, with dimensions the same
size as the screen. //! Returns the root gui element.
\return Pointer to the root element of the GUI. The returned pointer /** This is the first gui element, the (direct or indirect) parent of all
should not be dropped. See IReferenceCounted::drop() for more other gui elements. It is a valid IGUIElement, with dimensions the same
information. */ size as the screen.
virtual IGUIElement *getRootGUIElement() = 0; \return Pointer to the root element of the GUI. The returned pointer
should not be dropped. See IReferenceCounted::drop() for more
//! Adds a button element. information. */
/** \param rectangle Rectangle specifying the borders of the button. virtual IGUIElement* getRootGUIElement() = 0;
\param parent Parent gui element of the button.
\param id Id with which the gui element can be identified. //! Adds a button element.
\param text Text displayed on the button. /** \param rectangle Rectangle specifying the borders of the button.
\param tooltiptext Text displayed in the tooltip. \param parent Parent gui element of the button.
\return Pointer to the created button. Returns 0 if an error occurred. \param id Id with which the gui element can be identified.
This pointer should not be dropped. See IReferenceCounted::drop() for \param text Text displayed on the button.
more information. */ \param tooltiptext Text displayed in the tooltip.
virtual IGUIButton *addButton(const core::rect<s32> &rectangle, \return Pointer to the created button. Returns 0 if an error occurred.
IGUIElement *parent = 0, s32 id = -1, const wchar_t *text = 0, const wchar_t *tooltiptext = 0) = 0; This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */
//! Adds a scrollbar. virtual IGUIButton* addButton(const core::rect<s32>& rectangle,
/** \param horizontal Specifies if the scroll bar is drawn horizontal IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0, const wchar_t* tooltiptext = 0) = 0;
or vertical.
\param rectangle Rectangle specifying the borders of the scrollbar. //! Adds a scrollbar.
\param parent Parent gui element of the scroll bar. /** \param horizontal Specifies if the scroll bar is drawn horizontal
\param id Id to identify the gui element. or vertical.
\return Pointer to the created scrollbar. Returns 0 if an error \param rectangle Rectangle specifying the borders of the scrollbar.
occurred. This pointer should not be dropped. See \param parent Parent gui element of the scroll bar.
IReferenceCounted::drop() for more information. */ \param id Id to identify the gui element.
virtual IGUIScrollBar *addScrollBar(bool horizontal, const core::rect<s32> &rectangle, \return Pointer to the created scrollbar. Returns 0 if an error
IGUIElement *parent = 0, s32 id = -1) = 0; occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */
//! Adds an image element. virtual IGUIScrollBar* addScrollBar(bool horizontal, const core::rect<s32>& rectangle,
/** \param image Image to be displayed. IGUIElement* parent=0, s32 id=-1) = 0;
\param pos Position of the image. The width and height of the image is
taken from the image. //! Adds an image element.
\param useAlphaChannel Sets if the image should use the alpha channel /** \param image Image to be displayed.
of the texture to draw itself. \param pos Position of the image. The width and height of the image is
\param parent Parent gui element of the image. taken from the image.
\param id Id to identify the gui element. \param useAlphaChannel Sets if the image should use the alpha channel
\param text Title text of the image (not displayed). of the texture to draw itself.
\return Pointer to the created image element. Returns 0 if an error \param parent Parent gui element of the image.
occurred. This pointer should not be dropped. See \param id Id to identify the gui element.
IReferenceCounted::drop() for more information. */ \param text Title text of the image (not displayed).
virtual IGUIImage *addImage(video::ITexture *image, core::position2d<s32> pos, \return Pointer to the created image element. Returns 0 if an error
bool useAlphaChannel = true, IGUIElement *parent = 0, s32 id = -1, const wchar_t *text = 0) = 0; occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */
//! Adds an image element. virtual IGUIImage* addImage(video::ITexture* image, core::position2d<s32> pos,
/** Use IGUIImage::setImage later to set the image to be displayed. bool useAlphaChannel=true, IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0) = 0;
\param rectangle Rectangle specifying the borders of the image.
\param parent Parent gui element of the image. //! Adds an image element.
\param id Id to identify the gui element. /** Use IGUIImage::setImage later to set the image to be displayed.
\param text Title text of the image (not displayed). \param rectangle Rectangle specifying the borders of the image.
\param useAlphaChannel Sets if the image should use the alpha channel \param parent Parent gui element of the image.
of the texture to draw itself. \param id Id to identify the gui element.
\return Pointer to the created image element. Returns 0 if an error \param text Title text of the image (not displayed).
occurred. This pointer should not be dropped. See \param useAlphaChannel Sets if the image should use the alpha channel
IReferenceCounted::drop() for more information. */ of the texture to draw itself.
virtual IGUIImage *addImage(const core::rect<s32> &rectangle, \return Pointer to the created image element. Returns 0 if an error
IGUIElement *parent = 0, s32 id = -1, const wchar_t *text = 0, bool useAlphaChannel = true) = 0; occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */
//! Adds a checkbox element. virtual IGUIImage* addImage(const core::rect<s32>& rectangle,
/** \param checked Define the initial state of the check box. IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0, bool useAlphaChannel=true) = 0;
\param rectangle Rectangle specifying the borders of the check box.
\param parent Parent gui element of the check box. //! Adds a checkbox element.
\param id Id to identify the gui element. /** \param checked Define the initial state of the check box.
\param text Title text of the check box. \param rectangle Rectangle specifying the borders of the check box.
\return Pointer to the created check box. Returns 0 if an error \param parent Parent gui element of the check box.
occurred. This pointer should not be dropped. See \param id Id to identify the gui element.
IReferenceCounted::drop() for more information. */ \param text Title text of the check box.
virtual IGUICheckBox *addCheckBox(bool checked, const core::rect<s32> &rectangle, \return Pointer to the created check box. Returns 0 if an error
IGUIElement *parent = 0, s32 id = -1, const wchar_t *text = 0) = 0; occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */
//! Adds a list box element. virtual IGUICheckBox* addCheckBox(bool checked, const core::rect<s32>& rectangle,
/** \param rectangle Rectangle specifying the borders of the list box. IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0) = 0;
\param parent Parent gui element of the list box.
\param id Id to identify the gui element. //! Adds a list box element.
\param drawBackground Flag whether the background should be drawn. /** \param rectangle Rectangle specifying the borders of the list box.
\return Pointer to the created list box. Returns 0 if an error occurred. \param parent Parent gui element of the list box.
This pointer should not be dropped. See IReferenceCounted::drop() for \param id Id to identify the gui element.
more information. */ \param drawBackground Flag whether the background should be drawn.
virtual IGUIListBox *addListBox(const core::rect<s32> &rectangle, \return Pointer to the created list box. Returns 0 if an error occurred.
IGUIElement *parent = 0, s32 id = -1, bool drawBackground = false) = 0; This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */
//! Adds a file open dialog. virtual IGUIListBox* addListBox(const core::rect<s32>& rectangle,
/** \param title Text to be displayed as the title of the dialog. IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) = 0;
\param modal Defines if the dialog is modal. This means, that all other
gui elements which were created before the message box cannot be used //! Adds a file open dialog.
until this messagebox is removed. /** \param title Text to be displayed as the title of the dialog.
\param parent Parent gui element of the dialog. \param modal Defines if the dialog is modal. This means, that all other
\param id Id to identify the gui element. gui elements which were created before the message box cannot be used
\param restoreCWD If set to true, the current working directory will be until this messagebox is removed.
restored after the dialog is closed in some way. Otherwise the working \param parent Parent gui element of the dialog.
directory will be the one that the file dialog was last showing. \param id Id to identify the gui element.
\param startDir Optional path for which the file dialog will be opened. \param restoreCWD If set to true, the current working directory will be
\return Pointer to the created file open dialog. Returns 0 if an error restored after the dialog is closed in some way. Otherwise the working
occurred. This pointer should not be dropped. See directory will be the one that the file dialog was last showing.
IReferenceCounted::drop() for more information. */ \param startDir Optional path for which the file dialog will be opened.
virtual IGUIFileOpenDialog *addFileOpenDialog(const wchar_t *title = 0, \return Pointer to the created file open dialog. Returns 0 if an error
bool modal = true, IGUIElement *parent = 0, s32 id = -1, occurred. This pointer should not be dropped. See
bool restoreCWD = false, io::path::char_type *startDir = 0) = 0; IReferenceCounted::drop() for more information. */
virtual IGUIFileOpenDialog* addFileOpenDialog(const wchar_t* title=0,
//! Adds a static text. bool modal=true, IGUIElement* parent=0, s32 id=-1,
/** \param text Text to be displayed. Can be altered after creation by SetText(). bool restoreCWD=false, io::path::char_type* startDir=0) = 0;
\param rectangle Rectangle specifying the borders of the static text
\param border Set to true if the static text should have a 3d border. //! Adds a static text.
\param wordWrap Enable if the text should wrap into multiple lines. /** \param text Text to be displayed. Can be altered after creation by SetText().
\param parent Parent item of the element, e.g. a window. \param rectangle Rectangle specifying the borders of the static text
\param id The ID of the element. \param border Set to true if the static text should have a 3d border.
\param fillBackground Enable if the background shall be filled. \param wordWrap Enable if the text should wrap into multiple lines.
Defaults to false. \param parent Parent item of the element, e.g. a window.
\return Pointer to the created static text. Returns 0 if an error \param id The ID of the element.
occurred. This pointer should not be dropped. See \param fillBackground Enable if the background shall be filled.
IReferenceCounted::drop() for more information. */ Defaults to false.
virtual IGUIStaticText *addStaticText(const wchar_t *text, const core::rect<s32> &rectangle, \return Pointer to the created static text. Returns 0 if an error
bool border = false, bool wordWrap = true, IGUIElement *parent = 0, s32 id = -1, occurred. This pointer should not be dropped. See
bool fillBackground = false) = 0; IReferenceCounted::drop() for more information. */
virtual IGUIStaticText* addStaticText(const wchar_t* text, const core::rect<s32>& rectangle,
//! Adds an edit box. bool border=false, bool wordWrap=true, IGUIElement* parent=0, s32 id=-1,
/** Supports Unicode input from every keyboard around the world, bool fillBackground = false) = 0;
scrolling, copying and pasting (exchanging data with the clipboard
directly), maximum character amount, marking, and all shortcuts like //! Adds an edit box.
ctrl+X, ctrl+V, ctrl+C, shift+Left, shift+Right, Home, End, and so on. /** Supports Unicode input from every keyboard around the world,
\param text Text to be displayed. Can be altered after creation scrolling, copying and pasting (exchanging data with the clipboard
by setText(). directly), maximum character amount, marking, and all shortcuts like
\param rectangle Rectangle specifying the borders of the edit box. ctrl+X, ctrl+V, ctrl+C, shift+Left, shift+Right, Home, End, and so on.
\param border Set to true if the edit box should have a 3d border. \param text Text to be displayed. Can be altered after creation
\param parent Parent item of the element, e.g. a window. by setText().
Set it to 0 to place the edit box directly in the environment. \param rectangle Rectangle specifying the borders of the edit box.
\param id The ID of the element. \param border Set to true if the edit box should have a 3d border.
\return Pointer to the created edit box. Returns 0 if an error occurred. \param parent Parent item of the element, e.g. a window.
This pointer should not be dropped. See IReferenceCounted::drop() for Set it to 0 to place the edit box directly in the environment.
more information. */ \param id The ID of the element.
virtual IGUIEditBox *addEditBox(const wchar_t *text, const core::rect<s32> &rectangle, \return Pointer to the created edit box. Returns 0 if an error occurred.
bool border = true, IGUIElement *parent = 0, s32 id = -1) = 0; This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */
//! Adds a tab control to the environment. virtual IGUIEditBox* addEditBox(const wchar_t* text, const core::rect<s32>& rectangle,
/** \param rectangle Rectangle specifying the borders of the tab control. bool border=true, IGUIElement* parent=0, s32 id=-1) = 0;
\param parent Parent item of the element, e.g. a window.
Set it to 0 to place the tab control directly in the environment. //! Adds a tab control to the environment.
\param fillbackground Specifies if the background of the tab control /** \param rectangle Rectangle specifying the borders of the tab control.
should be drawn. \param parent Parent item of the element, e.g. a window.
\param border Specifies if a flat 3d border should be drawn. This is Set it to 0 to place the tab control directly in the environment.
usually not necessary unless you place the control directly into \param fillbackground Specifies if the background of the tab control
the environment without a window as parent. should be drawn.
\param id An identifier for the tab control. \param border Specifies if a flat 3d border should be drawn. This is
\return Pointer to the created tab control element. Returns 0 if an usually not necessary unless you place the control directly into
error occurred. This pointer should not be dropped. See the environment without a window as parent.
IReferenceCounted::drop() for more information. */ \param id An identifier for the tab control.
virtual IGUITabControl *addTabControl(const core::rect<s32> &rectangle, \return Pointer to the created tab control element. Returns 0 if an
IGUIElement *parent = 0, bool fillbackground = false, error occurred. This pointer should not be dropped. See
bool border = true, s32 id = -1) = 0; IReferenceCounted::drop() for more information. */
virtual IGUITabControl* addTabControl(const core::rect<s32>& rectangle,
//! Adds tab to the environment. IGUIElement* parent=0, bool fillbackground=false,
/** You can use this element to group other elements. This is not used bool border=true, s32 id=-1) = 0;
for creating tabs on tab controls, please use IGUITabControl::addTab()
for this instead. //! Adds tab to the environment.
\param rectangle Rectangle specifying the borders of the tab. /** You can use this element to group other elements. This is not used
\param parent Parent item of the element, e.g. a window. for creating tabs on tab controls, please use IGUITabControl::addTab()
Set it to 0 to place the tab directly in the environment. for this instead.
\param id An identifier for the tab. \param rectangle Rectangle specifying the borders of the tab.
\return Pointer to the created tab. Returns 0 if an \param parent Parent item of the element, e.g. a window.
error occurred. This pointer should not be dropped. See Set it to 0 to place the tab directly in the environment.
IReferenceCounted::drop() for more information. */ \param id An identifier for the tab.
virtual IGUITab *addTab(const core::rect<s32> &rectangle, \return Pointer to the created tab. Returns 0 if an
IGUIElement *parent = 0, s32 id = -1) = 0; error occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */
//! Adds a combo box to the environment. virtual IGUITab* addTab(const core::rect<s32>& rectangle,
/** \param rectangle Rectangle specifying the borders of the combo box. IGUIElement* parent=0, s32 id=-1) = 0;
\param parent Parent item of the element, e.g. a window.
Set it to 0 to place the combo box directly in the environment. //! Adds a combo box to the environment.
\param id An identifier for the combo box. /** \param rectangle Rectangle specifying the borders of the combo box.
\return Pointer to the created combo box. Returns 0 if an \param parent Parent item of the element, e.g. a window.
error occurred. This pointer should not be dropped. See Set it to 0 to place the combo box directly in the environment.
IReferenceCounted::drop() for more information. */ \param id An identifier for the combo box.
virtual IGUIComboBox *addComboBox(const core::rect<s32> &rectangle, \return Pointer to the created combo box. Returns 0 if an
IGUIElement *parent = 0, s32 id = -1) = 0; error occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */
//! Find the next element which would be selected when pressing the tab-key virtual IGUIComboBox* addComboBox(const core::rect<s32>& rectangle,
/** If you set the focus for the result you can manually force focus-changes like they IGUIElement* parent=0, s32 id=-1) = 0;
would happen otherwise by the tab-keys.
\param reverse When true it will search backward (toward lower TabOrder numbers, like shift+tab) //! Find the next element which would be selected when pressing the tab-key
\param group When true it will search for the next tab-group (like ctrl+tab) /** If you set the focus for the result you can manually force focus-changes like they
*/ would happen otherwise by the tab-keys.
virtual IGUIElement *getNextElement(bool reverse = false, bool group = false) = 0; \param reverse When true it will search backward (toward lower TabOrder numbers, like shift+tab)
\param group When true it will search for the next tab-group (like ctrl+tab)
//! Set the way the gui will handle automatic focus changes */
/** The default is (EFF_SET_ON_LMOUSE_DOWN | EFF_SET_ON_TAB). virtual IGUIElement* getNextElement(bool reverse=false, bool group=false) = 0;
with the left mouse button.
This does not affect the setFocus function itself - users can still call that whenever they want on any element. //! Set the way the gui will handle automatic focus changes
\param flags A bitmask which is a combination of ::EFOCUS_FLAG flags.*/ /** The default is (EFF_SET_ON_LMOUSE_DOWN | EFF_SET_ON_TAB).
virtual void setFocusBehavior(u32 flags) = 0; with the left mouse button.
This does not affect the setFocus function itself - users can still call that whenever they want on any element.
//! Get the way the gui does handle focus changes \param flags A bitmask which is a combination of ::EFOCUS_FLAG flags.*/
/** \returns A bitmask which is a combination of ::EFOCUS_FLAG flags.*/ virtual void setFocusBehavior(u32 flags) = 0;
virtual u32 getFocusBehavior() const = 0;
//! Get the way the gui does handle focus changes
//! Adds a IGUIElement to deletion queue. /** \returns A bitmask which is a combination of ::EFOCUS_FLAG flags.*/
/** Queued elements will be removed at the end of each drawAll call. virtual u32 getFocusBehavior() const = 0;
Or latest in the destructor of the GUIEnvironment.
This can be used to allow an element removing itself safely in a function //! Adds a IGUIElement to deletion queue.
iterating over gui elements, like an overloaded IGUIElement::draw or /** Queued elements will be removed at the end of each drawAll call.
IGUIElement::OnPostRender function. Or latest in the destructor of the GUIEnvironment.
Note that in general just calling IGUIElement::remove() is enough. This can be used to allow an element removing itself safely in a function
Unless you create your own GUI elements removing themselves you won't need it. iterating over gui elements, like an overloaded IGUIElement::draw or
\param element: Element to remove */ IGUIElement::OnPostRender function.
virtual void addToDeletionQueue(IGUIElement *element) = 0; Note that in general just calling IGUIElement::remove() is enough.
}; Unless you create your own GUI elements removing themselves you won't need it.
\param element: Element to remove */
} // end namespace gui virtual void addToDeletionQueue(IGUIElement* element) = 0;
} // end namespace irr };
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,44 +1,50 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IGUIElement.h"
#include "path.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
{
//! Standard file chooser dialog.
/** \warning When the user selects a folder this does change the current working directory //! Standard file chooser dialog.
/** \warning When the user selects a folder this does change the current working directory
\par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_DIRECTORY_SELECTED \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_FILE_SELECTED \li EGET_DIRECTORY_SELECTED
\li EGET_FILE_CHOOSE_DIALOG_CANCELLED \li EGET_FILE_SELECTED
*/ \li EGET_FILE_CHOOSE_DIALOG_CANCELLED
class IGUIFileOpenDialog : public IGUIElement */
{ class IGUIFileOpenDialog : public IGUIElement
public: {
//! constructor public:
IGUIFileOpenDialog(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_FILE_OPEN_DIALOG, environment, parent, id, rectangle) {} //! constructor
IGUIFileOpenDialog(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! Returns the filename of the selected file converted to wide characters. Returns NULL if no file was selected. : IGUIElement(EGUIET_FILE_OPEN_DIALOG, environment, parent, id, rectangle) {}
virtual const wchar_t *getFileName() const = 0;
//! Returns the filename of the selected file converted to wide characters. Returns NULL if no file was selected.
//! Returns the filename of the selected file. Is empty if no file was selected. virtual const wchar_t* getFileName() const = 0;
virtual const io::path &getFileNameP() const = 0;
//! Returns the filename of the selected file. Is empty if no file was selected.
//! Returns the directory of the selected file. Empty if no directory was selected. virtual const io::path& getFileNameP() const = 0;
virtual const io::path &getDirectoryName() const = 0;
//! Returns the directory of the selected file. Empty if no directory was selected.
//! Returns the directory of the selected file converted to wide characters. Returns NULL if no directory was selected. virtual const io::path& getDirectoryName() const = 0;
virtual const wchar_t *getDirectoryNameW() const = 0;
}; //! Returns the directory of the selected file converted to wide characters. Returns NULL if no directory was selected.
virtual const wchar_t* getDirectoryNameW() const = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,99 +1,104 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "rect.h" #include "SColor.h"
#include "irrString.h" #include "rect.h"
#include "irrString.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
{
//! An enum for the different types of GUI font.
enum EGUI_FONT_TYPE //! An enum for the different types of GUI font.
{ enum EGUI_FONT_TYPE
//! Bitmap fonts loaded from an XML file or a texture. {
EGFT_BITMAP = 0, //! Bitmap fonts loaded from an XML file or a texture.
EGFT_BITMAP = 0,
//! Scalable vector fonts loaded from an XML file.
/** These fonts reside in system memory and use no video memory //! Scalable vector fonts loaded from an XML file.
until they are displayed. These are slower than bitmap fonts /** These fonts reside in system memory and use no video memory
but can be easily scaled and rotated. */ until they are displayed. These are slower than bitmap fonts
EGFT_VECTOR, but can be easily scaled and rotated. */
EGFT_VECTOR,
//! A font which uses a the native API provided by the operating system.
/** Currently not used. */ //! A font which uses a the native API provided by the operating system.
EGFT_OS, /** Currently not used. */
EGFT_OS,
//! An external font type provided by the user.
EGFT_CUSTOM //! An external font type provided by the user.
}; EGFT_CUSTOM
};
//! Font interface.
class IGUIFont : public virtual IReferenceCounted //! Font interface.
{ class IGUIFont : public virtual IReferenceCounted
public: {
//! Draws some text and clips it to the specified rectangle if wanted. public:
/** \param text: Text to draw
\param position: Rectangle specifying position where to draw the text. //! Draws some text and clips it to the specified rectangle if wanted.
\param color: Color of the text /** \param text: Text to draw
\param hcenter: Specifies if the text should be centered horizontally into the rectangle. \param position: Rectangle specifying position where to draw the text.
\param vcenter: Specifies if the text should be centered vertically into the rectangle. \param color: Color of the text
\param clip: Optional pointer to a rectangle against which the text will be clipped. \param hcenter: Specifies if the text should be centered horizontally into the rectangle.
If the pointer is null, no clipping will be done. */ \param vcenter: Specifies if the text should be centered vertically into the rectangle.
virtual void draw(const core::stringw &text, const core::rect<s32> &position, \param clip: Optional pointer to a rectangle against which the text will be clipped.
video::SColor color, bool hcenter = false, bool vcenter = false, If the pointer is null, no clipping will be done. */
const core::rect<s32> *clip = 0) = 0; virtual void draw(const core::stringw& text, const core::rect<s32>& position,
video::SColor color, bool hcenter=false, bool vcenter=false,
//! Calculates the width and height of a given string of text. const core::rect<s32>* clip=0) = 0;
/** \return Returns width and height of the area covered by the text if
it would be drawn. */ //! Calculates the width and height of a given string of text.
virtual core::dimension2d<u32> getDimension(const wchar_t *text) const = 0; /** \return Returns width and height of the area covered by the text if
it would be drawn. */
//! Calculates the index of the character in the text which is on a specific position. virtual core::dimension2d<u32> getDimension(const wchar_t* text) const = 0;
/** \param text: Text string.
\param pixel_x: X pixel position of which the index of the character will be returned. //! Calculates the index of the character in the text which is on a specific position.
\return Returns zero based index of the character in the text, and -1 if no no character /** \param text: Text string.
is on this position. (=the text is too short). */ \param pixel_x: X pixel position of which the index of the character will be returned.
virtual s32 getCharacterFromPos(const wchar_t *text, s32 pixel_x) const = 0; \return Returns zero based index of the character in the text, and -1 if no no character
is on this position. (=the text is too short). */
//! Returns the type of this font virtual s32 getCharacterFromPos(const wchar_t* text, s32 pixel_x) const = 0;
virtual EGUI_FONT_TYPE getType() const { return EGFT_CUSTOM; }
//! Returns the type of this font
//! Sets global kerning width for the font. virtual EGUI_FONT_TYPE getType() const { return EGFT_CUSTOM; }
virtual void setKerningWidth(s32 kerning) = 0;
//! Sets global kerning width for the font.
//! Sets global kerning height for the font. virtual void setKerningWidth (s32 kerning) = 0;
virtual void setKerningHeight(s32 kerning) = 0;
//! Sets global kerning height for the font.
//! Gets kerning values (distance between letters) for the font. If no parameters are provided, virtual void setKerningHeight (s32 kerning) = 0;
/** the global kerning distance is returned.
\param thisLetter: If this parameter is provided, the left side kerning //! Gets kerning values (distance between letters) for the font. If no parameters are provided,
for this letter is added to the global kerning value. For example, a /** the global kerning distance is returned.
space might only be one pixel wide, but it may be displayed as several \param thisLetter: If this parameter is provided, the left side kerning
pixels. for this letter is added to the global kerning value. For example, a
\param previousLetter: If provided, kerning is calculated for both space might only be one pixel wide, but it may be displayed as several
letters and added to the global kerning value. For example, in a font pixels.
which supports kerning pairs a string such as 'Wo' may have the 'o' \param previousLetter: If provided, kerning is calculated for both
tucked neatly under the 'W'. letters and added to the global kerning value. For example, in a font
*/ which supports kerning pairs a string such as 'Wo' may have the 'o'
virtual s32 getKerningWidth(const wchar_t *thisLetter = 0, const wchar_t *previousLetter = 0) const = 0; tucked neatly under the 'W'.
*/
//! Returns the distance between letters virtual s32 getKerningWidth(const wchar_t* thisLetter=0, const wchar_t* previousLetter=0) const = 0;
virtual s32 getKerningHeight() const = 0;
//! Returns the distance between letters
//! Define which characters should not be drawn by the font. virtual s32 getKerningHeight() const = 0;
/** For example " " would not draw any space which is usually blank in
most fonts. //! Define which characters should not be drawn by the font.
\param s String of symbols which are not send down to the videodriver /** For example " " would not draw any space which is usually blank in
*/ most fonts.
virtual void setInvisibleCharacters(const wchar_t *s) = 0; \param s String of symbols which are not send down to the videodriver
}; */
virtual void setInvisibleCharacters( const wchar_t *s ) = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,41 +1,46 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IGUIFont.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
class IGUISpriteBank; {
class IGUISpriteBank;
//! Font interface.
class IGUIFontBitmap : public IGUIFont //! Font interface.
{ class IGUIFontBitmap : public IGUIFont
public: {
//! Returns the type of this font public:
EGUI_FONT_TYPE getType() const override { return EGFT_BITMAP; }
//! Returns the type of this font
//! returns the parsed Symbol Information EGUI_FONT_TYPE getType() const override { return EGFT_BITMAP; }
virtual IGUISpriteBank *getSpriteBank() const = 0;
//! returns the parsed Symbol Information
//! returns the sprite number from a given character virtual IGUISpriteBank* getSpriteBank() const = 0;
virtual u32 getSpriteNoFromChar(const wchar_t *c) const = 0;
//! returns the sprite number from a given character
//! Gets kerning values (distance between letters) for the font. If no parameters are provided, virtual u32 getSpriteNoFromChar(const wchar_t *c) const = 0;
/** the global kerning distance is returned.
\param thisLetter: If this parameter is provided, the left side kerning for this letter is added //! Gets kerning values (distance between letters) for the font. If no parameters are provided,
to the global kerning value. For example, a space might only be one pixel wide, but it may /** the global kerning distance is returned.
be displayed as several pixels. \param thisLetter: If this parameter is provided, the left side kerning for this letter is added
\param previousLetter: If provided, kerning is calculated for both letters and added to the global to the global kerning value. For example, a space might only be one pixel wide, but it may
kerning value. For example, EGFT_BITMAP will add the right kerning value of previousLetter to the be displayed as several pixels.
left side kerning value of thisLetter, then add the global value. \param previousLetter: If provided, kerning is calculated for both letters and added to the global
*/ kerning value. For example, EGFT_BITMAP will add the right kerning value of previousLetter to the
s32 getKerningWidth(const wchar_t *thisLetter = 0, const wchar_t *previousLetter = 0) const override = 0; left side kerning value of thisLetter, then add the global value.
}; */
s32 getKerningWidth(const wchar_t* thisLetter=0, const wchar_t* previousLetter=0) const override = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,82 +1,87 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IGUIElement.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
class ITexture; {
} class ITexture;
namespace gui }
{ namespace gui
//! GUI element displaying an image. {
class IGUIImage : public IGUIElement //! GUI element displaying an image.
{ class IGUIImage : public IGUIElement
public: {
//! constructor public:
IGUIImage(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_IMAGE, environment, parent, id, rectangle) {} //! constructor
IGUIImage(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! Sets an image texture : IGUIElement(EGUIET_IMAGE, environment, parent, id, rectangle) {}
virtual void setImage(video::ITexture *image) = 0;
//! Sets an image texture
//! Gets the image texture virtual void setImage(video::ITexture* image) = 0;
virtual video::ITexture *getImage() const = 0;
//! Gets the image texture
//! Sets the color of the image virtual video::ITexture* getImage() const = 0;
/** \param color Color with which the image is drawn. If the color
equals Color(255,255,255,255) it is ignored. */ //! Sets the color of the image
virtual void setColor(video::SColor color) = 0; /** \param color Color with which the image is drawn. If the color
equals Color(255,255,255,255) it is ignored. */
//! Sets if the image should scale to fit the element virtual void setColor(video::SColor color) = 0;
virtual void setScaleImage(bool scale) = 0;
//! Sets if the image should scale to fit the element
//! Sets if the image should use its alpha channel to draw itself virtual void setScaleImage(bool scale) = 0;
virtual void setUseAlphaChannel(bool use) = 0;
//! Sets if the image should use its alpha channel to draw itself
//! Gets the color of the image virtual void setUseAlphaChannel(bool use) = 0;
virtual video::SColor getColor() const = 0;
//! Gets the color of the image
//! Returns true if the image is scaled to fit, false if not virtual video::SColor getColor() const = 0;
virtual bool isImageScaled() const = 0;
//! Returns true if the image is scaled to fit, false if not
//! Returns true if the image is using the alpha channel, false if not virtual bool isImageScaled() const = 0;
virtual bool isAlphaChannelUsed() const = 0;
//! Returns true if the image is using the alpha channel, false if not
//! Sets the source rectangle of the image. By default the full image is used. virtual bool isAlphaChannelUsed() const = 0;
/** \param sourceRect coordinates inside the image or an area with size 0 for using the full image (default). */
virtual void setSourceRect(const core::rect<s32> &sourceRect) = 0; //! Sets the source rectangle of the image. By default the full image is used.
/** \param sourceRect coordinates inside the image or an area with size 0 for using the full image (default). */
//! Returns the customized source rectangle of the image to be used. virtual void setSourceRect(const core::rect<s32>& sourceRect) = 0;
/** By default an empty rectangle of width and height 0 is returned which means the full image is used. */
virtual core::rect<s32> getSourceRect() const = 0; //! Returns the customized source rectangle of the image to be used.
/** By default an empty rectangle of width and height 0 is returned which means the full image is used. */
//! Restrict drawing-area. virtual core::rect<s32> getSourceRect() const = 0;
/** This allows for example to use the image as a progress bar.
Base for area is the image, which means: //! Restrict drawing-area.
- The original clipping area when the texture is scaled or there is no texture. /** This allows for example to use the image as a progress bar.
- The source-rect for an unscaled texture (but still restricted afterward by the clipping area) Base for area is the image, which means:
Unlike normal clipping this does not affect the gui-children. - The original clipping area when the texture is scaled or there is no texture.
\param drawBoundUVs: Coordinates between 0 and 1 where 0 are for left+top and 1 for right+bottom - The source-rect for an unscaled texture (but still restricted afterward by the clipping area)
*/ Unlike normal clipping this does not affect the gui-children.
virtual void setDrawBounds(const core::rect<f32> &drawBoundUVs = core::rect<f32>(0.f, 0.f, 1.f, 1.f)) = 0; \param drawBoundUVs: Coordinates between 0 and 1 where 0 are for left+top and 1 for right+bottom
*/
//! Get drawing-area restrictions. virtual void setDrawBounds(const core::rect<f32>& drawBoundUVs = core::rect<f32>(0.f, 0.f, 1.f, 1.f)) = 0;
virtual core::rect<f32> getDrawBounds() const = 0;
//! Get drawing-area restrictions.
//! Sets whether to draw a background color (EGDC_3D_DARK_SHADOW) when no texture is set virtual core::rect<f32> getDrawBounds() const = 0;
/** By default it's enabled */
virtual void setDrawBackground(bool draw) = 0; //! Sets whether to draw a background color (EGDC_3D_DARK_SHADOW) when no texture is set
/** By default it's enabled */
//! Checks if a background is drawn when no texture is set virtual void setDrawBackground(bool draw) = 0;
/** \return true if background drawing is enabled, false otherwise */
virtual bool isDrawBackgroundEnabled() const = 0; //! Checks if a background is drawn when no texture is set
}; /** \return true if background drawing is enabled, false otherwise */
virtual bool isDrawBackgroundEnabled() const = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,40 +1,45 @@
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// written by Reinhard Ostermeier, reinhard@nospam.r-ostermeier.de // 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" #include "IGUIElement.h"
#include "irrTypes.h" #include "rect.h"
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
{
//! Font interface.
class IGUIImageList : public virtual IReferenceCounted //! Font interface.
{ class IGUIImageList : public virtual IReferenceCounted
public: {
//! Destructor public:
virtual ~IGUIImageList(){};
//! Destructor
//! Draws an image and clips it to the specified rectangle if wanted virtual ~IGUIImageList() {};
//! \param index: Index of the image
//! \param destPos: Position of the image to draw //! Draws an image and clips it to the specified rectangle if wanted
//! \param clip: Optional pointer to a rectangle against which the text will be clipped. //! \param index: Index of the image
//! If the pointer is null, no clipping will be done. //! \param destPos: Position of the image to draw
virtual void draw(s32 index, const core::position2d<s32> &destPos, //! \param clip: Optional pointer to a rectangle against which the text will be clipped.
const core::rect<s32> *clip = 0) = 0; //! If the pointer is null, no clipping will be done.
virtual void draw(s32 index, const core::position2d<s32>& destPos,
//! Returns the count of Images in the list. const core::rect<s32>* clip = 0) = 0;
//! \return Returns the count of Images in the list.
virtual s32 getImageCount() const = 0; //! Returns the count of Images in the list.
//! \return Returns the count of Images in the list.
//! Returns the size of the images in the list. virtual s32 getImageCount() const = 0;
//! \return Returns the size of the images in the list.
virtual core::dimension2d<s32> getImageSize() const = 0; //! Returns the size of the images in the list.
}; //! \return Returns the size of the images in the list.
virtual core::dimension2d<s32> getImageSize() const = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,136 +1,142 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IGUIElement.h"
#include "SColor.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
class IGUISpriteBank; {
class IGUIScrollBar; class IGUISpriteBank;
class IGUIScrollBar;
//! Enumeration for listbox colors
enum EGUI_LISTBOX_COLOR //! Enumeration for listbox colors
{ enum EGUI_LISTBOX_COLOR
//! Color of text {
EGUI_LBC_TEXT = 0, //! Color of text
//! Color of selected text EGUI_LBC_TEXT=0,
EGUI_LBC_TEXT_HIGHLIGHT, //! Color of selected text
//! Color of icon EGUI_LBC_TEXT_HIGHLIGHT,
EGUI_LBC_ICON, //! Color of icon
//! Color of selected icon EGUI_LBC_ICON,
EGUI_LBC_ICON_HIGHLIGHT, //! Color of selected icon
//! Not used, just counts the number of available colors EGUI_LBC_ICON_HIGHLIGHT,
EGUI_LBC_COUNT //! Not used, just counts the number of available colors
}; 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 //! Default list box GUI element.
\li EGET_LISTBOX_SELECTED_AGAIN /** \par This element can create the following events of type EGUI_EVENT_TYPE:
*/ \li EGET_LISTBOX_CHANGED
class IGUIListBox : public IGUIElement \li EGET_LISTBOX_SELECTED_AGAIN
{ */
public: class IGUIListBox : public IGUIElement
//! constructor {
IGUIListBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : public:
IGUIElement(EGUIET_LIST_BOX, environment, parent, id, rectangle) {} //! constructor
IGUIListBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! returns amount of list items : IGUIElement(EGUIET_LIST_BOX, environment, parent, id, rectangle) {}
virtual u32 getItemCount() const = 0;
//! returns amount of list items
//! returns string of a list item. the may id be a value from 0 to itemCount-1 virtual u32 getItemCount() const = 0;
virtual const wchar_t *getListItem(u32 id) const = 0;
//! returns string of a list item. the may id be a value from 0 to itemCount-1
//! adds an list item, returns id of item virtual const wchar_t* getListItem(u32 id) const = 0;
virtual u32 addItem(const wchar_t *text) = 0;
//! adds an list item, returns id of item
//! adds an list item with an icon virtual u32 addItem(const wchar_t* text) = 0;
/** \param text Text of list entry
\param icon Sprite index of the Icon within the current sprite bank. Set it to -1 if you want no icon //! adds an list item with an icon
\return The id of the new created item */ /** \param text Text of list entry
virtual u32 addItem(const wchar_t *text, s32 icon) = 0; \param icon Sprite index of the Icon within the current sprite bank. Set it to -1 if you want no icon
\return The id of the new created item */
//! Removes an item from the list virtual u32 addItem(const wchar_t* text, s32 icon) = 0;
virtual void removeItem(u32 index) = 0;
//! Removes an item from the list
//! get the the id of the item at the given absolute coordinates virtual void removeItem(u32 index) = 0;
/** \return The id of the list item or -1 when no item is at those coordinates*/
virtual s32 getItemAt(s32 xpos, s32 ypos) const = 0; //! get the the id of the item at the given absolute coordinates
/** \return The id of the list item or -1 when no item is at those coordinates*/
//! Returns the icon of an item virtual s32 getItemAt(s32 xpos, s32 ypos) const = 0;
virtual s32 getIcon(u32 index) const = 0;
//! Returns the icon of an item
//! Sets the sprite bank which should be used to draw list icons. virtual s32 getIcon(u32 index) const = 0;
/** This font is set to the sprite bank of the built-in-font by
default. A sprite can be displayed in front of every list item. //! Sets the sprite bank which should be used to draw list icons.
An icon is an index within the icon sprite bank. Several /** This font is set to the sprite bank of the built-in-font by
default icons are available in the skin through getIcon. */ default. A sprite can be displayed in front of every list item.
virtual void setSpriteBank(IGUISpriteBank *bank) = 0; An icon is an index within the icon sprite bank. Several
default icons are available in the skin through getIcon. */
//! clears the list, deletes all items in the listbox virtual void setSpriteBank(IGUISpriteBank* bank) = 0;
virtual void clear() = 0;
//! clears the list, deletes all items in the listbox
//! returns id of selected item. returns -1 if no item is selected. virtual void clear() = 0;
virtual s32 getSelected() const = 0;
//! returns id of selected item. returns -1 if no item is selected.
//! sets the selected item. Set this to -1 if no item should be selected virtual s32 getSelected() const = 0;
virtual void setSelected(s32 index) = 0;
//! sets the selected item. Set this to -1 if no item should be selected
//! sets the selected item. Set this to 0 if no item should be selected virtual void setSelected(s32 index) = 0;
virtual void setSelected(const wchar_t *item) = 0;
//! sets the selected item. Set this to 0 if no item should be selected
//! set whether the listbox should scroll to newly selected items virtual void setSelected(const wchar_t *item) = 0;
virtual void setAutoScrollEnabled(bool scroll) = 0;
//! set whether the listbox should scroll to newly selected items
//! returns true if automatic scrolling is enabled, false if not. virtual void setAutoScrollEnabled(bool scroll) = 0;
virtual bool isAutoScrollEnabled() const = 0;
//! returns true if automatic scrolling is enabled, false if not.
//! set all item colors at given index to color virtual bool isAutoScrollEnabled() const = 0;
virtual void setItemOverrideColor(u32 index, video::SColor color) = 0;
//! set all item colors at given index to color
//! set all item colors of specified type at given index to color virtual void setItemOverrideColor(u32 index, video::SColor color) = 0;
virtual void setItemOverrideColor(u32 index, EGUI_LISTBOX_COLOR colorType, video::SColor color) = 0;
//! set all item colors of specified type at given index to color
//! clear all item colors at index virtual void setItemOverrideColor(u32 index, EGUI_LISTBOX_COLOR colorType, video::SColor color) = 0;
virtual void clearItemOverrideColor(u32 index) = 0;
//! clear all item colors at index
//! clear item color at index for given colortype virtual void clearItemOverrideColor(u32 index) = 0;
virtual void clearItemOverrideColor(u32 index, EGUI_LISTBOX_COLOR colorType) = 0;
//! clear item color at index for given colortype
//! has the item at index its color overwritten? virtual void clearItemOverrideColor(u32 index, EGUI_LISTBOX_COLOR colorType) = 0;
virtual bool hasItemOverrideColor(u32 index, EGUI_LISTBOX_COLOR colorType) const = 0;
//! has the item at index its color overwritten?
//! return the overwrite color at given item index. virtual bool hasItemOverrideColor(u32 index, EGUI_LISTBOX_COLOR colorType) const = 0;
virtual video::SColor getItemOverrideColor(u32 index, EGUI_LISTBOX_COLOR colorType) const = 0;
//! return the overwrite color at given item index.
//! return the default color which is used for the given colorType virtual video::SColor getItemOverrideColor(u32 index, EGUI_LISTBOX_COLOR colorType) const = 0;
virtual video::SColor getItemDefaultColor(EGUI_LISTBOX_COLOR colorType) const = 0;
//! return the default color which is used for the given colorType
//! set the item at the given index virtual video::SColor getItemDefaultColor(EGUI_LISTBOX_COLOR colorType) const = 0;
virtual void setItem(u32 index, const wchar_t *text, s32 icon) = 0;
//! set the item at the given index
//! Insert the item at the given index virtual void setItem(u32 index, const wchar_t* text, s32 icon) = 0;
/** \return The index on success or -1 on failure. */
virtual s32 insertItem(u32 index, const wchar_t *text, s32 icon) = 0; //! Insert the item at the given index
/** \return The index on success or -1 on failure. */
//! Swap the items at the given indices virtual s32 insertItem(u32 index, const wchar_t* text, s32 icon) = 0;
virtual void swapItems(u32 index1, u32 index2) = 0;
//! Swap the items at the given indices
//! set global itemHeight virtual void swapItems(u32 index1, u32 index2) = 0;
virtual void setItemHeight(s32 height) = 0;
//! set global itemHeight
//! Sets whether to draw the background virtual void setItemHeight( s32 height ) = 0;
virtual void setDrawBackground(bool draw) = 0;
//! Sets whether to draw the background
//! Access the vertical scrollbar virtual void setDrawBackground(bool draw) = 0;
virtual IGUIScrollBar *getVerticalScrollBar() const = 0;
}; //! Access the vertical scrollbar
virtual IGUIScrollBar* getVerticalScrollBar() const = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,59 +1,65 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IGUIElement.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
{
//! Default scroll bar GUI element.
/** \par This element can create the following events of type EGUI_EVENT_TYPE: //! Default scroll bar GUI element.
\li EGET_SCROLL_BAR_CHANGED /** \par This element can create the following events of type EGUI_EVENT_TYPE:
*/ \li EGET_SCROLL_BAR_CHANGED
class IGUIScrollBar : public IGUIElement */
{ class IGUIScrollBar : public IGUIElement
public: {
//! constructor public:
IGUIScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_SCROLL_BAR, environment, parent, id, rectangle) {} //! constructor
IGUIScrollBar(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! sets the maximum value of the scrollbar. : IGUIElement(EGUIET_SCROLL_BAR, environment, parent, id, rectangle) {}
virtual void setMax(s32 max) = 0;
//! gets the maximum value of the scrollbar. //! sets the maximum value of the scrollbar.
virtual s32 getMax() const = 0; virtual void setMax(s32 max) = 0;
//! gets the maximum value of the scrollbar.
//! sets the minimum value of the scrollbar. virtual s32 getMax() const = 0;
virtual void setMin(s32 min) = 0;
//! gets the minimum value of the scrollbar. //! sets the minimum value of the scrollbar.
virtual s32 getMin() const = 0; virtual void setMin(s32 min) = 0;
//! gets the minimum value of the scrollbar.
//! gets the small step value virtual s32 getMin() const = 0;
virtual s32 getSmallStep() const = 0;
//! gets the small step value
//! Sets the small step virtual s32 getSmallStep() const = 0;
/** That is the amount that the value changes by when clicking
on the buttons or using the cursor keys. */ //! Sets the small step
virtual void setSmallStep(s32 step) = 0; /** That is the amount that the value changes by when clicking
on the buttons or using the cursor keys. */
//! gets the large step value virtual void setSmallStep(s32 step) = 0;
virtual s32 getLargeStep() const = 0;
//! gets the large step value
//! Sets the large step virtual s32 getLargeStep() const = 0;
/** That is the amount that the value changes by when clicking
in the tray, or using the page up and page down keys. */ //! Sets the large step
virtual void setLargeStep(s32 step) = 0; /** That is the amount that the value changes by when clicking
in the tray, or using the page up and page down keys. */
//! gets the current position of the scrollbar virtual void setLargeStep(s32 step) = 0;
virtual s32 getPos() const = 0;
//! gets the current position of the scrollbar
//! sets the current position of the scrollbar virtual s32 getPos() const = 0;
virtual void setPos(s32 pos) = 0;
}; //! sets the current position of the scrollbar
virtual void setPos(s32 pos) = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,138 +1,142 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "SColor.h" #include "irrArray.h"
#include "rect.h" #include "SColor.h"
#include "rect.h"
namespace irr
{ namespace irr
{
namespace video
{ namespace video
class ITexture; {
} // end namespace video class ITexture;
} // end namespace video
namespace gui
{ namespace gui
{
//! A single sprite frame.
// Note for implementer: Can't fix variable names to uppercase as this is a public interface used since a while //! A single sprite frame.
struct SGUISpriteFrame // 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) : SGUISpriteFrame(u32 textureIndex, u32 positionIndex)
textureNumber(textureIndex), rectNumber(positionIndex) : textureNumber(textureIndex), rectNumber(positionIndex)
{ {
} }
//! Texture index in IGUISpriteBank //! Texture index in IGUISpriteBank
u32 textureNumber; u32 textureNumber;
//! Index in IGUISpriteBank::getPositions() //! Index in IGUISpriteBank::getPositions()
u32 rectNumber; u32 rectNumber;
}; };
//! A sprite composed of several frames. //! A sprite composed of several frames.
// Note for implementer: Can't fix variable names to uppercase as this is a public interface used since a while // Note for implementer: Can't fix variable names to uppercase as this is a public interface used since a while
struct SGUISprite struct SGUISprite
{ {
SGUISprite() : SGUISprite() : frameTime(0) {}
frameTime(0) {} SGUISprite(const SGUISpriteFrame& firstFrame) : frameTime(0)
SGUISprite(const SGUISpriteFrame &firstFrame) : {
frameTime(0) Frames.push_back(firstFrame);
{ }
Frames.push_back(firstFrame);
} core::array<SGUISpriteFrame> Frames;
u32 frameTime;
core::array<SGUISpriteFrame> Frames; };
u32 frameTime;
};
//! Sprite bank interface.
//! Sprite bank interface. /** See http://http://irrlicht.sourceforge.net/forum//viewtopic.php?f=9&t=25742
/** See http://http://irrlicht.sourceforge.net/forum//viewtopic.php?f=9&t=25742 * for more information how to use the spritebank.
* for more information how to use the spritebank. */
*/ class IGUISpriteBank : public virtual IReferenceCounted
class IGUISpriteBank : public virtual IReferenceCounted {
{ public:
public:
//! Returns the list of rectangles held by the sprite bank //! Returns the list of rectangles held by the sprite bank
virtual core::array<core::rect<s32>> &getPositions() = 0; virtual core::array< core::rect<s32> >& getPositions() = 0;
//! Returns the array of animated sprites within the sprite bank //! Returns the array of animated sprites within the sprite bank
virtual core::array<SGUISprite> &getSprites() = 0; virtual core::array< SGUISprite >& getSprites() = 0;
//! Returns the number of textures held by the sprite bank //! Returns the number of textures held by the sprite bank
virtual u32 getTextureCount() const = 0; virtual u32 getTextureCount() const = 0;
//! Gets the texture with the specified index //! Gets the texture with the specified index
virtual video::ITexture *getTexture(u32 index) const = 0; virtual video::ITexture* getTexture(u32 index) const = 0;
//! Adds a texture to the sprite bank //! Adds a texture to the sprite bank
virtual void addTexture(video::ITexture *texture) = 0; virtual void addTexture(video::ITexture* texture) = 0;
//! Changes one of the textures in the sprite bank //! Changes one of the textures in the sprite bank
virtual void setTexture(u32 index, video::ITexture *texture) = 0; virtual void setTexture(u32 index, video::ITexture* texture) = 0;
//! Add the texture and use it for a single non-animated sprite. //! Add the texture and use it for a single non-animated sprite.
/** The texture and the corresponding rectangle and sprite will all be added to the end of each array. /** The texture and the corresponding rectangle and sprite will all be added to the end of each array.
\returns The index of the sprite or -1 on failure */ \returns The index of the sprite or -1 on failure */
virtual s32 addTextureAsSprite(video::ITexture *texture) = 0; virtual s32 addTextureAsSprite(video::ITexture* texture) = 0;
//! Clears sprites, rectangles and textures //! Clears sprites, rectangles and textures
virtual void clear() = 0; virtual void clear() = 0;
//! Draws a sprite in 2d with position and color //! Draws a sprite in 2d with position and color
/** /**
\param index Index of SGUISprite to draw \param index Index of SGUISprite to draw
\param pos Target position - depending on center value either the left-top or the sprite center is used as pivot \param pos Target position - depending on center value either the left-top or the sprite center is used as pivot
\param clip Clipping rectangle, can be 0 when clipping is not wanted. \param clip Clipping rectangle, can be 0 when clipping is not wanted.
\param color Color with which the image is drawn. \param color Color with which the image is drawn.
Note that the alpha component is used. If alpha is other than Note that the alpha component is used. If alpha is other than
255, the image will be transparent. 255, the image will be transparent.
\param starttime Tick when the first frame was drawn (only difference currenttime-starttime matters). \param starttime Tick when the first frame was drawn (only difference currenttime-starttime matters).
\param currenttime To calculate the frame of animated sprites \param currenttime To calculate the frame of animated sprites
\param loop When true animations are looped \param loop When true animations are looped
\param center When true pivot is set to the sprite-center. So it affects pos. \param center When true pivot is set to the sprite-center. So it affects pos.
*/ */
virtual void draw2DSprite(u32 index, const core::position2di &pos, virtual void draw2DSprite(u32 index, const core::position2di& pos,
const core::rect<s32> *clip = 0, const core::rect<s32>* clip=0,
const video::SColor &color = video::SColor(255, 255, 255, 255), const video::SColor& color= video::SColor(255,255,255,255),
u32 starttime = 0, u32 currenttime = 0, u32 starttime=0, u32 currenttime=0,
bool loop = true, bool center = false) = 0; bool loop=true, bool center=false) = 0;
//! Draws a sprite in 2d with destination rectangle and colors //! Draws a sprite in 2d with destination rectangle and colors
/** /**
\param index Index of SGUISprite to draw \param index Index of SGUISprite to draw
\param destRect The sprite will be scaled to fit this target rectangle \param destRect The sprite will be scaled to fit this target rectangle
\param clip Clipping rectangle, can be 0 when clipping is not wanted. \param clip Clipping rectangle, can be 0 when clipping is not wanted.
\param colors Array of 4 colors denoting the color values of \param colors Array of 4 colors denoting the color values of
the corners of the destRect the corners of the destRect
\param timeTicks Current frame for animated sprites \param timeTicks Current frame for animated sprites
(same as currenttime-starttime in other draw2DSprite function) (same as currenttime-starttime in other draw2DSprite function)
\param loop When true animations are looped \param loop When true animations are looped
*/ */
virtual void draw2DSprite(u32 index, const core::rect<s32> &destRect, virtual void draw2DSprite(u32 index, const core::rect<s32>& destRect,
const core::rect<s32> *clip = 0, const core::rect<s32>* clip=0,
const video::SColor *const colors = 0, const video::SColor * const colors=0,
u32 timeTicks = 0, u32 timeTicks = 0,
bool loop = true) = 0; bool loop=true) = 0;
//! Draws a sprite batch in 2d using an array of positions and a color //! Draws a sprite batch in 2d using an array of positions and a color
virtual void draw2DSpriteBatch(const core::array<u32> &indices, const core::array<core::position2di> &pos, virtual void draw2DSpriteBatch(const core::array<u32>& indices, const core::array<core::position2di>& pos,
const core::rect<s32> *clip = 0, const core::rect<s32>* clip=0,
const video::SColor &color = video::SColor(255, 255, 255, 255), const video::SColor& color= video::SColor(255,255,255,255),
u32 starttime = 0, u32 currenttime = 0, u32 starttime=0, u32 currenttime=0,
bool loop = true, bool center = false) = 0; bool loop=true, bool center=false) = 0;
}; };
} // end namespace gui
} // end namespace irr } // end namespace gui
} // end namespace irr
#endif // __I_GUI_SPRITE_BANK_H_INCLUDED__

View File

@ -1,133 +1,139 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IGUIElement.h"
#include "SColor.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
class IGUIFont; {
class IGUIFont;
//! Multi or single line text label.
class IGUIStaticText : public IGUIElement //! Multi or single line text label.
{ class IGUIStaticText : public IGUIElement
public: {
//! constructor public:
IGUIStaticText(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_STATIC_TEXT, environment, parent, id, rectangle) {} //! constructor
IGUIStaticText(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! Sets another skin independent font. : IGUIElement(EGUIET_STATIC_TEXT, environment, parent, id, rectangle) {}
/** If this is set to zero, the button uses the font of the skin.
\param font: New font to set. */ //! Sets another skin independent font.
virtual void setOverrideFont(IGUIFont *font = 0) = 0; /** If this is set to zero, the button uses the font of the skin.
\param font: New font to set. */
//! Gets the override font (if any) virtual void setOverrideFont(IGUIFont* font=0) = 0;
/** \return The override font (may be 0) */
virtual IGUIFont *getOverrideFont(void) const = 0; //! Gets the override font (if any)
/** \return The override font (may be 0) */
//! Get the font which is used right now for drawing virtual IGUIFont* getOverrideFont(void) const = 0;
/** Currently this is the override font when one is set and the
font of the active skin otherwise */ //! Get the font which is used right now for drawing
virtual IGUIFont *getActiveFont() const = 0; /** Currently this is the override font when one is set and the
font of the active skin otherwise */
//! Sets another color for the text. virtual IGUIFont* getActiveFont() const = 0;
/** If set, the static text does not use the EGDC_BUTTON_TEXT color defined
in the skin, but the set color instead. You don't need to call //! Sets another color for the text.
IGUIStaticText::enableOverrrideColor(true) after this, this is done /** If set, the static text does not use the EGDC_BUTTON_TEXT color defined
by this function. in the skin, but the set color instead. You don't need to call
If you set a color, and you want the text displayed with the color IGUIStaticText::enableOverrrideColor(true) after this, this is done
of the skin again, call IGUIStaticText::enableOverrideColor(false); by this function.
\param color: New color of the text. */ If you set a color, and you want the text displayed with the color
virtual void setOverrideColor(video::SColor color) = 0; of the skin again, call IGUIStaticText::enableOverrideColor(false);
\param color: New color of the text. */
//! Gets the override color virtual void setOverrideColor(video::SColor color) = 0;
/** \return: The override color */
virtual video::SColor getOverrideColor(void) const = 0; //! Gets the override color
/** \return: The override color */
//! Gets the currently used text color virtual video::SColor getOverrideColor(void) const = 0;
/** Either a skin-color for the current state or the override color */
virtual video::SColor getActiveColor() const = 0; //! Gets the currently used text color
/** Either a skin-color for the current state or the override color */
//! Sets if the static text should use the override color or the color in the gui skin. virtual video::SColor getActiveColor() const = 0;
/** \param enable: If set to true, the override color, which can be set
with IGUIStaticText::setOverrideColor is used, otherwise the //! Sets if the static text should use the override color or the color in the gui skin.
EGDC_BUTTON_TEXT color of the skin. */ /** \param enable: If set to true, the override color, which can be set
virtual void enableOverrideColor(bool enable) = 0; with IGUIStaticText::setOverrideColor is used, otherwise the
EGDC_BUTTON_TEXT color of the skin. */
//! Checks if an override color is enabled virtual void enableOverrideColor(bool enable) = 0;
/** \return true if the override color is enabled, false otherwise */
virtual bool isOverrideColorEnabled(void) const = 0; //! Checks if an override color is enabled
/** \return true if the override color is enabled, false otherwise */
//! Sets another color for the background. virtual bool isOverrideColorEnabled(void) const = 0;
virtual void setBackgroundColor(video::SColor color) = 0;
//! Sets another color for the background.
//! Sets whether to draw the background virtual void setBackgroundColor(video::SColor color) = 0;
virtual void setDrawBackground(bool draw) = 0;
//! Sets whether to draw the background
//! Checks if background drawing is enabled virtual void setDrawBackground(bool draw) = 0;
/** \return true if background drawing is enabled, false otherwise */
virtual bool isDrawBackgroundEnabled() const = 0; //! Checks if background drawing is enabled
/** \return true if background drawing is enabled, false otherwise */
//! Gets the background color virtual bool isDrawBackgroundEnabled() const = 0;
/** \return: The background color */
virtual video::SColor getBackgroundColor() const = 0; //! Gets the background color
/** \return: The background color */
//! Sets whether to draw the border virtual video::SColor getBackgroundColor() const = 0;
virtual void setDrawBorder(bool draw) = 0;
//! Sets whether to draw the border
//! Checks if border drawing is enabled virtual void setDrawBorder(bool draw) = 0;
/** \return true if border drawing is enabled, false otherwise */
virtual bool isDrawBorderEnabled() const = 0; //! Checks if border drawing is enabled
/** \return true if border drawing is enabled, false otherwise */
//! Sets text justification mode virtual bool isDrawBorderEnabled() const = 0;
/** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text. //! Sets text justification mode
\param vertical: EGUIA_UPPERLEFT to align with top edge (default), /** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text. */ EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text.
virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0; \param vertical: EGUIA_UPPERLEFT to align with top edge (default),
EGUIA_LOWERRIGHT for bottom edge, or EGUIA_CENTER for centered text. */
//! Enables or disables word wrap for using the static text as multiline text control. virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) = 0;
/** \param enable: If set to true, words going over one line are
broken on to the next line. */ //! Enables or disables word wrap for using the static text as multiline text control.
virtual void setWordWrap(bool enable) = 0; /** \param enable: If set to true, words going over one line are
broken on to the next line. */
//! Checks if word wrap is enabled virtual void setWordWrap(bool enable) = 0;
/** \return true if word wrap is enabled, false otherwise */
virtual bool isWordWrapEnabled(void) const = 0; //! Checks if word wrap is enabled
/** \return true if word wrap is enabled, false otherwise */
//! Returns the height of the text in pixels when it is drawn. virtual bool isWordWrapEnabled(void) const = 0;
/** This is useful for adjusting the layout of gui elements based on the height
of the multiline text in this element. //! Returns the height of the text in pixels when it is drawn.
\return Height of text in pixels. */ /** This is useful for adjusting the layout of gui elements based on the height
virtual s32 getTextHeight() const = 0; of the multiline text in this element.
\return Height of text in pixels. */
//! Returns the width of the current text, in the current font virtual s32 getTextHeight() const = 0;
/** If the text is broken, this returns the width of the widest line
\return The width of the text, or the widest broken line. */ //! Returns the width of the current text, in the current font
virtual s32 getTextWidth(void) const = 0; /** If the text is broken, this returns the width of the widest line
\return The width of the text, or the widest broken line. */
//! Set whether the text in this label should be clipped if it goes outside bounds virtual s32 getTextWidth(void) const = 0;
virtual void setTextRestrainedInside(bool restrainedInside) = 0;
//! Set whether the text in this label should be clipped if it goes outside bounds
//! Checks if the text in this label should be clipped if it goes outside bounds virtual void setTextRestrainedInside(bool restrainedInside) = 0;
virtual bool isTextRestrainedInside() const = 0;
//! Checks if the text in this label should be clipped if it goes outside bounds
//! Set whether the string should be interpreted as right-to-left (RTL) text virtual bool isTextRestrainedInside() const = 0;
/** \note This component does not implement the Unicode bidi standard, the
text of the component should be already RTL if you call this. The //! Set whether the string should be interpreted as right-to-left (RTL) text
main difference when RTL is enabled is that the linebreaks for multiline /** \note This component does not implement the Unicode bidi standard, the
elements are performed starting from the end. text of the component should be already RTL if you call this. The
*/ main difference when RTL is enabled is that the linebreaks for multiline
virtual void setRightToLeft(bool rtl) = 0; elements are performed starting from the end.
*/
//! Checks whether the text in this element should be interpreted as right-to-left virtual void setRightToLeft(bool rtl) = 0;
virtual bool isRightToLeft() const = 0;
}; //! Checks whether the text in this element should be interpreted as right-to-left
virtual bool isRightToLeft() const = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,149 +1,155 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IGUIElement.h"
#include "IGUISkin.h" #include "SColor.h"
#include "IGUISkin.h"
namespace irr
{ namespace irr
namespace gui {
{ namespace gui
class IGUITab; {
class IGUITab;
//! A standard tab control
/** \par This element can create the following events of type EGUI_EVENT_TYPE: //! A standard tab control
\li EGET_TAB_CHANGED /** \par This element can create the following events of type EGUI_EVENT_TYPE:
*/ \li EGET_TAB_CHANGED
class IGUITabControl : public IGUIElement */
{ class IGUITabControl : public IGUIElement
public: {
//! constructor public:
IGUITabControl(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_TAB_CONTROL, environment, parent, id, rectangle) {} //! constructor
IGUITabControl(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! Adds a tab : IGUIElement(EGUIET_TAB_CONTROL, environment, parent, id, rectangle) {}
virtual IGUITab *addTab(const wchar_t *caption, s32 id = -1) = 0;
//! Adds a tab
//! Adds an existing tab virtual IGUITab* addTab(const wchar_t* caption, s32 id=-1) = 0;
/** Note that it will also add the tab as a child of this TabControl.
\return Index of added tab or -1 for failure*/ //! Adds an existing tab
virtual s32 addTab(IGUITab *tab) = 0; /** Note that it will also add the tab as a child of this TabControl.
\return Index of added tab or -1 for failure*/
//! Insert the tab at the given index virtual s32 addTab(IGUITab* tab) = 0;
/** \return The tab on success or NULL on failure. */
virtual IGUITab *insertTab(s32 idx, const wchar_t *caption, s32 id = -1) = 0; //! Insert the tab at the given index
/** \return The tab on success or NULL on failure. */
//! Insert an existing tab virtual IGUITab* insertTab(s32 idx, const wchar_t* caption, s32 id=-1) = 0;
/** Note that it will also add the tab as a child of this TabControl.
\param idx Index at which tab will be inserted. Later tabs will be moved. //! Insert an existing tab
Previous active tab will stay active unless this is the first /** Note that it will also add the tab as a child of this TabControl.
element to be inserted in which case it becomes active. \param idx Index at which tab will be inserted. Later tabs will be moved.
\param tab New tab to insert. Previous active tab will stay active unless this is the first
\param serializationMode Internally used for serialization. You should not need this. element to be inserted in which case it becomes active.
When true it reserves space for the index, doesn't move but replaces tabs \param tab New tab to insert.
and it doesn't change the active tab. \param serializationMode Internally used for serialization. You should not need this.
\return Index of added tab (should be same as the one passed) or -1 for failure*/ When true it reserves space for the index, doesn't move but replaces tabs
virtual s32 insertTab(s32 idx, IGUITab *tab, bool serializationMode = false) = 0; and it doesn't change the active tab.
\return Index of added tab (should be same as the one passed) or -1 for failure*/
//! Removes a tab from the tabcontrol virtual s32 insertTab(s32 idx, IGUITab* tab, bool serializationMode=false) = 0;
virtual void removeTab(s32 idx) = 0;
//! Removes a tab from the tabcontrol
//! Clears the tabcontrol removing all tabs virtual void removeTab(s32 idx) = 0;
virtual void clear() = 0;
//! Clears the tabcontrol removing all tabs
//! Returns amount of tabs in the tabcontrol virtual void clear() = 0;
virtual s32 getTabCount() const = 0;
//! Returns amount of tabs in the tabcontrol
//! Returns a tab based on zero based index virtual s32 getTabCount() const = 0;
/** \param idx: zero based index of tab. Is a value between 0 and getTabcount()-1;
\return Returns pointer to the Tab. Returns 0 if no tab //! Returns a tab based on zero based index
is corresponding to this tab. */ /** \param idx: zero based index of tab. Is a value between 0 and getTabcount()-1;
virtual IGUITab *getTab(s32 idx) const = 0; \return Returns pointer to the Tab. Returns 0 if no tab
is corresponding to this tab. */
//! For given element find if it's a tab and return it's zero-based index (or -1 for not found) virtual IGUITab* getTab(s32 idx) const = 0;
/** \param tab Tab for which we are looking (usually you will look for an IGUITab* type as only
those can be tabs, but we allow looking for any kind of IGUIElement* as there are some //! For given element find if it's a tab and return it's zero-based index (or -1 for not found)
use-cases for that even if it just returns 0. For example this way you can check for /** \param tab Tab for which we are looking (usually you will look for an IGUITab* type as only
all children of this gui-element if they are tabs or some non-tab children.*/ those can be tabs, but we allow looking for any kind of IGUIElement* as there are some
virtual s32 getTabIndex(const IGUIElement *tab) const = 0; use-cases for that even if it just returns 0. For example this way you can check for
all children of this gui-element if they are tabs or some non-tab children.*/
//! Brings a tab to front. virtual s32 getTabIndex(const IGUIElement *tab) const = 0;
/** \param idx: number of the tab.
\return Returns true if successful. */ //! Brings a tab to front.
virtual bool setActiveTab(s32 idx) = 0; /** \param idx: number of the tab.
\return Returns true if successful. */
//! Brings a tab to front. virtual bool setActiveTab(s32 idx) = 0;
/** \param tab: pointer to the tab.
\return Returns true if successful. */ //! Brings a tab to front.
virtual bool setActiveTab(IGUITab *tab) = 0; /** \param tab: pointer to the tab.
\return Returns true if successful. */
//! Returns which tab is currently active virtual bool setActiveTab(IGUITab *tab) = 0;
virtual s32 getActiveTab() const = 0;
//! Returns which tab is currently active
//! get the the id of the tab at the given absolute coordinates virtual s32 getActiveTab() const = 0;
/** \return The id of the tab or -1 when no tab is at those coordinates*/
virtual s32 getTabAt(s32 xpos, s32 ypos) const = 0; //! get the the id of the tab at the given absolute coordinates
/** \return The id of the tab or -1 when no tab is at those coordinates*/
//! Set the height of the tabs virtual s32 getTabAt(s32 xpos, s32 ypos) const = 0;
virtual void setTabHeight(s32 height) = 0;
//! Set the height of the tabs
//! Get the height of the tabs virtual void setTabHeight( s32 height ) = 0;
/** return Returns the height of the tabs */
virtual s32 getTabHeight() const = 0; //! Get the height of the tabs
/** return Returns the height of the tabs */
//! set the maximal width of a tab. Per default width is 0 which means "no width restriction". virtual s32 getTabHeight() const = 0;
virtual void setTabMaxWidth(s32 width) = 0;
//! set the maximal width of a tab. Per default width is 0 which means "no width restriction".
//! get the maximal width of a tab virtual void setTabMaxWidth(s32 width ) = 0;
virtual s32 getTabMaxWidth() const = 0;
//! get the maximal width of a tab
//! Set the alignment of the tabs virtual s32 getTabMaxWidth() const = 0;
/** Use EGUIA_UPPERLEFT or EGUIA_LOWERRIGHT */
virtual void setTabVerticalAlignment(gui::EGUI_ALIGNMENT alignment) = 0; //! Set the alignment of the tabs
/** Use EGUIA_UPPERLEFT or EGUIA_LOWERRIGHT */
//! Get the alignment of the tabs virtual void setTabVerticalAlignment( gui::EGUI_ALIGNMENT alignment ) = 0;
/** return Returns the alignment of the tabs */
virtual gui::EGUI_ALIGNMENT getTabVerticalAlignment() const = 0; //! Get the alignment of the tabs
/** return Returns the alignment of the tabs */
//! Set the extra width added to tabs on each side of the text virtual gui::EGUI_ALIGNMENT getTabVerticalAlignment() const = 0;
virtual void setTabExtraWidth(s32 extraWidth) = 0;
//! Set the extra width added to tabs on each side of the text
//! Get the extra width added to tabs on each side of the text virtual void setTabExtraWidth( s32 extraWidth ) = 0;
/** return Returns the extra width of the tabs */
virtual s32 getTabExtraWidth() const = 0; //! Get the extra width added to tabs on each side of the text
}; /** return Returns the extra width of the tabs */
virtual s32 getTabExtraWidth() const = 0;
//! A tab-page, onto which other gui elements could be added. };
/** IGUITab refers mostly to the page itself, but also carries some data about the tab in the tabbar of an IGUITabControl. */
class IGUITab : public IGUIElement //! A tab-page, onto which other gui elements could be added.
{ /** IGUITab refers mostly to the page itself, but also carries some data about the tab in the tabbar of an IGUITabControl. */
public: class IGUITab : public IGUIElement
//! constructor {
IGUITab(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : public:
IGUIElement(EGUIET_TAB, environment, parent, id, rectangle) {}
//! constructor
//! sets if the tab should draw its background IGUITab(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
virtual void setDrawBackground(bool draw = true) = 0; : IGUIElement(EGUIET_TAB, environment, parent, id, rectangle) {}
//! sets the color of the background, if it should be drawn. //! sets if the tab should draw its background
virtual void setBackgroundColor(video::SColor c) = 0; virtual void setDrawBackground(bool draw=true) = 0;
//! returns true if the tab is drawing its background, false if not //! sets the color of the background, if it should be drawn.
virtual bool isDrawingBackground() const = 0; virtual void setBackgroundColor(video::SColor c) = 0;
//! returns the color of the background //! returns true if the tab is drawing its background, false if not
virtual video::SColor getBackgroundColor() const = 0; virtual bool isDrawingBackground() const = 0;
//! sets the color of it's text in the tab-bar //! returns the color of the background
virtual void setTextColor(video::SColor c) = 0; virtual video::SColor getBackgroundColor() const = 0;
//! gets the color of the text //! sets the color of it's text in the tab-bar
virtual video::SColor getTextColor() const = 0; virtual void setTextColor(video::SColor c) = 0;
};
//! gets the color of the text
} // end namespace gui virtual video::SColor getTextColor() const = 0;
} // end namespace irr };
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,34 +1,40 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IGUIElement.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
class ITexture; {
} // end namespace video class ITexture;
namespace gui } // end namespace video
{ namespace gui
class IGUIButton; {
class IGUIButton;
//! Stays at the top of its parent like the menu bar and contains tool buttons
class IGUIToolBar : public IGUIElement //! Stays at the top of its parent like the menu bar and contains tool buttons
{ class IGUIToolBar : public IGUIElement
public: {
//! constructor public:
IGUIToolBar(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_TOOL_BAR, environment, parent, id, rectangle) {} //! constructor
IGUIToolBar(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
//! Adds a button to the tool bar : IGUIElement(EGUIET_TOOL_BAR, environment, parent, id, rectangle) {}
virtual IGUIButton *addButton(s32 id = -1, const wchar_t *text = 0, const wchar_t *tooltiptext = 0,
video::ITexture *img = 0, video::ITexture *pressedimg = 0, //! Adds a button to the tool bar
bool isPushButton = false, bool useAlphaChannel = false) = 0; virtual IGUIButton* addButton(s32 id=-1, const wchar_t* text=0,const wchar_t* tooltiptext=0,
}; video::ITexture* img=0, video::ITexture* pressedimg=0,
bool isPushButton=false, bool useAlphaChannel=false) = 0;
} // end namespace gui };
} // end namespace irr
} // end namespace gui
} // end namespace irr
#endif

View File

@ -1,424 +1,565 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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 "IReferenceCounted.h"
#include "rect.h" #include "position2d.h"
#include "SColor.h" #include "rect.h"
#include <cstring> #include "SColor.h"
#include <string.h>
namespace irr
{ namespace irr
namespace video {
{ namespace video
{
//! Interface for software image data.
/** Image loaders create these images from files. IVideoDrivers convert //! Interface for software image data.
these images into their (hardware) textures. /** Image loaders create these images from files. IVideoDrivers convert
NOTE: Floating point formats are not well supported yet. Basically only getData() works for them. these images into their (hardware) textures.
*/ NOTE: Floating point formats are not well supported yet. Basically only getData() works for them.
class IImage : public virtual IReferenceCounted */
{ class IImage : public virtual IReferenceCounted
public: {
//! constructor public:
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) //! constructor
{ IImage(ECOLOR_FORMAT format, const core::dimension2d<u32>& size, bool deleteMemory) :
BytesPerPixel = getBitsPerPixelFromFormat(Format) / 8; Format(format), Size(size), Data(0), MipMapsData(0), BytesPerPixel(0), Pitch(0), DeleteMemory(deleteMemory), DeleteMipMapsMemory(false)
Pitch = BytesPerPixel * Size.Width; #if defined(IRRLICHT_sRGB)
} ,Format_sRGB(1)
#endif
//! destructor {
virtual ~IImage() BytesPerPixel = getBitsPerPixelFromFormat(Format) / 8;
{ Pitch = BytesPerPixel * Size.Width;
if (DeleteMemory) }
delete[] Data;
//! destructor
if (DeleteMipMapsMemory) virtual ~IImage()
delete[] MipMapsData; {
} if (DeleteMemory)
delete[] Data;
//! Returns the color format
ECOLOR_FORMAT getColorFormat() const if (DeleteMipMapsMemory)
{ delete[] MipMapsData;
return Format; }
}
//! Returns the color format
//! Returns width and height of image data. ECOLOR_FORMAT getColorFormat() const
const core::dimension2d<u32> &getDimension() const {
{ return Format;
return Size; }
}
#if defined(IRRLICHT_sRGB)
//! Returns bits per pixel. //! Texture is linear/sRGB (should be part of ColorFormat: default yes)
u32 getBitsPerPixel() const int get_sRGB() const
{ {
return Format_sRGB;
return getBitsPerPixelFromFormat(Format); }
} void set_sRGB(int val)
{
//! Returns bytes per pixel Format_sRGB = val;
u32 getBytesPerPixel() const }
{ #endif
return BytesPerPixel;
} //! Returns width and height of image data.
const core::dimension2d<u32>& getDimension() const
//! Returns image data size in bytes {
u32 getImageDataSizeInBytes() const return Size;
{ }
return getDataSizeFromFormat(Format, Size.Width, Size.Height);
} //! Returns bits per pixel.
u32 getBitsPerPixel() const
//! Returns image data size in pixels {
u32 getImageDataSizeInPixels() const
{ return getBitsPerPixelFromFormat(Format);
return Size.Width * Size.Height; }
}
//! Returns bytes per pixel
//! Returns pitch of image u32 getBytesPerPixel() const
u32 getPitch() const {
{ return BytesPerPixel;
return Pitch; }
}
//! Returns image data size in bytes
//! Returns mask for red value of a pixel u32 getImageDataSizeInBytes() const
u32 getRedMask() const {
{ return getDataSizeFromFormat(Format, Size.Width, Size.Height);
switch (Format) { }
case ECF_A1R5G5B5:
return 0x1F << 10; //! Returns image data size in pixels
case ECF_R5G6B5: u32 getImageDataSizeInPixels() const
return 0x1F << 11; {
case ECF_R8G8B8: return Size.Width * Size.Height;
return 0x00FF0000; }
case ECF_A8R8G8B8:
return 0x00FF0000; //! Returns pitch of image
default: u32 getPitch() const
return 0x0; {
} return Pitch;
} }
//! Returns mask for green value of a pixel //! Returns mask for red value of a pixel
u32 getGreenMask() const u32 getRedMask() const
{ {
switch (Format) { switch (Format)
case ECF_A1R5G5B5: {
return 0x1F << 5; case ECF_A1R5G5B5:
case ECF_R5G6B5: return 0x1F << 10;
return 0x3F << 5; case ECF_R5G6B5:
case ECF_R8G8B8: return 0x1F << 11;
return 0x0000FF00; case ECF_R8G8B8:
case ECF_A8R8G8B8: return 0x00FF0000;
return 0x0000FF00; case ECF_A8R8G8B8:
default: return 0x00FF0000;
return 0x0; default:
} return 0x0;
} }
}
//! Returns mask for blue value of a pixel
u32 getBlueMask() const //! Returns mask for green value of a pixel
{ u32 getGreenMask() const
switch (Format) { {
case ECF_A1R5G5B5: switch (Format)
return 0x1F; {
case ECF_R5G6B5: case ECF_A1R5G5B5:
return 0x1F; return 0x1F << 5;
case ECF_R8G8B8: case ECF_R5G6B5:
return 0x000000FF; return 0x3F << 5;
case ECF_A8R8G8B8: case ECF_R8G8B8:
return 0x000000FF; return 0x0000FF00;
default: case ECF_A8R8G8B8:
return 0x0; return 0x0000FF00;
} default:
} return 0x0;
}
//! Returns mask for alpha value of a pixel }
u32 getAlphaMask() const
{ //! Returns mask for blue value of a pixel
switch (Format) { u32 getBlueMask() const
case ECF_A1R5G5B5: {
return 0x1 << 15; switch (Format)
case ECF_R5G6B5: {
return 0x0; case ECF_A1R5G5B5:
case ECF_R8G8B8: return 0x1F;
return 0x0; case ECF_R5G6B5:
case ECF_A8R8G8B8: return 0x1F;
return 0xFF000000; case ECF_R8G8B8:
default: return 0x000000FF;
return 0x0; case ECF_A8R8G8B8:
} return 0x000000FF;
} default:
return 0x0;
//! Use this to get a pointer to the image data. }
/** }
\return Pointer to the image data. What type of data is pointed to
depends on the color format of the image. For example if the color //! Returns mask for alpha value of a pixel
format is ECF_A8R8G8B8, it is of u32. */ u32 getAlphaMask() const
void *getData() const {
{ switch (Format)
return Data; {
} case ECF_A1R5G5B5:
return 0x1 << 15;
//! Get the mipmap size for this image for a certain mipmap level case ECF_R5G6B5:
/** level 0 will be full image size. Every further level is half the size. return 0x0;
Doesn't care if the image actually has mipmaps, just which size would be needed. */ case ECF_R8G8B8:
core::dimension2du getMipMapsSize(u32 mipmapLevel) const return 0x0;
{ case ECF_A8R8G8B8:
return getMipMapsSize(Size, mipmapLevel); return 0xFF000000;
} default:
return 0x0;
//! 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)
{ //! Use this to get a pointer to the image data.
core::dimension2du result(sizeLevel0); /**
u32 i = 0; \return Pointer to the image data. What type of data is pointed to
while (i != mipmapLevel) { depends on the color format of the image. For example if the color
if (result.Width > 1) format is ECF_A8R8G8B8, it is of u32. */
result.Width >>= 1; void* getData() const
if (result.Height > 1) {
result.Height >>= 1; return Data;
++i; }
if (result.Width == 1 && result.Height == 1 && i < mipmapLevel) //! Get the mipmap size for this image for a certain mipmap level
return core::dimension2du(0, 0); /** level 0 will be full image size. Every further level is half the size.
} Doesn't care if the image actually has mipmaps, just which size would be needed. */
return result; core::dimension2du getMipMapsSize(u32 mipmapLevel) const
} {
return getMipMapsSize(Size, mipmapLevel);
//! 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.
There is no level 0 - use getData to get the original image data. //! Calculate mipmap size for a certain level
*/ /** level 0 will be full image size. Every further level is half the size. */
void *getMipMapsData(irr::u32 mipLevel = 1) const static core::dimension2du getMipMapsSize(const core::dimension2du& sizeLevel0, u32 mipmapLevel)
{ {
if (MipMapsData && mipLevel > 0) { core::dimension2du result(sizeLevel0);
size_t dataSize = 0; u32 i=0;
core::dimension2du mipSize(Size); while (i != mipmapLevel)
u32 i = 1; // We want the start of data for this level, not end. {
if (result.Width>1)
while (i != mipLevel) { result.Width >>= 1;
if (mipSize.Width > 1) if (result.Height>1)
mipSize.Width >>= 1; result.Height>>=1;
++i;
if (mipSize.Height > 1)
mipSize.Height >>= 1; if ( result.Width == 1 && result.Height == 1 && i < mipmapLevel )
return core::dimension2du(0,0);
dataSize += getDataSizeFromFormat(Format, mipSize.Width, mipSize.Height); }
return result;
++i; }
if (mipSize.Width == 1 && mipSize.Height == 1 && i < mipLevel)
return 0;
} //! Get mipmaps data.
/** Note that different mip levels are just behind each other in memory block.
return MipMapsData + dataSize; So if you just get level 1 you also have the data for all other levels.
} There is no level 0 - use getData to get the original image data.
*/
return 0; void* getMipMapsData(irr::u32 mipLevel=1) const
} {
if ( MipMapsData && mipLevel > 0)
//! Set mipmaps data. {
/** This method allows you to put custom mipmaps data for size_t dataSize = 0;
image. core::dimension2du mipSize(Size);
\param data A byte array with pixel color information u32 i = 1; // We want the start of data for this level, not end.
\param ownForeignMemory If true, the image will use the data
pointer directly and own it afterward. If false, the memory while (i != mipLevel)
will by copied internally. {
\param deleteMemory Whether the memory is deallocated upon if (mipSize.Width > 1)
destruction. */ mipSize.Width >>= 1;
void setMipMapsData(void *data, bool ownForeignMemory)
{ if (mipSize.Height > 1)
if (data != MipMapsData) { mipSize.Height >>= 1;
if (DeleteMipMapsMemory) {
delete[] MipMapsData; dataSize += getDataSizeFromFormat(Format, mipSize.Width, mipSize.Height);
DeleteMipMapsMemory = false; ++i;
} if ( mipSize.Width == 1 && mipSize.Height == 1 && i < mipLevel)
return 0;
if (data) { }
if (ownForeignMemory) {
MipMapsData = static_cast<u8 *>(data); return MipMapsData + dataSize;
}
DeleteMipMapsMemory = false;
} else { return 0;
u32 dataSize = 0; }
u32 width = Size.Width;
u32 height = Size.Height; //! Set mipmaps data.
/** This method allows you to put custom mipmaps data for
do { image.
if (width > 1) \param data A byte array with pixel color information
width >>= 1; \param ownForeignMemory If true, the image will use the data
pointer directly and own it afterward. If false, the memory
if (height > 1) will by copied internally.
height >>= 1; \param deleteMemory Whether the memory is deallocated upon
destruction. */
dataSize += getDataSizeFromFormat(Format, width, height); void setMipMapsData(void* data, bool ownForeignMemory)
} while (width != 1 || height != 1); {
if (data != MipMapsData)
MipMapsData = new u8[dataSize]; {
memcpy(MipMapsData, data, dataSize); if (DeleteMipMapsMemory)
{
DeleteMipMapsMemory = true; delete[] MipMapsData;
}
} else { DeleteMipMapsMemory = false;
MipMapsData = 0; }
}
} if (data)
} {
if (ownForeignMemory)
//! Returns a pixel {
virtual SColor getPixel(u32 x, u32 y) const = 0; MipMapsData = static_cast<u8*>(data);
//! Sets a pixel DeleteMipMapsMemory = false;
virtual void setPixel(u32 x, u32 y, const SColor &color, bool blend = false) = 0; }
else
//! Copies this surface into another, if it has the exact same size and format. {
/** NOTE: mipmaps are ignored u32 dataSize = 0;
\return True if it was copied, false otherwise. u32 width = Size.Width;
*/ u32 height = Size.Height;
virtual bool copyToNoScaling(void *target, u32 width, u32 height, ECOLOR_FORMAT format = ECF_A8R8G8B8, u32 pitch = 0) const = 0;
do
//! Copies the image into the target, scaling the image to fit {
/** NOTE: mipmaps are ignored */ if (width > 1)
virtual void copyToScaling(void *target, u32 width, u32 height, ECOLOR_FORMAT format = ECF_A8R8G8B8, u32 pitch = 0) = 0; width >>= 1;
//! Copies the image into the target, scaling the image to fit if (height > 1)
/** NOTE: mipmaps are ignored */ height >>= 1;
virtual void copyToScaling(IImage *target) = 0;
dataSize += getDataSizeFromFormat(Format, width, height);
//! copies this surface into another } while (width != 1 || height != 1);
/** NOTE: mipmaps are ignored */
virtual void copyTo(IImage *target, const core::position2d<s32> &pos = core::position2d<s32>(0, 0)) = 0; MipMapsData = new u8[dataSize];
memcpy(MipMapsData, data, dataSize);
//! copies this surface into another
/** NOTE: mipmaps are ignored */ DeleteMipMapsMemory = true;
virtual void copyTo(IImage *target, const core::position2d<s32> &pos, const core::rect<s32> &sourceRect, const core::rect<s32> *clipRect = 0) = 0; }
}
//! copies this surface into another, using the alpha mask and cliprect and a color to add with else
/** NOTE: mipmaps are ignored {
\param combineAlpha - When true then combine alpha channels. When false replace target image alpha with source image alpha. MipMapsData = 0;
*/ }
virtual void copyToWithAlpha(IImage *target, const core::position2d<s32> &pos, }
const core::rect<s32> &sourceRect, const SColor &color, }
const core::rect<s32> *clipRect = 0,
bool combineAlpha = false) = 0; //! Returns a pixel
virtual SColor getPixel(u32 x, u32 y) const = 0;
//! copies this surface into another, scaling it to fit, applying a box filter
/** NOTE: mipmaps are ignored */ //! Sets a pixel
virtual void copyToScalingBoxFilter(IImage *target, s32 bias = 0, bool blend = false) = 0; virtual void setPixel(u32 x, u32 y, const SColor &color, bool blend = false ) = 0;
//! fills the surface with given color //! Copies this surface into another, if it has the exact same size and format.
virtual void fill(const SColor &color) = 0; /** NOTE: mipmaps are ignored
\return True if it was copied, false otherwise.
//! get the amount of Bits per Pixel of the given color format */
static u32 getBitsPerPixelFromFormat(const ECOLOR_FORMAT format) virtual bool copyToNoScaling(void *target, u32 width, u32 height, ECOLOR_FORMAT format=ECF_A8R8G8B8, u32 pitch=0) const = 0;
{
switch (format) { //! Copies the image into the target, scaling the image to fit
case ECF_A1R5G5B5: /** NOTE: mipmaps are ignored */
return 16; virtual void copyToScaling(void* target, u32 width, u32 height, ECOLOR_FORMAT format=ECF_A8R8G8B8, u32 pitch=0) =0;
case ECF_R5G6B5:
return 16; //! Copies the image into the target, scaling the image to fit
case ECF_R8G8B8: /** NOTE: mipmaps are ignored */
return 24; virtual void copyToScaling(IImage* target) =0;
case ECF_A8R8G8B8:
return 32; //! copies this surface into another
case ECF_D16: /** NOTE: mipmaps are ignored */
return 16; virtual void copyTo(IImage* target, const core::position2d<s32>& pos=core::position2d<s32>(0,0)) =0;
case ECF_D32:
return 32; //! copies this surface into another
case ECF_D24S8: /** NOTE: mipmaps are ignored */
return 32; virtual void copyTo(IImage* target, const core::position2d<s32>& pos, const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect=0) =0;
case ECF_R8:
return 8; //! copies this surface into another, using the alpha mask and cliprect and a color to add with
case ECF_R8G8: /** NOTE: mipmaps are ignored
return 16; \param combineAlpha - When true then combine alpha channels. When false replace target image alpha with source image alpha.
case ECF_R16: */
return 16; virtual void copyToWithAlpha(IImage* target, const core::position2d<s32>& pos,
case ECF_R16G16: const core::rect<s32>& sourceRect, const SColor &color,
return 32; const core::rect<s32>* clipRect = 0,
case ECF_R16F: bool combineAlpha=false) =0;
return 16;
case ECF_G16R16F: //! copies this surface into another, scaling it to fit, applying a box filter
return 32; /** NOTE: mipmaps are ignored */
case ECF_A16B16G16R16F: virtual void copyToScalingBoxFilter(IImage* target, s32 bias = 0, bool blend = false) = 0;
return 64;
case ECF_R32F: //! fills the surface with given color
return 32; virtual void fill(const SColor &color) =0;
case ECF_G32R32F:
return 64; //! get the amount of Bits per Pixel of the given color format
case ECF_A32B32G32R32F: static u32 getBitsPerPixelFromFormat(const ECOLOR_FORMAT format)
return 128; {
default: switch(format)
return 0; {
} case ECF_A1R5G5B5:
} return 16;
case ECF_R5G6B5:
//! calculate image data size in bytes for selected format, width and height. return 16;
static u32 getDataSizeFromFormat(ECOLOR_FORMAT format, u32 width, u32 height) case ECF_R8G8B8:
{ return 24;
// non-compressed formats case ECF_A8R8G8B8:
u32 imageSize = getBitsPerPixelFromFormat(format) / 8 * width; return 32;
imageSize *= height; case ECF_DXT1:
return 16;
return imageSize; case ECF_DXT2:
} case ECF_DXT3:
case ECF_DXT4:
//! check if this is compressed color format case ECF_DXT5:
static bool isCompressedFormat(const ECOLOR_FORMAT format) return 32;
{ case ECF_PVRTC_RGB2:
return false; return 12;
} case ECF_PVRTC_ARGB2:
case ECF_PVRTC2_ARGB2:
//! check if the color format is only viable for depth/stencil textures return 16;
static bool isDepthFormat(const ECOLOR_FORMAT format) case ECF_PVRTC_RGB4:
{ return 24;
switch (format) { case ECF_PVRTC_ARGB4:
case ECF_D16: case ECF_PVRTC2_ARGB4:
case ECF_D32: return 32;
case ECF_D24S8: case ECF_ETC1:
return true; case ECF_ETC2_RGB:
default: return 24;
return false; case ECF_ETC2_ARGB:
} return 32;
} case ECF_D16:
return 16;
//! Check if the color format uses floating point values for pixels case ECF_D32:
static bool isFloatingPointFormat(const ECOLOR_FORMAT format) return 32;
{ case ECF_D24S8:
if (isCompressedFormat(format)) return 32;
return false; case ECF_R8:
return 8;
switch (format) { case ECF_R8G8:
case ECF_R16F: return 16;
case ECF_G16R16F: case ECF_R16:
case ECF_A16B16G16R16F: return 16;
case ECF_R32F: case ECF_R16G16:
case ECF_G32R32F: return 32;
case ECF_A32B32G32R32F: case ECF_R16F:
return true; return 16;
default: case ECF_G16R16F:
break; return 32;
} case ECF_A16B16G16R16F:
return false; return 64;
} case ECF_R32F:
return 32;
protected: case ECF_G32R32F:
ECOLOR_FORMAT Format; return 64;
core::dimension2d<u32> Size; case ECF_A32B32G32R32F:
return 128;
u8 *Data; default:
u8 *MipMapsData; return 0;
}
u32 BytesPerPixel; }
u32 Pitch;
//! calculate image data size in bytes for selected format, width and height.
bool DeleteMemory; static u32 getDataSizeFromFormat(ECOLOR_FORMAT format, u32 width, u32 height)
bool DeleteMipMapsMemory; {
}; u32 imageSize = 0;
} // end namespace video switch (format)
} // end namespace irr {
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)
{
case ECF_D16:
case ECF_D32:
case ECF_D24S8:
return true;
default:
return false;
}
}
//! Check if the color format uses floating point values for pixels
static bool isFloatingPointFormat(const ECOLOR_FORMAT format)
{
if (isCompressedFormat(format))
return false;
switch(format)
{
case ECF_R16F:
case ECF_G16R16F:
case ECF_A16B16G16R16F:
case ECF_R32F:
case ECF_G32R32F:
case ECF_A32B32G32R32F:
return true;
default:
break;
}
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;
u8* Data;
u8* MipMapsData;
u32 BytesPerPixel;
u32 Pitch;
bool DeleteMemory;
bool DeleteMipMapsMemory;
#if defined(IRRLICHT_sRGB)
int Format_sRGB;
#endif
};
} // end namespace video
} // end namespace irr
#endif

View File

@ -1,49 +1,55 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "ITexture.h" #include "IImage.h"
#include "path.h" #include "ITexture.h"
#include "irrArray.h" #include "path.h"
#include "irrArray.h"
namespace irr
{ namespace irr
namespace io {
{ namespace io
class IReadFile; {
} // end namespace io class IReadFile;
namespace video } // end namespace io
{ namespace video
{
//! Class which is able to create a image from a file.
/** If you want the Irrlicht Engine be able to load textures of //! Class which is able to create a image from a file.
currently unsupported file formats (e.g .gif), then implement /** If you want the Irrlicht Engine be able to load textures of
this and add your new Surface loader with currently unsupported file formats (e.g .gif), then implement
IVideoDriver::addExternalImageLoader() to the engine. */ this and add your new Surface loader with
class IImageLoader : public virtual IReferenceCounted IVideoDriver::addExternalImageLoader() to the engine. */
{ class IImageLoader : public virtual IReferenceCounted
public: {
//! Check if the file might be loaded by this class public:
/** Check is based on the file extension (e.g. ".tga")
\param filename Name of file to check. //! Check if the file might be loaded by this class
\return True if file seems to be loadable. */ /** Check is based on the file extension (e.g. ".tga")
virtual bool isALoadableFileExtension(const io::path &filename) const = 0; \param filename Name of file to check.
\return True if file seems to be loadable. */
//! Check if the file might be loaded by this class virtual bool isALoadableFileExtension(const io::path& filename) const = 0;
/** Check might look into the file.
\param file File handle to check. //! Check if the file might be loaded by this class
\return True if file seems to be loadable. */ /** Check might look into the file.
virtual bool isALoadableFileFormat(io::IReadFile *file) const = 0; \param file File handle to check.
\return True if file seems to be loadable. */
//! Creates a surface from the file virtual bool isALoadableFileFormat(io::IReadFile* file) const = 0;
/** \param file File handle to check.
\return Pointer to newly created image, or 0 upon error. */ //! Creates a surface from the file
virtual IImage *loadImage(io::IReadFile *file) const = 0; /** \param file File handle to check.
}; \return Pointer to newly created image, or 0 upon error. */
virtual IImage* loadImage(io::IReadFile* file) const = 0;
} // end namespace video };
} // end namespace irr
} // end namespace video
} // end namespace irr
#endif

View File

@ -1,40 +1,45 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "coreutil.h" #include "irrString.h"
#include "coreutil.h"
namespace irr
{ namespace irr
namespace io {
{ namespace io
class IWriteFile; {
} // end namespace io class IWriteFile;
} // end namespace io
namespace video
{ namespace video
class IImage; {
class IImage;
//! Interface for writing software image data.
class IImageWriter : public IReferenceCounted
{ //! Interface for writing software image data.
public: class IImageWriter : public IReferenceCounted
//! Check if this writer can write a file with the given extension {
/** \param filename Name of the file to check. public:
\return True if file extension specifies a writable type. */ //! Check if this writer can write a file with the given extension
virtual bool isAWriteableFileExtension(const io::path &filename) const = 0; /** \param filename Name of the file to check.
\return True if file extension specifies a writable type. */
//! Write image to file virtual bool isAWriteableFileExtension(const io::path& filename) const = 0;
/** \param file File handle to write to.
\param image Image to write into file. //! Write image to file
\param param Writer specific parameter, influencing e.g. quality. /** \param file File handle to write to.
\return True if image was successfully written. */ \param image Image to write into file.
virtual bool writeImage(io::IWriteFile *file, IImage *image, u32 param = 0) const = 0; \param param Writer specific parameter, influencing e.g. quality.
}; \return True if image was successfully written. */
virtual bool writeImage(io::IWriteFile *file, IImage *image, u32 param = 0) const = 0;
} // namespace video };
} // namespace irr
} // namespace video
} // namespace irr
#endif // _I_IMAGE_WRITER_H_INCLUDED__

View File

@ -1,59 +1,65 @@
// Copyright (C) 2008-2012 Nikolaus Gebhardt // Copyright (C) 2008-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "EHardwareBufferFlags.h" #include "irrArray.h"
#include "SVertexIndex.h" #include "EHardwareBufferFlags.h"
#include "SVertexIndex.h"
namespace irr
{ namespace irr
{
namespace video
{ namespace video
{
}
}
namespace scene
{ namespace scene
{
class IIndexBuffer : public virtual IReferenceCounted
{ class IIndexBuffer : public virtual IReferenceCounted
public: {
virtual void *getData() = 0; public:
virtual video::E_INDEX_TYPE getType() const = 0; virtual void* getData() =0;
virtual void setType(video::E_INDEX_TYPE IndexType) = 0;
virtual video::E_INDEX_TYPE getType() const =0;
virtual u32 stride() const = 0; virtual void setType(video::E_INDEX_TYPE IndexType) =0;
virtual u32 size() const = 0; virtual u32 stride() const =0;
virtual void push_back(const u32 &element) = 0;
virtual u32 operator[](u32 index) const = 0; virtual u32 size() const =0;
virtual u32 getLast() = 0; virtual void push_back (const u32 &element) =0;
virtual void setValue(u32 index, u32 value) = 0; virtual u32 operator [](u32 index) const =0;
virtual void set_used(u32 usedNow) = 0; virtual u32 getLast() =0;
virtual void reallocate(u32 new_size) = 0; virtual void setValue(u32 index, u32 value) =0;
virtual u32 allocated_size() const = 0; virtual void set_used(u32 usedNow) =0;
virtual void reallocate(u32 new_size) =0;
virtual void *pointer() = 0; virtual u32 allocated_size() const=0;
//! get the current hardware mapping hint virtual void* pointer() =0;
virtual E_HARDWARE_MAPPING getHardwareMappingHint() const = 0;
//! get the current hardware mapping hint
//! set the hardware mapping hint, for driver virtual E_HARDWARE_MAPPING getHardwareMappingHint() const =0;
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING NewMappingHint) = 0;
//! set the hardware mapping hint, for driver
//! flags the meshbuffer as changed, reloads hardware buffers virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) =0;
virtual void setDirty() = 0;
//! flags the meshbuffer as changed, reloads hardware buffers
//! Get the currently used ID for identification of changes. virtual void setDirty() = 0;
/** This shouldn't be used for anything outside the VideoDriver. */
virtual u32 getChangedID() const = 0; //! Get the currently used ID for identification of changes.
}; /** This shouldn't be used for anything outside the VideoDriver. */
virtual u32 getChangedID() const = 0;
} // end namespace scene };
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,75 +1,102 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IReferenceCounted.h"
namespace irr
{ namespace irr
{
//! Possible log levels.
//! When used has filter ELL_DEBUG means => log everything and ELL_NONE means => log (nearly) nothing. //! Possible log levels.
//! When used to print logging information ELL_DEBUG will have lowest priority while ELL_NONE //! When used has filter ELL_DEBUG means => log everything and ELL_NONE means => log (nearly) nothing.
//! messages are never filtered and always printed. //! When used to print logging information ELL_DEBUG will have lowest priority while ELL_NONE
enum ELOG_LEVEL //! messages are never filtered and always printed.
{ enum ELOG_LEVEL
//! Used for printing information helpful in debugging {
ELL_DEBUG, //! Used for printing information helpful in debugging
ELL_DEBUG,
//! Useful information to print. For example hardware info or something started/stopped.
ELL_INFORMATION, //! 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
ELL_WARNING, //! Warnings that something isn't as expected and can cause oddities
ELL_WARNING,
//! Something did go wrong.
ELL_ERROR, //! Something did go wrong.
ELL_ERROR,
//! Logs with ELL_NONE will never be filtered.
//! And used as filter it will remove all logging except ELL_NONE messages. //! Logs with ELL_NONE will never be filtered.
ELL_NONE //! And used as filter it will remove all logging except ELL_NONE messages.
}; ELL_NONE
};
//! Interface for logging messages, warnings and errors
class ILogger : public virtual IReferenceCounted
{ //! Interface for logging messages, warnings and errors
public: class ILogger : public virtual IReferenceCounted
//! Destructor {
virtual ~ILogger() {} public:
//! Returns the current set log level. //! Destructor
virtual ELOG_LEVEL getLogLevel() const = 0; virtual ~ILogger() {}
//! Sets a new log level. //! Returns the current set log level.
/** With this value, texts which are sent to the logger are filtered virtual ELOG_LEVEL getLogLevel() const = 0;
out. For example setting this value to ELL_WARNING, only warnings and
errors are printed out. Setting it to ELL_INFORMATION, which is the //! Sets a new log level.
default setting, warnings, errors and informational texts are printed /** With this value, texts which are sent to the logger are filtered
out. out. For example setting this value to ELL_WARNING, only warnings and
\param ll: new log level filter value. */ errors are printed out. Setting it to ELL_INFORMATION, which is the
virtual void setLogLevel(ELOG_LEVEL ll) = 0; default setting, warnings, errors and informational texts are printed
out.
//! Prints out a text into the log \param ll: new log level filter value. */
/** \param text: Text to print out. virtual void setLogLevel(ELOG_LEVEL ll) = 0;
\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 //! Prints out a text into the log
is just an informational text, set it to ELL_INFORMATION. Texts are /** \param text: Text to print out.
filtered with these levels. If you want to be a text displayed, \param ll: Log level of the text. If the text is an error, set
independent on what level filter is set, use ELL_NONE. */ it to ELL_ERROR, if it is warning set it to ELL_WARNING, and if it
virtual void log(const c8 *text, ELOG_LEVEL ll = ELL_INFORMATION) = 0; is just an informational text, set it to ELL_INFORMATION. Texts are
filtered with these levels. If you want to be a text displayed,
//! Prints out a text into the log independent on what level filter is set, use ELL_NONE. */
/** \param text: Text to print out. virtual void log(const c8* text, ELOG_LEVEL ll=ELL_INFORMATION) = 0;
\param hint: Additional info. This string is added after a " :" to the
string. //! Prints out a text into the log
\param ll: Log level of the text. If the text is an error, set /** \param text: Text to print out.
it to ELL_ERROR, if it is warning set it to ELL_WARNING, and if it \param hint: Additional info. This string is added after a " :" to the
is just an informational text, set it to ELL_INFORMATION. Texts are string.
filtered with these levels. If you want to be a text displayed, \param ll: Log level of the text. If the text is an error, set
independent on what level filter is set, use ELL_NONE. */ it to ELL_ERROR, if it is warning set it to ELL_WARNING, and if it
virtual void log(const c8 *text, const c8 *hint, ELOG_LEVEL ll = ELL_INFORMATION) = 0; 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. */
} // end namespace 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

@ -1,101 +1,107 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "S3DVertex.h" #include "SMaterial.h"
#include "S3DVertex.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
{
class IVideoDriver;
class IMaterialRendererServices; class IVideoDriver;
class IShaderConstantSetCallBack; class IMaterialRendererServices;
class IShaderConstantSetCallBack;
//! Interface for material rendering.
/** Can be used to extend the engine with new materials. Refer to //! Interface for material rendering.
IVideoDriver::addMaterialRenderer() for more information on how to extend the /** Can be used to extend the engine with new materials. Refer to
engine with new materials. */ IVideoDriver::addMaterialRenderer() for more information on how to extend the
class IMaterialRenderer : public virtual IReferenceCounted engine with new materials. */
{ class IMaterialRenderer : public virtual IReferenceCounted
public: {
//! Called by the IVideoDriver implementation the let the renderer set its needed render states. public:
/** This is called during the IVideoDriver::setMaterial() call.
When overriding this, you can set some renderstates or for example a //! Called by the IVideoDriver implementation the let the renderer set its needed render states.
vertex or pixel shader if you like. /** This is called during the IVideoDriver::setMaterial() call.
\param material: The new material parameters to be set. The renderer When overriding this, you can set some renderstates or for example a
may change the material flags in this material. For example if this vertex or pixel shader if you like.
material does not accept the zbuffer = true, it can set it to false. \param material: The new material parameters to be set. The renderer
This is useful, because in the next lastMaterial will be just the may change the material flags in this material. For example if this
material in this call. material does not accept the zbuffer = true, it can set it to false.
\param lastMaterial: The material parameters which have been set before This is useful, because in the next lastMaterial will be just the
this material. material in this call.
\param resetAllRenderstates: True if all renderstates should really be \param lastMaterial: The material parameters which have been set before
reset. This is usually true if the last rendering mode was not a usual this material.
3d rendering mode, but for example a 2d rendering mode. \param resetAllRenderstates: True if all renderstates should really be
You should reset really all renderstates if this is true, no matter if reset. This is usually true if the last rendering mode was not a usual
the lastMaterial had some similar settings. This is used because in 3d rendering mode, but for example a 2d rendering mode.
most cases, some common renderstates are not changed if they are You should reset really all renderstates if this is true, no matter if
already there, for example bilinear filtering, wireframe, the lastMaterial had some similar settings. This is used because in
gouraudshading, lighting, zbuffer, zwriteenable, backfaceculling and most cases, some common renderstates are not changed if they are
fogenable. already there, for example bilinear filtering, wireframe,
\param services: Interface providing some methods for changing gouraudshading, lighting, zbuffer, zwriteenable, backfaceculling and
advanced, internal states of a IVideoDriver. */ fogenable.
virtual void OnSetMaterial(const SMaterial &material, const SMaterial &lastMaterial, \param services: Interface providing some methods for changing
bool resetAllRenderstates, IMaterialRendererServices *services) {} advanced, internal states of a IVideoDriver. */
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
//! Called every time before a new bunch of geometry is being drawn using this material with for example drawIndexedTriangleList() call. bool resetAllRenderstates, IMaterialRendererServices* services) {}
/** OnSetMaterial should normally only be called if the renderer decides
that the renderstates should be changed, it won't be called if for //! Called every time before a new bunch of geometry is being drawn using this material with for example drawIndexedTriangleList() call.
example two drawIndexedTriangleList() will be called with the same /** OnSetMaterial should normally only be called if the renderer decides
material set. This method will be called every time. This is useful for that the renderstates should be changed, it won't be called if for
example for materials with shaders, which don't only set new example two drawIndexedTriangleList() will be called with the same
renderstates but also shader constants. material set. This method will be called every time. This is useful for
\param service: Pointer to interface providing methods for setting example for materials with shaders, which don't only set new
constants and other things. renderstates but also shader constants.
\param vtxtype: Vertex type with which the next rendering will be done. \param service: Pointer to interface providing methods for setting
This can be used by the material renderer to set some specific constants and other things.
optimized shaders or if this is an incompatible vertex type for this \param vtxtype: Vertex type with which the next rendering will be done.
renderer, to refuse rendering for example. This can be used by the material renderer to set some specific
\return Returns true if everything is OK, and false if nothing should optimized shaders or if this is an incompatible vertex type for this
be rendered. The material renderer can choose to return false for renderer, to refuse rendering for example.
example if he doesn't support the specified vertex type. This is \return Returns true if everything is OK, and false if nothing should
actually done in D3D9 when using a normal mapped material with be rendered. The material renderer can choose to return false for
a vertex type other than EVT_TANGENTS. */ example if he doesn't support the specified vertex type. This is
virtual bool OnRender(IMaterialRendererServices *service, E_VERTEX_TYPE vtxtype) { return true; } actually done in D3D9 when using a normal mapped material with
a vertex type other than EVT_TANGENTS. */
//! Called by the IVideoDriver to unset this material. virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) { return true; }
/** Called during the IVideoDriver::setMaterial() call before the new
material will get the OnSetMaterial() call. */ //! Called by the IVideoDriver to unset this material.
virtual void OnUnsetMaterial() {} /** Called during the IVideoDriver::setMaterial() call before the new
material will get the OnSetMaterial() call. */
//! Returns if the material is transparent. virtual void OnUnsetMaterial() {}
/** The scene management needs to know this
for being able to sort the materials by opaque and transparent. */ //! Returns if the material is transparent.
virtual bool isTransparent() const { return false; } /** The scene management needs to know this
for being able to sort the materials by opaque and transparent. */
//! Returns the render capability of the material. virtual bool isTransparent() const { return false; }
/** Because some more complex materials
are implemented in multiple ways and need special hardware capabilities, it is possible //! Returns the render capability of the material.
to query how the current material renderer is performing on the current hardware with this /** Because some more complex materials
function. are implemented in multiple ways and need special hardware capabilities, it is possible
\return Returns 0 if everything is running fine. Any other value is material renderer to query how the current material renderer is performing on the current hardware with this
specific and means for example that the renderer switched back to a fall back material because function.
it cannot use the latest shaders. More specific examples: \return Returns 0 if everything is running fine. Any other value is material renderer
Fixed function pipeline materials should return 0 in most cases, parallax mapped specific and means for example that the renderer switched back to a fall back material because
material will only return 0 when at least pixel shader 1.4 is available on that machine. */ it cannot use the latest shaders. More specific examples:
virtual s32 getRenderCapability() const { return 0; } Fixed function pipeline materials should return 0 in most cases, parallax mapped
material will only return 0 when at least pixel shader 1.4 is available on that machine. */
//! Access the callback provided by the users when creating shader materials virtual s32 getRenderCapability() const { return 0; }
/** \returns Returns either the users provided callback or 0 when no such
callback exists. Non-shader materials will always return 0. */ //! Access the callback provided by the users when creating shader materials
virtual IShaderConstantSetCallBack *getShaderConstantSetCallBack() const { return 0; } /** \returns Returns either the users provided callback or 0 when no such
}; callback exists. Non-shader materials will always return 0. */
virtual IShaderConstantSetCallBack* getShaderConstantSetCallBack() const { return 0; }
} // end namespace video };
} // end namespace irr
} // end namespace video
} // end namespace irr
#endif

View File

@ -1,80 +1,127 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "SMaterial.h"
#include "S3DVertex.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
{
class IVideoDriver;
class IVideoDriver;
//! Interface providing some methods for changing advanced, internal states of a IVideoDriver.
class IMaterialRendererServices
{ //! Interface providing some methods for changing advanced, internal states of a IVideoDriver.
public: class IMaterialRendererServices
//! Destructor {
virtual ~IMaterialRendererServices() {} public:
//! Can be called by an IMaterialRenderer to make its work easier. //! Destructor
/** Sets all basic renderstates if needed. virtual ~IMaterialRendererServices() {}
Basic render states are diffuse, ambient, specular, and emissive color,
specular power, bilinear and trilinear filtering, wireframe mode, //! Can be called by an IMaterialRenderer to make its work easier.
grouraudshading, lighting, zbuffer, zwriteenable, backfaceculling and /** Sets all basic renderstates if needed.
fog enabling. Basic render states are diffuse, ambient, specular, and emissive color,
\param material The new material to be used. specular power, bilinear and trilinear filtering, wireframe mode,
\param lastMaterial The material used until now. grouraudshading, lighting, zbuffer, zwriteenable, backfaceculling and
\param resetAllRenderstates Set to true if all renderstates should be fog enabling.
set, regardless of their current state. */ \param material The new material to be used.
virtual void setBasicRenderStates(const SMaterial &material, \param lastMaterial The material used until now.
const SMaterial &lastMaterial, \param resetAllRenderstates Set to true if all renderstates should be
bool resetAllRenderstates) = 0; set, regardless of their current state. */
virtual void setBasicRenderStates(const SMaterial& material,
//! Return an index constant for the vertex shader based on a uniform variable name. const SMaterial& lastMaterial,
virtual s32 getVertexShaderConstantID(const c8 *name) = 0; bool resetAllRenderstates) = 0;
//! Sets a value for a vertex shader uniform variable. //! Return an index constant for the vertex shader based on a name.
/** \param index Index of the variable (as received from getVertexShaderConstantID) virtual s32 getVertexShaderConstantID(const c8* name) = 0;
\param floats Pointer to array of floats
\param count Amount of floats in array. //! Sets a constant for the vertex shader based on a name.
\return True if successful. /** 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
virtual bool setVertexShaderConstant(s32 index, const f32 *floats, int count) = 0; variables named 'mWorldViewProj' (containing the WorldViewProjection
matrix) and another one named 'fTime' containing one float, you can set
//! Int interface for the above. them in your IShaderConstantSetCallBack derived class like this:
virtual bool setVertexShaderConstant(s32 index, const s32 *ints, int count) = 0; \code
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
//! Uint interface for the above. {
virtual bool setVertexShaderConstant(s32 index, const u32 *ints, int count) = 0; video::IVideoDriver* driver = services->getVideoDriver();
//! Return an index constant for the pixel shader for the given uniform variable name f32 time = (f32)os::Timer::getTime()/100000.0f;
virtual s32 getPixelShaderConstantID(const c8 *name) = 0; services->setVertexShaderConstant("fTime", &time, 1);
//! Sets a value for the given pixel shader uniform variable core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION));
/** This can be used if you used a high level shader language like GLSL worldViewProj *= driver->getTransform(video::ETS_VIEW);
or HLSL to create a shader. See setVertexShaderConstant() for an worldViewProj *= driver->getTransform(video::ETS_WORLD);
example on how to use this. services->setVertexShaderConstant("mWorldViewProj", worldViewProj.M, 16);
\param index Index of the variable (as received from getPixelShaderConstantID) }
\param floats Pointer to array of floats \endcode
\param count Amount of floats in array. \param index Index of the variable
\return True if successful. */ \param floats Pointer to array of floats
virtual bool setPixelShaderConstant(s32 index, const f32 *floats, int count) = 0; \param count Amount of floats in array.
\return True if successful.
//! Int interface for the above. */
virtual bool setPixelShaderConstant(s32 index, const s32 *ints, int count) = 0; virtual bool setVertexShaderConstant(s32 index, const f32* floats, int count) = 0;
//! Uint interface for the above. //! Int interface for the above.
virtual bool setPixelShaderConstant(s32 index, const u32 *ints, int count) = 0; virtual bool setVertexShaderConstant(s32 index, const s32* ints, int count) = 0;
//! Get pointer to the IVideoDriver interface //! Uint interface for the above.
/** \return Pointer to the IVideoDriver interface */ /* NOTE: UINT only works with GLSL, not supported for other shaders.
virtual IVideoDriver *getVideoDriver() = 0; 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;
} // end namespace video
} // end namespace irr //! 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 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
\param floats Pointer to array of floats
\param count Amount of floats in array.
\return True if successful. */
virtual bool setPixelShaderConstant(s32 index, const f32* floats, int count) = 0;
//! Int interface for the above.
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;
};
} // end namespace video
} // end namespace irr
#endif

View File

@ -1,27 +1,31 @@
// Copyright Michael Zeilfelder // Copyright Michael Zeilfelder
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "IReadFile.h"
namespace irr
{ namespace irr
namespace io {
{ namespace io
{
//! Interface providing read access to a memory read file.
class IMemoryReadFile : public IReadFile //! Interface providing read access to a memory read file.
{ class IMemoryReadFile : public IReadFile
public: {
//! Get direct access to internal buffer of memory block used as file. public:
/** It's usually better to use the IReadFile functions to access //! Get direct access to internal buffer of memory block used as file.
the file content. But as that buffer exist over the full life-time /** It's usually better to use the IReadFile functions to access
of a CMemoryReadFile, it's sometimes nice to avoid the additional the file content. But as that buffer exist over the full life-time
data-copy which read() needs. of a CMemoryReadFile, it's sometimes nice to avoid the additional
*/ data-copy which read() needs.
virtual const void *getBuffer() const = 0; */
}; virtual const void *getBuffer() const = 0;
} // end namespace io };
} // end namespace irr } // end namespace io
} // end namespace irr
#endif

View File

@ -1,123 +1,129 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "EHardwareBufferFlags.h" #include "SMaterial.h"
#include "EHardwareBufferFlags.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
//! Possible types of meshes. {
// Note: Was previously only used in IAnimatedMesh so it still has the "animated" in the name. //! Possible types of meshes.
// But can now be used for all mesh-types as we need those casts as well. // Note: Was previously only used in IAnimatedMesh so it still has the "animated" in the name.
enum E_ANIMATED_MESH_TYPE // But can now be used for all mesh-types as we need those casts as well.
{ enum E_ANIMATED_MESH_TYPE
//! Unknown animated mesh type. {
EAMT_UNKNOWN = 0, //! Unknown animated mesh type.
EAMT_UNKNOWN = 0,
//! Quake 2 MD2 model file
EAMT_MD2, //! Quake 2 MD2 model file
EAMT_MD2,
//! Quake 3 MD3 model file
EAMT_MD3, //! Quake 3 MD3 model file
EAMT_MD3,
//! Maya .obj static model
EAMT_OBJ, //! Maya .obj static model
EAMT_OBJ,
//! Quake 3 .bsp static Map
EAMT_BSP, //! Quake 3 .bsp static Map
EAMT_BSP,
//! 3D Studio .3ds file
EAMT_3DS, //! 3D Studio .3ds file
EAMT_3DS,
//! My3D Mesh, the file format by Zhuck Dimitry
EAMT_MY3D, //! My3D Mesh, the file format by Zhuck Dimitry
EAMT_MY3D,
//! Pulsar LMTools .lmts file. This Irrlicht loader was written by Jonas Petersen
EAMT_LMTS, //! Pulsar LMTools .lmts file. This Irrlicht loader was written by Jonas Petersen
EAMT_LMTS,
//! Cartography Shop .csm file. This loader was created by Saurav Mohapatra.
EAMT_CSM, //! Cartography Shop .csm file. This loader was created by Saurav Mohapatra.
EAMT_CSM,
//! .oct file for Paul Nette's FSRad or from Murphy McCauley's Blender .oct exporter.
/** The oct file format contains 3D geometry and lightmaps and //! .oct file for Paul Nette's FSRad or from Murphy McCauley's Blender .oct exporter.
can be loaded directly by Irrlicht */ /** The oct file format contains 3D geometry and lightmaps and
EAMT_OCT, can be loaded directly by Irrlicht */
EAMT_OCT,
//! Halflife MDL model file
EAMT_MDL_HALFLIFE, //! Halflife MDL model file
EAMT_MDL_HALFLIFE,
//! generic skinned mesh
EAMT_SKINNED, //! generic skinned mesh
EAMT_SKINNED,
//! generic non-animated mesh
EAMT_STATIC //! generic non-animated mesh
}; EAMT_STATIC
};
class IMeshBuffer;
//! Class which holds the geometry of an object. class IMeshBuffer;
/** An IMesh is nothing more than a collection of some mesh buffers
(IMeshBuffer). SMesh is a simple implementation of an IMesh. //! Class which holds the geometry of an object.
A mesh is usually added to an IMeshSceneNode in order to be rendered. /** An IMesh is nothing more than a collection of some mesh buffers
*/ (IMeshBuffer). SMesh is a simple implementation of an IMesh.
class IMesh : public virtual IReferenceCounted A mesh is usually added to an IMeshSceneNode in order to be rendered.
{ */
public: class IMesh : public virtual IReferenceCounted
//! Get the amount of mesh buffers. {
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */ public:
virtual u32 getMeshBufferCount() const = 0;
//! Get the amount of mesh buffers.
//! Get pointer to a mesh buffer. /** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
/** \param nr: Zero based index of the mesh buffer. The maximum value is virtual u32 getMeshBufferCount() const = 0;
getMeshBufferCount() - 1;
\return Pointer to the mesh buffer or 0 if there is no such //! Get pointer to a mesh buffer.
mesh buffer. */ /** \param nr: Zero based index of the mesh buffer. The maximum value is
virtual IMeshBuffer *getMeshBuffer(u32 nr) const = 0; getMeshBufferCount() - 1;
\return Pointer to the mesh buffer or 0 if there is no such
//! Get pointer to a mesh buffer which fits a material mesh buffer. */
/** \param material: material to search for virtual IMeshBuffer* getMeshBuffer(u32 nr) const = 0;
\return Pointer to the mesh buffer or 0 if there is no such
mesh buffer. */ //! Get pointer to a mesh buffer which fits a material
virtual IMeshBuffer *getMeshBuffer(const video::SMaterial &material) const = 0; /** \param material: material to search for
\return Pointer to the mesh buffer or 0 if there is no such
//! Get an axis aligned bounding box of the mesh. mesh buffer. */
/** \return Bounding box of this mesh. */ virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const = 0;
virtual const core::aabbox3d<f32> &getBoundingBox() const = 0;
//! Get an axis aligned bounding box of the mesh.
//! Set user-defined axis aligned bounding box /** \return Bounding box of this mesh. */
/** \param box New bounding box to use for the mesh. */ virtual const core::aabbox3d<f32>& getBoundingBox() const = 0;
virtual void setBoundingBox(const core::aabbox3df &box) = 0;
//! Set user-defined axis aligned bounding box
//! Set the hardware mapping hint /** \param box New bounding box to use for the mesh. */
/** This methods allows to define optimization hints for the virtual void setBoundingBox( const core::aabbox3df& box) = 0;
hardware. This enables, e.g., the use of hardware buffers on
platforms that support this feature. This can lead to noticeable //! Set the hardware mapping hint
performance gains. */ /** This methods allows to define optimization hints for the
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) = 0; hardware. This enables, e.g., the use of hardware buffers on
platforms that support this feature. This can lead to noticeable
//! Flag the meshbuffer as changed, reloads hardware buffers performance gains. */
/** This method has to be called every time the vertices or virtual void setHardwareMappingHint(E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) = 0;
indices have changed. Otherwise, changes won't be updated
on the GPU in the next render cycle. */ //! Flag the meshbuffer as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) = 0; /** This method has to be called every time the vertices or
indices have changed. Otherwise, changes won't be updated
//! Returns the type of the meshes. on the GPU in the next render cycle. */
/** This is useful for making a safe downcast. For example, virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) = 0;
if getMeshType() returns EAMT_MD2 it's safe to cast the
IMesh to IAnimatedMeshMD2. //! Returns the type of the meshes.
Note: It's no longer just about animated meshes, that name has just historical reasons. /** This is useful for making a safe downcast. For example,
\returns Type of the mesh */ if getMeshType() returns EAMT_MD2 it's safe to cast the
virtual E_ANIMATED_MESH_TYPE getMeshType() const IMesh to IAnimatedMeshMD2.
{ Note: It's no longer just about animated meshes, that name has just historical reasons.
return EAMT_STATIC; \returns Type of the mesh */
} virtual E_ANIMATED_MESH_TYPE getMeshType() const
}; {
return EAMT_STATIC;
} // end namespace scene }
} // end namespace irr };
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,182 +1,185 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "aabbox3d.h" #include "SMaterial.h"
#include "S3DVertex.h" #include "aabbox3d.h"
#include "SVertexIndex.h" #include "S3DVertex.h"
#include "EHardwareBufferFlags.h" #include "SVertexIndex.h"
#include "EPrimitiveTypes.h" #include "EHardwareBufferFlags.h"
#include "EPrimitiveTypes.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
//! Struct for holding a mesh with a single material. {
/** A part of an IMesh which has the same material on each face of that //! Struct for holding a mesh with a single material.
group. Logical groups of an IMesh need not be put into separate mesh /** A part of an IMesh which has the same material on each face of that
buffers, but can be. Separately animated parts of the mesh must be put group. Logical groups of an IMesh need not be put into separate mesh
into separate mesh buffers. buffers, but can be. Separately animated parts of the mesh must be put
Some mesh buffer implementations have limitations on the number of into separate mesh buffers.
vertices the buffer can hold. In that case, logical grouping can help. Some mesh buffer implementations have limitations on the number of
Moreover, the number of vertices should be optimized for the GPU upload, vertices the buffer can hold. In that case, logical grouping can help.
which often depends on the type of gfx card. Typical figures are Moreover, the number of vertices should be optimized for the GPU upload,
1000-10000 vertices per buffer. which often depends on the type of gfx card. Typical figures are
SMeshBuffer is a simple implementation of a MeshBuffer, which supports 1000-10000 vertices per buffer.
up to 65535 vertices. SMeshBuffer is a simple implementation of a MeshBuffer, which supports
up to 65535 vertices.
Since meshbuffers are used for drawing, and hence will be exposed
to the driver, chances are high that they are grab()'ed from somewhere. Since meshbuffers are used for drawing, and hence will be exposed
It's therefore required to dynamically allocate meshbuffers which are to the driver, chances are high that they are grab()'ed from somewhere.
passed to a video driver and only drop the buffer once it's not used in It's therefore required to dynamically allocate meshbuffers which are
the current code block anymore. passed to a video driver and only drop the buffer once it's not used in
*/ the current code block anymore.
class IMeshBuffer : public virtual IReferenceCounted */
{ class IMeshBuffer : public virtual IReferenceCounted
public: {
//! Get the material of this meshbuffer public:
/** \return Material of this buffer. */
virtual video::SMaterial &getMaterial() = 0; //! Get the material of this meshbuffer
/** \return Material of this buffer. */
//! Get the material of this meshbuffer virtual video::SMaterial& getMaterial() = 0;
/** \return Material of this buffer. */
virtual const video::SMaterial &getMaterial() const = 0; //! Get the material of this meshbuffer
/** \return Material of this buffer. */
//! Get type of vertex data which is stored in this meshbuffer. virtual const video::SMaterial& getMaterial() const = 0;
/** \return Vertex type of this buffer. */
virtual video::E_VERTEX_TYPE getVertexType() const = 0; //! Get type of vertex data which is stored in this meshbuffer.
/** \return Vertex type of this buffer. */
//! Get access to vertex data. The data is an array of vertices. virtual video::E_VERTEX_TYPE getVertexType() const = 0;
/** Which vertex type is used can be determined by getVertexType().
\return Pointer to array of vertices. */ //! Get access to vertex data. The data is an array of vertices.
virtual const void *getVertices() const = 0; /** Which vertex type is used can be determined by getVertexType().
\return Pointer to array of vertices. */
//! Get access to vertex data. The data is an array of vertices. virtual const void* getVertices() const = 0;
/** Which vertex type is used can be determined by getVertexType().
\return Pointer to array of vertices. */ //! Get access to vertex data. The data is an array of vertices.
virtual void *getVertices() = 0; /** Which vertex type is used can be determined by getVertexType().
\return Pointer to array of vertices. */
//! Get amount of vertices in meshbuffer. virtual void* getVertices() = 0;
/** \return Number of vertices in this buffer. */
virtual u32 getVertexCount() const = 0; //! Get amount of vertices in meshbuffer.
/** \return Number of vertices in this buffer. */
//! Get type of index data which is stored in this meshbuffer. virtual u32 getVertexCount() const = 0;
/** \return Index type of this buffer. */
virtual video::E_INDEX_TYPE getIndexType() const = 0; //! Get type of index data which is stored in this meshbuffer.
/** \return Index type of this buffer. */
//! Get access to indices. virtual video::E_INDEX_TYPE getIndexType() const =0;
/** \return Pointer to indices array. */
virtual const u16 *getIndices() const = 0; //! Get access to indices.
/** \return Pointer to indices array. */
//! Get access to indices. virtual const u16* getIndices() const = 0;
/** \return Pointer to indices array. */
virtual u16 *getIndices() = 0; //! Get access to indices.
/** \return Pointer to indices array. */
//! Get amount of indices in this meshbuffer. virtual u16* getIndices() = 0;
/** \return Number of indices in this buffer. */
virtual u32 getIndexCount() const = 0; //! Get amount of indices in this meshbuffer.
/** \return Number of indices in this buffer. */
//! Get the axis aligned bounding box of this meshbuffer. virtual u32 getIndexCount() const = 0;
/** \return Axis aligned bounding box of this buffer. */
virtual const core::aabbox3df &getBoundingBox() const = 0; //! Get the axis aligned bounding box of this meshbuffer.
/** \return Axis aligned bounding box of this buffer. */
//! Set axis aligned bounding box virtual const core::aabbox3df& getBoundingBox() const = 0;
/** \param box User defined axis aligned bounding box to use
for this buffer. */ //! Set axis aligned bounding box
virtual void setBoundingBox(const core::aabbox3df &box) = 0; /** \param box User defined axis aligned bounding box to use
for this buffer. */
//! Recalculates the bounding box. Should be called if the mesh changed. virtual void setBoundingBox(const core::aabbox3df& box) = 0;
virtual void recalculateBoundingBox() = 0;
//! Recalculates the bounding box. Should be called if the mesh changed.
//! returns position of vertex i virtual void recalculateBoundingBox() = 0;
virtual const core::vector3df &getPosition(u32 i) const = 0;
//! returns position of vertex i
//! returns position of vertex i virtual const core::vector3df& getPosition(u32 i) const = 0;
virtual core::vector3df &getPosition(u32 i) = 0;
//! returns position of vertex i
//! returns normal of vertex i virtual core::vector3df& getPosition(u32 i) = 0;
virtual const core::vector3df &getNormal(u32 i) const = 0;
//! returns normal of vertex i
//! returns normal of vertex i virtual const core::vector3df& getNormal(u32 i) const = 0;
virtual core::vector3df &getNormal(u32 i) = 0;
//! returns normal of vertex i
//! returns texture coord of vertex i virtual core::vector3df& getNormal(u32 i) = 0;
virtual const core::vector2df &getTCoords(u32 i) const = 0;
//! returns texture coord of vertex i
//! returns texture coord of vertex i virtual const core::vector2df& getTCoords(u32 i) const = 0;
virtual core::vector2df &getTCoords(u32 i) = 0;
//! returns texture coord of vertex i
//! Append the vertices and indices to the current buffer virtual core::vector2df& getTCoords(u32 i) = 0;
/** Only works for compatible vertex types.
\param vertices Pointer to a vertex array. //! Append the vertices and indices to the current buffer
\param numVertices Number of vertices in the array. /** Only works for compatible vertex types.
\param indices Pointer to index array. \param vertices Pointer to a vertex array.
\param numIndices Number of indices in array. */ \param numVertices Number of vertices in the array.
virtual void append(const void *const vertices, u32 numVertices, const u16 *const indices, u32 numIndices) = 0; \param indices Pointer to index array.
\param numIndices Number of indices in array. */
//! get the current hardware mapping hint virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) = 0;
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const = 0;
//! Append the meshbuffer to the current buffer
//! get the current hardware mapping hint /** Only works for compatible vertex types
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const = 0; \param other Buffer to append to this one. */
virtual void append(const IMeshBuffer* const other) = 0;
//! set the hardware mapping hint, for driver
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) = 0; //! get the current hardware mapping hint
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const = 0;
//! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) = 0; //! get the current hardware mapping hint
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const = 0;
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ //! set the hardware mapping hint, for driver
virtual u32 getChangedID_Vertex() const = 0; virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) = 0;
//! Get the currently used ID for identification of changes. //! flags the meshbuffer as changed, reloads hardware buffers
/** This shouldn't be used for anything outside the VideoDriver. */ virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) = 0;
virtual u32 getChangedID_Index() const = 0;
//! Get the currently used ID for identification of changes.
//! Used by the VideoDriver to remember the buffer link. /** This shouldn't be used for anything outside the VideoDriver. */
virtual void setHWBuffer(void *ptr) const = 0; virtual u32 getChangedID_Vertex() const = 0;
virtual void *getHWBuffer() const = 0;
//! Get the currently used ID for identification of changes.
//! Describe what kind of primitive geometry is used by the meshbuffer /** This shouldn't be used for anything outside the VideoDriver. */
/** Note: Default is EPT_TRIANGLES. Using other types is fine for rendering. virtual u32 getChangedID_Index() const = 0;
But meshbuffer manipulation functions might expect type EPT_TRIANGLES
to work correctly. Also mesh writers will generally fail (badly!) with other //! Used by the VideoDriver to remember the buffer link.
types than EPT_TRIANGLES. */ virtual void setHWBuffer(void *ptr) const = 0;
virtual void setPrimitiveType(E_PRIMITIVE_TYPE type) = 0; virtual void *getHWBuffer() const = 0;
//! Get the kind of primitive geometry which is used by the meshbuffer //! Describe what kind of primitive geometry is used by the meshbuffer
virtual E_PRIMITIVE_TYPE getPrimitiveType() const = 0; /** Note: Default is EPT_TRIANGLES. Using other types is fine for rendering.
But meshbuffer manipulation functions might expect type EPT_TRIANGLES
//! Calculate how many geometric primitives are used by this meshbuffer to work correctly. Also mesh writers will generally fail (badly!) with other
virtual u32 getPrimitiveCount() const types than EPT_TRIANGLES. */
{ virtual void setPrimitiveType(E_PRIMITIVE_TYPE type) = 0;
const u32 indexCount = getIndexCount();
switch (getPrimitiveType()) { //! Get the kind of primitive geometry which is used by the meshbuffer
case scene::EPT_POINTS: virtual E_PRIMITIVE_TYPE getPrimitiveType() const = 0;
return indexCount;
case scene::EPT_LINE_STRIP: //! Calculate how many geometric primitives are used by this meshbuffer
return indexCount - 1; virtual u32 getPrimitiveCount() const
case scene::EPT_LINE_LOOP: {
return indexCount; const u32 indexCount = getIndexCount();
case scene::EPT_LINES: switch (getPrimitiveType())
return indexCount / 2; {
case scene::EPT_TRIANGLE_STRIP: case scene::EPT_POINTS: return indexCount;
return (indexCount - 2); case scene::EPT_LINE_STRIP: return indexCount-1;
case scene::EPT_TRIANGLE_FAN: case scene::EPT_LINE_LOOP: return indexCount;
return (indexCount - 2); case scene::EPT_LINES: return indexCount/2;
case scene::EPT_TRIANGLES: case scene::EPT_TRIANGLE_STRIP: return (indexCount-2);
return indexCount / 3; case scene::EPT_TRIANGLE_FAN: return (indexCount-2);
case scene::EPT_POINT_SPRITES: case scene::EPT_TRIANGLES: return indexCount/3;
return indexCount; case scene::EPT_POINT_SPRITES: return indexCount;
} }
return 0; return 0;
} }
};
};
} // end namespace scene
} // end namespace irr } // end namespace scene
} // end namespace irr
#endif

View File

@ -1,131 +1,137 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "path.h"
namespace irr
{ namespace irr
{
namespace scene
{ namespace scene
class IMesh; {
class IAnimatedMesh; class IMesh;
class IAnimatedMeshSceneNode; class IAnimatedMesh;
class IMeshLoader; class IAnimatedMeshSceneNode;
class IMeshLoader;
//! The mesh cache stores already loaded meshes and provides an interface to them.
/** You can access it using ISceneManager::getMeshCache(). All existing //! The mesh cache stores already loaded meshes and provides an interface to them.
scene managers will return a pointer to the same mesh cache, because it /** You can access it using ISceneManager::getMeshCache(). All existing
is shared between them. With this interface, it is possible to manually scene managers will return a pointer to the same mesh cache, because it
add new loaded meshes (if ISceneManager::getMesh() is not sufficient), is shared between them. With this interface, it is possible to manually
to remove them and to iterate through already loaded meshes. */ add new loaded meshes (if ISceneManager::getMesh() is not sufficient),
class IMeshCache : public virtual IReferenceCounted to remove them and to iterate through already loaded meshes. */
{ class IMeshCache : public virtual IReferenceCounted
public: {
//! Destructor public:
virtual ~IMeshCache() {}
//! Destructor
//! Adds a mesh to the internal list of loaded meshes. virtual ~IMeshCache() {}
/** Usually, ISceneManager::getMesh() is called to load a mesh
from a file. That method searches the list of loaded meshes if //! Adds a mesh to the internal list of loaded meshes.
a mesh has already been loaded and returns a pointer to if it /** Usually, ISceneManager::getMesh() is called to load a mesh
is in that list and already in memory. Otherwise it loads the from a file. That method searches the list of loaded meshes if
mesh. With IMeshCache::addMesh(), it is possible to pretend a mesh has already been loaded and returns a pointer to if it
that a mesh already has been loaded. This method can be used is in that list and already in memory. Otherwise it loads the
for example by mesh loaders who need to load more than one mesh mesh. With IMeshCache::addMesh(), it is possible to pretend
with one call. They can add additional meshes with this method that a mesh already has been loaded. This method can be used
to the scene manager. The COLLADA loader for example uses this for example by mesh loaders who need to load more than one mesh
method. with one call. They can add additional meshes with this method
\param name Name of the mesh. When calling to the scene manager. The COLLADA loader for example uses this
ISceneManager::getMesh() with this name it will return the mesh method.
set by this method. \param name Name of the mesh. When calling
\param mesh Pointer to a mesh which will now be referenced by ISceneManager::getMesh() with this name it will return the mesh
this name. */ set by this method.
virtual void addMesh(const io::path &name, IAnimatedMesh *mesh) = 0; \param mesh Pointer to a mesh which will now be referenced by
this name. */
//! Removes the mesh from the cache. virtual void addMesh(const io::path& name, IAnimatedMesh* mesh) = 0;
/** After loading a mesh with getMesh(), the mesh can be
removed from the cache using this method, freeing a lot of //! Removes the mesh from the cache.
memory. /** After loading a mesh with getMesh(), the mesh can be
\param mesh Pointer to the mesh which shall be removed. */ removed from the cache using this method, freeing a lot of
virtual void removeMesh(const IMesh *const mesh) = 0; memory.
\param mesh Pointer to the mesh which shall be removed. */
//! Returns amount of loaded meshes in the cache. virtual void removeMesh(const IMesh* const mesh) = 0;
/** You can load new meshes into the cache using getMesh() and
addMesh(). If you ever need to access the internal mesh cache, //! Returns amount of loaded meshes in the cache.
you can do this using removeMesh(), getMeshNumber(), /** You can load new meshes into the cache using getMesh() and
getMeshByIndex() and getMeshName(). addMesh(). If you ever need to access the internal mesh cache,
\return Number of meshes in cache. */ you can do this using removeMesh(), getMeshNumber(),
virtual u32 getMeshCount() const = 0; getMeshByIndex() and getMeshName().
\return Number of meshes in cache. */
//! Returns current index number of the mesh or -1 when not found. virtual u32 getMeshCount() const = 0;
/** \param mesh Pointer to the mesh to search for.
\return Index of the mesh in the cache, or -1 if not found. */ //! Returns current index number of the mesh or -1 when not found.
virtual s32 getMeshIndex(const IMesh *const mesh) const = 0; /** \param mesh Pointer to the mesh to search for.
\return Index of the mesh in the cache, or -1 if not found. */
//! Returns a mesh based on its index number. virtual s32 getMeshIndex(const IMesh* const mesh) const = 0;
/** \param index: Index of the mesh, number between 0 and
getMeshCount()-1. //! Returns a mesh based on its index number.
Note that this number is only valid until a new mesh is loaded /** \param index: Index of the mesh, number between 0 and
or removed. getMeshCount()-1.
\return Pointer to the mesh or 0 if there is none with this Note that this number is only valid until a new mesh is loaded
number. */ or removed.
virtual IAnimatedMesh *getMeshByIndex(u32 index) = 0; \return Pointer to the mesh or 0 if there is none with this
number. */
//! Returns a mesh based on its name. virtual IAnimatedMesh* getMeshByIndex(u32 index) = 0;
/** \param name Name of the mesh. Usually a filename.
\return Pointer to the mesh or 0 if there is none with this number. */ //! Returns a mesh based on its name.
virtual IAnimatedMesh *getMeshByName(const io::path &name) = 0; /** \param name Name of the mesh. Usually a filename.
\return Pointer to the mesh or 0 if there is none with this number. */
//! Get the name of a loaded mesh, based on its index. virtual IAnimatedMesh* getMeshByName(const io::path& name) = 0;
/** \param index: Index of the mesh, number between 0 and getMeshCount()-1.
\return The name if mesh was found and has a name, else the path is empty. */ //! Get the name of a loaded mesh, based on its index.
virtual const io::SNamedPath &getMeshName(u32 index) const = 0; /** \param index: Index of the mesh, number between 0 and getMeshCount()-1.
\return The name if mesh was found and has a name, else the path is empty. */
//! Get the name of the loaded mesh if there is any. virtual const io::SNamedPath& getMeshName(u32 index) const = 0;
/** \param mesh Pointer to mesh to query.
\return The name if mesh was found and has a name, else the path is empty. */ //! Get the name of the loaded mesh if there is any.
virtual const io::SNamedPath &getMeshName(const IMesh *const mesh) const = 0; /** \param mesh Pointer to mesh to query.
\return The name if mesh was found and has a name, else the path is empty. */
//! Renames a loaded mesh. virtual const io::SNamedPath& getMeshName(const IMesh* const mesh) const = 0;
/** Note that renaming meshes might change the ordering of the
meshes, and so the index of the meshes as returned by //! Renames a loaded mesh.
getMeshIndex() or taken by some methods will change. /** Note that renaming meshes might change the ordering of the
\param index The index of the mesh in the cache. meshes, and so the index of the meshes as returned by
\param name New name for the mesh. getMeshIndex() or taken by some methods will change.
\return True if mesh was renamed. */ \param index The index of the mesh in the cache.
virtual bool renameMesh(u32 index, const io::path &name) = 0; \param name New name for the mesh.
\return True if mesh was renamed. */
//! Renames the loaded mesh virtual bool renameMesh(u32 index, const io::path& name) = 0;
/** Note that renaming meshes might change the ordering of the
meshes, and so the index of the meshes as returned by //! Renames the loaded mesh
getMeshIndex() or taken by some methods will change. /** Note that renaming meshes might change the ordering of the
\param mesh Mesh to be renamed. meshes, and so the index of the meshes as returned by
\param name New name for the mesh. getMeshIndex() or taken by some methods will change.
\return True if mesh was renamed. */ \param mesh Mesh to be renamed.
virtual bool renameMesh(const IMesh *const mesh, const io::path &name) = 0; \param name New name for the mesh.
\return True if mesh was renamed. */
//! Check if a mesh was already loaded. virtual bool renameMesh(const IMesh* const mesh, const io::path& name) = 0;
/** \param name Name of the mesh. Usually a filename.
\return True if the mesh has been loaded, else false. */ //! Check if a mesh was already loaded.
virtual bool isMeshLoaded(const io::path &name) = 0; /** \param name Name of the mesh. Usually a filename.
\return True if the mesh has been loaded, else false. */
//! Clears the whole mesh cache, removing all meshes. virtual bool isMeshLoaded(const io::path& name) = 0;
/** All meshes will be reloaded completely when using ISceneManager::getMesh()
after calling this method. //! Clears the whole mesh cache, removing all meshes.
Warning: If you have pointers to meshes that were loaded with ISceneManager::getMesh() /** All meshes will be reloaded completely when using ISceneManager::getMesh()
and you did not grab them, then they may become invalid. */ after calling this method.
virtual void clear() = 0; Warning: If you have pointers to meshes that were loaded with ISceneManager::getMesh()
and you did not grab them, then they may become invalid. */
//! Clears all meshes that are held in the mesh cache but not used anywhere else. virtual void clear() = 0;
/** Warning: If you have pointers to meshes that were loaded with ISceneManager::getMesh()
and you did not grab them, then they may become invalid. */ //! Clears all meshes that are held in the mesh cache but not used anywhere else.
virtual void clearUnusedMeshes() = 0; /** Warning: If you have pointers to meshes that were loaded with ISceneManager::getMesh()
}; and you did not grab them, then they may become invalid. */
virtual void clearUnusedMeshes() = 0;
} // end namespace scene };
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,50 +1,55 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "path.h"
namespace irr
{ namespace irr
namespace io {
{ namespace io
class IReadFile; {
} // end namespace io class IReadFile;
namespace scene } // end namespace io
{ namespace scene
class IAnimatedMesh; {
class IAnimatedMesh;
//! Class which is able to load an animated mesh from a file.
/** If you want Irrlicht be able to load meshes of //! Class which is able to load an animated mesh from a file.
currently unsupported file formats (e.g. .cob), then implement /** If you want Irrlicht be able to load meshes of
this and add your new Meshloader with currently unsupported file formats (e.g. .cob), then implement
ISceneManager::addExternalMeshLoader() to the engine. */ this and add your new Meshloader with
class IMeshLoader : public virtual IReferenceCounted ISceneManager::addExternalMeshLoader() to the engine. */
{ class IMeshLoader : public virtual IReferenceCounted
public: {
//! Constructor public:
IMeshLoader() {}
//! Constructor
//! Destructor IMeshLoader() {}
virtual ~IMeshLoader() {}
//! Destructor
//! Returns true if the file might be loaded by this class. virtual ~IMeshLoader() {}
/** This decision should be based on the file extension (e.g. ".cob")
only. //! Returns true if the file might be loaded by this class.
\param filename Name of the file to test. /** This decision should be based on the file extension (e.g. ".cob")
\return True if the file might be loaded by this class. */ only.
virtual bool isALoadableFileExtension(const io::path &filename) const = 0; \param filename Name of the file to test.
\return True if the file might be loaded by this class. */
//! Creates/loads an animated mesh from the file. virtual bool isALoadableFileExtension(const io::path& filename) const = 0;
/** \param file File handler to load the file from.
\return Pointer to the created mesh. Returns 0 if loading failed. //! Creates/loads an animated mesh from the file.
If you no longer need the mesh, you should call IAnimatedMesh::drop(). /** \param file File handler to load the file from.
See IReferenceCounted::drop() for more information. */ \return Pointer to the created mesh. Returns 0 if loading failed.
virtual IAnimatedMesh *createMesh(io::IReadFile *file) = 0; If you no longer need the mesh, you should call IAnimatedMesh::drop().
}; See IReferenceCounted::drop() for more information. */
virtual IAnimatedMesh* createMesh(io::IReadFile* file) = 0;
} // end namespace scene };
} // end namespace irr
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,170 +1,187 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "aabbox3d.h" #include "vector3d.h"
#include "matrix4.h" #include "aabbox3d.h"
#include "IAnimatedMesh.h" #include "matrix4.h"
#include "IMeshBuffer.h" #include "IAnimatedMesh.h"
#include "SVertexManipulator.h" #include "IMeshBuffer.h"
#include "SVertexManipulator.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
{
struct SMesh;
struct SMesh;
//! An interface for easy manipulation of meshes.
/** Scale, set alpha value, flip surfaces, and so on. This exists for //! An interface for easy manipulation of meshes.
fixing problems with wrong imported or exported meshes quickly after /** Scale, set alpha value, flip surfaces, and so on. This exists for
loading. It is not intended for doing mesh modifications and/or fixing problems with wrong imported or exported meshes quickly after
animations during runtime. loading. It is not intended for doing mesh modifications and/or
*/ animations during runtime.
class IMeshManipulator : public virtual IReferenceCounted */
{ class IMeshManipulator : public virtual IReferenceCounted
public: {
//! Recalculates all normals of the mesh. public:
/** \param mesh: Mesh on which the operation is performed.
\param smooth: If the normals shall be smoothed. //! Recalculates all normals of the mesh.
\param angleWeighted: If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. */ /** \param mesh: Mesh on which the operation is performed.
virtual void recalculateNormals(IMesh *mesh, bool smooth = false, \param smooth: If the normals shall be smoothed.
bool angleWeighted = false) const = 0; \param angleWeighted: If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. */
virtual void recalculateNormals(IMesh* mesh, bool smooth = false,
//! Recalculates all normals of the mesh buffer. bool angleWeighted = false) const=0;
/** \param buffer: Mesh buffer on which the operation is performed.
\param smooth: If the normals shall be smoothed. //! Recalculates all normals of the mesh buffer.
\param angleWeighted: If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. */ /** \param buffer: Mesh buffer on which the operation is performed.
virtual void recalculateNormals(IMeshBuffer *buffer, \param smooth: If the normals shall be smoothed.
bool smooth = false, bool angleWeighted = false) const = 0; \param angleWeighted: If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. */
virtual void recalculateNormals(IMeshBuffer* buffer,
//! Scales the actual mesh, not a scene node. bool smooth = false, bool angleWeighted = false) const=0;
/** \param mesh Mesh on which the operation is performed.
\param factor Scale factor for each axis. */ //! Scales the actual mesh, not a scene node.
void scale(IMesh *mesh, const core::vector3df &factor) const /** \param mesh Mesh on which the operation is performed.
{ \param factor Scale factor for each axis. */
apply(SVertexPositionScaleManipulator(factor), mesh, true); void scale(IMesh* mesh, const core::vector3df& factor) const
} {
apply(SVertexPositionScaleManipulator(factor), mesh, true);
//! Scales the actual meshbuffer, not a scene node. }
/** \param buffer Meshbuffer on which the operation is performed.
\param factor Scale factor for each axis. */ //! Scales the actual meshbuffer, not a scene node.
void scale(IMeshBuffer *buffer, const core::vector3df &factor) const /** \param buffer Meshbuffer on which the operation is performed.
{ \param factor Scale factor for each axis. */
apply(SVertexPositionScaleManipulator(factor), buffer, true); void scale(IMeshBuffer* buffer, const core::vector3df& factor) const
} {
apply(SVertexPositionScaleManipulator(factor), buffer, true);
//! Clones a static IMesh into a modifiable SMesh. }
/** All meshbuffers in the returned SMesh
are of type SMeshBuffer or SMeshBufferLightMap. //! Clones a static IMesh into a modifiable SMesh.
\param mesh Mesh to copy. /** All meshbuffers in the returned SMesh
\return Cloned mesh. If you no longer need the are of type SMeshBuffer or SMeshBufferLightMap.
cloned mesh, you should call SMesh::drop(). See \param mesh Mesh to copy.
IReferenceCounted::drop() for more information. */ \return Cloned mesh. If you no longer need the
virtual SMesh *createMeshCopy(IMesh *mesh) const = 0; cloned mesh, you should call SMesh::drop(). See
IReferenceCounted::drop() for more information. */
//! Get amount of polygons in mesh. virtual SMesh* createMeshCopy(IMesh* mesh) const = 0;
/** \param mesh Input mesh
\return Number of polygons in mesh. */ //! Get amount of polygons in mesh.
virtual s32 getPolyCount(IMesh *mesh) const = 0; /** \param mesh Input mesh
\return Number of polygons in mesh. */
//! Get amount of polygons in mesh. virtual s32 getPolyCount(IMesh* mesh) const = 0;
/** \param mesh Input mesh
\return Number of polygons in mesh. */ //! Get amount of polygons in mesh.
virtual s32 getPolyCount(IAnimatedMesh *mesh) const = 0; /** \param mesh Input mesh
\return Number of polygons in mesh. */
//! Create a new AnimatedMesh and adds the mesh to it virtual s32 getPolyCount(IAnimatedMesh* mesh) const = 0;
/** \param mesh Input mesh
\param type The type of the animated mesh to create. //! Create a new AnimatedMesh and adds the mesh to it
\return Newly created animated mesh with mesh as its only /** \param mesh Input mesh
content. When you don't need the animated mesh anymore, you \param type The type of the animated mesh to create.
should call IAnimatedMesh::drop(). See \return Newly created animated mesh with mesh as its only
IReferenceCounted::drop() for more information. */ content. When you don't need the animated mesh anymore, you
virtual IAnimatedMesh *createAnimatedMesh(IMesh *mesh, should call IAnimatedMesh::drop(). See
scene::E_ANIMATED_MESH_TYPE type = scene::EAMT_UNKNOWN) const = 0; IReferenceCounted::drop() for more information. */
virtual IAnimatedMesh * createAnimatedMesh(IMesh* mesh,
//! Apply a manipulator on the Meshbuffer scene::E_ANIMATED_MESH_TYPE type = scene::EAMT_UNKNOWN) const = 0;
/** \param func A functor defining the mesh manipulation.
\param buffer The Meshbuffer to apply the manipulator to. //! Apply a manipulator on the Meshbuffer
\param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation. /** \param func A functor defining the mesh manipulation.
\return True if the functor was successfully applied, else false. */ \param buffer The Meshbuffer to apply the manipulator to.
template <typename Functor> \param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation.
bool apply(const Functor &func, IMeshBuffer *buffer, bool boundingBoxUpdate = false) const \return True if the functor was successfully applied, else false. */
{ template <typename Functor>
return apply_(func, buffer, boundingBoxUpdate, func); bool apply(const Functor& func, IMeshBuffer* buffer, bool boundingBoxUpdate=false) const
} {
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.
\param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation. //! Apply a manipulator on the Mesh
\return True if the functor was successfully applied, else false. */ /** \param func A functor defining the mesh manipulation.
template <typename Functor> \param mesh The Mesh to apply the manipulator to.
bool apply(const Functor &func, IMesh *mesh, bool boundingBoxUpdate = false) const \param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation.
{ \return True if the functor was successfully applied, else false. */
if (!mesh) template <typename Functor>
return true; bool apply(const Functor& func, IMesh* mesh, bool boundingBoxUpdate=false) const
bool result = true; {
core::aabbox3df bufferbox; if (!mesh)
for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) { return true;
result &= apply(func, mesh->getMeshBuffer(i), boundingBoxUpdate); bool result = true;
if (boundingBoxUpdate) { core::aabbox3df bufferbox;
if (0 == i) for (u32 i=0; i<mesh->getMeshBufferCount(); ++i)
bufferbox.reset(mesh->getMeshBuffer(i)->getBoundingBox()); {
else result &= apply(func, mesh->getMeshBuffer(i), boundingBoxUpdate);
bufferbox.addInternalBox(mesh->getMeshBuffer(i)->getBoundingBox()); if (boundingBoxUpdate)
} {
} if (0==i)
if (boundingBoxUpdate) bufferbox.reset(mesh->getMeshBuffer(i)->getBoundingBox());
mesh->setBoundingBox(bufferbox); else
return result; bufferbox.addInternalBox(mesh->getMeshBuffer(i)->getBoundingBox());
} }
}
protected: if (boundingBoxUpdate)
//! Apply a manipulator based on the type of the functor mesh->setBoundingBox(bufferbox);
/** \param func A functor defining the mesh manipulation. return result;
\param buffer The Meshbuffer to apply the manipulator to. }
\param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation.
\param typeTest Unused parameter, which handles the proper call selection based on the type of the Functor which is passed in two times. protected:
\return True if the functor was successfully applied, else false. */ //! Apply a manipulator based on the type of the functor
template <typename Functor> /** \param func A functor defining the mesh manipulation.
bool apply_(const Functor &func, IMeshBuffer *buffer, bool boundingBoxUpdate, const IVertexManipulator &typeTest) const \param buffer The Meshbuffer to apply the manipulator to.
{ \param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation.
if (!buffer) \param typeTest Unused parameter, which handles the proper call selection based on the type of the Functor which is passed in two times.
return true; \return True if the functor was successfully applied, else false. */
template <typename Functor>
core::aabbox3df bufferbox; bool apply_(const Functor& func, IMeshBuffer* buffer, bool boundingBoxUpdate, const IVertexManipulator& typeTest) const
for (u32 i = 0; i < buffer->getVertexCount(); ++i) { {
switch (buffer->getVertexType()) { if (!buffer)
case video::EVT_STANDARD: { return true;
video::S3DVertex *verts = (video::S3DVertex *)buffer->getVertices();
func(verts[i]); core::aabbox3df bufferbox;
} break; for (u32 i=0; i<buffer->getVertexCount(); ++i)
case video::EVT_2TCOORDS: { {
video::S3DVertex2TCoords *verts = (video::S3DVertex2TCoords *)buffer->getVertices(); switch (buffer->getVertexType())
func(verts[i]); {
} break; case video::EVT_STANDARD:
case video::EVT_TANGENTS: { {
video::S3DVertexTangents *verts = (video::S3DVertexTangents *)buffer->getVertices(); video::S3DVertex* verts = (video::S3DVertex*)buffer->getVertices();
func(verts[i]); func(verts[i]);
} break; }
} break;
if (boundingBoxUpdate) { case video::EVT_2TCOORDS:
if (0 == i) {
bufferbox.reset(buffer->getPosition(0)); video::S3DVertex2TCoords* verts = (video::S3DVertex2TCoords*)buffer->getVertices();
else func(verts[i]);
bufferbox.addInternalPoint(buffer->getPosition(i)); }
} break;
} case video::EVT_TANGENTS:
if (boundingBoxUpdate) {
buffer->setBoundingBox(bufferbox); video::S3DVertexTangents* verts = (video::S3DVertexTangents*)buffer->getVertices();
return true; func(verts[i]);
} }
}; break;
}
} // end namespace scene if (boundingBoxUpdate)
} // end namespace irr {
if (0==i)
bufferbox.reset(buffer->getPosition(0));
else
bufferbox.addInternalPoint(buffer->getPosition(i));
}
}
if (boundingBoxUpdate)
buffer->setBoundingBox(bufferbox);
return true;
}
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1,50 +1,57 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "ISceneNode.h"
namespace irr
{ namespace irr
namespace scene {
{ namespace scene
{
class IMesh;
class IMesh;
//! A scene node displaying a static mesh
class IMeshSceneNode : public ISceneNode
{ //! A scene node displaying a static mesh
public: class IMeshSceneNode : public ISceneNode
//! Constructor {
/** Use setMesh() to set the mesh to display. public:
*/
IMeshSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id, //! Constructor
const core::vector3df &position = core::vector3df(0, 0, 0), /** Use setMesh() to set the mesh to display.
const core::vector3df &rotation = core::vector3df(0, 0, 0), */
const core::vector3df &scale = core::vector3df(1, 1, 1)) : IMeshSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
ISceneNode(parent, mgr, id, position, rotation, scale) {} const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df& rotation = core::vector3df(0,0,0),
//! Sets a new mesh to display const core::vector3df& scale = core::vector3df(1,1,1))
/** \param mesh Mesh to display. */ : ISceneNode(parent, mgr, id, position, rotation, scale) {}
virtual void setMesh(IMesh *mesh) = 0;
//! Sets a new mesh to display
//! Get the currently defined mesh for display. /** \param mesh Mesh to display. */
/** \return Pointer to mesh which is displayed by this node. */ virtual void setMesh(IMesh* mesh) = 0;
virtual IMesh *getMesh(void) = 0;
//! Get the currently defined mesh for display.
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style. /** \return Pointer to mesh which is displayed by this node. */
/** In this way it is possible to change the materials of a mesh virtual IMesh* getMesh(void) = 0;
causing all mesh scene nodes referencing this mesh to change, too.
\param readonly Flag if the materials shall be read-only. */ //! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
virtual void setReadOnlyMaterials(bool readonly) = 0; /** In this way it is possible to change the materials of a mesh
causing all mesh scene nodes referencing this mesh to change, too.
//! Check if the scene node should not copy the materials of the mesh but use them in a read only style \param readonly Flag if the materials shall be read-only. */
/** This flag can be set by setReadOnlyMaterials(). virtual void setReadOnlyMaterials(bool readonly) = 0;
\return Whether the materials are read-only. */
virtual bool isReadOnlyMaterials() const = 0; //! Check if the scene node should not copy the materials of the mesh but use them in a read only style
}; /** This flag can be set by setReadOnlyMaterials().
\return Whether the materials are read-only. */
} // end namespace scene virtual bool isReadOnlyMaterials() const = 0;
} // end namespace irr };
} // 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

@ -1,45 +1,49 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "irrString.h"
namespace irr
{ namespace irr
{
//! The OSOperator provides OS-specific methods and information.
class IOSOperator : public virtual IReferenceCounted //! The Operating system operator provides operation system specific methods and information.
{ class IOSOperator : public virtual IReferenceCounted
public: {
//! Get the current OS version as string. public:
virtual const core::stringc &getOperatingSystemVersion() const = 0; //! Get the current operation system version as string.
virtual const core::stringc& getOperatingSystemVersion() const = 0;
//! Copies text to the clipboard
//! \param text: text in utf-8 //! Copies text to the clipboard
virtual void copyToClipboard(const c8 *text) const = 0; //! \param text: text in utf-8
virtual void copyToClipboard(const c8* text) const = 0;
//! Copies text to the primary selection
//! This is a no-op on some platforms. //! Copies text to the primary selection
//! \param text: text in utf-8 //! This is a no-op on some platforms.
virtual void copyToPrimarySelection(const c8 *text) const = 0; //! \param text: text in utf-8
virtual void copyToPrimarySelection(const c8* text) const = 0;
//! Get text from the clipboard
//! \return Returns 0 if no string is in there, otherwise an utf-8 string. //! Get text from the clipboard
virtual const c8 *getTextFromClipboard() const = 0; //! \return Returns 0 if no string is in there, otherwise an utf-8 string.
virtual const c8* getTextFromClipboard() const = 0;
//! Get text from the primary selection
//! This is a no-op on some platforms. //! Get text from the primary selection
//! \return Returns 0 if no string is in there, otherwise an utf-8 string. //! This is a no-op on some platforms.
virtual const c8 *getTextFromPrimarySelection() const = 0; //! \return Returns 0 if no string is in there, otherwise an utf-8 string.
virtual const c8* getTextFromPrimarySelection() const = 0;
//! Get the total and available system RAM
/** \param totalBytes: will contain the total system memory in Kilobytes (1024 B) //! Get the total and available system RAM
\param availableBytes: will contain the available memory in Kilobytes (1024 B) /** \param totalBytes: will contain the total system memory in Kilobytes (1024 B)
\return True if successful, false if not */ \param availableBytes: will contain the available memory in Kilobytes (1024 B)
virtual bool getSystemMemory(u32 *totalBytes, u32 *availableBytes) const = 0; \return True if successful, false if not */
}; virtual bool getSystemMemory(u32* totalBytes, u32* availableBytes) const = 0;
} // end namespace };
} // end namespace
#endif

View File

@ -1,57 +1,61 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "EReadFileType.h" #include "coreutil.h"
#include "EReadFileType.h"
namespace irr
{ namespace irr
namespace io {
{ namespace io
{
//! Interface providing read access to a file.
class IReadFile : public virtual IReferenceCounted //! Interface providing read access to a file.
{ class IReadFile : public virtual IReferenceCounted
public: {
//! Reads an amount of bytes from the file. public:
/** \param buffer Pointer to buffer where read bytes are written to. //! Reads an amount of bytes from the file.
\param sizeToRead Amount of bytes to read from the file. /** \param buffer Pointer to buffer where read bytes are written to.
\return How many bytes were read. */ \param sizeToRead Amount of bytes to read from the file.
virtual size_t read(void *buffer, size_t sizeToRead) = 0; \return How many bytes were read. */
virtual size_t read(void* buffer, size_t sizeToRead) = 0;
//! Changes position in file
/** \param finalPos Destination position in the file. //! Changes position in file
\param relativeMovement If set to true, the position in the file is /** \param finalPos Destination position in the file.
changed relative to current position. Otherwise the position is changed \param relativeMovement If set to true, the position in the file is
from beginning of file. changed relative to current position. Otherwise the position is changed
\return True if successful, otherwise false. */ from beginning of file.
virtual bool seek(long finalPos, bool relativeMovement = false) = 0; \return True if successful, otherwise false. */
virtual bool seek(long finalPos, bool relativeMovement = false) = 0;
//! Get size of file.
/** \return Size of the file in bytes. */ //! Get size of file.
virtual long getSize() const = 0; /** \return Size of the file in bytes. */
virtual long getSize() const = 0;
//! Get the current position in the file.
/** \return Current position in the file in bytes on success or -1L on failure. */ //! Get the current position in the file.
virtual long getPos() const = 0; /** \return Current position in the file in bytes on success or -1L on failure. */
virtual long getPos() const = 0;
//! Get name of file.
/** \return File name as zero terminated character string. */ //! Get name of file.
virtual const io::path &getFileName() const = 0; /** \return File name as zero terminated character string. */
virtual const io::path& getFileName() const = 0;
//! Get the type of the class implementing this interface
virtual EREAD_FILE_TYPE getType() const //! Get the type of the class implementing this interface
{ virtual EREAD_FILE_TYPE getType() const
return EFIT_UNKNOWN; {
} return EFIT_UNKNOWN;
}; }
};
//! Internal function, please do not use.
IReadFile *createLimitReadFile(const io::path &fileName, IReadFile *alreadyOpenedFile, long pos, long areaSize); //! Internal function, please do not use.
IReadFile* createLimitReadFile(const io::path& fileName, IReadFile* alreadyOpenedFile, long pos, long areaSize);
} // end namespace io
} // end namespace irr } // end namespace io
} // end namespace irr
#endif

View File

@ -1,162 +1,170 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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"
#include "irrTypes.h"
namespace irr
{ namespace irr
{
//! Base class of most objects of the Irrlicht Engine.
/** This class provides reference counting through the methods grab() and drop(). //! Base class of most objects of the Irrlicht Engine.
It also is able to store a debug string for every instance of an object. /** This class provides reference counting through the methods grab() and drop().
Most objects of the Irrlicht It also is able to store a debug string for every instance of an object.
Engine are derived from IReferenceCounted, and so they are reference counted. Most objects of the Irrlicht
Engine are derived from IReferenceCounted, and so they are reference counted.
When you create an object in the Irrlicht engine, calling a method
which starts with 'create', an object is created, and you get a pointer When you create an object in the Irrlicht engine, calling a method
to the new object. If you no longer need the object, you have which starts with 'create', an object is created, and you get a pointer
to call drop(). This will destroy the object, if grab() was not called to the new object. If you no longer need the object, you have
in another part of you program, because this part still needs the object. to call drop(). This will destroy the object, if grab() was not called
Note, that you only need to call drop() to the object, if you created it, in another part of you program, because this part still needs the object.
and the method had a 'create' in it. Note, that you only need to call drop() to the object, if you created it,
and the method had a 'create' in it.
A simple example:
A simple example:
If you want to create a texture, you may want to call an imaginable method
IDriver::createTexture. You call If you want to create a texture, you may want to call an imaginable method
ITexture* texture = driver->createTexture(dimension2d<u32>(128, 128)); IDriver::createTexture. You call
If you no longer need the texture, call texture->drop(). ITexture* texture = driver->createTexture(dimension2d<u32>(128, 128));
If you no longer need the texture, call texture->drop().
If you want to load a texture, you may want to call imaginable method
IDriver::loadTexture. You do this like If you want to load a texture, you may want to call imaginable method
ITexture* texture = driver->loadTexture("example.jpg"); IDriver::loadTexture. You do this like
You will not have to drop the pointer to the loaded texture, because ITexture* texture = driver->loadTexture("example.jpg");
the name of the method does not start with 'create'. The texture You will not have to drop the pointer to the loaded texture, because
is stored somewhere by the driver. the name of the method does not start with 'create'. The texture
*/ is stored somewhere by the driver.
class IReferenceCounted */
{ class IReferenceCounted
public: {
//! Constructor. public:
IReferenceCounted() :
DebugName(0), ReferenceCounter(1) //! Constructor.
{ IReferenceCounted()
} : DebugName(0), ReferenceCounter(1)
{
//! Destructor. }
virtual ~IReferenceCounted()
{ //! Destructor.
} virtual ~IReferenceCounted()
{
//! Grabs the object. Increments the reference counter by one. }
/** Someone who calls grab() to an object, should later also
call drop() to it. If an object never gets as much drop() as //! Grabs the object. Increments the reference counter by one.
grab() calls, it will never be destroyed. The /** Someone who calls grab() to an object, should later also
IReferenceCounted class provides a basic reference counting call drop() to it. If an object never gets as much drop() as
mechanism with its methods grab() and drop(). Most objects of grab() calls, it will never be destroyed. The
the Irrlicht Engine are derived from IReferenceCounted, and so IReferenceCounted class provides a basic reference counting
they are reference counted. mechanism with its methods grab() and drop(). Most objects of
the Irrlicht Engine are derived from IReferenceCounted, and so
When you create an object in the Irrlicht engine, calling a they are reference counted.
method which starts with 'create', an object is created, and
you get a pointer to the new object. If you no longer need the When you create an object in the Irrlicht engine, calling a
object, you have to call drop(). This will destroy the object, method which starts with 'create', an object is created, and
if grab() was not called in another part of you program, you get a pointer to the new object. If you no longer need the
because this part still needs the object. Note, that you only object, you have to call drop(). This will destroy the object,
need to call drop() to the object, if you created it, and the if grab() was not called in another part of you program,
method had a 'create' in it. because this part still needs the object. Note, that you only
need to call drop() to the object, if you created it, and the
A simple example: method had a 'create' in it.
If you want to create a texture, you may want to call an A simple example:
imaginable method IDriver::createTexture. You call
ITexture* texture = driver->createTexture(dimension2d<u32>(128, 128)); If you want to create a texture, you may want to call an
If you no longer need the texture, call texture->drop(). imaginable method IDriver::createTexture. You call
If you want to load a texture, you may want to call imaginable ITexture* texture = driver->createTexture(dimension2d<u32>(128, 128));
method IDriver::loadTexture. You do this like If you no longer need the texture, call texture->drop().
ITexture* texture = driver->loadTexture("example.jpg"); If you want to load a texture, you may want to call imaginable
You will not have to drop the pointer to the loaded texture, method IDriver::loadTexture. You do this like
because the name of the method does not start with 'create'. ITexture* texture = driver->loadTexture("example.jpg");
The texture is stored somewhere by the driver. */ You will not have to drop the pointer to the loaded texture,
void grab() const { ++ReferenceCounter; } because the name of the method does not start with 'create'.
The texture is stored somewhere by the driver. */
//! Drops the object. Decrements the reference counter by one. void grab() const { ++ReferenceCounter; }
/** The IReferenceCounted class provides a basic reference
counting mechanism with its methods grab() and drop(). Most //! Drops the object. Decrements the reference counter by one.
objects of the Irrlicht Engine are derived from /** The IReferenceCounted class provides a basic reference
IReferenceCounted, and so they are reference counted. counting mechanism with its methods grab() and drop(). Most
objects of the Irrlicht Engine are derived from
When you create an object in the Irrlicht engine, calling a IReferenceCounted, and so they are reference counted.
method which starts with 'create', an object is created, and
you get a pointer to the new object. If you no longer need the When you create an object in the Irrlicht engine, calling a
object, you have to call drop(). This will destroy the object, method which starts with 'create', an object is created, and
if grab() was not called in another part of you program, you get a pointer to the new object. If you no longer need the
because this part still needs the object. Note, that you only object, you have to call drop(). This will destroy the object,
need to call drop() to the object, if you created it, and the if grab() was not called in another part of you program,
method had a 'create' in it. because this part still needs the object. Note, that you only
need to call drop() to the object, if you created it, and the
A simple example: method had a 'create' in it.
If you want to create a texture, you may want to call an A simple example:
imaginable method IDriver::createTexture. You call
ITexture* texture = driver->createTexture(dimension2d<u32>(128, 128)); If you want to create a texture, you may want to call an
If you no longer need the texture, call texture->drop(). imaginable method IDriver::createTexture. You call
If you want to load a texture, you may want to call imaginable ITexture* texture = driver->createTexture(dimension2d<u32>(128, 128));
method IDriver::loadTexture. You do this like If you no longer need the texture, call texture->drop().
ITexture* texture = driver->loadTexture("example.jpg"); If you want to load a texture, you may want to call imaginable
You will not have to drop the pointer to the loaded texture, method IDriver::loadTexture. You do this like
because the name of the method does not start with 'create'. ITexture* texture = driver->loadTexture("example.jpg");
The texture is stored somewhere by the driver. You will not have to drop the pointer to the loaded texture,
\return True, if the object was deleted. */ because the name of the method does not start with 'create'.
bool drop() const The texture is stored somewhere by the driver.
{ \return True, if the object was deleted. */
// someone is doing bad reference counting. bool drop() const
_IRR_DEBUG_BREAK_IF(ReferenceCounter <= 0) {
// someone is doing bad reference counting.
--ReferenceCounter; _IRR_DEBUG_BREAK_IF(ReferenceCounter <= 0)
if (!ReferenceCounter) {
delete this; --ReferenceCounter;
return true; if (!ReferenceCounter)
} {
delete this;
return false; return true;
} }
//! Get the reference count. return false;
/** \return Current value of the reference counter. */ }
s32 getReferenceCount() const
{ //! Get the reference count.
return ReferenceCounter; /** \return Current value of the reference counter. */
} s32 getReferenceCount() const
{
//! Returns the debug name of the object. return ReferenceCounter;
/** The Debugname may only be set and changed by the object }
itself. This method should only be used in Debug mode.
\return Returns a string, previously set by setDebugName(); */ //! Returns the debug name of the object.
const c8 *getDebugName() const /** The Debugname may only be set and changed by the object
{ itself. This method should only be used in Debug mode.
return DebugName; \return Returns a string, previously set by setDebugName(); */
} const c8* getDebugName() const
{
protected: return DebugName;
//! 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. protected:
\param newName: New debug name to set. */
void setDebugName(const c8 *newName) //! Sets the debug name of the object.
{ /** The Debugname may only be set and changed by the object
DebugName = newName; itself. This method should only be used in Debug mode.
} \param newName: New debug name to set. */
void setDebugName(const c8* newName)
private: {
//! The debug name. DebugName = newName;
const c8 *DebugName; }
//! The reference counter. Mutable to do reference counting on const objects. private:
mutable s32 ReferenceCounter;
}; //! The debug name.
const c8* DebugName;
} // end namespace irr
//! The reference counter. Mutable to do reference counting on const objects.
mutable s32 ReferenceCounter;
};
} // end namespace irr
#endif

View File

@ -1,119 +1,129 @@
// Copyright (C) 2015 Patryk Nadrowski // Copyright (C) 2015 Patryk Nadrowski
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "irrArray.h" #include "EDriverTypes.h"
#include "irrArray.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
class ITexture; {
class ITexture;
//! Enumeration of cube texture surfaces
enum E_CUBE_SURFACE //! Enumeration of cube texture surfaces
{ enum E_CUBE_SURFACE
ECS_POSX = 0, {
ECS_NEGX, ECS_POSX = 0,
ECS_POSY, ECS_NEGX,
ECS_NEGY, ECS_POSY,
ECS_POSZ, ECS_NEGY,
ECS_NEGZ ECS_POSZ,
}; ECS_NEGZ
};
//! Interface of a Render Target.
class IRenderTarget : public virtual IReferenceCounted //! Interface of a Render Target.
{ class IRenderTarget : public virtual IReferenceCounted
public: {
//! constructor public:
IRenderTarget() :
DepthStencil(0), DriverType(EDT_NULL) //! constructor
{ IRenderTarget() : DepthStencil(0), DriverType(EDT_NULL)
} {
}
//! Returns an array of previously set textures.
const core::array<ITexture *> &getTexture() const //! Returns an array of previously set textures.
{ const core::array<ITexture*>& getTexture() const
return Textures; {
} return Textures;
}
//! Returns a of previously set depth / depth-stencil texture.
ITexture *getDepthStencil() const //! Returns a of previously set depth / depth-stencil texture.
{ ITexture* getDepthStencil() const
return DepthStencil; {
} return DepthStencil;
}
//! Returns an array of active surface for cube textures
const core::array<E_CUBE_SURFACE> &getCubeSurfaces() const //! Returns an array of active surface for cube textures
{ const core::array<E_CUBE_SURFACE>& getCubeSurfaces() const
return CubeSurfaces; {
} return CubeSurfaces;
}
//! Set multiple textures.
/** Set multiple textures for the render target. //! Set multiple textures.
\param texture Array of texture objects. These textures are used for a color outputs. /** Set multiple textures for the render target.
\param depthStencil Depth or packed depth-stencil texture. This texture is used as depth \param texture Array of texture objects. These textures are used for a color outputs.
or depth-stencil buffer. You can pass getDepthStencil() if you don't want to change it. \param depthStencil Depth or packed depth-stencil texture. This texture is used as depth
\param cubeSurfaces When rendering to cube textures, set the surface to be used for each texture. Can be empty otherwise. or depth-stencil buffer. You can pass getDepthStencil() if you don't want to change it.
*/ \param cubeSurfaces When rendering to cube textures, set the surface to be used for each texture. Can be empty otherwise.
void setTexture(const core::array<ITexture *> &texture, ITexture *depthStencil, const core::array<E_CUBE_SURFACE> &cubeSurfaces = core::array<E_CUBE_SURFACE>()) */
{ void setTexture(const core::array<ITexture*>& texture, ITexture* depthStencil, const core::array<E_CUBE_SURFACE>& cubeSurfaces = core::array<E_CUBE_SURFACE>())
setTextures(texture.const_pointer(), texture.size(), depthStencil, cubeSurfaces.const_pointer(), cubeSurfaces.size()); {
} setTextures(texture.const_pointer(), texture.size(), depthStencil, cubeSurfaces.const_pointer(), cubeSurfaces.size());
}
//! Sets one texture + depthStencil
//! You can pass getDepthStencil() for depthStencil if you don't want to change that one //! Sets one texture + depthStencil
void setTexture(ITexture *texture, ITexture *depthStencil) //! You can pass getDepthStencil() for depthStencil if you don't want to change that one
{ void setTexture(ITexture* texture, ITexture* depthStencil)
if (texture) { {
setTextures(&texture, 1, depthStencil); if ( texture )
} else { {
setTextures(0, 0, depthStencil); setTextures(&texture, 1, depthStencil);
} }
} else
{
//! Set one cube surface texture. setTextures(0, 0, depthStencil);
void setTexture(ITexture *texture, ITexture *depthStencil, E_CUBE_SURFACE cubeSurface) }
{ }
if (texture) {
setTextures(&texture, 1, depthStencil, &cubeSurface, 1); //! Set one cube surface texture.
} else { void setTexture(ITexture* texture, ITexture* depthStencil, E_CUBE_SURFACE cubeSurface)
setTextures(0, 0, depthStencil, &cubeSurface, 1); {
} if ( texture )
} {
setTextures(&texture, 1, depthStencil, &cubeSurface, 1);
//! Get driver type of render target. }
E_DRIVER_TYPE getDriverType() const else
{ {
return DriverType; setTextures(0, 0, depthStencil, &cubeSurface, 1);
} }
}
protected:
//! Set multiple textures. //! Get driver type of render target.
// NOTE: working with pointers instead of arrays to avoid unnecessary memory allocations for the single textures case E_DRIVER_TYPE getDriverType() const
virtual void setTextures(ITexture *const *textures, u32 numTextures, ITexture *depthStencil, const E_CUBE_SURFACE *cubeSurfaces = 0, u32 numCubeSurfaces = 0) = 0; {
return DriverType;
//! Textures assigned to render target. }
core::array<ITexture *> Textures;
protected:
//! Depth or packed depth-stencil texture assigned to render target.
ITexture *DepthStencil; //! Set multiple textures.
// NOTE: working with pointers instead of arrays to avoid unnecessary memory allocations for the single textures case
//! Active surface of cube textures virtual void setTextures(ITexture* const * textures, u32 numTextures, ITexture* depthStencil, const E_CUBE_SURFACE* cubeSurfaces=0, u32 numCubeSurfaces=0) = 0;
core::array<E_CUBE_SURFACE> CubeSurfaces;
//! Textures assigned to render target.
//! Driver type of render target. core::array<ITexture*> Textures;
E_DRIVER_TYPE DriverType;
//! Depth or packed depth-stencil texture assigned to render target.
private: ITexture* DepthStencil;
// no copying (IReferenceCounted still allows that for reasons which take some time to work around)
IRenderTarget(const IRenderTarget &); //! Active surface of cube textures
IRenderTarget &operator=(const IRenderTarget &); core::array<E_CUBE_SURFACE> CubeSurfaces;
};
//! Driver type of render target.
} E_DRIVER_TYPE DriverType;
}
private:
// no copying (IReferenceCounted still allows that for reasons which take some time to work around)
IRenderTarget(const IRenderTarget&);
IRenderTarget& operator=(const IRenderTarget&);
};
}
}
#endif

View File

@ -1,33 +1,38 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // 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" #include "IReferenceCounted.h"
#include "line3d.h" #include "position2d.h"
#include "line3d.h"
namespace irr
{ namespace irr
{
namespace scene
{ namespace scene
class ICameraSceneNode; {
class ICameraSceneNode;
class ISceneCollisionManager : public virtual IReferenceCounted
{ class ISceneCollisionManager : public virtual IReferenceCounted
public: {
//! Returns a 3d ray which would go through the 2d screen coordinates. public:
/** \param pos: Screen coordinates in pixels.
\param camera: Camera from which the ray starts. If null, the //! Returns a 3d ray which would go through the 2d screen coordinates.
active camera is used. /** \param pos: Screen coordinates in pixels.
\return Ray starting from the position of the camera and ending \param camera: Camera from which the ray starts. If null, the
at a length of the far value of the camera at a position which active camera is used.
would be behind the 2d screen coordinates. */ \return Ray starting from the position of the camera and ending
virtual core::line3d<f32> getRayFromScreenCoordinates( at a length of the far value of the camera at a position which
const core::position2d<s32> &pos, const ICameraSceneNode *camera = 0) = 0; 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 };
} // end namespace scene
} // end namespace irr
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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