Compare commits

..

No commits in common. "master" and "1.9.0mt14" have entirely different histories.

424 changed files with 63294 additions and 62102 deletions

View File

@ -10,7 +10,7 @@ jobs:
linux-gl: linux-gl:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update sudo apt-get update
@ -30,7 +30,7 @@ jobs:
make DESTDIR=$PWD/_install install make DESTDIR=$PWD/_install install
tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local . tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local .
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v3
with: with:
name: irrlicht-linux name: irrlicht-linux
path: ./irrlicht-linux.tar.gz path: ./irrlicht-linux.tar.gz
@ -39,7 +39,7 @@ jobs:
# Xvfb test is broken on 20.04 for unknown reasons (not our bug) # Xvfb test is broken on 20.04 for unknown reasons (not our bug)
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update sudo apt-get update
@ -63,7 +63,7 @@ jobs:
linux-sdl: linux-sdl:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update sudo apt-get update
@ -71,7 +71,7 @@ jobs:
- 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)
@ -83,7 +83,7 @@ jobs:
# Xvfb test is broken on 20.04 for unknown reasons (not our bug) # Xvfb test is broken on 20.04 for unknown reasons (not our bug)
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update sudo apt-get update
@ -107,7 +107,7 @@ jobs:
linux-sdl-gles2: linux-sdl-gles2:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update sudo apt-get update
@ -140,21 +140,21 @@ 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 ./scripts/ci-get-mingw.sh ${{matrix.config.arch}}
- 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 +162,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: |
@ -183,14 +180,11 @@ jobs:
macos-sdl: macos-sdl:
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 sdl2 brew install cmake libpng jpeg sdl2
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Build - name: Build
run: | run: |
@ -203,7 +197,7 @@ jobs:
env: env:
VCPKG_VERSION: 8eb57355a4ffb410a2e94c07b4dca2dffbee8e50 VCPKG_VERSION: 8eb57355a4ffb410a2e94c07b4dca2dffbee8e50
# 2023.10.19 # 2023.10.19
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 +214,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 +221,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 +254,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 }}

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.12) cmake_minimum_required(VERSION 3.12)
set(IRRLICHTMT_REVISION 15) set(IRRLICHTMT_REVISION 14)
project(Irrlicht project(Irrlicht
VERSION 1.9.0.${IRRLICHTMT_REVISION} VERSION 1.9.0.${IRRLICHTMT_REVISION}
@ -35,7 +35,7 @@ endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
enable_testing() enable_testing()
add_subdirectory(src) add_subdirectory(source/Irrlicht)
add_subdirectory(test) add_subdirectory(test)
option(BUILD_EXAMPLES "Build example applications" FALSE) option(BUILD_EXAMPLES "Build example applications" FALSE)

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()

View File

@ -1,14 +1,6 @@
IrrlichtMt version 1.9 IrrlichtMt version 1.9
====================== ======================
Notice
------
IrrlichtMt has been moved into the [main Minetest repository](https://github.com/minetest) during Minetest 5.9 development. This repository is an archive useful for building older versions of Minetest.
About
-----
IrrlichtMt is the 3D engine of [Minetest](https://github.com/minetest). 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 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.
@ -23,7 +15,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 +23,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 +40,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:

View File

@ -28,14 +28,14 @@ static video::E_DRIVER_TYPE chooseDriver(core::stringc arg_)
static inline void check(bool ok, const char *msg) static inline void check(bool ok, const char *msg)
{ {
if (!ok) { if (!ok)
{
test_fail++; test_fail++;
device->getLogger()->log((core::stringc("FAILED TEST: ") + msg).c_str(), ELL_ERROR); 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();
@ -72,33 +72,35 @@ int main(int argc, char *argv[])
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"); {
video::ITexture* tex = driver->getTexture(mediaPath + "cooltexture.png");
check(tex, "texture loading"); check(tex, "texture loading");
scene::IAnimatedMeshSceneNode *node = smgr->addAnimatedMeshSceneNode(mesh); scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
if (node) { if (node)
node->forEachMaterial([tex](video::SMaterial &mat) { {
node->forEachMaterial([tex] (video::SMaterial &mat) {
mat.Lighting = false; mat.Lighting = false;
mat.setTexture(0, tex); mat.setTexture(0, tex);
}); });
@ -107,26 +109,31 @@ int main(int argc, char *argv[])
} }
} }
smgr->addCameraSceneNode(0, core::vector3df(0, 4, 5), core::vector3df(0, 2, 0)); smgr->addCameraSceneNode(0, core::vector3df(0,4,5), core::vector3df(0,2,0));
s32 n = 0; s32 n = 0;
SEvent event; SEvent event;
device->getTimer()->start(); device->getTimer()->start();
while (device->run()) { while (device->run())
if (device->getTimer()->getTime() >= 1000) { {
if (device->getTimer()->getTime() >= 1000)
{
device->getTimer()->setTime(0); device->getTimer()->setTime(0);
++n; ++n;
if (n == 1) { // Tooltip display if (n == 1) // Tooltip display
{
bzero(&event, sizeof(SEvent)); bzero(&event, sizeof(SEvent));
event.EventType = irr::EET_MOUSE_INPUT_EVENT; event.EventType = irr::EET_MOUSE_INPUT_EVENT;
event.MouseInput.Event = irr::EMIE_MOUSE_MOVED; event.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
event.MouseInput.X = button->getAbsolutePosition().getCenter().X; event.MouseInput.X = button->getAbsolutePosition().getCenter().X;
event.MouseInput.Y = button->getAbsolutePosition().getCenter().Y; event.MouseInput.Y = button->getAbsolutePosition().getCenter().Y;
device->postEventFromUser(event); device->postEventFromUser(event);
} else if (n == 2) // Text input focus }
else if (n == 2) // Text input focus
guienv->setFocus(editbox); guienv->setFocus(editbox);
else if (n == 3) { // Keypress for Text input else if (n == 3) // Keypress for Text input
{
bzero(&event, sizeof(SEvent)); bzero(&event, sizeof(SEvent));
event.EventType = irr::EET_KEY_INPUT_EVENT; event.EventType = irr::EET_KEY_INPUT_EVENT;
event.KeyInput.Char = L'a'; event.KeyInput.Char = L'a';
@ -135,12 +142,13 @@ int main(int argc, char *argv[])
device->postEventFromUser(event); device->postEventFromUser(event);
event.KeyInput.PressedDown = false; event.KeyInput.PressedDown = false;
device->postEventFromUser(event); device->postEventFromUser(event);
} else }
else
device->closeDevice(); device->closeDevice();
} }
driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH,
video::SColor(255, 100, 100, 150)); video::SColor(255,100,100,150));
smgr->drawAll(); smgr->drawAll();
guienv->drawAll(); guienv->drawAll();
driver->endScene(); driver->endScene();

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,13 +3,11 @@
#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)) { \
@ -17,12 +15,11 @@ class TestFailedException : public std::exception
<< "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 \ << " actual: " << a << std::endl << " expected: " \
<< " expected: " \
<< e << std::endl; \ << e << std::endl; \
throw TestFailedException(); \ 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)

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,7 +163,7 @@ 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()
@ -180,9 +180,9 @@ static void test_conv()
wStringToUTF8(out2, L"†††"); wStringToUTF8(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 // locale-dependent

View File

@ -2,7 +2,8 @@
// 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 "irrArray.h"
#include "IMeshBuffer.h" #include "IMeshBuffer.h"
@ -11,48 +12,56 @@ namespace irr
{ {
namespace scene namespace scene
{ {
//! Template implementation of the IMeshBuffer interface //! Template implementation of the IMeshBuffer interface
template <class T> template <class T>
class CMeshBuffer : public IMeshBuffer class CMeshBuffer : public IMeshBuffer
{ {
public: public:
//! Default constructor for empty meshbuffer //! Default constructor for empty meshbuffer
CMeshBuffer() : CMeshBuffer()
ChangedID_Vertex(1), ChangedID_Index(1), MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER), HWBuffer(NULL), PrimitiveType(EPT_TRIANGLES) : ChangedID_Vertex(1), ChangedID_Index(1)
, MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)
, HWBuffer(NULL)
, PrimitiveType(EPT_TRIANGLES)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CMeshBuffer"); setDebugName("CMeshBuffer");
#endif #endif
} }
//! Get material of this meshbuffer //! Get material of this meshbuffer
/** \return Material of this buffer */ /** \return Material of this buffer */
const video::SMaterial &getMaterial() const override const video::SMaterial& getMaterial() const override
{ {
return Material; return Material;
} }
//! Get material of this meshbuffer //! Get material of this meshbuffer
/** \return Material of this buffer */ /** \return Material of this buffer */
video::SMaterial &getMaterial() override video::SMaterial& getMaterial() override
{ {
return Material; return Material;
} }
//! Get pointer to vertices //! Get pointer to vertices
/** \return Pointer to vertices. */ /** \return Pointer to vertices. */
const void *getVertices() const override const void* getVertices() const override
{ {
return Vertices.const_pointer(); return Vertices.const_pointer();
} }
//! Get pointer to vertices //! Get pointer to vertices
/** \return Pointer to vertices. */ /** \return Pointer to vertices. */
void *getVertices() override void* getVertices() override
{ {
return Vertices.pointer(); return Vertices.pointer();
} }
//! Get number of vertices //! Get number of vertices
/** \return Number of vertices. */ /** \return Number of vertices. */
u32 getVertexCount() const override u32 getVertexCount() const override
@ -69,18 +78,20 @@ public:
//! Get pointer to indices //! Get pointer to indices
/** \return Pointer to indices. */ /** \return Pointer to indices. */
const u16 *getIndices() const override const u16* getIndices() const override
{ {
return Indices.const_pointer(); return Indices.const_pointer();
} }
//! Get pointer to indices //! Get pointer to indices
/** \return Pointer to indices. */ /** \return Pointer to indices. */
u16 *getIndices() override u16* getIndices() override
{ {
return Indices.pointer(); return Indices.pointer();
} }
//! Get number of indices //! Get number of indices
/** \return Number of indices. */ /** \return Number of indices. */
u32 getIndexCount() const override u32 getIndexCount() const override
@ -88,33 +99,40 @@ public:
return Indices.size(); return Indices.size();
} }
//! Get the axis aligned bounding box //! Get the axis aligned bounding box
/** \return Axis aligned bounding box of this buffer. */ /** \return Axis aligned bounding box of this buffer. */
const core::aabbox3d<f32> &getBoundingBox() const override const core::aabbox3d<f32>& getBoundingBox() const override
{ {
return BoundingBox; return BoundingBox;
} }
//! Set the axis aligned bounding box //! Set the axis aligned bounding box
/** \param box New axis aligned bounding box for this buffer. */ /** \param box New axis aligned bounding box for this buffer. */
//! set user axis aligned bounding box //! set user axis aligned bounding box
void setBoundingBox(const core::aabbox3df &box) override void setBoundingBox(const core::aabbox3df& box) override
{ {
BoundingBox = box; BoundingBox = box;
} }
//! Recalculate the bounding box. //! Recalculate the bounding box.
/** should be called if the mesh changed. */ /** should be called if the mesh changed. */
void recalculateBoundingBox() override void recalculateBoundingBox() override
{ {
if (!Vertices.empty()) { if (!Vertices.empty())
{
BoundingBox.reset(Vertices[0].Pos); BoundingBox.reset(Vertices[0].Pos);
const irr::u32 vsize = Vertices.size(); const irr::u32 vsize = Vertices.size();
for (u32 i = 1; i < vsize; ++i) for (u32 i=1; i<vsize; ++i)
BoundingBox.addInternalPoint(Vertices[i].Pos); BoundingBox.addInternalPoint(Vertices[i].Pos);
} else
BoundingBox.reset(0, 0, 0);
} }
else
BoundingBox.reset(0,0,0);
}
//! Get type of vertex data stored in this buffer. //! Get type of vertex data stored in this buffer.
/** \return Type of vertex data. */ /** \return Type of vertex data. */
@ -124,47 +142,48 @@ public:
} }
//! returns position of vertex i //! returns position of vertex i
const core::vector3df &getPosition(u32 i) const override const core::vector3df& getPosition(u32 i) const override
{ {
return Vertices[i].Pos; return Vertices[i].Pos;
} }
//! returns position of vertex i //! returns position of vertex i
core::vector3df &getPosition(u32 i) override core::vector3df& getPosition(u32 i) override
{ {
return Vertices[i].Pos; return Vertices[i].Pos;
} }
//! returns normal of vertex i //! returns normal of vertex i
const core::vector3df &getNormal(u32 i) const override const core::vector3df& getNormal(u32 i) const override
{ {
return Vertices[i].Normal; return Vertices[i].Normal;
} }
//! returns normal of vertex i //! returns normal of vertex i
core::vector3df &getNormal(u32 i) override core::vector3df& getNormal(u32 i) override
{ {
return Vertices[i].Normal; return Vertices[i].Normal;
} }
//! returns texture coord of vertex i //! returns texture coord of vertex i
const core::vector2df &getTCoords(u32 i) const override const core::vector2df& getTCoords(u32 i) const override
{ {
return Vertices[i].TCoords; return Vertices[i].TCoords;
} }
//! returns texture coord of vertex i //! returns texture coord of vertex i
core::vector2df &getTCoords(u32 i) override core::vector2df& getTCoords(u32 i) override
{ {
return Vertices[i].TCoords; return Vertices[i].TCoords;
} }
//! Append the vertices and indices to the current buffer //! Append the vertices and indices to the current buffer
/** Only works for compatible types, i.e. either the same type /** Only works for compatible types, i.e. either the same type
or the main buffer is of standard type. Otherwise, behavior is or the main buffer is of standard type. Otherwise, behavior is
undefined. undefined.
*/ */
void append(const void *const vertices, u32 numVertices, const u16 *const indices, u32 numIndices) override void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) override
{ {
if (vertices == getVertices()) if (vertices == getVertices())
return; return;
@ -172,18 +191,52 @@ public:
const u32 vertexCount = getVertexCount(); const u32 vertexCount = getVertexCount();
u32 i; u32 i;
Vertices.reallocate(vertexCount + numVertices); Vertices.reallocate(vertexCount+numVertices);
for (i = 0; i < numVertices; ++i) { for (i=0; i<numVertices; ++i)
Vertices.push_back(static_cast<const T *>(vertices)[i]); {
BoundingBox.addInternalPoint(static_cast<const T *>(vertices)[i].Pos); Vertices.push_back(static_cast<const T*>(vertices)[i]);
BoundingBox.addInternalPoint(static_cast<const T*>(vertices)[i].Pos);
} }
Indices.reallocate(getIndexCount() + numIndices); Indices.reallocate(getIndexCount()+numIndices);
for (i = 0; i < numIndices; ++i) { for (i=0; i<numIndices; ++i)
Indices.push_back(indices[i] + vertexCount); {
Indices.push_back(indices[i]+vertexCount);
} }
} }
//! Append the meshbuffer to the current buffer
/** Only works for compatible types, i.e. either the same type
or the main buffer is of standard type. Otherwise, behavior is
undefined.
\param other Meshbuffer to be appended to this one.
*/
void append(const IMeshBuffer* const other) override
{
/*
if (this==other)
return;
const u32 vertexCount = getVertexCount();
u32 i;
Vertices.reallocate(vertexCount+other->getVertexCount());
for (i=0; i<other->getVertexCount(); ++i)
{
Vertices.push_back(reinterpret_cast<const T*>(other->getVertices())[i]);
}
Indices.reallocate(getIndexCount()+other->getIndexCount());
for (i=0; i<other->getIndexCount(); ++i)
{
Indices.push_back(other->getIndices()[i]+vertexCount);
}
BoundingBox.addInternalBox(other->getBoundingBox());
*/
}
//! get the current hardware mapping hint //! get the current hardware mapping hint
E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const override E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const override
{ {
@ -197,12 +250,12 @@ public:
} }
//! set the hardware mapping hint, for driver //! set the hardware mapping hint, for driver
void setHardwareMappingHint(E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer = EBT_VERTEX_AND_INDEX) override void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) override
{ {
if (Buffer == EBT_VERTEX_AND_INDEX || Buffer == EBT_VERTEX) if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
MappingHint_Vertex = NewMappingHint; MappingHint_Vertex=NewMappingHint;
if (Buffer == EBT_VERTEX_AND_INDEX || Buffer == EBT_INDEX) if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
MappingHint_Index = NewMappingHint; MappingHint_Index=NewMappingHint;
} }
//! Describe what kind of primitive geometry is used by the meshbuffer //! Describe what kind of primitive geometry is used by the meshbuffer
@ -218,32 +271,31 @@ public:
} }
//! flags the mesh as changed, reloads hardware buffers //! flags the mesh as changed, reloads hardware buffers
void setDirty(E_BUFFER_TYPE Buffer = EBT_VERTEX_AND_INDEX) override void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) override
{ {
if (Buffer == EBT_VERTEX_AND_INDEX || Buffer == EBT_VERTEX) if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
++ChangedID_Vertex; ++ChangedID_Vertex;
if (Buffer == EBT_VERTEX_AND_INDEX || Buffer == EBT_INDEX) if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
++ChangedID_Index; ++ChangedID_Index;
} }
//! Get the currently used ID for identification of changes. //! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ /** This shouldn't be used for anything outside the VideoDriver. */
u32 getChangedID_Vertex() const override { return ChangedID_Vertex; } u32 getChangedID_Vertex() const override {return ChangedID_Vertex;}
//! Get the currently used ID for identification of changes. //! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ /** This shouldn't be used for anything outside the VideoDriver. */
u32 getChangedID_Index() const override { return ChangedID_Index; } u32 getChangedID_Index() const override {return ChangedID_Index;}
void setHWBuffer(void *ptr) const override void setHWBuffer(void *ptr) const override {
{
HWBuffer = ptr; HWBuffer = ptr;
} }
void *getHWBuffer() const override void *getHWBuffer() const override {
{
return HWBuffer; return HWBuffer;
} }
u32 ChangedID_Vertex; u32 ChangedID_Vertex;
u32 ChangedID_Index; u32 ChangedID_Index;
@ -262,13 +314,17 @@ public:
core::aabbox3d<f32> BoundingBox; core::aabbox3d<f32> BoundingBox;
//! Primitive type used for rendering (triangles, lines, ...) //! Primitive type used for rendering (triangles, lines, ...)
E_PRIMITIVE_TYPE PrimitiveType; E_PRIMITIVE_TYPE PrimitiveType;
}; };
//! Standard meshbuffer //! Standard meshbuffer
typedef CMeshBuffer<video::S3DVertex> SMeshBuffer; typedef CMeshBuffer<video::S3DVertex> SMeshBuffer;
//! Meshbuffer with two texture coords per vertex, e.g. for lightmaps //! Meshbuffer with two texture coords per vertex, e.g. for lightmaps
typedef CMeshBuffer<video::S3DVertex2TCoords> SMeshBufferLightMap; typedef CMeshBuffer<video::S3DVertex2TCoords> SMeshBufferLightMap;
//! Meshbuffer with vertices having tangents stored, e.g. for normal mapping //! Meshbuffer with vertices having tangents stored, e.g. for normal mapping
typedef CMeshBuffer<video::S3DVertexTangents> SMeshBufferTangents; typedef CMeshBuffer<video::S3DVertexTangents> SMeshBufferTangents;
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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
{ {
@ -18,9 +19,75 @@ enum E_ATTRIBUTE_TYPE
// float attribute // float attribute
EAT_FLOAT, EAT_FLOAT,
// string attribute
EAT_STRING,
// boolean attribute // boolean attribute
EAT_BOOL, EAT_BOOL,
// enumeration attribute
EAT_ENUM,
// color attribute
EAT_COLOR,
// floating point color attribute
EAT_COLORF,
// 3d vector attribute
EAT_VECTOR3D,
// 2d position attribute
EAT_POSITION2D,
// vector 2d attribute
EAT_VECTOR2D,
// rectangle attribute
EAT_RECT,
// matrix attribute
EAT_MATRIX,
// quaternion attribute
EAT_QUATERNION,
// 3d bounding box
EAT_BBOX,
// plane
EAT_PLANE,
// 3d triangle
EAT_TRIANGLE3D,
// line 2d
EAT_LINE2D,
// line 3d
EAT_LINE3D,
// array of stringws attribute
EAT_STRINGWARRAY,
// array of float
EAT_FLOATARRAY,
// array of int
EAT_INTARRAY,
// binary data attribute
EAT_BINARY,
// texture reference attribute
EAT_TEXTURE,
// user pointer void*
EAT_USER_POINTER,
// dimension attribute
EAT_DIMENSION2D,
// known attribute type count // known attribute type count
EAT_COUNT, EAT_COUNT,
@ -30,3 +97,5 @@ enum E_ATTRIBUTE_TYPE
} // end namespace io } // end namespace io
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,25 +12,30 @@ namespace irr
namespace scene namespace scene
{ {
//! An enumeration for all types of automatic culling for built-in scene nodes //! An enumeration for all types of automatic culling for built-in scene nodes
enum E_CULLING_TYPE enum E_CULLING_TYPE
{ {
EAC_OFF = 0, EAC_OFF = 0,
EAC_BOX = 1, EAC_BOX = 1,
EAC_FRUSTUM_BOX = 2, EAC_FRUSTUM_BOX = 2,
EAC_FRUSTUM_SPHERE = 4, EAC_FRUSTUM_SPHERE = 4,
EAC_OCC_QUERY = 8 EAC_OCC_QUERY = 8
}; };
//! Names for culling type //! Names for culling type
const c8 *const AutomaticCullingNames[] = { const c8* const AutomaticCullingNames[] =
{
"false", "false",
"box", // camera box against node box "box", // camera box against node box
"frustum_box", // camera frustum against node box "frustum_box", // camera frustum against node box
"frustum_sphere", // camera frustum against node sphere "frustum_sphere", // camera frustum against node sphere
"occ_query", // occlusion query "occ_query", // occlusion query
0, 0
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif // __E_CULLING_TYPES_H_INCLUDED__

View File

@ -2,16 +2,17 @@
// 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) //! An enumeration for all types of debug data for built-in scene nodes (flags)
enum E_DEBUG_SCENE_TYPE enum E_DEBUG_SCENE_TYPE
{ {
//! No Debug Data ( Default ) //! No Debug Data ( Default )
EDS_OFF = 0, EDS_OFF = 0,
@ -35,7 +36,12 @@ enum E_DEBUG_SCENE_TYPE
//! Show all debug infos //! Show all debug infos
EDS_FULL = 0xffffffff EDS_FULL = 0xffffffff
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif // __E_DEBUG_SCENE_TYPES_H_INCLUDED__

View File

@ -2,14 +2,15 @@
// 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. //! An enum for the different device types supported by the Irrlicht Engine.
enum E_DEVICE_TYPE enum E_DEVICE_TYPE
{ {
//! A device native to Microsoft Windows //! A device native to Microsoft Windows
/** This device uses the Win32 API and works in all versions of Windows. */ /** This device uses the Win32 API and works in all versions of Windows. */
@ -41,6 +42,9 @@ enum E_DEVICE_TYPE
Does not need X11 or other graphical subsystems. Does not need X11 or other graphical subsystems.
May support hw-acceleration via OpenGL-ES */ May support hw-acceleration via OpenGL-ES */
EIDT_ANDROID, EIDT_ANDROID,
}; };
} // end namespace irr } // end namespace irr
#endif // __E_DEVICE_TYPES_H_INCLUDED__

View File

@ -2,16 +2,17 @@
// 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. //! enumeration for querying features of the video driver.
enum E_VIDEO_DRIVER_FEATURE enum E_VIDEO_DRIVER_FEATURE
{ {
//! Is driver able to render to a surface? //! Is driver able to render to a surface?
EVDF_RENDER_TO_TARGET = 0, EVDF_RENDER_TO_TARGET = 0,
@ -131,7 +132,11 @@ enum E_VIDEO_DRIVER_FEATURE
//! Only used for counting the elements of this enum //! Only used for counting the elements of this enum
EVDF_COUNT EVDF_COUNT
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,9 +12,9 @@ namespace irr
namespace video namespace video
{ {
//! An enum for all types of drivers the Irrlicht Engine supports. //! An enum for all types of drivers the Irrlicht Engine supports.
enum E_DRIVER_TYPE enum E_DRIVER_TYPE
{ {
//! Null driver, useful for applications to run the engine without visualization. //! Null driver, useful for applications to run the engine without visualization.
/** The null device is able to load textures, but does not /** The null device is able to load textures, but does not
render and display any graphics. */ render and display any graphics. */
@ -38,7 +39,10 @@ enum E_DRIVER_TYPE
//! No driver, just for counting the elements //! No driver, just for counting the elements
EDT_COUNT EDT_COUNT
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -1,7 +1,8 @@
// 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
{ {
@ -32,3 +33,6 @@ enum EFOCUS_FLAG
} // namespace gui } // namespace gui
} // namespace irr } // namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -13,7 +14,7 @@ namespace gui
enum EGUI_ALIGNMENT enum EGUI_ALIGNMENT
{ {
//! Aligned to parent's top or left side (default) //! Aligned to parent's top or left side (default)
EGUIA_UPPERLEFT = 0, EGUIA_UPPERLEFT=0,
//! Aligned to parent's bottom or right side //! Aligned to parent's bottom or right side
EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT,
//! Aligned to the center of parent //! Aligned to the center of parent
@ -23,13 +24,16 @@ enum EGUI_ALIGNMENT
}; };
//! Names for alignments //! Names for alignments
const c8 *const GUIAlignmentNames[] = { const c8* const GUIAlignmentNames[] =
{
"upperLeft", "upperLeft",
"lowerRight", "lowerRight",
"center", "center",
"scale", "scale",
0, 0
}; };
} // namespace gui } // namespace gui
} // namespace irr } // namespace irr
#endif // __E_GUI_ALIGNMENT_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// 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"
@ -99,7 +100,8 @@ enum EGUI_ELEMENT_TYPE
}; };
//! Names for built-in element types //! Names for built-in element types
const c8 *const GUIElementTypeNames[] = { const c8* const GUIElementTypeNames[] =
{
"button", "button",
"checkBox", "checkBox",
"comboBox", "comboBox",
@ -126,8 +128,14 @@ const c8 *const GUIElementTypeNames[] = {
"element", "element",
"root", "root",
"profiler", "profiler",
0, 0
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,17 +2,18 @@
// 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 //! Don't store on the hardware
EHM_NEVER = 0, EHM_NEVER=0,
//! Rarely changed, usually stored completely on the hardware //! Rarely changed, usually stored completely on the hardware
EHM_STATIC, EHM_STATIC,
@ -22,19 +23,22 @@ enum E_HARDWARE_MAPPING
//! Always changed, cache optimizing on the GPU //! Always changed, cache optimizing on the GPU
EHM_STREAM EHM_STREAM
}; };
enum E_BUFFER_TYPE enum E_BUFFER_TYPE
{ {
//! Does not change anything //! Does not change anything
EBT_NONE = 0, EBT_NONE=0,
//! Change the vertex mapping //! Change the vertex mapping
EBT_VERTEX, EBT_VERTEX,
//! Change the index mapping //! Change the index mapping
EBT_INDEX, EBT_INDEX,
//! Change both vertex and index mapping to the same value //! Change both vertex and index mapping to the same value
EBT_VERTEX_AND_INDEX EBT_VERTEX_AND_INDEX
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,16 +2,17 @@
// 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 //! Material properties
enum E_MATERIAL_PROP enum E_MATERIAL_PROP
{ {
//! Corresponds to SMaterial::Wireframe. //! Corresponds to SMaterial::Wireframe.
EMP_WIREFRAME = 0x1, EMP_WIREFRAME = 0x1,
@ -76,7 +77,11 @@ enum E_MATERIAL_PROP
//! Corresponds to SMaterial::BlendFactor. //! Corresponds to SMaterial::BlendFactor.
EMP_BLEND_FACTOR = 0x100000, EMP_BLEND_FACTOR = 0x100000,
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif // __E_MATERIAL_PROPS_H_INCLUDED__

View File

@ -2,18 +2,17 @@
// 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. */
@ -55,20 +54,22 @@ enum E_MATERIAL_TYPE
//! 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 =
sizeof(sBuiltInMaterialTypeNames) / sizeof(char *) - 1;
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif // __E_MATERIAL_TYPES_H_INCLUDED__

View File

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

View File

@ -2,18 +2,19 @@
// 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. //! Enumeration for all primitive types there are.
enum E_PRIMITIVE_TYPE enum E_PRIMITIVE_TYPE
{ {
//! All vertices are non-connected points. //! All vertices are non-connected points.
EPT_POINTS = 0, EPT_POINTS=0,
//! All vertices form a single connected line. //! All vertices form a single connected line.
EPT_LINE_STRIP, EPT_LINE_STRIP,
@ -37,7 +38,10 @@ enum E_PRIMITIVE_TYPE
//! The single vertices are expanded to quad billboards on the GPU. //! The single vertices are expanded to quad billboards on the GPU.
EPT_POINT_SPRITES EPT_POINT_SPRITES
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,20 +12,23 @@ namespace irr
namespace io namespace io
{ {
//! An enumeration for different class types implementing IReadFile //! An enumeration for different class types implementing IReadFile
enum EREAD_FILE_TYPE enum EREAD_FILE_TYPE
{ {
//! CReadFile //! CReadFile
ERFT_READ_FILE = MAKE_IRR_ID('r', 'e', 'a', 'd'), ERFT_READ_FILE = MAKE_IRR_ID('r','e','a','d'),
//! CMemoryReadFile //! CMemoryReadFile
ERFT_MEMORY_READ_FILE = MAKE_IRR_ID('r', 'm', 'e', 'm'), ERFT_MEMORY_READ_FILE = MAKE_IRR_ID('r','m','e','m'),
//! CLimitReadFile //! CLimitReadFile
ERFT_LIMIT_READ_FILE = MAKE_IRR_ID('r', 'l', 'i', 'm'), ERFT_LIMIT_READ_FILE = MAKE_IRR_ID('r','l','i','m'),
//! Unknown type //! Unknown type
EFIT_UNKNOWN = MAKE_IRR_ID('u', 'n', 'k', 'n') EFIT_UNKNOWN = MAKE_IRR_ID('u','n','k','n')
}; };
} // end namespace io } // end namespace io
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,39 +12,45 @@ namespace irr
namespace scene namespace scene
{ {
//! An enumeration for all types of built-in scene nodes //! An enumeration for all types of built-in scene nodes
/** A scene node type is represented by a four character code /** A scene node type is represented by a four character code
such as 'cube' or 'mesh' instead of simple numbers, to avoid such as 'cube' or 'mesh' instead of simple numbers, to avoid
name clashes with external scene nodes.*/ name clashes with external scene nodes.*/
enum ESCENE_NODE_TYPE enum ESCENE_NODE_TYPE
{ {
//! of type CSceneManager (note that ISceneManager is not(!) an ISceneNode) //! of type CSceneManager (note that ISceneManager is not(!) an ISceneNode)
ESNT_SCENE_MANAGER = MAKE_IRR_ID('s', 'm', 'n', 'g'), ESNT_SCENE_MANAGER = MAKE_IRR_ID('s','m','n','g'),
//! Mesh Scene Node //! Mesh Scene Node
ESNT_MESH = MAKE_IRR_ID('m', 'e', 's', 'h'), ESNT_MESH = MAKE_IRR_ID('m','e','s','h'),
//! Empty Scene Node //! Empty Scene Node
ESNT_EMPTY = MAKE_IRR_ID('e', 'm', 't', 'y'), ESNT_EMPTY = MAKE_IRR_ID('e','m','t','y'),
//! Dummy Transformation Scene Node //! Dummy Transformation Scene Node
ESNT_DUMMY_TRANSFORMATION = MAKE_IRR_ID('d', 'm', 'm', 'y'), ESNT_DUMMY_TRANSFORMATION = MAKE_IRR_ID('d','m','m','y'),
//! Camera Scene Node //! Camera Scene Node
ESNT_CAMERA = MAKE_IRR_ID('c', 'a', 'm', '_'), ESNT_CAMERA = MAKE_IRR_ID('c','a','m','_'),
//! Billboard Scene Node //! Billboard Scene Node
ESNT_BILLBOARD = MAKE_IRR_ID('b', 'i', 'l', 'l'), ESNT_BILLBOARD = MAKE_IRR_ID('b','i','l','l'),
//! Animated Mesh Scene Node //! Animated Mesh Scene Node
ESNT_ANIMATED_MESH = MAKE_IRR_ID('a', 'm', 's', 'h'), ESNT_ANIMATED_MESH = MAKE_IRR_ID('a','m','s','h'),
//! Unknown scene node //! Unknown scene node
ESNT_UNKNOWN = MAKE_IRR_ID('u', 'n', 'k', 'n'), ESNT_UNKNOWN = MAKE_IRR_ID('u','n','k','n'),
//! Will match with any scene node when checking types //! Will match with any scene node when checking types
ESNT_ANY = MAKE_IRR_ID('a', 'n', 'y', '_') ESNT_ANY = MAKE_IRR_ID('a','n','y','_')
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -1,4 +1,5 @@
#pragma once #ifndef __E_SHADER_TYPES_H_INCLUDED__
#define __E_SHADER_TYPES_H_INCLUDED__
#include "irrTypes.h" #include "irrTypes.h"
@ -23,7 +24,7 @@ enum E_VERTEX_SHADER_TYPE
}; };
//! Names for all vertex shader types, each entry corresponds to a E_VERTEX_SHADER_TYPE entry. //! Names for all vertex shader types, each entry corresponds to a E_VERTEX_SHADER_TYPE entry.
const c8 *const VERTEX_SHADER_TYPE_NAMES[] = { const c8* const VERTEX_SHADER_TYPE_NAMES[] = {
"vs_1_1", "vs_1_1",
"vs_2_0", "vs_2_0",
"vs_2_a", "vs_2_a",
@ -31,7 +32,7 @@ const c8 *const VERTEX_SHADER_TYPE_NAMES[] = {
"vs_4_0", "vs_4_0",
"vs_4_1", "vs_4_1",
"vs_5_0", "vs_5_0",
0}; 0 };
//! Compile target enumeration for the addHighLevelShaderMaterial() method. //! Compile target enumeration for the addHighLevelShaderMaterial() method.
enum E_PIXEL_SHADER_TYPE enum E_PIXEL_SHADER_TYPE
@ -53,7 +54,7 @@ enum E_PIXEL_SHADER_TYPE
}; };
//! Names for all pixel shader types, each entry corresponds to a E_PIXEL_SHADER_TYPE entry. //! Names for all pixel shader types, each entry corresponds to a E_PIXEL_SHADER_TYPE entry.
const c8 *const PIXEL_SHADER_TYPE_NAMES[] = { const c8* const PIXEL_SHADER_TYPE_NAMES[] = {
"ps_1_1", "ps_1_1",
"ps_1_2", "ps_1_2",
"ps_1_3", "ps_1_3",
@ -65,7 +66,7 @@ const c8 *const PIXEL_SHADER_TYPE_NAMES[] = {
"ps_4_0", "ps_4_0",
"ps_4_1", "ps_4_1",
"ps_5_0", "ps_5_0",
0}; 0 };
//! Enum for supported geometry shader types //! Enum for supported geometry shader types
enum E_GEOMETRY_SHADER_TYPE enum E_GEOMETRY_SHADER_TYPE
@ -77,9 +78,13 @@ enum E_GEOMETRY_SHADER_TYPE
}; };
//! String names for supported geometry shader types //! String names for supported geometry shader types
const c8 *const GEOMETRY_SHADER_TYPE_NAMES[] = { const c8* const GEOMETRY_SHADER_TYPE_NAMES[] = {
"gs_4_0", "gs_4_0",
0}; 0 };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif // __E_SHADER_TYPES_H_INCLUDED__

View File

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

View File

@ -2,7 +2,8 @@
// 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 "aabbox3d.h"
#include "IMesh.h" #include "IMesh.h"
@ -11,14 +12,15 @@ namespace irr
{ {
namespace scene namespace scene
{ {
//! Interface for an animated mesh. //! Interface for an animated mesh.
/** There are already simple implementations of this interface available so /** There are already simple implementations of this interface available so
you don't have to implement this interface on your own if you need to: you don't have to implement this interface on your own if you need to:
You might want to use irr::scene::SAnimatedMesh, irr::scene::SMesh, You might want to use irr::scene::SAnimatedMesh, irr::scene::SMesh,
irr::scene::SMeshBuffer etc. */ irr::scene::SMeshBuffer etc. */
class IAnimatedMesh : public IMesh class IAnimatedMesh : public IMesh
{ {
public: public:
//! Gets the frame count of the animated mesh. //! Gets the frame count of the animated mesh.
/** Note that the play-time is usually getFrameCount()-1 as it stops as soon as the last frame-key is reached. /** 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, \return The amount of frames. If the amount is 1,
@ -36,7 +38,7 @@ public:
animation with by default. If the amount is 0, animation with by default. If the amount is 0,
it is not animated. The actual speed is set in the it is not animated. The actual speed is set in the
scene node the mesh is instantiated in.*/ scene node the mesh is instantiated in.*/
virtual void setAnimationSpeed(f32 fps) = 0; virtual void setAnimationSpeed(f32 fps) =0;
//! Returns the IMesh interface for a frame. //! Returns the IMesh interface for a frame.
/** \param frame: Frame number as zero based index. The maximum /** \param frame: Frame number as zero based index. The maximum
@ -51,7 +53,7 @@ public:
If startFrameLoop and endFrameLoop are both -1, they are ignored. If startFrameLoop and endFrameLoop are both -1, they are ignored.
\param endFrameLoop: see startFrameLoop. \param endFrameLoop: see startFrameLoop.
\return Returns the animated mesh based on a detail level. */ \return Returns the animated mesh based on a detail level. */
virtual IMesh *getMesh(s32 frame, s32 detailLevel = 255, s32 startFrameLoop = -1, s32 endFrameLoop = -1) = 0; virtual IMesh* getMesh(s32 frame, s32 detailLevel=255, s32 startFrameLoop=-1, s32 endFrameLoop=-1) = 0;
//! Returns the type of the animated mesh. //! Returns the type of the animated mesh.
/** In most cases it is not necessary to use this method. /** In most cases it is not necessary to use this method.
@ -63,7 +65,10 @@ public:
{ {
return EAMT_UNKNOWN; return EAMT_UNKNOWN;
} }
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "ISceneNode.h"
#include "IBoneSceneNode.h" #include "IBoneSceneNode.h"
@ -12,8 +13,8 @@ namespace irr
{ {
namespace scene namespace scene
{ {
enum E_JOINT_UPDATE_ON_RENDER enum E_JOINT_UPDATE_ON_RENDER
{ {
//! do nothing //! do nothing
EJUOR_NONE = 0, EJUOR_NONE = 0,
@ -22,35 +23,38 @@ enum E_JOINT_UPDATE_ON_RENDER
//! control joint positions in the mesh (eg. ragdolls, or set the animation from animateJoints() ) //! control joint positions in the mesh (eg. ragdolls, or set the animation from animateJoints() )
EJUOR_CONTROL 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
{
public:
//! Will be called when the animation playback has ended. //! Will be called when the animation playback has ended.
/** See IAnimatedMeshSceneNode::setAnimationEndCallback for /** See IAnimatedMeshSceneNode::setAnimationEndCallback for
more information. more information.
\param node: Node of which the animation has ended. */ \param node: Node of which the animation has ended. */
virtual void OnAnimationEnd(IAnimatedMeshSceneNode *node) = 0; virtual void OnAnimationEnd(IAnimatedMeshSceneNode* node) = 0;
}; };
//! Scene node capable of displaying an animated mesh.
class IAnimatedMeshSceneNode : public ISceneNode
{
public:
//! Scene node capable of displaying an animated mesh.
class IAnimatedMeshSceneNode : public ISceneNode
{
public:
//! Constructor //! Constructor
IAnimatedMeshSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id, IAnimatedMeshSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df &position = core::vector3df(0, 0, 0), const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df &rotation = core::vector3df(0, 0, 0), const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) : const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f))
ISceneNode(parent, mgr, id, position, rotation, scale) {} : ISceneNode(parent, mgr, id, position, rotation, scale) {}
//! Destructor //! Destructor
virtual ~IAnimatedMeshSceneNode() {} virtual ~IAnimatedMeshSceneNode() {}
@ -79,7 +83,7 @@ public:
//! Gets the speed with which the animation is played. //! Gets the speed with which the animation is played.
/** \return Frames per second played. */ /** \return Frames per second played. */
virtual f32 getAnimationSpeed() const = 0; virtual f32 getAnimationSpeed() const =0;
//! Get a pointer to a joint in the mesh (if the mesh is a bone based mesh). //! Get a pointer to a joint in the mesh (if the mesh is a bone based mesh).
/** With this method it is possible to attach scene nodes to /** With this method it is possible to attach scene nodes to
@ -96,10 +100,10 @@ public:
\return Pointer to the scene node which represents the joint \return Pointer to the scene node which represents the joint
with the specified name. Returns 0 if the contained mesh is not with the specified name. Returns 0 if the contained mesh is not
an skinned mesh or the name of the joint could not be found. */ an skinned mesh or the name of the joint could not be found. */
virtual IBoneSceneNode *getJointNode(const c8 *jointName) = 0; virtual IBoneSceneNode* getJointNode(const c8* jointName)=0;
//! same as getJointNode(const c8* jointName), but based on id //! same as getJointNode(const c8* jointName), but based on id
virtual IBoneSceneNode *getJointNode(u32 jointID) = 0; virtual IBoneSceneNode* getJointNode(u32 jointID) = 0;
//! Gets joint count. //! Gets joint count.
/** \return Amount of joints in the mesh. */ /** \return Amount of joints in the mesh. */
@ -124,7 +128,7 @@ public:
/** Set this to 0 to disable the callback again. /** Set this to 0 to disable the callback again.
Please note that this will only be called when in non looped Please note that this will only be called when in non looped
mode, see IAnimatedMeshSceneNode::setLoopMode(). */ mode, see IAnimatedMeshSceneNode::setLoopMode(). */
virtual void setAnimationEndCallback(IAnimationEndCallBack *callback = 0) = 0; virtual void setAnimationEndCallback(IAnimationEndCallBack* callback=0) = 0;
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style. //! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
/** In this way it is possible to change the materials a mesh /** In this way it is possible to change the materials a mesh
@ -136,34 +140,38 @@ public:
virtual bool isReadOnlyMaterials() const = 0; virtual bool isReadOnlyMaterials() const = 0;
//! Sets a new mesh //! Sets a new mesh
virtual void setMesh(IAnimatedMesh *mesh) = 0; virtual void setMesh(IAnimatedMesh* mesh) = 0;
//! Returns the current mesh //! Returns the current mesh
virtual IAnimatedMesh *getMesh(void) = 0; virtual IAnimatedMesh* getMesh(void) = 0;
//! Set how the joints should be updated on render //! Set how the joints should be updated on render
virtual void setJointMode(E_JOINT_UPDATE_ON_RENDER mode) = 0; virtual void setJointMode(E_JOINT_UPDATE_ON_RENDER mode)=0;
//! Sets the transition time in seconds //! Sets the transition time in seconds
/** Note: This needs to enable joints, and setJointmode set to /** Note: This needs to enable joints, and setJointmode set to
EJUOR_CONTROL. You must call animateJoints(), or the mesh will EJUOR_CONTROL. You must call animateJoints(), or the mesh will
not animate. */ not animate. */
virtual void setTransitionTime(f32 Time) = 0; virtual void setTransitionTime(f32 Time) =0;
//! animates the joints in the mesh based on the current frame. //! animates the joints in the mesh based on the current frame.
/** Also takes in to account transitions. */ /** Also takes in to account transitions. */
virtual void animateJoints(bool CalculateAbsolutePositions = true) = 0; virtual void animateJoints(bool CalculateAbsolutePositions=true) = 0;
//! render mesh ignoring its transformation. //! render mesh ignoring its transformation.
/** Culling is unaffected. */ /** Culling is unaffected. */
virtual void setRenderFromIdentity(bool On) = 0; virtual void setRenderFromIdentity( bool On )=0;
//! Creates a clone of this scene node and its children. //! Creates a clone of this scene node and its children.
/** \param newParent An optional new parent. /** \param newParent An optional new parent.
\param newManager An optional new scene manager. \param newManager An optional new scene manager.
\return The newly created clone of this node. */ \return The newly created clone of this node. */
virtual ISceneNode *clone(ISceneNode *newParent = 0, ISceneManager *newManager = 0) = 0; virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) = 0;
};
};
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,19 +2,35 @@
// 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 "IReferenceCounted.h"
#include "EAttributes.h" #include "SColor.h"
#include "vector3d.h"
// not needed here but I can't be bothered to clean the transitive includes up. #include "vector2d.h"
#include "line2d.h"
#include "line3d.h"
#include "triangle3d.h"
#include "position2d.h"
#include "rect.h"
#include "dimension2d.h"
#include "matrix4.h"
#include "quaternion.h" #include "quaternion.h"
#include "plane3d.h"
#include "triangle3d.h"
#include "line2d.h"
#include "line3d.h"
#include "irrString.h"
#include "irrArray.h"
#include "EAttributes.h"
#include "path.h"
namespace irr namespace irr
{ {
namespace video namespace video
{ {
class ITexture; class ITexture;
} // end namespace video } // end namespace video
namespace io namespace io
{ {
@ -23,30 +39,42 @@ namespace io
class IAttributes : public virtual IReferenceCounted class IAttributes : public virtual IReferenceCounted
{ {
public: public:
//! Returns amount of attributes in this collection of attributes. //! Returns amount of attributes in this collection of attributes.
virtual u32 getAttributeCount() const = 0; virtual u32 getAttributeCount() const = 0;
//! Returns attribute name by index. //! Returns attribute name by index.
//! \param index: Index value, must be between 0 and getAttributeCount()-1. //! \param index: Index value, must be between 0 and getAttributeCount()-1.
virtual const c8 *getAttributeName(s32 index) const = 0; virtual const c8* getAttributeName(s32 index) const = 0;
//! Returns the type of an attribute //! Returns the type of an attribute
//! \param attributeName: Name for the attribute //! \param attributeName: Name for the attribute
virtual E_ATTRIBUTE_TYPE getAttributeType(const c8 *attributeName) const = 0; virtual E_ATTRIBUTE_TYPE getAttributeType(const c8* attributeName) const = 0;
//! Returns attribute type by index. //! Returns attribute type by index.
//! \param index: Index value, must be between 0 and getAttributeCount()-1. //! \param index: Index value, must be between 0 and getAttributeCount()-1.
virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) const = 0; virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) const = 0;
//! Returns the type string of the attribute
//! \param attributeName: String for the attribute type
//! \param defaultNotFound Value returned when attributeName was not found
virtual const wchar_t* getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound = L"unknown") const = 0;
//! Returns the type string of the attribute by index.
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
//! \param defaultNotFound Value returned for an invalid index
virtual const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") const = 0;
//! Returns if an attribute with a name exists //! Returns if an attribute with a name exists
virtual bool existsAttribute(const c8 *attributeName) const = 0; virtual bool existsAttribute(const c8* attributeName) const = 0;
//! Returns attribute index from name, -1 if not found //! Returns attribute index from name, -1 if not found
virtual s32 findAttribute(const c8 *attributeName) const = 0; virtual s32 findAttribute(const c8* attributeName) const = 0;
//! Removes all attributes //! Removes all attributes
virtual void clear() = 0; virtual void clear() = 0;
/* /*
Integer Attribute Integer Attribute
@ -54,16 +82,16 @@ public:
*/ */
//! Adds an attribute as integer //! Adds an attribute as integer
virtual void addInt(const c8 *attributeName, s32 value) = 0; virtual void addInt(const c8* attributeName, s32 value) = 0;
//! Sets an attribute as integer value //! Sets an attribute as integer value
virtual void setAttribute(const c8 *attributeName, s32 value) = 0; virtual void setAttribute(const c8* attributeName, s32 value) = 0;
//! Gets an attribute as integer value //! Gets an attribute as integer value
//! \param attributeName: Name of the attribute to get. //! \param attributeName: Name of the attribute to get.
//! \param defaultNotFound Value returned when attributeName was not found //! \param defaultNotFound Value returned when attributeName was not found
//! \return Returns value of the attribute previously set by setAttribute() //! \return Returns value of the attribute previously set by setAttribute()
virtual s32 getAttributeAsInt(const c8 *attributeName, irr::s32 defaultNotFound = 0) const = 0; virtual s32 getAttributeAsInt(const c8* attributeName, irr::s32 defaultNotFound=0) const = 0;
//! Gets an attribute as integer value //! Gets an attribute as integer value
//! \param index: Index value, must be between 0 and getAttributeCount()-1. //! \param index: Index value, must be between 0 and getAttributeCount()-1.
@ -79,16 +107,16 @@ public:
*/ */
//! Adds an attribute as float //! Adds an attribute as float
virtual void addFloat(const c8 *attributeName, f32 value) = 0; virtual void addFloat(const c8* attributeName, f32 value) = 0;
//! Sets a attribute as float value //! Sets a attribute as float value
virtual void setAttribute(const c8 *attributeName, f32 value) = 0; virtual void setAttribute(const c8* attributeName, f32 value) = 0;
//! Gets an attribute as float value //! Gets an attribute as float value
//! \param attributeName: Name of the attribute to get. //! \param attributeName: Name of the attribute to get.
//! \param defaultNotFound Value returned when attributeName was not found //! \param defaultNotFound Value returned when attributeName was not found
//! \return Returns value of the attribute previously set by setAttribute() //! \return Returns value of the attribute previously set by setAttribute()
virtual f32 getAttributeAsFloat(const c8 *attributeName, irr::f32 defaultNotFound = 0.f) const = 0; virtual f32 getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound=0.f) const = 0;
//! Gets an attribute as float value //! Gets an attribute as float value
//! \param index: Index value, must be between 0 and getAttributeCount()-1. //! \param index: Index value, must be between 0 and getAttributeCount()-1.
@ -97,21 +125,22 @@ public:
//! Sets an attribute as float value //! Sets an attribute as float value
virtual void setAttribute(s32 index, f32 value) = 0; virtual void setAttribute(s32 index, f32 value) = 0;
/* /*
Bool Attribute Bool Attribute
*/ */
//! Adds an attribute as bool //! Adds an attribute as bool
virtual void addBool(const c8 *attributeName, bool value) = 0; virtual void addBool(const c8* attributeName, bool value) = 0;
//! Sets an attribute as boolean value //! Sets an attribute as boolean value
virtual void setAttribute(const c8 *attributeName, bool value) = 0; virtual void setAttribute(const c8* attributeName, bool value) = 0;
//! Gets an attribute as boolean value //! Gets an attribute as boolean value
//! \param attributeName: Name of the attribute to get. //! \param attributeName: Name of the attribute to get.
//! \param defaultNotFound Value returned when attributeName was not found //! \param defaultNotFound Value returned when attributeName was not found
//! \return Returns value of the attribute previously set by setAttribute() //! \return Returns value of the attribute previously set by setAttribute()
virtual bool getAttributeAsBool(const c8 *attributeName, bool defaultNotFound = false) const = 0; virtual bool getAttributeAsBool(const c8* attributeName, bool defaultNotFound=false) const = 0;
//! Gets an attribute as boolean value //! Gets an attribute as boolean value
//! \param index: Index value, must be between 0 and getAttributeCount()-1. //! \param index: Index value, must be between 0 and getAttributeCount()-1.
@ -119,7 +148,10 @@ public:
//! Sets an attribute as boolean value //! Sets an attribute as boolean value
virtual void setAttribute(s32 index, bool value) = 0; virtual void setAttribute(s32 index, bool value) = 0;
}; };
} // end namespace io } // end namespace io
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -10,8 +11,8 @@ namespace irr
{ {
namespace scene namespace scene
{ {
class ICameraSceneNode; class ICameraSceneNode;
class IMeshBuffer; class IMeshBuffer;
//! A billboard scene node. //! A billboard scene node.
/** A billboard is like a 3d sprite: A 2d element, /** A billboard is like a 3d sprite: A 2d element,
@ -21,13 +22,14 @@ lensflares, particles and things like that.
class IBillboardSceneNode : public ISceneNode class IBillboardSceneNode : public ISceneNode
{ {
public: public:
//! Constructor //! Constructor
IBillboardSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id, IBillboardSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df &position = core::vector3df(0, 0, 0)) : const core::vector3df& position = core::vector3df(0,0,0))
ISceneNode(parent, mgr, id, position) {} : ISceneNode(parent, mgr, id, position) {}
//! Sets the size of the billboard, making it rectangular. //! Sets the size of the billboard, making it rectangular.
virtual void setSize(const core::dimension2d<f32> &size) = 0; virtual void setSize(const core::dimension2d<f32>& size) = 0;
//! Sets the size of the billboard with independent widths of the bottom and top edges. //! Sets the size of the billboard with independent widths of the bottom and top edges.
/** \param[in] height The height of the billboard. /** \param[in] height The height of the billboard.
@ -41,30 +43,30 @@ public:
Use getWidths() to retrieve the bottom and top edges independently. Use getWidths() to retrieve the bottom and top edges independently.
\return Size of the billboard. \return Size of the billboard.
*/ */
virtual const core::dimension2d<f32> &getSize() const = 0; virtual const core::dimension2d<f32>& getSize() const = 0;
//! Gets the size of the the billboard and handles independent top and bottom edge widths correctly. //! Gets the size of the the billboard and handles independent top and bottom edge widths correctly.
/** \param[out] height The height of the billboard. /** \param[out] height The height of the billboard.
\param[out] bottomEdgeWidth The width of the bottom edge of the billboard. \param[out] bottomEdgeWidth The width of the bottom edge of the billboard.
\param[out] topEdgeWidth The width of the top edge of the billboard. \param[out] topEdgeWidth The width of the top edge of the billboard.
*/ */
virtual void getSize(f32 &height, f32 &bottomEdgeWidth, f32 &topEdgeWidth) const = 0; virtual void getSize(f32& height, f32& bottomEdgeWidth, f32& topEdgeWidth) const =0;
//! Set the color of all vertices of the billboard //! Set the color of all vertices of the billboard
/** \param[in] overallColor Color to set */ /** \param[in] overallColor Color to set */
virtual void setColor(const video::SColor &overallColor) = 0; virtual void setColor(const video::SColor& overallColor) = 0;
//! Set the color of the top and bottom vertices of the billboard //! Set the color of the top and bottom vertices of the billboard
/** \param[in] topColor Color to set the top vertices /** \param[in] topColor Color to set the top vertices
\param[in] bottomColor Color to set the bottom vertices */ \param[in] bottomColor Color to set the bottom vertices */
virtual void setColor(const video::SColor &topColor, virtual void setColor(const video::SColor& topColor,
const video::SColor &bottomColor) = 0; const video::SColor& bottomColor) = 0;
//! Gets the color of the top and bottom vertices of the billboard //! Gets the color of the top and bottom vertices of the billboard
/** \param[out] topColor Stores the color of the top vertices /** \param[out] topColor Stores the color of the top vertices
\param[out] bottomColor Stores the color of the bottom vertices */ \param[out] bottomColor Stores the color of the bottom vertices */
virtual void getColor(video::SColor &topColor, virtual void getColor(video::SColor& topColor,
video::SColor &bottomColor) const = 0; video::SColor& bottomColor) const = 0;
//! Get the real boundingbox used by the billboard, which can depend on the active camera. //! Get the real boundingbox used by the billboard, which can depend on the active camera.
/** The boundingbox returned will use absolute coordinates. /** The boundingbox returned will use absolute coordinates.
@ -72,7 +74,7 @@ public:
So we don't know the real boundingboxes before that. Which would be too late for culling. So we don't know the real boundingboxes before that. Which would be too late for culling.
That is why the usual getBoundingBox will return a "safe" boundingbox which is guaranteed 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. */ to contain the billboard. While this function can return the real one. */
virtual const core::aabbox3d<f32> &getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode *camera) = 0; virtual const core::aabbox3d<f32>& getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode* camera) = 0;
//! Get the amount of mesh buffers. //! Get the amount of mesh buffers.
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */ /** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
@ -83,8 +85,12 @@ public:
So this is mainly useful to access/modify the uv-coordinates. So this is mainly useful to access/modify the uv-coordinates.
\param nr: Zero based index of the mesh buffer. \param nr: Zero based index of the mesh buffer.
\return Pointer to the mesh buffer or 0 if there is no such mesh buffer. */ \return Pointer to the mesh buffer or 0 if there is no such mesh buffer. */
virtual IMeshBuffer *getMeshBuffer(u32 nr) const = 0; virtual IMeshBuffer* getMeshBuffer(u32 nr) const = 0;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,11 +12,11 @@ namespace irr
namespace scene namespace scene
{ {
//! Enumeration for different bone animation modes //! Enumeration for different bone animation modes
enum E_BONE_ANIMATION_MODE enum E_BONE_ANIMATION_MODE
{ {
//! The bone is usually animated, unless it's parent is not animated //! The bone is usually animated, unless it's parent is not animated
EBAM_AUTOMATIC = 0, 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 //! The bone is animated by the skin, if it's parent is not animated then animation will resume from this bone onward
EBAM_ANIMATED, EBAM_ANIMATED,
@ -26,34 +27,37 @@ enum E_BONE_ANIMATION_MODE
//! Not an animation mode, just here to count the available modes //! Not an animation mode, just here to count the available modes
EBAM_COUNT EBAM_COUNT
}; };
enum E_BONE_SKINNING_SPACE enum E_BONE_SKINNING_SPACE
{ {
//! local skinning, standard //! local skinning, standard
EBSS_LOCAL = 0, EBSS_LOCAL=0,
//! global skinning //! global skinning
EBSS_GLOBAL, EBSS_GLOBAL,
EBSS_COUNT EBSS_COUNT
}; };
//! Names for bone animation modes //! Names for bone animation modes
const c8 *const BoneAnimationModeNames[] = { const c8* const BoneAnimationModeNames[] =
{
"automatic", "automatic",
"animated", "animated",
"unanimated", "unanimated",
0, 0,
}; };
//! Interface for bones used for skeletal animation.
/** Used with ISkinnedMesh and IAnimatedMeshSceneNode. */ //! Interface for bones used for skeletal animation.
class IBoneSceneNode : public ISceneNode /** Used with ISkinnedMesh and IAnimatedMeshSceneNode. */
{ class IBoneSceneNode : public ISceneNode
public: {
IBoneSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id = -1) : public:
ISceneNode(parent, mgr, id), positionHint(-1), scaleHint(-1), rotationHint(-1) {}
IBoneSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id=-1) :
ISceneNode(parent, mgr, id),positionHint(-1),scaleHint(-1),rotationHint(-1) { }
//! Get the index of the bone //! Get the index of the bone
virtual u32 getBoneIndex() const = 0; virtual u32 getBoneIndex() const = 0;
@ -66,31 +70,35 @@ public:
virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0; virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0;
//! Get the axis aligned bounding box of this node //! Get the axis aligned bounding box of this node
const core::aabbox3d<f32> &getBoundingBox() const override = 0; const core::aabbox3d<f32>& getBoundingBox() const override = 0;
//! Returns the relative transformation of the scene node. //! Returns the relative transformation of the scene node.
// virtual core::matrix4 getRelativeTransformation() const = 0; //virtual core::matrix4 getRelativeTransformation() const = 0;
//! The animation method. //! The animation method.
void OnAnimate(u32 timeMs) override = 0; void OnAnimate(u32 timeMs) override =0;
//! The render method. //! The render method.
/** Does nothing as bones are not visible. */ /** Does nothing as bones are not visible. */
void render() override {} void render() override { }
//! How the relative transformation of the bone is used //! How the relative transformation of the bone is used
virtual void setSkinningSpace(E_BONE_SKINNING_SPACE space) = 0; virtual void setSkinningSpace( E_BONE_SKINNING_SPACE space ) =0;
//! How the relative transformation of the bone is used //! How the relative transformation of the bone is used
virtual E_BONE_SKINNING_SPACE getSkinningSpace() const = 0; virtual E_BONE_SKINNING_SPACE getSkinningSpace() const =0;
//! Updates the absolute position based on the relative and the parents position //! Updates the absolute position based on the relative and the parents position
virtual void updateAbsolutePositionOfAllChildren() = 0; virtual void updateAbsolutePositionOfAllChildren()=0;
s32 positionHint; s32 positionHint;
s32 scaleHint; s32 scaleHint;
s32 rotationHint; s32 rotationHint;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "ISceneNode.h"
#include "IEventReceiver.h" #include "IEventReceiver.h"
@ -11,24 +12,24 @@ 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.
Because the ICameraSceneNode is a SceneNode, it can be attached to any
other scene node, and will follow its parents movement, rotation and so
on.
*/
class ICameraSceneNode : public ISceneNode, public IEventReceiver
{
public:
//! Scene Node which is a (controllable) camera.
/** The whole scene will be rendered from the cameras point of view.
Because the ICameraSceneNode is a SceneNode, it can be attached to any
other scene node, and will follow its parents movement, rotation and so
on.
*/
class ICameraSceneNode : public ISceneNode, public IEventReceiver
{
public:
//! Constructor //! Constructor
ICameraSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id, ICameraSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df &position = core::vector3df(0, 0, 0), const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df &rotation = core::vector3df(0, 0, 0), const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) : const core::vector3df& scale = core::vector3df(1.0f,1.0f,1.0f))
ISceneNode(parent, mgr, id, position, rotation, scale), : ISceneNode(parent, mgr, id, position, rotation, scale), IsOrthogonal(false) {}
IsOrthogonal(false) {}
//! Sets the projection matrix of the camera. //! Sets the projection matrix of the camera.
/** The core::matrix4 class has some methods to build a /** The core::matrix4 class has some methods to build a
@ -43,26 +44,26 @@ public:
\param isOrthogonal Set this to true if the matrix is an \param isOrthogonal Set this to true if the matrix is an
orthogonal one (e.g. from matrix4::buildProjectionMatrixOrtho). 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. //! Gets the current projection matrix of the camera.
/** \return The current projection matrix of the camera. */ /** \return The current projection matrix of the camera. */
virtual const core::matrix4 &getProjectionMatrix() const = 0; virtual const core::matrix4& getProjectionMatrix() const =0;
//! Gets the current view matrix of the camera. //! Gets the current view matrix of the camera.
/** \return The current view matrix of the camera. */ /** \return The current view matrix of the camera. */
virtual const core::matrix4 &getViewMatrix() const = 0; virtual const core::matrix4& getViewMatrix() const =0;
//! Sets a custom view matrix affector. //! Sets a custom view matrix affector.
/** The matrix passed here, will be multiplied with the view /** The matrix passed here, will be multiplied with the view
matrix when it gets updated. This allows for custom camera matrix when it gets updated. This allows for custom camera
setups like, for example, a reflection camera. setups like, for example, a reflection camera.
\param affector The affector matrix. */ \param affector The affector matrix. */
virtual void setViewMatrixAffector(const core::matrix4 &affector) = 0; virtual void setViewMatrixAffector(const core::matrix4& affector) =0;
//! Get the custom view matrix affector. //! Get the custom view matrix affector.
/** \return The affector matrix. */ /** \return The affector matrix. */
virtual const core::matrix4 &getViewMatrixAffector() const = 0; virtual const core::matrix4& getViewMatrixAffector() const =0;
//! It is possible to send mouse and key events to the camera. //! It is possible to send mouse and key events to the camera.
/** Most cameras may ignore this input, but camera scene nodes /** Most cameras may ignore this input, but camera scene nodes
@ -71,7 +72,7 @@ public:
ISceneManager::addCameraSceneNodeFPS, may want to get ISceneManager::addCameraSceneNodeFPS, may want to get
this input for changing their position, look at target or this input for changing their position, look at target or
whatever. */ whatever. */
bool OnEvent(const SEvent &event) override = 0; bool OnEvent(const SEvent& event) override =0;
//! Sets the look at target of the camera //! Sets the look at target of the camera
/** If the camera's target and rotation are bound ( @see /** If the camera's target and rotation are bound ( @see
@ -81,7 +82,7 @@ public:
internally, so if you changed setPosition since last rendering you must internally, so if you changed setPosition since last rendering you must
call updateAbsolutePosition before using this function. call updateAbsolutePosition before using this function.
\param pos Look at target of the camera, in world co-ordinates. */ \param pos Look at target of the camera, in world co-ordinates. */
virtual void setTarget(const core::vector3df &pos) = 0; virtual void setTarget(const core::vector3df& pos) =0;
//! Sets the rotation of the node. //! Sets the rotation of the node.
/** This only modifies the relative rotation of the node. /** This only modifies the relative rotation of the node.
@ -89,63 +90,63 @@ public:
bindTargetAndRotation() ) then calling this will also change bindTargetAndRotation() ) then calling this will also change
the camera's target to match the rotation. the camera's target to match the rotation.
\param rotation New rotation of the node in degrees. */ \param rotation New rotation of the node in degrees. */
void setRotation(const core::vector3df &rotation) override = 0; void setRotation(const core::vector3df& rotation) override =0;
//! Gets the current look at target of the camera //! Gets the current look at target of the camera
/** \return The current look at target of the camera, in world co-ordinates */ /** \return The current look at target of the camera, in world co-ordinates */
virtual const core::vector3df &getTarget() const = 0; virtual const core::vector3df& getTarget() const =0;
//! Sets the up vector of the camera. //! Sets the up vector of the camera.
/** \param pos: New upvector of the camera. */ /** \param pos: New upvector of the camera. */
virtual void setUpVector(const core::vector3df &pos) = 0; virtual void setUpVector(const core::vector3df& pos) =0;
//! Gets the up vector of the camera. //! Gets the up vector of the camera.
/** \return The up vector of the camera, in world space. */ /** \return The up vector of the camera, in world space. */
virtual const core::vector3df &getUpVector() const = 0; virtual const core::vector3df& getUpVector() const =0;
//! Gets the value of the near plane of the camera. //! Gets the value of the near plane of the camera.
/** \return The value of the near plane of the camera. */ /** \return The value of the near plane of the camera. */
virtual f32 getNearValue() const = 0; virtual f32 getNearValue() const =0;
//! Gets the value of the far plane of the camera. //! Gets the value of the far plane of the camera.
/** \return The value of the far plane of the camera. */ /** \return The value of the far plane of the camera. */
virtual f32 getFarValue() const = 0; virtual f32 getFarValue() const =0;
//! Gets the aspect ratio of the camera. //! Gets the aspect ratio of the camera.
/** \return The aspect ratio of the camera. */ /** \return The aspect ratio of the camera. */
virtual f32 getAspectRatio() const = 0; virtual f32 getAspectRatio() const =0;
//! Gets the field of view of the camera. //! Gets the field of view of the camera.
/** \return The field of view of the camera in radians. */ /** \return The field of view of the camera in radians. */
virtual f32 getFOV() const = 0; virtual f32 getFOV() const =0;
//! Sets the value of the near clipping plane. (default: 1.0f) //! Sets the value of the near clipping plane. (default: 1.0f)
/** \param zn: New z near value. */ /** \param zn: New z near value. */
virtual void setNearValue(f32 zn) = 0; virtual void setNearValue(f32 zn) =0;
//! Sets the value of the far clipping plane (default: 2000.0f) //! Sets the value of the far clipping plane (default: 2000.0f)
/** \param zf: New z far value. */ /** \param zf: New z far value. */
virtual void setFarValue(f32 zf) = 0; virtual void setFarValue(f32 zf) =0;
//! Sets the aspect ratio (default: 4.0f / 3.0f) //! Sets the aspect ratio (default: 4.0f / 3.0f)
/** \param aspect: New aspect ratio. */ /** \param aspect: New aspect ratio. */
virtual void setAspectRatio(f32 aspect) = 0; virtual void setAspectRatio(f32 aspect) =0;
//! Sets the field of view (Default: PI / 2.5f) //! Sets the field of view (Default: PI / 2.5f)
/** \param fovy: New field of view in radians. */ /** \param fovy: New field of view in radians. */
virtual void setFOV(f32 fovy) = 0; virtual void setFOV(f32 fovy) =0;
//! Get the view frustum. //! Get the view frustum.
/** \return The current view frustum. */ /** \return The current view frustum. */
virtual const SViewFrustum *getViewFrustum() const = 0; virtual const SViewFrustum* getViewFrustum() const =0;
//! Disables or enables the camera to get key or mouse inputs. //! Disables or enables the camera to get key or mouse inputs.
/** If this is set to true, the camera will respond to key /** If this is set to true, the camera will respond to key
inputs otherwise not. */ inputs otherwise not. */
virtual void setInputReceiverEnabled(bool enabled) = 0; virtual void setInputReceiverEnabled(bool enabled) =0;
//! Checks if the input receiver of the camera is currently enabled. //! Checks if the input receiver of the camera is currently enabled.
virtual bool isInputReceiverEnabled() const = 0; virtual bool isInputReceiverEnabled() const =0;
//! Checks if a camera is orthogonal. //! Checks if a camera is orthogonal.
virtual bool isOrthogonal() const virtual bool isOrthogonal() const
@ -162,23 +163,27 @@ public:
\param bound True to bind the camera's scene node rotation \param bound True to bind the camera's scene node rotation
and targeting, false to unbind them. and targeting, false to unbind them.
@see getTargetAndRotationBinding() */ @see getTargetAndRotationBinding() */
virtual void bindTargetAndRotation(bool bound) = 0; virtual void bindTargetAndRotation(bool bound) =0;
//! Updates the matrices without uploading them to the driver //! Updates the matrices without uploading them to the driver
virtual void updateMatrices() = 0; virtual void updateMatrices() = 0;
//! Queries if the camera scene node's rotation and its target position are bound together. //! Queries if the camera scene node's rotation and its target position are bound together.
/** @see bindTargetAndRotation() */ /** @see bindTargetAndRotation() */
virtual bool getTargetAndRotationBinding(void) const = 0; virtual bool getTargetAndRotationBinding(void) const =0;
protected: protected:
void cloneMembers(const ICameraSceneNode *toCopyFrom)
void cloneMembers(const ICameraSceneNode* toCopyFrom)
{ {
IsOrthogonal = toCopyFrom->IsOrthogonal; IsOrthogonal = toCopyFrom->IsOrthogonal;
} }
bool IsOrthogonal; bool IsOrthogonal;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -12,30 +12,30 @@ namespace irr
{ {
namespace video namespace video
{ {
// For system specific window contexts (used for OpenGL) // For system specific window contexts (used for OpenGL)
class IContextManager : public virtual IReferenceCounted class IContextManager : public virtual IReferenceCounted
{ {
public: public:
//! Initialize manager with device creation parameters and device window (passed as exposed video data) //! Initialize manager with device creation parameters and device window (passed as exposed video data)
virtual bool initialize(const SIrrlichtCreationParameters &params, const SExposedVideoData &data) = 0; 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 //! Terminate manager, any cleanup that is left over. Manager needs a new initialize to be usable again
virtual void terminate() = 0; virtual void terminate() =0;
//! Create surface based on current window set //! Create surface based on current window set
virtual bool generateSurface() = 0; virtual bool generateSurface() =0;
//! Destroy current surface //! Destroy current surface
virtual void destroySurface() = 0; virtual void destroySurface() =0;
//! Create context based on current surface //! Create context based on current surface
virtual bool generateContext() = 0; virtual bool generateContext() =0;
//! Destroy current context //! Destroy current context
virtual void destroyContext() = 0; virtual void destroyContext() =0;
//! Get current context //! Get current context
virtual const SExposedVideoData &getContext() const = 0; virtual const SExposedVideoData& getContext() const =0;
//! Change render context, disable old and activate new defined by videoData //! 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. //\param restorePrimaryOnZero When true: restore original driver context when videoData is set to 0 values.
@ -46,14 +46,16 @@ public:
Old thread gives up context with: activateContext(irr::video::SExposedVideoData()); Old thread gives up context with: activateContext(irr::video::SExposedVideoData());
New thread takes over context with: activateContext(videoDriver->getExposedVideoData()); New thread takes over context with: activateContext(videoDriver->getExposedVideoData());
Note that only 1 thread at a time may access an OpenGL context. */ Note that only 1 thread at a time may access an OpenGL context. */
virtual bool activateContext(const SExposedVideoData &videoData, bool restorePrimaryOnZero = false) = 0; virtual bool activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero=false) =0;
//! Get the address of any OpenGL procedure (including core procedures). //! Get the address of any OpenGL procedure (including core procedures).
virtual void *getProcAddress(const std::string &procName) = 0; virtual void* getProcAddress(const std::string &procName) =0;
//! Swap buffers. //! Swap buffers.
virtual bool swapBuffers() = 0; virtual bool swapBuffers() =0;
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "position2d.h" #include "position2d.h"
@ -13,11 +14,11 @@ namespace irr
namespace gui namespace gui
{ {
class IGUISpriteBank; class IGUISpriteBank;
//! Default icons for cursors //! Default icons for cursors
enum ECURSOR_ICON enum ECURSOR_ICON
{ {
// Following cursors might be system specific, or might use an Irrlicht icon-set. No guarantees so far. // Following cursors might be system specific, or might use an Irrlicht icon-set. No guarantees so far.
ECI_NORMAL, // arrow ECI_NORMAL, // arrow
ECI_CROSS, // Crosshair ECI_CROSS, // Crosshair
@ -38,10 +39,11 @@ enum ECURSOR_ICON
// additionally. // 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 //! Names for ECURSOR_ICON
const c8 *const GUICursorIconNames[ECI_COUNT + 1] = { const c8* const GUICursorIconNames[ECI_COUNT+1] =
{
"normal", "normal",
"cross", "cross",
"hand", "hand",
@ -55,30 +57,30 @@ const c8 *const GUICursorIconNames[ECI_COUNT + 1] = {
"sizens", "sizens",
"sizewe", "sizewe",
"sizeup", "sizeup",
0, 0
}; };
//! structure used to set sprites as cursors. //! structure used to set sprites as cursors.
struct SCursorSprite struct SCursorSprite
{ {
SCursorSprite() : SCursorSprite()
SpriteBank(0), SpriteId(-1) : SpriteBank(0), SpriteId(-1)
{ {
} }
SCursorSprite(gui::IGUISpriteBank *spriteBank, s32 spriteId, const core::position2d<s32> &hotspot = (core::position2d<s32>(0, 0))) : SCursorSprite( gui::IGUISpriteBank * spriteBank, s32 spriteId, const core::position2d<s32> &hotspot=(core::position2d<s32>(0,0)) )
SpriteBank(spriteBank), SpriteId(spriteId), HotSpot(hotspot) : SpriteBank(spriteBank), SpriteId(spriteId), HotSpot(hotspot)
{ {
} }
IGUISpriteBank *SpriteBank; IGUISpriteBank * SpriteBank;
s32 SpriteId; s32 SpriteId;
core::position2d<s32> HotSpot; core::position2d<s32> HotSpot;
}; };
//! platform specific behavior flags for the cursor //! platform specific behavior flags for the cursor
enum ECURSOR_PLATFORM_BEHAVIOR enum ECURSOR_PLATFORM_BEHAVIOR
{ {
//! default - no platform specific behavior //! default - no platform specific behavior
ECPB_NONE = 0, ECPB_NONE = 0,
@ -89,12 +91,13 @@ enum ECURSOR_PLATFORM_BEHAVIOR
http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=45525 http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=45525
*/ */
ECPB_X11_CACHE_UPDATES = 1 ECPB_X11_CACHE_UPDATES = 1
}; };
//! Interface to manipulate the mouse cursor.
class ICursorControl : public virtual IReferenceCounted
{
public:
//! Interface to manipulate the mouse cursor.
class ICursorControl : public virtual IReferenceCounted
{
public:
//! Changes the visible state of the mouse cursor. //! Changes the visible state of the mouse cursor.
/** \param visible: The new visible state. If true, the cursor will be visible, /** \param visible: The new visible state. If true, the cursor will be visible,
if false, it will be invisible. */ if false, it will be invisible. */
@ -136,7 +139,7 @@ public:
check what has become of a setPosition call with float numbers). check what has become of a setPosition call with float numbers).
\return Returns the current position of the cursor. The returned position \return Returns the current position of the cursor. The returned position
is the position of the mouse cursor in pixel units. */ is the position of the mouse cursor in pixel units. */
virtual const core::position2d<s32> &getPosition(bool updateCursor = true) = 0; virtual const core::position2d<s32>& getPosition(bool updateCursor=true) = 0;
//! Returns the current position of the mouse cursor. //! Returns the current position of the mouse cursor.
/** \param updateCursor When true ask system/OS for current cursor position. /** \param updateCursor When true ask system/OS for current cursor position.
@ -147,7 +150,7 @@ public:
is a value between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is 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 the top left corner and (1.0f, 1.0f) is the bottom right corner of the
render window. */ render window. */
virtual core::position2d<f32> getRelativePosition(bool updateCursor = true) = 0; virtual core::position2d<f32> getRelativePosition(bool updateCursor=true) = 0;
//! Sets an absolute reference rect for setting and retrieving the cursor position. //! Sets an absolute reference rect for setting and retrieving the cursor position.
/** If this rect is set, the cursor position is not being calculated relative to /** If this rect is set, the cursor position is not being calculated relative to
@ -155,11 +158,11 @@ public:
this feature again. This feature is useful when rendering into parts of foreign windows this feature again. This feature is useful when rendering into parts of foreign windows
for example in an editor. for example in an editor.
\param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/ \param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/
virtual void setReferenceRect(core::rect<s32> *rect = 0) = 0; virtual void setReferenceRect(core::rect<s32>* rect=0) = 0;
//! Internally fixes the mouse position, and reports relative mouse movement compared to the old position //! Internally fixes the mouse position, and reports relative mouse movement compared to the old position
/** Specific to SDL */ /** Specific to SDL */
virtual void setRelativeMode(bool relative){}; virtual void setRelativeMode(bool relative) {};
//! Sets the active cursor icon //! Sets the active cursor icon
/** Setting cursor icons is so far only supported on Win32 and Linux */ /** Setting cursor icons is so far only supported on Win32 and Linux */
@ -170,17 +173,17 @@ public:
//! Add a custom sprite as cursor icon. //! Add a custom sprite as cursor icon.
/** \return Identification for the icon */ /** \return Identification for the icon */
virtual ECURSOR_ICON addIcon(const gui::SCursorSprite &icon) { return gui::ECI_NORMAL; } virtual ECURSOR_ICON addIcon(const gui::SCursorSprite& icon) { return gui::ECI_NORMAL; }
//! replace a cursor icon. //! replace a cursor icon.
/** Changing cursor icons is so far only supported on Win32 and Linux /** Changing cursor icons is so far only supported on Win32 and Linux
Note that this only changes the icons within your application, system cursors outside your Note that this only changes the icons within your application, system cursors outside your
application will not be affected. application will not be affected.
*/ */
virtual void changeIcon(ECURSOR_ICON iconId, const gui::SCursorSprite &sprite) {} virtual void changeIcon(ECURSOR_ICON iconId, const gui::SCursorSprite& sprite) {}
//! Return a system-specific size which is supported for cursors. Larger icons will fail, smaller icons might work. //! 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 core::dimension2di getSupportedIconSize() const { return core::dimension2di(0,0); }
//! Set platform specific behavior flags. //! Set platform specific behavior flags.
virtual void setPlatformBehavior(ECURSOR_PLATFORM_BEHAVIOR behavior) {} virtual void setPlatformBehavior(ECURSOR_PLATFORM_BEHAVIOR behavior) {}
@ -189,7 +192,11 @@ public:
/** \return Behavior set by setPlatformBehavior or ECPB_NONE for platforms not implementing specific behaviors. /** \return Behavior set by setPlatformBehavior or ECPB_NONE for platforms not implementing specific behaviors.
*/ */
virtual ECURSOR_PLATFORM_BEHAVIOR getPlatformBehavior() const { return ECPB_NONE; } virtual ECURSOR_PLATFORM_BEHAVIOR getPlatformBehavior() const { return ECPB_NONE; }
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -22,15 +23,20 @@ joint scene nodes when playing skeletal animations.
class IDummyTransformationSceneNode : public ISceneNode class IDummyTransformationSceneNode : public ISceneNode
{ {
public: public:
//! Constructor //! Constructor
IDummyTransformationSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id) : IDummyTransformationSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id)
ISceneNode(parent, mgr, id) {} : ISceneNode(parent, mgr, id) {}
//! Returns a reference to the current relative transformation matrix. //! Returns a reference to the current relative transformation matrix.
/** This is the matrix, this scene node uses instead of scale, translation /** This is the matrix, this scene node uses instead of scale, translation
and rotation. */ and rotation. */
virtual core::matrix4 &getRelativeTransformationMatrix() = 0; virtual core::matrix4& getRelativeTransformationMatrix() = 0;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_EVENT_RECEIVER_H_INCLUDED__
#define __I_EVENT_RECEIVER_H_INCLUDED__
#include "ILogger.h" #include "ILogger.h"
#include "Keycodes.h" #include "Keycodes.h"
@ -10,9 +11,9 @@
namespace irr namespace irr
{ {
//! Enumeration for all event types there are. //! Enumeration for all event types there are.
enum EEVENT_TYPE enum EEVENT_TYPE
{ {
//! An event of the graphical user interface. //! An event of the graphical user interface.
/** GUI events are created by the GUI environment or the GUI elements in response /** GUI events are created by the GUI environment or the GUI elements in response
to mouse or keyboard events. When a GUI element receives an event it will either to mouse or keyboard events. When a GUI element receives an event it will either
@ -89,11 +90,11 @@ enum EEVENT_TYPE
//! compile these enumeration values to 32 bit. //! compile these enumeration values to 32 bit.
EGUIET_FORCE_32_BIT = 0x7fffffff EGUIET_FORCE_32_BIT = 0x7fffffff
}; };
//! Enumeration for all mouse input events //! Enumeration for all mouse input events
enum EMOUSE_INPUT_EVENT enum EMOUSE_INPUT_EVENT
{ {
//! Left mouse button was pressed down. //! Left mouse button was pressed down.
EMIE_LMOUSE_PRESSED_DOWN = 0, EMIE_LMOUSE_PRESSED_DOWN = 0,
@ -153,11 +154,11 @@ enum EMOUSE_INPUT_EVENT
//! No real event. Just for convenience to get number of events //! No real event. Just for convenience to get number of events
EMIE_COUNT EMIE_COUNT
}; };
//! Masks for mouse button states //! Masks for mouse button states
enum E_MOUSE_BUTTON_STATE_MASK enum E_MOUSE_BUTTON_STATE_MASK
{ {
EMBSM_LEFT = 0x01, EMBSM_LEFT = 0x01,
EMBSM_RIGHT = 0x02, EMBSM_RIGHT = 0x02,
EMBSM_MIDDLE = 0x04, EMBSM_MIDDLE = 0x04,
@ -169,11 +170,11 @@ enum E_MOUSE_BUTTON_STATE_MASK
EMBSM_EXTRA2 = 0x10, EMBSM_EXTRA2 = 0x10,
EMBSM_FORCE_32_BIT = 0x7fffffff EMBSM_FORCE_32_BIT = 0x7fffffff
}; };
//! Enumeration for all touch input events //! Enumeration for all touch input events
enum ETOUCH_INPUT_EVENT enum ETOUCH_INPUT_EVENT
{ {
//! Touch was pressed down. //! Touch was pressed down.
ETIE_PRESSED_DOWN = 0, ETIE_PRESSED_DOWN = 0,
@ -185,10 +186,10 @@ enum ETOUCH_INPUT_EVENT
//! No real event. Just for convenience to get number of events //! No real event. Just for convenience to get number of events
ETIE_COUNT ETIE_COUNT
}; };
enum ESYSTEM_EVENT_TYPE enum ESYSTEM_EVENT_TYPE
{ {
//! From Android command handler for native activity messages //! From Android command handler for native activity messages
ESET_ANDROID_CMD = 0, ESET_ANDROID_CMD = 0,
@ -196,11 +197,11 @@ enum ESYSTEM_EVENT_TYPE
//! No real event, but to get number of event types //! No real event, but to get number of event types
ESET_COUNT ESET_COUNT
}; };
//! Enumeration for a commonly used application state events (it's useful mainly for mobile devices) //! Enumeration for a commonly used application state events (it's useful mainly for mobile devices)
enum EAPPLICATION_EVENT_TYPE enum EAPPLICATION_EVENT_TYPE
{ {
//! The application will be resumed. //! The application will be resumed.
EAET_WILL_RESUME = 0, EAET_WILL_RESUME = 0,
@ -221,16 +222,16 @@ enum EAPPLICATION_EVENT_TYPE
//! No real event, but to get number of event types. //! No real event, but to get number of event types.
EAET_COUNT EAET_COUNT
}; };
namespace gui namespace gui
{ {
class IGUIElement; class IGUIElement;
//! Enumeration for all events which are sendable by the gui system //! Enumeration for all events which are sendable by the gui system
enum EGUI_EVENT_TYPE enum EGUI_EVENT_TYPE
{ {
//! A gui element has lost its focus. //! A gui element has lost its focus.
/** GUIEvent.Caller is losing the focus to GUIEvent.Element. /** GUIEvent.Caller is losing the focus to GUIEvent.Element.
If the event is absorbed then the focus will not be changed. */ If the event is absorbed then the focus will not be changed. */
@ -305,8 +306,9 @@ enum EGUI_EVENT_TYPE
//! No real event. Just for convenience to get number of events //! No real event. Just for convenience to get number of events
EGET_COUNT EGET_COUNT
}; };
} // end namespace gui } // end namespace gui
//! SEvents hold information about an event. See irr::IEventReceiver for details on event handling. //! SEvents hold information about an event. See irr::IEventReceiver for details on event handling.
struct SEvent struct SEvent
@ -315,13 +317,14 @@ struct SEvent
struct SGUIEvent struct SGUIEvent
{ {
//! IGUIElement who called the event //! IGUIElement who called the event
gui::IGUIElement *Caller; gui::IGUIElement* Caller;
//! If the event has something to do with another element, it will be held here. //! If the event has something to do with another element, it will be held here.
gui::IGUIElement *Element; gui::IGUIElement* Element;
//! Type of GUI Event //! Type of GUI Event
gui::EGUI_EVENT_TYPE EventType; gui::EGUI_EVENT_TYPE EventType;
}; };
//! Any kind of mouse event. //! Any kind of mouse event.
@ -338,10 +341,10 @@ struct SEvent
f32 Wheel; f32 Wheel;
//! True if shift was also pressed //! True if shift was also pressed
bool Shift : 1; bool Shift:1;
//! True if ctrl was also pressed //! True if ctrl was also pressed
bool Control : 1; bool Control:1;
//! A bitmap of button states. You can use isButtonPressed() to determine //! A bitmap of button states. You can use isButtonPressed() to determine
//! if a button is pressed or not. //! if a button is pressed or not.
@ -349,13 +352,13 @@ struct SEvent
u32 ButtonStates; u32 ButtonStates;
//! Is the left button pressed down? //! Is the left button pressed down?
bool isLeftPressed() const { return 0 != (ButtonStates & EMBSM_LEFT); } bool isLeftPressed() const { return 0 != ( ButtonStates & EMBSM_LEFT ); }
//! Is the right button pressed down? //! Is the right button pressed down?
bool isRightPressed() const { return 0 != (ButtonStates & EMBSM_RIGHT); } bool isRightPressed() const { return 0 != ( ButtonStates & EMBSM_RIGHT ); }
//! Is the middle button pressed down? //! Is the middle button pressed down?
bool isMiddlePressed() const { return 0 != (ButtonStates & EMBSM_MIDDLE); } bool isMiddlePressed() const { return 0 != ( ButtonStates & EMBSM_MIDDLE ); }
//! Type of mouse event //! Type of mouse event
EMOUSE_INPUT_EVENT Event; EMOUSE_INPUT_EVENT Event;
@ -375,13 +378,13 @@ struct SEvent
u32 SystemKeyCode; u32 SystemKeyCode;
//! If not true, then the key was left up //! If not true, then the key was left up
bool PressedDown : 1; bool PressedDown:1;
//! True if shift was also pressed //! True if shift was also pressed
bool Shift : 1; bool Shift:1;
//! True if ctrl was also pressed //! True if ctrl was also pressed
bool Control : 1; bool Control:1;
}; };
//! String input event. //! String input event.
@ -469,7 +472,7 @@ struct SEvent
AXIS_R, // e.g. rudder, or analog 2 stick 2 top to bottom AXIS_R, // e.g. rudder, or analog 2 stick 2 top to bottom
AXIS_U, AXIS_U,
AXIS_V, AXIS_V,
NUMBER_OF_AXES = 18 // (please tell Irrlicht maintainers if you absolutely need more axes) NUMBER_OF_AXES=18 // (please tell Irrlicht maintainers if you absolutely need more axes)
}; };
/** A bitmap of button states. You can use IsButtonPressed() to /** A bitmap of button states. You can use IsButtonPressed() to
@ -501,7 +504,7 @@ struct SEvent
//! A helper function to check if a button is pressed. //! A helper function to check if a button is pressed.
bool IsButtonPressed(u32 button) const bool IsButtonPressed(u32 button) const
{ {
if (button >= (u32)NUMBER_OF_BUTTONS) if(button >= (u32)NUMBER_OF_BUTTONS)
return false; return false;
return (ButtonStates & (1 << button)) ? true : false; return (ButtonStates & (1 << button)) ? true : false;
@ -512,7 +515,7 @@ struct SEvent
struct SLogEvent struct SLogEvent
{ {
//! Pointer to text which has been logged //! Pointer to text which has been logged
const c8 *Text; const c8* Text;
//! Log level in which the text has been logged //! Log level in which the text has been logged
ELOG_LEVEL Level; ELOG_LEVEL Level;
@ -570,6 +573,7 @@ struct SEvent
struct SSystemEvent SystemEvent; struct SSystemEvent SystemEvent;
struct SApplicationEvent ApplicationEvent; struct SApplicationEvent ApplicationEvent;
}; };
}; };
//! Interface of an object which can receive events. //! Interface of an object which can receive events.
@ -581,6 +585,7 @@ path it takes through the system. */
class IEventReceiver class IEventReceiver
{ {
public: public:
//! Destructor //! Destructor
virtual ~IEventReceiver() {} virtual ~IEventReceiver() {}
@ -590,9 +595,10 @@ public:
* Therefore your return value for all unprocessed events should be 'false'. * Therefore your return value for all unprocessed events should be 'false'.
\return True if the event was processed. \return True if the event was processed.
*/ */
virtual bool OnEvent(const SEvent &event) = 0; virtual bool OnEvent(const SEvent& event) = 0;
}; };
//! Information on a joystick, returned from @ref irr::IrrlichtDevice::activateJoysticks() //! Information on a joystick, returned from @ref irr::IrrlichtDevice::activateJoysticks()
struct SJoystickInfo struct SJoystickInfo
{ {
@ -629,4 +635,8 @@ struct SJoystickInfo
} PovHat; } PovHat;
}; // struct SJoystickInfo }; // struct SJoystickInfo
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReadFile.h"
#include "IFileList.h" #include "IFileList.h"
@ -24,45 +25,61 @@ enum EFileSystemType
enum E_FILE_ARCHIVE_TYPE enum E_FILE_ARCHIVE_TYPE
{ {
//! A PKZIP archive //! A PKZIP archive
EFAT_ZIP = MAKE_IRR_ID('Z', 'I', 'P', 0), EFAT_ZIP = MAKE_IRR_ID('Z','I','P', 0),
//! A gzip archive //! A gzip archive
EFAT_GZIP = MAKE_IRR_ID('g', 'z', 'i', 'p'), EFAT_GZIP = MAKE_IRR_ID('g','z','i','p'),
//! A virtual directory
EFAT_FOLDER = MAKE_IRR_ID('f','l','d','r'),
//! An ID Software PAK archive
EFAT_PAK = MAKE_IRR_ID('P','A','K', 0),
//! A Nebula Device archive
EFAT_NPK = MAKE_IRR_ID('N','P','K', 0),
//! A Tape ARchive
EFAT_TAR = MAKE_IRR_ID('T','A','R', 0),
//! A wad Archive, Quake2, Halflife
EFAT_WAD = MAKE_IRR_ID('W','A','D', 0),
//! An Android asset file archive //! An Android asset file archive
EFAT_ANDROID_ASSET = MAKE_IRR_ID('A', 'S', 'S', 'E'), EFAT_ANDROID_ASSET = MAKE_IRR_ID('A','S','S','E'),
//! The type of this archive is unknown //! The type of this archive is unknown
EFAT_UNKNOWN = MAKE_IRR_ID('u', 'n', 'k', 'n') EFAT_UNKNOWN = MAKE_IRR_ID('u','n','k','n')
}; };
//! The FileArchive manages archives and provides access to files inside them. //! The FileArchive manages archives and provides access to files inside them.
class IFileArchive : public virtual IReferenceCounted class IFileArchive : public virtual IReferenceCounted
{ {
public: public:
//! Opens a file based on its name //! Opens a file based on its name
/** Creates and returns a new IReadFile for a file in the archive. /** Creates and returns a new IReadFile for a file in the archive.
\param filename The file to open \param filename The file to open
\return Returns A pointer to the created file on success, \return Returns A pointer to the created file on success,
or 0 on failure. */ or 0 on failure. */
virtual IReadFile *createAndOpenFile(const path &filename) = 0; virtual IReadFile* createAndOpenFile(const path& filename) =0;
//! Opens a file based on its position in the file list. //! Opens a file based on its position in the file list.
/** Creates and returns /** Creates and returns
\param index The zero based index of the file. \param index The zero based index of the file.
\return Returns a pointer to the created file on success, or 0 on failure. */ \return Returns a pointer to the created file on success, or 0 on failure. */
virtual IReadFile *createAndOpenFile(u32 index) = 0; virtual IReadFile* createAndOpenFile(u32 index) =0;
//! Returns the complete file tree //! Returns the complete file tree
/** \return Returns the complete directory tree for the archive, /** \return Returns the complete directory tree for the archive,
including all files and folders */ including all files and folders */
virtual const IFileList *getFileList() const = 0; virtual const IFileList* getFileList() const =0;
//! get the archive type //! get the archive type
virtual E_FILE_ARCHIVE_TYPE getType() const { return EFAT_UNKNOWN; } virtual E_FILE_ARCHIVE_TYPE getType() const { return EFAT_UNKNOWN; }
//! return the name (id) of the file Archive //! return the name (id) of the file Archive
virtual const io::path &getArchiveName() const = 0; virtual const io::path& getArchiveName() const =0;
//! Add a directory in the archive and all it's files to the FileList //! Add a directory in the archive and all it's files to the FileList
/** Only needed for file-archives which have no information about their own /** Only needed for file-archives which have no information about their own
@ -94,34 +111,38 @@ public:
/** Check based on the file extension (e.g. ".zip") /** Check based on the file extension (e.g. ".zip")
\param filename Name of file to check. \param filename Name of file to check.
\return True if file seems to be loadable. */ \return True if file seems to be loadable. */
virtual bool isALoadableFileFormat(const path &filename) const = 0; virtual bool isALoadableFileFormat(const path& filename) const =0;
//! Check if the file might be loaded by this class //! Check if the file might be loaded by this class
/** This check may look into the file. /** This check may look into the file.
\param file File handle to check. \param file File handle to check.
\return True if file seems to be loadable. */ \return True if file seems to be loadable. */
virtual bool isALoadableFileFormat(io::IReadFile *file) const = 0; virtual bool isALoadableFileFormat(io::IReadFile* file) const =0;
//! Check to see if the loader can create archives of this type. //! Check to see if the loader can create archives of this type.
/** Check based on the archive type. /** Check based on the archive type.
\param fileType The archive type to check. \param fileType The archive type to check.
\return True if the archive loader supports this type, false if not */ \return True if the archive loader supports this type, false if not */
virtual bool isALoadableFileFormat(E_FILE_ARCHIVE_TYPE fileType) const = 0; virtual bool isALoadableFileFormat(E_FILE_ARCHIVE_TYPE fileType) const =0;
//! Creates an archive from the filename //! Creates an archive from the filename
/** \param filename File to use. /** \param filename File to use.
\param ignoreCase Searching is performed without regarding the case \param ignoreCase Searching is performed without regarding the case
\param ignorePaths Files are searched for without checking for the directories \param ignorePaths Files are searched for without checking for the directories
\return Pointer to newly created archive, or 0 upon error. */ \return Pointer to newly created archive, or 0 upon error. */
virtual IFileArchive *createArchive(const path &filename, bool ignoreCase, bool ignorePaths) const = 0; virtual IFileArchive* createArchive(const path& filename, bool ignoreCase, bool ignorePaths) const =0;
//! Creates an archive from the file //! Creates an archive from the file
/** \param file File handle to use. /** \param file File handle to use.
\param ignoreCase Searching is performed without regarding the case \param ignoreCase Searching is performed without regarding the case
\param ignorePaths Files are searched for without checking for the directories \param ignorePaths Files are searched for without checking for the directories
\return Pointer to newly created archive, or 0 upon error. */ \return Pointer to newly created archive, or 0 upon error. */
virtual IFileArchive *createArchive(io::IReadFile *file, bool ignoreCase, bool ignorePaths) const = 0; virtual IFileArchive* createArchive(io::IReadFile* file, bool ignoreCase, bool ignorePaths) const =0;
}; };
} // end namespace io } // end namespace io
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "path.h" #include "path.h"
@ -27,13 +28,13 @@ public:
\param index is the zero based index of the file which name should \param index is the zero based index of the file which name should
be returned. The index must be less than the amount getFileCount() returns. be returned. The index must be less than the amount getFileCount() returns.
\return File name of the file. Returns 0, if an error occurred. */ \return File name of the file. Returns 0, if an error occurred. */
virtual const io::path &getFileName(u32 index) const = 0; 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. //! 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 /** \param index is the zero based index of the file which name should
be returned. The index must be less than the amount getFileCount() returns. be returned. The index must be less than the amount getFileCount() returns.
\return File name of the file. Returns 0 if an error occurred. */ \return File name of the file. Returns 0 if an error occurred. */
virtual const io::path &getFullFileName(u32 index) const = 0; virtual const io::path& getFullFileName(u32 index) const = 0;
//! Returns the size of a file in the file list, based on an index. //! 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. /** \param index is the zero based index of the file which should be returned.
@ -68,10 +69,10 @@ public:
\param isFolder True if you are searching for a directory path, false if you are searching for a file \param isFolder True if you are searching for a directory path, false if you are searching for a file
\return Returns the index of the file in the file list, or -1 if \return Returns the index of the file in the file list, or -1 if
no matching name name was found. */ no matching name name was found. */
virtual s32 findFile(const io::path &filename, bool isFolder = false) const = 0; virtual s32 findFile(const io::path& filename, bool isFolder=false) const = 0;
//! Returns the base path of the file list //! Returns the base path of the file list
virtual const io::path &getPath() const = 0; virtual const io::path& getPath() const = 0;
//! Add as a file or folder to the list //! Add as a file or folder to the list
/** \param fullPath The file name including path, from the root of the file list. /** \param fullPath The file name including path, from the root of the file list.
@ -79,7 +80,7 @@ public:
\param offset The file offset inside an archive \param offset The file offset inside an archive
\param size The size of the file in bytes. \param size The size of the file in bytes.
\param id The ID of the file in the archive which owns it */ \param id The ID of the file in the archive which owns it */
virtual u32 addItem(const io::path &fullPath, u32 offset, u32 size, bool isDirectory, u32 id = 0) = 0; 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 //! Sorts the file list. You should call this after adding any items to the file list
virtual void sort() = 0; virtual void sort() = 0;
@ -87,3 +88,7 @@ public:
} // end namespace irr } // end namespace irr
} // end namespace io } // end namespace io
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "IFileArchive.h" #include "IFileArchive.h"
@ -11,7 +12,7 @@ namespace irr
{ {
namespace video namespace video
{ {
class IVideoDriver; class IVideoDriver;
} // end namespace video } // end namespace video
namespace io namespace io
{ {
@ -21,6 +22,7 @@ class IWriteFile;
class IFileList; class IFileList;
class IAttributes; class IAttributes;
//! The FileSystem manages files and archives and provides access to them. //! 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 /** 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 need to know where every file is located. A file could be in a .zip-Archive or
@ -28,12 +30,13 @@ as file on disk, using the IFileSystem makes no difference to this. */
class IFileSystem : public virtual IReferenceCounted class IFileSystem : public virtual IReferenceCounted
{ {
public: public:
//! Opens a file for read access. //! Opens a file for read access.
/** \param filename: Name of file to open. /** \param filename: Name of file to open.
\return Pointer to the created file interface. \return Pointer to the created file interface.
The returned pointer should be dropped when no longer needed. The returned pointer should be dropped when no longer needed.
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IReadFile *createAndOpenFile(const path &filename) = 0; virtual IReadFile* createAndOpenFile(const path& filename) =0;
//! Creates an IReadFile interface for accessing memory like a file. //! Creates an IReadFile interface for accessing memory like a file.
/** This allows you to use a pointer to memory where an IReadFile is requested. /** This allows you to use a pointer to memory where an IReadFile is requested.
@ -46,7 +49,7 @@ public:
The returned pointer should be dropped when no longer needed. The returned pointer should be dropped when no longer needed.
See IReferenceCounted::drop() for more information. See IReferenceCounted::drop() for more information.
*/ */
virtual IReadFile *createMemoryReadFile(const void *memory, s32 len, const path &fileName, bool deleteMemoryWhenDropped = false) = 0; virtual IReadFile* createMemoryReadFile(const void* memory, s32 len, const path& fileName, bool deleteMemoryWhenDropped=false) =0;
//! Creates an IReadFile interface for accessing files inside files. //! Creates an IReadFile interface for accessing files inside files.
/** This is useful e.g. for archives. /** This is useful e.g. for archives.
@ -58,8 +61,8 @@ public:
The returned pointer should be dropped when no longer needed. The returned pointer should be dropped when no longer needed.
See IReferenceCounted::drop() for more information. See IReferenceCounted::drop() for more information.
*/ */
virtual IReadFile *createLimitReadFile(const path &fileName, virtual IReadFile* createLimitReadFile(const path& fileName,
IReadFile *alreadyOpenedFile, long pos, long areaSize) = 0; IReadFile* alreadyOpenedFile, long pos, long areaSize) =0;
//! Creates an IWriteFile interface for accessing memory like a file. //! Creates an IWriteFile interface for accessing memory like a file.
/** This allows you to use a pointer to memory where an IWriteFile is requested. /** This allows you to use a pointer to memory where an IWriteFile is requested.
@ -73,7 +76,8 @@ public:
The returned pointer should be dropped when no longer needed. The returned pointer should be dropped when no longer needed.
See IReferenceCounted::drop() for more information. See IReferenceCounted::drop() for more information.
*/ */
virtual IWriteFile *createMemoryWriteFile(void *memory, s32 len, const path &fileName, bool deleteMemoryWhenDropped = false) = 0; virtual IWriteFile* createMemoryWriteFile(void* memory, s32 len, const path& fileName, bool deleteMemoryWhenDropped=false) =0;
//! Opens a file for write access. //! Opens a file for write access.
/** \param filename: Name of file to open. /** \param filename: Name of file to open.
@ -83,7 +87,7 @@ public:
file could not created or opened for writing. file could not created or opened for writing.
The returned pointer should be dropped when no longer needed. The returned pointer should be dropped when no longer needed.
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IWriteFile *createAndWriteFile(const path &filename, bool append = false) = 0; virtual IWriteFile* createAndWriteFile(const path& filename, bool append=false) =0;
//! Adds an archive to the file system. //! Adds an archive to the file system.
/** After calling this, the Irrlicht Engine will also search and open /** After calling this, the Irrlicht Engine will also search and open
@ -107,11 +111,11 @@ public:
\param password An optional password, which is used in case of encrypted archives. \param password An optional password, which is used in case of encrypted archives.
\param retArchive A pointer that will be set to the archive that is added. \param retArchive A pointer that will be set to the archive that is added.
\return True if the archive was added successfully, false if not. */ \return True if the archive was added successfully, false if not. */
virtual bool addFileArchive(const path &filename, bool ignoreCase = true, virtual bool addFileArchive(const path& filename, bool ignoreCase=true,
bool ignorePaths = true, bool ignorePaths=true,
E_FILE_ARCHIVE_TYPE archiveType = EFAT_UNKNOWN, E_FILE_ARCHIVE_TYPE archiveType=EFAT_UNKNOWN,
const core::stringc &password = "", const core::stringc& password="",
IFileArchive **retArchive = 0) = 0; IFileArchive** retArchive=0) =0;
//! Adds an archive to the file system. //! Adds an archive to the file system.
/** After calling this, the Irrlicht Engine will also search and open /** After calling this, the Irrlicht Engine will also search and open
@ -139,19 +143,19 @@ public:
\param password An optional password, which is used in case of encrypted archives. \param password An optional password, which is used in case of encrypted archives.
\param retArchive A pointer that will be set to the archive that is added. \param retArchive A pointer that will be set to the archive that is added.
\return True if the archive was added successfully, false if not. */ \return True if the archive was added successfully, false if not. */
virtual bool addFileArchive(IReadFile *file, bool ignoreCase = true, virtual bool addFileArchive(IReadFile* file, bool ignoreCase=true,
bool ignorePaths = true, bool ignorePaths=true,
E_FILE_ARCHIVE_TYPE archiveType = EFAT_UNKNOWN, E_FILE_ARCHIVE_TYPE archiveType=EFAT_UNKNOWN,
const core::stringc &password = "", const core::stringc& password="",
IFileArchive **retArchive = 0) = 0; IFileArchive** retArchive=0) =0;
//! Adds an archive to the file system. //! Adds an archive to the file system.
/** \param archive: The archive to add to the file system. /** \param archive: The archive to add to the file system.
\return True if the archive was added successfully, false if not. */ \return True if the archive was added successfully, false if not. */
virtual bool addFileArchive(IFileArchive *archive) = 0; virtual bool addFileArchive(IFileArchive* archive) =0;
//! Get the number of archives currently attached to the file system //! Get the number of archives currently attached to the file system
virtual u32 getFileArchiveCount() const = 0; virtual u32 getFileArchiveCount() const =0;
//! Removes an archive from the file system. //! Removes an archive from the file system.
/** This will close the archive and free any file handles, but will not /** This will close the archive and free any file handles, but will not
@ -159,7 +163,7 @@ public:
example textures and meshes. example textures and meshes.
\param index: The index of the archive to remove \param index: The index of the archive to remove
\return True on success, false on failure */ \return True on success, false on failure */
virtual bool removeFileArchive(u32 index) = 0; virtual bool removeFileArchive(u32 index) =0;
//! Removes an archive from the file system. //! Removes an archive from the file system.
/** This will close the archive and free any file handles, but will not /** This will close the archive and free any file handles, but will not
@ -173,7 +177,7 @@ public:
locating the archive to work with. locating the archive to work with.
\param filename The archive pointed to by the name will be removed \param filename The archive pointed to by the name will be removed
\return True on success, false on failure */ \return True on success, false on failure */
virtual bool removeFileArchive(const path &filename) = 0; virtual bool removeFileArchive(const path& filename) =0;
//! Removes an archive from the file system. //! Removes an archive from the file system.
/** This will close the archive and free any file handles, but will not /** This will close the archive and free any file handles, but will not
@ -181,21 +185,21 @@ public:
example textures and meshes. example textures and meshes.
\param archive The archive to remove. \param archive The archive to remove.
\return True on success, false on failure */ \return True on success, false on failure */
virtual bool removeFileArchive(const IFileArchive *archive) = 0; virtual bool removeFileArchive(const IFileArchive* archive) =0;
//! Changes the search order of attached archives. //! Changes the search order of attached archives.
/** /**
\param sourceIndex: The index of the archive to change \param sourceIndex: The index of the archive to change
\param relative: The relative change in position, archives with a lower index are searched first */ \param relative: The relative change in position, archives with a lower index are searched first */
virtual bool moveFileArchive(u32 sourceIndex, s32 relative) = 0; virtual bool moveFileArchive(u32 sourceIndex, s32 relative) =0;
//! Get the archive at a given index. //! Get the archive at a given index.
virtual IFileArchive *getFileArchive(u32 index) = 0; virtual IFileArchive* getFileArchive(u32 index) =0;
//! Adds an external archive loader to the engine. //! Adds an external archive loader to the engine.
/** Use this function to add support for new archive types to the /** Use this function to add support for new archive types to the
engine, for example proprietary or encrypted file storage. */ engine, for example proprietary or encrypted file storage. */
virtual void addArchiveLoader(IArchiveLoader *loader) = 0; virtual void addArchiveLoader(IArchiveLoader* loader) =0;
//! Gets the number of archive loaders currently added //! Gets the number of archive loaders currently added
virtual u32 getArchiveLoaderCount() const = 0; virtual u32 getArchiveLoaderCount() const = 0;
@ -204,62 +208,66 @@ public:
/** \param index The index of the loader to retrieve. This parameter is an 0-based /** \param index The index of the loader to retrieve. This parameter is an 0-based
array index. array index.
\return A pointer to the specified loader, 0 if the index is incorrect. */ \return A pointer to the specified loader, 0 if the index is incorrect. */
virtual IArchiveLoader *getArchiveLoader(u32 index) const = 0; virtual IArchiveLoader* getArchiveLoader(u32 index) const = 0;
//! Get the current working directory. //! Get the current working directory.
/** \return Current working directory as a string. */ /** \return Current working directory as a string. */
virtual const path &getWorkingDirectory() = 0; virtual const path& getWorkingDirectory() =0;
//! Changes the current working directory. //! Changes the current working directory.
/** \param newDirectory: A string specifying the new working directory. /** \param newDirectory: A string specifying the new working directory.
The string is operating system dependent. Under Windows it has The string is operating system dependent. Under Windows it has
the form "<drive>:\<directory>\<sudirectory>\<..>". An example would be: "C:\Windows\" the form "<drive>:\<directory>\<sudirectory>\<..>". An example would be: "C:\Windows\"
\return True if successful, otherwise false. */ \return True if successful, otherwise false. */
virtual bool changeWorkingDirectoryTo(const path &newDirectory) = 0; virtual bool changeWorkingDirectoryTo(const path& newDirectory) =0;
//! Converts a relative path to an absolute (unique) path, resolving symbolic links if required //! Converts a relative path to an absolute (unique) path, resolving symbolic links if required
/** \param filename Possibly relative file or directory name to query. /** \param filename Possibly relative file or directory name to query.
\result Absolute filename which points to the same file. */ \result Absolute filename which points to the same file. */
virtual path getAbsolutePath(const path &filename) const = 0; virtual path getAbsolutePath(const path& filename) const =0;
//! Get the directory a file is located in. //! Get the directory a file is located in.
/** \param filename: The file to get the directory from. /** \param filename: The file to get the directory from.
\return String containing the directory of the file. */ \return String containing the directory of the file. */
virtual path getFileDir(const path &filename) const = 0; virtual path getFileDir(const path& filename) const =0;
//! Get the base part of a filename, i.e. the name without the directory part. //! Get the base part of a filename, i.e. the name without the directory part.
/** If no directory is prefixed, the full name is returned. /** If no directory is prefixed, the full name is returned.
\param filename: The file to get the basename from \param filename: The file to get the basename from
\param keepExtension True if filename with extension is returned otherwise everything \param keepExtension True if filename with extension is returned otherwise everything
after the final '.' is removed as well. */ after the final '.' is removed as well. */
virtual path getFileBasename(const path &filename, bool keepExtension = true) const = 0; virtual path getFileBasename(const path& filename, bool keepExtension=true) const =0;
//! flatten a path and file name for example: "/you/me/../." becomes "/you" //! flatten a path and file name for example: "/you/me/../." becomes "/you"
virtual path &flattenFilename(path &directory, const path &root = "/") const = 0; virtual path& flattenFilename(path& directory, const path& root="/") const =0;
//! Get the relative filename, relative to the given directory //! Get the relative filename, relative to the given directory
virtual path getRelativeFilename(const path &filename, const path &directory) const = 0; virtual path getRelativeFilename(const path& filename, const path& directory) const =0;
//! Creates a list of files and directories in the current working directory and returns it. //! 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 /** \return a Pointer to the created IFileList is returned. After the list has been used
it has to be deleted using its IFileList::drop() method. it has to be deleted using its IFileList::drop() method.
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IFileList *createFileList() = 0; virtual IFileList* createFileList() =0;
//! Creates an empty filelist //! Creates an empty filelist
/** \return a Pointer to the created IFileList is returned. After the list has been used /** \return a Pointer to the created IFileList is returned. After the list has been used
it has to be deleted using its IFileList::drop() method. it has to be deleted using its IFileList::drop() method.
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IFileList *createEmptyFileList(const io::path &path, bool ignoreCase, bool ignorePaths) = 0; virtual IFileList* createEmptyFileList(const io::path& path, bool ignoreCase, bool ignorePaths) =0;
//! Set the active type of file system. //! Set the active type of file system.
virtual EFileSystemType setFileListSystem(EFileSystemType listType) = 0; virtual EFileSystemType setFileListSystem(EFileSystemType listType) =0;
//! Determines if a file exists and could be opened. //! Determines if a file exists and could be opened.
/** \param filename is the string identifying the file which should be tested for existence. /** \param filename is the string identifying the file which should be tested for existence.
\return True if file exists, and false if it does not exist or an error occurred. */ \return True if file exists, and false if it does not exist or an error occurred. */
virtual bool existFile(const path &filename) const = 0; virtual bool existFile(const path& filename) const =0;
}; };
} // end namespace io } // end namespace io
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "EShaderTypes.h"
#include "EMaterialTypes.h" #include "EMaterialTypes.h"
@ -14,7 +15,7 @@ namespace irr
namespace io namespace io
{ {
class IReadFile; class IReadFile;
} // end namespace io } // end namespace io
namespace video namespace video
@ -27,6 +28,7 @@ class IShaderConstantSetCallBack;
class IGPUProgrammingServices class IGPUProgrammingServices
{ {
public: public:
//! Destructor //! Destructor
virtual ~IGPUProgrammingServices() {} virtual ~IGPUProgrammingServices() {}
@ -72,33 +74,33 @@ public:
target is not reachable. The error strings are then printed to the target is not reachable. The error strings are then printed to the
error log and can be caught with a custom event receiver. */ error log and can be caught with a custom event receiver. */
virtual s32 addHighLevelShaderMaterial( virtual s32 addHighLevelShaderMaterial(
const c8 *vertexShaderProgram, const c8* vertexShaderProgram,
const c8 *vertexShaderEntryPointName, const c8* vertexShaderEntryPointName,
E_VERTEX_SHADER_TYPE vsCompileTarget, E_VERTEX_SHADER_TYPE vsCompileTarget,
const c8 *pixelShaderProgram, const c8* pixelShaderProgram,
const c8 *pixelShaderEntryPointName, const c8* pixelShaderEntryPointName,
E_PIXEL_SHADER_TYPE psCompileTarget, E_PIXEL_SHADER_TYPE psCompileTarget,
const c8 *geometryShaderProgram, const c8* geometryShaderProgram,
const c8 *geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0, u32 verticesOut = 0,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0; s32 userData = 0) = 0;
//! convenience function for use without geometry shaders //! convenience function for use without geometry shaders
s32 addHighLevelShaderMaterial( s32 addHighLevelShaderMaterial(
const c8 *vertexShaderProgram, const c8* vertexShaderProgram,
const c8 *vertexShaderEntryPointName = "main", const c8* vertexShaderEntryPointName="main",
E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, E_VERTEX_SHADER_TYPE vsCompileTarget=EVST_VS_1_1,
const c8 *pixelShaderProgram = 0, const c8* pixelShaderProgram=0,
const c8 *pixelShaderEntryPointName = "main", const c8* pixelShaderEntryPointName="main",
E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, E_PIXEL_SHADER_TYPE psCompileTarget=EPST_PS_1_1,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback=0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial=video::EMT_SOLID,
s32 userData = 0) s32 userData=0)
{ {
return addHighLevelShaderMaterial( return addHighLevelShaderMaterial(
vertexShaderProgram, vertexShaderEntryPointName, vertexShaderProgram, vertexShaderEntryPointName,
@ -114,11 +116,11 @@ public:
type 1.1. type 1.1.
*/ */
s32 addHighLevelShaderMaterial( s32 addHighLevelShaderMaterial(
const c8 *vertexShaderProgram, const c8* vertexShaderProgram,
const c8 *pixelShaderProgram = 0, const c8* pixelShaderProgram=0,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback=0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) s32 userData=0)
{ {
return addHighLevelShaderMaterial( return addHighLevelShaderMaterial(
vertexShaderProgram, "main", vertexShaderProgram, "main",
@ -134,15 +136,15 @@ public:
type 1.1 and geometry shader 4.0. type 1.1 and geometry shader 4.0.
*/ */
s32 addHighLevelShaderMaterial( s32 addHighLevelShaderMaterial(
const c8 *vertexShaderProgram, const c8* vertexShaderProgram,
const c8 *pixelShaderProgram = 0, const c8* pixelShaderProgram = 0,
const c8 *geometryShaderProgram = 0, const c8* geometryShaderProgram = 0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0, u32 verticesOut = 0,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) s32 userData = 0 )
{ {
return addHighLevelShaderMaterial( return addHighLevelShaderMaterial(
vertexShaderProgram, "main", vertexShaderProgram, "main",
@ -153,7 +155,7 @@ public:
callback, baseMaterial, userData); callback, baseMaterial, userData);
} }
//! Like addHighLevelShaderMaterial(), but loads from files. //! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
/** \param vertexShaderProgramFileName Text file containing the source /** \param vertexShaderProgramFileName Text file containing the source
of the vertex shader program. Set to empty string if no vertex shader of the vertex shader program. Set to empty string if no vertex shader
shall be created. shall be created.
@ -196,31 +198,31 @@ public:
target is not reachable. The error strings are then printed to the target is not reachable. The error strings are then printed to the
error log and can be caught with a custom event receiver. */ error log and can be caught with a custom event receiver. */
virtual s32 addHighLevelShaderMaterialFromFiles( virtual s32 addHighLevelShaderMaterialFromFiles(
const io::path &vertexShaderProgramFileName, const io::path& vertexShaderProgramFileName,
const c8 *vertexShaderEntryPointName, const c8* vertexShaderEntryPointName,
E_VERTEX_SHADER_TYPE vsCompileTarget, E_VERTEX_SHADER_TYPE vsCompileTarget,
const io::path &pixelShaderProgramFileName, const io::path& pixelShaderProgramFileName,
const c8 *pixelShaderEntryPointName, const c8* pixelShaderEntryPointName,
E_PIXEL_SHADER_TYPE psCompileTarget, E_PIXEL_SHADER_TYPE psCompileTarget,
const io::path &geometryShaderProgramFileName, const io::path& geometryShaderProgramFileName,
const c8 *geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0, u32 verticesOut = 0,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0; s32 userData = 0) = 0;
//! convenience function for use without geometry shaders //! convenience function for use without geometry shaders
s32 addHighLevelShaderMaterialFromFiles( s32 addHighLevelShaderMaterialFromFiles(
const io::path &vertexShaderProgramFileName, const io::path& vertexShaderProgramFileName,
const c8 *vertexShaderEntryPointName = "main", const c8* vertexShaderEntryPointName = "main",
E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1,
const io::path &pixelShaderProgramFileName = "", const io::path& pixelShaderProgramFileName = "",
const c8 *pixelShaderEntryPointName = "main", const c8* pixelShaderEntryPointName = "main",
E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) s32 userData = 0)
{ {
@ -238,11 +240,11 @@ public:
type 1.1. type 1.1.
*/ */
s32 addHighLevelShaderMaterialFromFiles( s32 addHighLevelShaderMaterialFromFiles(
const io::path &vertexShaderProgramFileName, const io::path& vertexShaderProgramFileName,
const io::path &pixelShaderProgramFileName = "", const io::path& pixelShaderProgramFileName = "",
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) s32 userData = 0 )
{ {
return addHighLevelShaderMaterialFromFiles( return addHighLevelShaderMaterialFromFiles(
vertexShaderProgramFileName, "main", vertexShaderProgramFileName, "main",
@ -258,15 +260,15 @@ public:
type 1.1 and geometry shader 4.0. type 1.1 and geometry shader 4.0.
*/ */
s32 addHighLevelShaderMaterialFromFiles( s32 addHighLevelShaderMaterialFromFiles(
const io::path &vertexShaderProgramFileName, const io::path& vertexShaderProgramFileName,
const io::path &pixelShaderProgramFileName = "", const io::path& pixelShaderProgramFileName = "",
const io::path &geometryShaderProgramFileName = "", const io::path& geometryShaderProgramFileName = "",
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0, u32 verticesOut = 0,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) s32 userData = 0 )
{ {
return addHighLevelShaderMaterialFromFiles( return addHighLevelShaderMaterialFromFiles(
vertexShaderProgramFileName, "main", vertexShaderProgramFileName, "main",
@ -277,7 +279,7 @@ public:
callback, baseMaterial, userData); callback, baseMaterial, userData);
} }
//! Like addHighLevelShaderMaterial(), but loads from files. //! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
/** \param vertexShaderProgram Text file handle containing the source /** \param vertexShaderProgram Text file handle containing the source
of the vertex shader program. Set to 0 if no vertex shader shall be of the vertex shader program. Set to 0 if no vertex shader shall be
created. created.
@ -318,31 +320,31 @@ public:
compile target is not reachable. The error strings are then printed to compile target is not reachable. The error strings are then printed to
the error log and can be caught with a custom event receiver. */ the error log and can be caught with a custom event receiver. */
virtual s32 addHighLevelShaderMaterialFromFiles( virtual s32 addHighLevelShaderMaterialFromFiles(
io::IReadFile *vertexShaderProgram, io::IReadFile* vertexShaderProgram,
const c8 *vertexShaderEntryPointName, const c8* vertexShaderEntryPointName,
E_VERTEX_SHADER_TYPE vsCompileTarget, E_VERTEX_SHADER_TYPE vsCompileTarget,
io::IReadFile *pixelShaderProgram, io::IReadFile* pixelShaderProgram,
const c8 *pixelShaderEntryPointName, const c8* pixelShaderEntryPointName,
E_PIXEL_SHADER_TYPE psCompileTarget, E_PIXEL_SHADER_TYPE psCompileTarget,
io::IReadFile *geometryShaderProgram, io::IReadFile* geometryShaderProgram,
const c8 *geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0, u32 verticesOut = 0,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0; s32 userData = 0) = 0;
//! convenience function for use without geometry shaders //! convenience function for use without geometry shaders
s32 addHighLevelShaderMaterialFromFiles( s32 addHighLevelShaderMaterialFromFiles(
io::IReadFile *vertexShaderProgram, io::IReadFile* vertexShaderProgram,
const c8 *vertexShaderEntryPointName = "main", const c8* vertexShaderEntryPointName = "main",
E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1,
io::IReadFile *pixelShaderProgram = 0, io::IReadFile* pixelShaderProgram = 0,
const c8 *pixelShaderEntryPointName = "main", const c8* pixelShaderEntryPointName = "main",
E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) s32 userData = 0)
{ {
@ -355,15 +357,99 @@ public:
callback, baseMaterial, userData); callback, baseMaterial, userData);
} }
//! Delete a shader material and associated data. //! Adds a new ASM shader material renderer to the VideoDriver
/** /** Note that it is a good idea to call IVideoDriver::queryFeature() in
After you have deleted a material it is invalid to still use and doing advance to check if the IVideoDriver supports the vertex and/or pixel
so might result in a crash. The ID may be reused in the future when new shader version your are using.
materials are added.
\param material Number of the material type. Must not be a built-in The material is added to the VideoDriver like with
material. */ IVideoDriver::addMaterialRenderer() and can be used like it had been
virtual void deleteShaderMaterial(s32 material) = 0; added with that method.
\param vertexShaderProgram String containing the source of the vertex
shader program. This can be 0 if no vertex program shall be used.
For DX8 programs, the will always input registers look like this: v0:
position, v1: normal, v2: color, v3: texture coordinates, v4: texture
coordinates 2 if available.
For DX9 programs, you can manually set the registers using the dcl_
statements.
\param pixelShaderProgram String containing the source of the pixel
shader program. This can be 0 if you don't want to use a pixel shader.
\param callback Pointer to an implementation of
IShaderConstantSetCallBack in which you can set the needed vertex and
pixel shader program constants. Set this to 0 if you don't need this.
\param baseMaterial Base material which renderstates will be used to
shade the material.
\param userData a user data int. This int can be set to any value and
will be set as parameter in the callback method when calling
OnSetConstants(). In this way it is easily possible to use the same
callback method for multiple materials and distinguish between them
during the call.
\return Returns the number of the material type which can be set in
SMaterial::MaterialType to use the renderer. -1 is returned if an
error occurred. -1 is returned for example if a vertex or pixel shader
program could not be compiled, the error strings are then printed out
into the error log, and can be caught with a custom event receiver. */
virtual s32 addShaderMaterial(const c8* vertexShaderProgram = 0,
const c8* pixelShaderProgram = 0,
IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0;
//! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
/** \param vertexShaderProgram Text file containing the source of the
vertex shader program. Set to 0 if no shader shall be created.
\param pixelShaderProgram Text file containing the source of the pixel
shader program. Set to 0 if no shader shall be created.
\param callback Pointer to an IShaderConstantSetCallback object to
which the OnSetConstants function is called.
\param baseMaterial baseMaterial
\param userData a user data int. This int can be set to any value and
will be set as parameter in the callback method when calling
OnSetConstants(). In this way it is easily possible to use the same
callback method for multiple materials and distinguish between them
during the call.
\return Returns the number of the material type which can be set in
SMaterial::MaterialType to use the renderer. -1 is returned if an
error occurred. -1 is returned for example if a vertex or pixel shader
program could not be compiled, the error strings are then printed out
into the error log, and can be caught with a custom event receiver. */
virtual s32 addShaderMaterialFromFiles(io::IReadFile* vertexShaderProgram,
io::IReadFile* pixelShaderProgram,
IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0;
//! Like IGPUProgrammingServices::addShaderMaterial(), but loads from files.
/** \param vertexShaderProgramFileName Text file name containing the
source of the vertex shader program. Set to 0 if no shader shall be
created.
\param pixelShaderProgramFileName Text file name containing the source
of the pixel shader program. Set to 0 if no shader shall be created.
\param callback Pointer to an IShaderConstantSetCallback object on
which the OnSetConstants function is called.
\param baseMaterial baseMaterial
\param userData a user data int. This int can be set to any value and
will be set as parameter in the callback method when calling
OnSetConstants(). In this way it is easily possible to use the same
callback method for multiple materials and distinguish between them
during the call.
\return Returns the number of the material type which can be set in
SMaterial::MaterialType to use the renderer. -1 is returned if an
error occurred. -1 is returned for example if a vertex or pixel shader
program could not be compiled, the error strings are then printed out
into the error log, and can be caught with a custom event receiver. */
virtual s32 addShaderMaterialFromFiles(const io::path& vertexShaderProgramFileName,
const io::path& pixelShaderProgramFileName,
IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0;
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,23 +12,23 @@ namespace irr
namespace video namespace video
{ {
class ITexture; class ITexture;
} // end namespace video } // end namespace video
namespace gui namespace gui
{ {
class IGUIFont; class IGUIFont;
class IGUISpriteBank; class IGUISpriteBank;
//! Current state of buttons used for drawing sprites. //! Current state of buttons used for drawing sprites.
//! Note that up to 3 states can be active at the same time: //! Note that up to 3 states can be active at the same time:
//! EGBS_BUTTON_UP or EGBS_BUTTON_DOWN //! EGBS_BUTTON_UP or EGBS_BUTTON_DOWN
//! EGBS_BUTTON_MOUSE_OVER or EGBS_BUTTON_MOUSE_OFF //! EGBS_BUTTON_MOUSE_OVER or EGBS_BUTTON_MOUSE_OFF
//! EGBS_BUTTON_FOCUSED or EGBS_BUTTON_NOT_FOCUSED //! EGBS_BUTTON_FOCUSED or EGBS_BUTTON_NOT_FOCUSED
enum EGUI_BUTTON_STATE enum EGUI_BUTTON_STATE
{ {
//! The button is not pressed. //! The button is not pressed.
EGBS_BUTTON_UP = 0, EGBS_BUTTON_UP=0,
//! The button is currently pressed down. //! The button is currently pressed down.
EGBS_BUTTON_DOWN, EGBS_BUTTON_DOWN,
//! The mouse cursor is over the button //! The mouse cursor is over the button
@ -42,10 +43,11 @@ enum EGUI_BUTTON_STATE
EGBS_BUTTON_DISABLED, EGBS_BUTTON_DISABLED,
//! not used, counts the number of enumerated items //! not used, counts the number of enumerated items
EGBS_COUNT EGBS_COUNT
}; };
//! Names for gui button state icons //! Names for gui button state icons
const c8 *const GUIButtonStateNames[EGBS_COUNT + 1] = { const c8* const GUIButtonStateNames[EGBS_COUNT+1] =
{
"buttonUp", "buttonUp",
"buttonDown", "buttonDown",
"buttonMouseOver", "buttonMouseOver",
@ -53,16 +55,16 @@ const c8 *const GUIButtonStateNames[EGBS_COUNT + 1] = {
"buttonFocused", "buttonFocused",
"buttonNotFocused", "buttonNotFocused",
"buttonDisabled", "buttonDisabled",
0, // count 0 // count
}; };
//! State of buttons used for drawing texture images. //! State of buttons used for drawing texture images.
//! Note that only a single state is active at a time //! 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 //! Also when no image is defined for a state it will use images from another state
//! and if that state is not set from the replacement for that,etc. //! 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. //! So in many cases setting EGBIS_IMAGE_UP and EGBIS_IMAGE_DOWN is sufficient.
enum EGUI_BUTTON_IMAGE_STATE enum EGUI_BUTTON_IMAGE_STATE
{ {
//! When no other states have images they will all use this one. //! When no other states have images they will all use this one.
EGBIS_IMAGE_UP, EGBIS_IMAGE_UP,
//! When not set EGBIS_IMAGE_UP is used. //! When not set EGBIS_IMAGE_UP is used.
@ -83,10 +85,11 @@ enum EGUI_BUTTON_IMAGE_STATE
EGBIS_IMAGE_DISABLED, EGBIS_IMAGE_DISABLED,
//! not used, counts the number of enumerated items //! not used, counts the number of enumerated items
EGBIS_COUNT EGBIS_COUNT
}; };
//! Names for gui button image states //! Names for gui button image states
const c8 *const GUIButtonImageStateNames[EGBIS_COUNT + 1] = { const c8* const GUIButtonImageStateNames[EGBIS_COUNT+1] =
{
"Image", // not "ImageUp" as it otherwise breaks serialization of old files "Image", // not "ImageUp" as it otherwise breaks serialization of old files
"ImageUpOver", "ImageUpOver",
"ImageUpFocused", "ImageUpFocused",
@ -96,33 +99,34 @@ const c8 *const GUIButtonImageStateNames[EGBIS_COUNT + 1] = {
"ImageDownFocused", "ImageDownFocused",
"ImageDownFocusedOver", "ImageDownFocusedOver",
"ImageDisabled", "ImageDisabled",
0, // count 0 // count
}; };
//! GUI Button interface. //! GUI Button interface.
/** \par This element can create the following events of type EGUI_EVENT_TYPE: /** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_BUTTON_CLICKED \li EGET_BUTTON_CLICKED
*/ */
class IGUIButton : public IGUIElement class IGUIButton : public IGUIElement
{ {
public: public:
//! constructor //! constructor
IGUIButton(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIButton(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_BUTTON, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_BUTTON, environment, parent, id, rectangle) {}
//! Sets another skin independent font. //! Sets another skin independent font.
/** If this is set to zero, the button uses the font of the skin. /** If this is set to zero, the button uses the font of the skin.
\param font: New font to set. */ \param font: New font to set. */
virtual void setOverrideFont(IGUIFont *font = 0) = 0; virtual void setOverrideFont(IGUIFont* font=0) = 0;
//! Gets the override font (if any) //! Gets the override font (if any)
/** \return The override font (may be 0) */ /** \return The override font (may be 0) */
virtual IGUIFont *getOverrideFont(void) const = 0; virtual IGUIFont* getOverrideFont(void) const = 0;
//! Get the font which is used right now for drawing //! Get the font which is used right now for drawing
/** Currently this is the override font when one is set and the /** Currently this is the override font when one is set and the
font of the active skin otherwise */ font of the active skin otherwise */
virtual IGUIFont *getActiveFont() const = 0; virtual IGUIFont* getActiveFont() const = 0;
//! Sets another color for the button text. //! Sets another color for the button text.
/** When set, this color is used instead of EGDC_BUTTON_TEXT/EGDC_GRAY_TEXT. /** When set, this color is used instead of EGDC_BUTTON_TEXT/EGDC_GRAY_TEXT.
@ -157,37 +161,38 @@ public:
\param state: One of ::EGUI_BUTTON_IMAGE_STATE \param state: One of ::EGUI_BUTTON_IMAGE_STATE
\param image: Image to be displayed or NULL to remove the image \param image: Image to be displayed or NULL to remove the image
\param sourceRect: Source rectangle on the image texture. When width or height are 0 then the full texture-size is used (default). */ \param sourceRect: Source rectangle on the image texture. When width or height are 0 then the full texture-size is used (default). */
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(EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image=0, const core::rect<s32>& sourceRect=core::rect<s32>(0,0,0,0)) = 0;
//! Sets an image which should be displayed on the button when it is in normal state. //! Sets an image which should be displayed on the button when it is in normal state.
/** 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); and might be deprecated in future revisions.
\param image: Image to be displayed */ \param image: Image to be displayed */
virtual void setImage(video::ITexture *image = 0) = 0; virtual void setImage(video::ITexture* image=0) = 0;
//! Sets a background image for 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, sourceRect); 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: Texture containing the image to be displayed \param image: Texture containing the image to be displayed
\param sourceRect: Position in the texture, where the image is located. \param sourceRect: Position in the texture, where the image is located.
When width or height are 0 then the full texture-size is used */ When width or height are 0 then the full texture-size is used */
virtual void setImage(video::ITexture *image, const core::rect<s32> &sourceRect) = 0; virtual void setImage(video::ITexture* image, const core::rect<s32>& sourceRect) = 0;
//! Sets a background image for the button when it is in pressed state. //! Sets a background image for the button when it is in pressed state.
/** This is identical to calling setImage(EGBIS_IMAGE_DOWN, image); and might be deprecated in future revisions. /** 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 If no images is specified for the pressed state via
setPressedImage(), this image is also drawn in pressed state. setPressedImage(), this image is also drawn in pressed state.
\param image: Image to be displayed */ \param image: Image to be displayed */
virtual void setPressedImage(video::ITexture *image = 0) = 0; virtual void setPressedImage(video::ITexture* image=0) = 0;
//! Sets an image which should be displayed on the button when it is in pressed state. //! Sets an image which should be displayed on the button when it is in pressed state.
/** This is identical to calling setImage(EGBIS_IMAGE_DOWN, image, sourceRect); and might be deprecated in future revisions. /** This is identical to calling setImage(EGBIS_IMAGE_DOWN, image, sourceRect); and might be deprecated in future revisions.
\param image: Texture containing the image to be displayed \param image: Texture containing the image to be displayed
\param sourceRect: Position in the texture, where the image is located */ \param sourceRect: Position in the texture, where the image is located */
virtual void setPressedImage(video::ITexture *image, const core::rect<s32> &sourceRect) = 0; virtual void setPressedImage(video::ITexture* image, const core::rect<s32>& sourceRect) = 0;
//! Sets the sprite bank used by the button //! Sets the sprite bank used by the button
/** NOTE: The spritebank itself is _not_ serialized so far. The sprites are serialized. /** NOTE: The spritebank itself is _not_ serialized so far. The sprites are serialized.
Which means after loading the gui you still have to set the spritebank manually. */ Which means after loading the gui you still have to set the spritebank manually. */
virtual void setSpriteBank(IGUISpriteBank *bank = 0) = 0; virtual void setSpriteBank(IGUISpriteBank* bank=0) = 0;
//! Sets the animated sprite for a specific button state //! Sets the animated sprite for a specific button state
/** Several sprites can be drawn at the same time. /** Several sprites can be drawn at the same time.
@ -200,7 +205,7 @@ public:
\param loop: True if the animation should loop, false if not \param loop: True if the animation should loop, false if not
\param scale: True if the sprite should scale to button size, false if not */ \param scale: True if the sprite should scale to button size, false if not */
virtual void setSprite(EGUI_BUTTON_STATE state, s32 index, virtual void setSprite(EGUI_BUTTON_STATE state, s32 index,
video::SColor color = video::SColor(255, 255, 255, 255), bool loop = false, bool scale = false) = 0; video::SColor color=video::SColor(255,255,255,255), bool loop=false, bool scale=false) = 0;
//! Get the sprite-index for the given state or -1 when no sprite is set //! Get the sprite-index for the given state or -1 when no sprite is set
virtual s32 getSpriteIndex(EGUI_BUTTON_STATE state) const = 0; virtual s32 getSpriteIndex(EGUI_BUTTON_STATE state) const = 0;
@ -217,16 +222,16 @@ public:
//! Sets if the button should behave like a push button. //! Sets if the button should behave like a push button.
/** Which means it can be in two states: Normal or Pressed. With a click on the button, /** 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. */ the user can change the state of the button. */
virtual void setIsPushButton(bool isPushButton = true) = 0; virtual void setIsPushButton(bool isPushButton=true) = 0;
//! Sets the pressed state of the button if this is a pushbutton //! Sets the pressed state of the button if this is a pushbutton
virtual void setPressed(bool pressed = true) = 0; virtual void setPressed(bool pressed=true) = 0;
//! Returns if the button is currently pressed //! Returns if the button is currently pressed
virtual bool isPressed() const = 0; virtual bool isPressed() const = 0;
//! Sets if the alpha channel should be used for drawing background images on the button (default is false) //! Sets if the alpha channel should be used for drawing background images on the button (default is false)
virtual void setUseAlphaChannel(bool useAlphaChannel = true) = 0; virtual void setUseAlphaChannel(bool useAlphaChannel=true) = 0;
//! Returns if the alpha channel should be used for drawing background images on the button //! Returns if the alpha channel should be used for drawing background images on the button
virtual bool isAlphaChannelUsed() const = 0; virtual bool isAlphaChannelUsed() const = 0;
@ -235,13 +240,13 @@ public:
virtual bool isPushButton() const = 0; virtual bool isPushButton() 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 use the skin to draw its border and button face (default is true)
virtual void setDrawBorder(bool border = true) = 0; virtual void setDrawBorder(bool border=true) = 0;
//! Returns if the border and button face are being drawn using the skin //! Returns if the border and button face are being drawn using the skin
virtual bool isDrawingBorder() const = 0; virtual bool isDrawingBorder() const = 0;
//! Sets if the button should scale the button images to fit //! Sets if the button should scale the button images to fit
virtual void setScaleImage(bool scaleImage = true) = 0; virtual void setScaleImage(bool scaleImage=true) = 0;
//! Checks whether the button scales the used images //! Checks whether the button scales the used images
virtual bool isScalingImage() const = 0; virtual bool isScalingImage() const = 0;
@ -253,7 +258,11 @@ public:
//! Get if the control key was pressed in last EGET_BUTTON_CLICKED event //! Get if the control key was pressed in last EGET_BUTTON_CLICKED event
/** Generated together with event, so info is available in the event-receiver. */ /** Generated together with event, so info is available in the event-receiver. */
virtual bool getClickControlState() const = 0; virtual bool getClickControlState() const = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,16 +12,17 @@ namespace irr
namespace gui namespace gui
{ {
//! GUI Check box interface. //! GUI Check box interface.
/** \par This element can create the following events of type EGUI_EVENT_TYPE: /** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_CHECKBOX_CHANGED \li EGET_CHECKBOX_CHANGED
*/ */
class IGUICheckBox : public IGUIElement class IGUICheckBox : public IGUIElement
{ {
public: public:
//! constructor //! constructor
IGUICheckBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUICheckBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_CHECK_BOX, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_CHECK_BOX, environment, parent, id, rectangle) {}
//! Set if box is checked. //! Set if box is checked.
virtual void setChecked(bool checked) = 0; virtual void setChecked(bool checked) = 0;
@ -41,7 +43,11 @@ public:
//! Checks if border drawing is enabled //! Checks if border drawing is enabled
/** \return true if border drawing is enabled, false otherwise */ /** \return true if border drawing is enabled, false otherwise */
virtual bool isDrawBorderEnabled() const = 0; virtual bool isDrawBorderEnabled() const = 0;
};
};
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,31 +12,32 @@ namespace irr
namespace gui namespace gui
{ {
//! Combobox widget //! Combobox widget
/** \par This element can create the following events of type EGUI_EVENT_TYPE: /** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_COMBO_BOX_CHANGED \li EGET_COMBO_BOX_CHANGED
*/ */
class IGUIComboBox : public IGUIElement class IGUIComboBox : public IGUIElement
{ {
public: public:
//! constructor //! constructor
IGUIComboBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIComboBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_COMBO_BOX, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_COMBO_BOX, environment, parent, id, rectangle) {}
//! Returns amount of items in box //! Returns amount of items in box
virtual u32 getItemCount() const = 0; virtual u32 getItemCount() const = 0;
//! Returns string of an item. the idx may be a value from 0 to itemCount-1 //! Returns string of an item. the idx may be a value from 0 to itemCount-1
virtual const wchar_t *getItem(u32 idx) const = 0; virtual const wchar_t* getItem(u32 idx) const = 0;
//! Returns item data 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 u32 getItemData(u32 idx) const = 0; virtual u32 getItemData(u32 idx) const = 0;
//! Returns index based on item data //! Returns index based on item data
virtual s32 getIndexForItemData(u32 data) const = 0; virtual s32 getIndexForItemData(u32 data ) const = 0;
//! Adds an item and returns the index of it //! Adds an item and returns the index of it
virtual u32 addItem(const wchar_t *text, u32 data = 0) = 0; virtual u32 addItem(const wchar_t* text, u32 data = 0) = 0;
//! Removes an item from the combo box. //! Removes an item from the combo box.
/** Warning. This will change the index of all following items */ /** Warning. This will change the index of all following items */
@ -66,7 +68,11 @@ public:
//! Get the maximal number of rows for the selection listbox //! Get the maximal number of rows for the selection listbox
virtual u32 getMaxSelectionRows() const = 0; virtual u32 getMaxSelectionRows() const = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IGUIElement.h"
#include "SColor.h" #include "SColor.h"
@ -11,34 +12,35 @@ 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:
\li EGET_EDITBOX_ENTER
\li EGET_EDITBOX_CHANGED
\li EGET_EDITBOX_MARKING_CHANGED
*/
class IGUIEditBox : public IGUIElement
{
public:
//! Single line edit box for editing simple text.
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_EDITBOX_ENTER
\li EGET_EDITBOX_CHANGED
\li EGET_EDITBOX_MARKING_CHANGED
*/
class IGUIEditBox : public IGUIElement
{
public:
//! constructor //! constructor
IGUIEditBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIEditBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_EDIT_BOX, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_EDIT_BOX, environment, parent, id, rectangle) {}
//! Sets another skin independent font. //! Sets another skin independent font.
/** If this is set to zero, the button uses the font of the skin. /** If this is set to zero, the button uses the font of the skin.
\param font: New font to set. */ \param font: New font to set. */
virtual void setOverrideFont(IGUIFont *font = 0) = 0; virtual void setOverrideFont(IGUIFont* font=0) = 0;
//! Gets the override font (if any) //! Gets the override font (if any)
/** \return The override font (may be 0) */ /** \return The override font (may be 0) */
virtual IGUIFont *getOverrideFont() const = 0; virtual IGUIFont* getOverrideFont() const = 0;
//! Get the font which is used right now for drawing //! Get the font which is used right now for drawing
/** Currently this is the override font when one is set and the /** Currently this is the override font when one is set and the
font of the active skin otherwise */ font of the active skin otherwise */
virtual IGUIFont *getActiveFont() const = 0; virtual IGUIFont* getActiveFont() const = 0;
//! Sets another color for the text. //! Sets another color for the text.
/** If set, the edit box does not use the EGDC_BUTTON_TEXT color defined /** If set, the edit box does not use the EGDC_BUTTON_TEXT color defined
@ -145,7 +147,11 @@ public:
//! Get the cursor blinktime //! Get the cursor blinktime
virtual irr::u32 getCursorBlinkTime() const = 0; virtual irr::u32 getCursorBlinkTime() const = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_ELEMENT_H_INCLUDED__
#define __I_GUI_ELEMENT_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
#include "rect.h" #include "rect.h"
@ -25,28 +26,30 @@ namespace gui
class IGUIElement : virtual public IReferenceCounted, public IEventReceiver class IGUIElement : virtual public IReferenceCounted, public IEventReceiver
{ {
public: public:
//! Constructor //! Constructor
IGUIElement(EGUI_ELEMENT_TYPE type, IGUIEnvironment *environment, IGUIElement *parent, IGUIElement(EGUI_ELEMENT_TYPE type, IGUIEnvironment* environment, IGUIElement* parent,
s32 id, const core::rect<s32> &rectangle) : s32 id, const core::rect<s32>& rectangle)
Parent(0), : Parent(0), RelativeRect(rectangle), AbsoluteRect(rectangle),
RelativeRect(rectangle), AbsoluteRect(rectangle),
AbsoluteClippingRect(rectangle), DesiredRect(rectangle), AbsoluteClippingRect(rectangle), DesiredRect(rectangle),
MaxSize(0, 0), MinSize(1, 1), IsVisible(true), IsEnabled(true), MaxSize(0,0), MinSize(1,1), IsVisible(true), IsEnabled(true),
IsSubElement(false), NoClip(false), ID(id), IsTabStop(false), TabOrder(-1), IsTabGroup(false), IsSubElement(false), NoClip(false), ID(id), IsTabStop(false), TabOrder(-1), IsTabGroup(false),
AlignLeft(EGUIA_UPPERLEFT), AlignRight(EGUIA_UPPERLEFT), AlignTop(EGUIA_UPPERLEFT), AlignBottom(EGUIA_UPPERLEFT), AlignLeft(EGUIA_UPPERLEFT), AlignRight(EGUIA_UPPERLEFT), AlignTop(EGUIA_UPPERLEFT), AlignBottom(EGUIA_UPPERLEFT),
Environment(environment), Type(type) Environment(environment), Type(type)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("IGUIElement"); setDebugName("IGUIElement");
#endif #endif
// if we were given a parent to attach to // if we were given a parent to attach to
if (parent) { if (parent)
{
parent->addChildToEnd(this); parent->addChildToEnd(this);
recalculateAbsolutePosition(true); recalculateAbsolutePosition(true);
} }
} }
//! Destructor //! Destructor
virtual ~IGUIElement() virtual ~IGUIElement()
{ {
@ -56,8 +59,9 @@ public:
} }
} }
//! Returns parent of this element. //! Returns parent of this element.
IGUIElement *getParent() const IGUIElement* getParent() const
{ {
return Parent; return Parent;
} }
@ -68,12 +72,14 @@ public:
return RelativeRect; return RelativeRect;
} }
//! Sets the relative rectangle of this element. //! Sets the relative rectangle of this element.
/** \param r The absolute position to set */ /** \param r The absolute position to set */
void setRelativePosition(const core::rect<s32> &r) void setRelativePosition(const core::rect<s32>& r)
{ {
if (Parent) { if (Parent)
const core::rect<s32> &r2 = Parent->getAbsolutePosition(); {
const core::rect<s32>& r2 = Parent->getAbsolutePosition();
core::dimension2df d((f32)(r2.getSize().Width), (f32)(r2.getSize().Height)); core::dimension2df d((f32)(r2.getSize().Width), (f32)(r2.getSize().Height));
@ -93,7 +99,7 @@ public:
//! Sets the relative rectangle of this element, maintaining its current width and height //! Sets the relative rectangle of this element, maintaining its current width and height
/** \param position The new relative position to set. Width and height will not be changed. */ /** \param position The new relative position to set. Width and height will not be changed. */
void setRelativePosition(const core::position2di &position) void setRelativePosition(const core::position2di & position)
{ {
const core::dimension2di mySize = RelativeRect.getSize(); const core::dimension2di mySize = RelativeRect.getSize();
const core::rect<s32> rectangle(position.X, position.Y, const core::rect<s32> rectangle(position.X, position.Y,
@ -101,17 +107,18 @@ public:
setRelativePosition(rectangle); setRelativePosition(rectangle);
} }
//! Sets the relative rectangle of this element as a proportion of its parent's area. //! Sets the relative rectangle of this element as a proportion of its parent's area.
/** \note This method used to be 'void setRelativePosition(const core::rect<f32>& r)' /** \note This method used to be 'void setRelativePosition(const core::rect<f32>& r)'
\param r The rectangle to set, interpreted as a proportion of the parent's area. \param r The rectangle to set, interpreted as a proportion of the parent's area.
Meaningful values are in the range [0...1], unless you intend this element to spill Meaningful values are in the range [0...1], unless you intend this element to spill
outside its parent. */ outside its parent. */
void setRelativePositionProportional(const core::rect<f32> &r) void setRelativePositionProportional(const core::rect<f32>& r)
{ {
if (!Parent) if (!Parent)
return; return;
const core::dimension2di &d = Parent->getAbsolutePosition().getSize(); const core::dimension2di& d = Parent->getAbsolutePosition().getSize();
DesiredRect = core::rect<s32>( DesiredRect = core::rect<s32>(
core::floor32((f32)d.Width * r.UpperLeftCorner.X), core::floor32((f32)d.Width * r.UpperLeftCorner.X),
@ -124,18 +131,21 @@ public:
updateAbsolutePosition(); updateAbsolutePosition();
} }
//! Gets the absolute rectangle of this element //! Gets the absolute rectangle of this element
core::rect<s32> getAbsolutePosition() const core::rect<s32> getAbsolutePosition() const
{ {
return AbsoluteRect; return AbsoluteRect;
} }
//! Returns the visible area of the element. //! Returns the visible area of the element.
core::rect<s32> getAbsoluteClippingRect() const core::rect<s32> getAbsoluteClippingRect() const
{ {
return AbsoluteClippingRect; return AbsoluteClippingRect;
} }
//! Sets whether the element will ignore its parent's clipping rectangle //! Sets whether the element will ignore its parent's clipping rectangle
/** \param noClip If true, the element will not be clipped by its parent's clipping rectangle. */ /** \param noClip If true, the element will not be clipped by its parent's clipping rectangle. */
void setNotClipped(bool noClip) void setNotClipped(bool noClip)
@ -144,6 +154,7 @@ public:
updateAbsolutePosition(); updateAbsolutePosition();
} }
//! Gets whether the element will ignore its parent's clipping rectangle //! Gets whether the element will ignore its parent's clipping rectangle
/** \return true if the element is not clipped by its parent's clipping rectangle. */ /** \return true if the element is not clipped by its parent's clipping rectangle. */
bool isNotClipped() const bool isNotClipped() const
@ -151,6 +162,7 @@ public:
return NoClip; return NoClip;
} }
//! Sets the maximum size allowed for this element //! Sets the maximum size allowed for this element
/** If set to 0,0, there is no maximum size */ /** If set to 0,0, there is no maximum size */
void setMaxSize(core::dimension2du size) void setMaxSize(core::dimension2du size)
@ -159,6 +171,7 @@ public:
updateAbsolutePosition(); updateAbsolutePosition();
} }
//! Sets the minimum size allowed for this element //! Sets the minimum size allowed for this element
void setMinSize(core::dimension2du size) void setMinSize(core::dimension2du size)
{ {
@ -170,6 +183,7 @@ public:
updateAbsolutePosition(); updateAbsolutePosition();
} }
//! The alignment defines how the borders of this element will be positioned when the parent element is resized. //! The alignment defines how the borders of this element will be positioned when the parent element is resized.
void setAlignment(EGUI_ALIGNMENT left, EGUI_ALIGNMENT right, EGUI_ALIGNMENT top, EGUI_ALIGNMENT bottom) void setAlignment(EGUI_ALIGNMENT left, EGUI_ALIGNMENT right, EGUI_ALIGNMENT top, EGUI_ALIGNMENT bottom)
{ {
@ -178,7 +192,8 @@ public:
AlignTop = top; AlignTop = top;
AlignBottom = bottom; AlignBottom = bottom;
if (Parent) { if (Parent)
{
core::rect<s32> r(Parent->getAbsolutePosition()); core::rect<s32> r(Parent->getAbsolutePosition());
core::dimension2df d((f32)r.getSize().Width, (f32)r.getSize().Height); core::dimension2df d((f32)r.getSize().Width, (f32)r.getSize().Height);
@ -224,11 +239,13 @@ public:
recalculateAbsolutePosition(false); recalculateAbsolutePosition(false);
// update all children // update all children
for (auto child : Children) { for (auto child : Children)
{
child->updateAbsolutePosition(); child->updateAbsolutePosition();
} }
} }
//! Returns the topmost GUI element at the specific position. //! Returns the topmost GUI element at the specific position.
/** /**
This will check this GUI element and all of its descendants, so it This will check this GUI element and all of its descendants, so it
@ -241,16 +258,18 @@ public:
\return The topmost GUI element at that point, or 0 if there are \return The topmost GUI element at that point, or 0 if there are
no candidate elements at this point. no candidate elements at this point.
*/ */
virtual IGUIElement *getElementFromPoint(const core::position2d<s32> &point) virtual IGUIElement* getElementFromPoint(const core::position2d<s32>& point)
{ {
IGUIElement *target = 0; IGUIElement* target = 0;
if (isVisible()) { if (isVisible())
{
// we have to search from back to front, because later children // we have to search from back to front, because later children
// might be drawn over the top of earlier ones. // might be drawn over the top of earlier ones.
auto it = Children.rbegin(); auto it = Children.rbegin();
auto ie = Children.rend(); auto ie = Children.rend();
while (it != ie) { while (it != ie)
{
target = (*it)->getElementFromPoint(point); target = (*it)->getElementFromPoint(point);
if (target) if (target)
return target; return target;
@ -265,24 +284,27 @@ public:
return target; return target;
} }
//! Returns true if a point is within this element. //! Returns true if a point is within this element.
/** Elements with a shape other than a rectangle should override this method */ /** Elements with a shape other than a rectangle should override this method */
virtual bool isPointInside(const core::position2d<s32> &point) const virtual bool isPointInside(const core::position2d<s32>& point) const
{ {
return AbsoluteClippingRect.isPointInside(point); return AbsoluteClippingRect.isPointInside(point);
} }
//! Adds a GUI element as new child of this element. //! Adds a GUI element as new child of this element.
virtual void addChild(IGUIElement *child) virtual void addChild(IGUIElement* child)
{
if ( child && child != this )
{ {
if (child && child != this) {
addChildToEnd(child); addChildToEnd(child);
child->updateAbsolutePosition(); child->updateAbsolutePosition();
} }
} }
//! Removes a child. //! Removes a child.
virtual void removeChild(IGUIElement *child) virtual void removeChild(IGUIElement* child)
{ {
assert(child->Parent == this); assert(child->Parent == this);
Children.erase(child->ParentPos); Children.erase(child->ParentPos);
@ -291,8 +313,7 @@ public:
} }
//! Removes all children. //! Removes all children.
virtual void removeAllChildren() virtual void removeAllChildren() {
{
while (!Children.empty()) { while (!Children.empty()) {
auto child = Children.back(); auto child = Children.back();
child->remove(); child->remove();
@ -306,30 +327,36 @@ public:
Parent->removeChild(this); Parent->removeChild(this);
} }
//! Draws the element and its children. //! Draws the element and its children.
virtual void draw() virtual void draw()
{ {
if (isVisible()) { if ( isVisible() )
{
for (auto child : Children) for (auto child : Children)
child->draw(); child->draw();
} }
} }
//! animate the element and its children. //! animate the element and its children.
virtual void OnPostRender(u32 timeMs) virtual void OnPostRender(u32 timeMs)
{ {
if (isVisible()) { if ( isVisible() )
{
for (auto child : Children) for (auto child : Children)
child->OnPostRender(timeMs); child->OnPostRender( timeMs );
} }
} }
//! Moves this element. //! Moves this element.
virtual void move(core::position2d<s32> absoluteMovement) virtual void move(core::position2d<s32> absoluteMovement)
{ {
setRelativePosition(DesiredRect + absoluteMovement); setRelativePosition(DesiredRect + absoluteMovement);
} }
//! Returns true if element is visible. //! Returns true if element is visible.
virtual bool isVisible() const virtual bool isVisible() const
{ {
@ -341,10 +368,10 @@ public:
false if this or any parent element is invisible. */ false if this or any parent element is invisible. */
virtual bool isTrulyVisible() const virtual bool isTrulyVisible() const
{ {
if (!IsVisible) if(!IsVisible)
return false; return false;
if (!Parent) if(!Parent)
return true; return true;
return Parent->isTrulyVisible(); return Parent->isTrulyVisible();
@ -356,12 +383,14 @@ public:
IsVisible = visible; IsVisible = visible;
} }
//! Returns true if this element was created as part of its parent control //! Returns true if this element was created as part of its parent control
virtual bool isSubElement() const virtual bool isSubElement() const
{ {
return IsSubElement; return IsSubElement;
} }
//! Sets whether this control was created as part of its parent. //! Sets whether this control was created as part of its parent.
/** For example, it is true when a scrollbar is part of a listbox. /** For example, it is true when a scrollbar is part of a listbox.
SubElements are not saved to disk when calling guiEnvironment->saveGUI() */ SubElements are not saved to disk when calling guiEnvironment->saveGUI() */
@ -370,6 +399,7 @@ public:
IsSubElement = subElement; IsSubElement = subElement;
} }
//! If set to true, the focus will visit this element when using the tab key to cycle through elements. //! If set to true, the focus will visit this element when using the tab key to cycle through elements.
/** If this element is a tab group (see isTabGroup/setTabGroup) then /** If this element is a tab group (see isTabGroup/setTabGroup) then
ctrl+tab will be used instead. */ ctrl+tab will be used instead. */
@ -378,43 +408,51 @@ public:
IsTabStop = enable; IsTabStop = enable;
} }
//! Returns true if this element can be focused by navigating with the tab key //! Returns true if this element can be focused by navigating with the tab key
bool isTabStop() const bool isTabStop() const
{ {
return IsTabStop; return IsTabStop;
} }
//! Sets the priority of focus when using the tab key to navigate between a group of elements. //! Sets the priority of focus when using the tab key to navigate between a group of elements.
/** See setTabGroup, isTabGroup and getTabGroup for information on tab groups. /** See setTabGroup, isTabGroup and getTabGroup for information on tab groups.
Elements with a lower number are focused first */ Elements with a lower number are focused first */
void setTabOrder(s32 index) void setTabOrder(s32 index)
{ {
// negative = autonumber // negative = autonumber
if (index < 0) { if (index < 0)
{
TabOrder = 0; TabOrder = 0;
IGUIElement *el = getTabGroup(); IGUIElement *el = getTabGroup();
while (IsTabGroup && el && el->Parent) while (IsTabGroup && el && el->Parent)
el = el->Parent; el = el->Parent;
IGUIElement *first = 0, *closest = 0; IGUIElement *first=0, *closest=0;
if (el) { if (el)
{
// find the highest element number // find the highest element number
el->getNextElement(-1, true, IsTabGroup, first, closest, true, true); el->getNextElement(-1, true, IsTabGroup, first, closest, true, true);
if (first) { if (first)
{
TabOrder = first->getTabOrder() + 1; TabOrder = first->getTabOrder() + 1;
} }
} }
} else }
else
TabOrder = index; TabOrder = index;
} }
//! Returns the number in the tab order sequence //! Returns the number in the tab order sequence
s32 getTabOrder() const s32 getTabOrder() const
{ {
return TabOrder; return TabOrder;
} }
//! Sets whether this element is a container for a group of elements which can be navigated using the tab key. //! Sets whether this element is a container for a group of elements which can be navigated using the tab key.
/** For example, windows are tab groups. /** For example, windows are tab groups.
Groups can be navigated using ctrl+tab, providing isTabStop is true. */ Groups can be navigated using ctrl+tab, providing isTabStop is true. */
@ -423,16 +461,18 @@ public:
IsTabGroup = isGroup; IsTabGroup = isGroup;
} }
//! Returns true if this element is a tab group. //! Returns true if this element is a tab group.
bool isTabGroup() const bool isTabGroup() const
{ {
return IsTabGroup; return IsTabGroup;
} }
//! Returns the container element which holds all elements in this element's tab group. //! Returns the container element which holds all elements in this element's tab group.
IGUIElement *getTabGroup() IGUIElement* getTabGroup()
{ {
IGUIElement *ret = this; IGUIElement *ret=this;
while (ret && !ret->isTabGroup()) while (ret && !ret->isTabGroup())
ret = ret->getParent(); ret = ret->getParent();
@ -440,6 +480,7 @@ public:
return ret; return ret;
} }
//! Returns true if element is enabled //! Returns true if element is enabled
/** Currently elements do _not_ care about parent-states. /** Currently elements do _not_ care about parent-states.
So if you want to affect children you have to enable/disable them all. So if you want to affect children you have to enable/disable them all.
@ -447,63 +488,72 @@ public:
*/ */
virtual bool isEnabled() const virtual bool isEnabled() const
{ {
if (isSubElement() && IsEnabled && getParent()) if ( isSubElement() && IsEnabled && getParent() )
return getParent()->isEnabled(); return getParent()->isEnabled();
return IsEnabled; return IsEnabled;
} }
//! Sets the enabled state of this element. //! Sets the enabled state of this element.
virtual void setEnabled(bool enabled) virtual void setEnabled(bool enabled)
{ {
IsEnabled = enabled; IsEnabled = enabled;
} }
//! Sets the new caption of this element. //! Sets the new caption of this element.
virtual void setText(const wchar_t *text) virtual void setText(const wchar_t* text)
{ {
Text = text; Text = text;
} }
//! Returns caption of this element. //! Returns caption of this element.
virtual const wchar_t *getText() const virtual const wchar_t* getText() const
{ {
return Text.c_str(); return Text.c_str();
} }
//! Sets the new caption of this element. //! Sets the new caption of this element.
virtual void setToolTipText(const wchar_t *text) virtual void setToolTipText(const wchar_t* text)
{ {
ToolTipText = text; ToolTipText = text;
} }
//! Returns caption of this element. //! Returns caption of this element.
virtual const core::stringw &getToolTipText() const virtual const core::stringw& getToolTipText() const
{ {
return ToolTipText; return ToolTipText;
} }
//! Returns id. Can be used to identify the element. //! Returns id. Can be used to identify the element.
virtual s32 getID() const virtual s32 getID() const
{ {
return ID; return ID;
} }
//! Sets the id of this element //! Sets the id of this element
virtual void setID(s32 id) virtual void setID(s32 id)
{ {
ID = id; ID = id;
} }
//! Called if an event happened. //! Called if an event happened.
bool OnEvent(const SEvent &event) override bool OnEvent(const SEvent& event) override
{ {
return Parent ? Parent->OnEvent(event) : false; return Parent ? Parent->OnEvent(event) : false;
} }
//! Brings a child to front //! Brings a child to front
/** \return True if successful, false if not. */ /** \return True if successful, false if not. */
virtual bool bringToFront(IGUIElement *child) virtual bool bringToFront(IGUIElement* child)
{ {
if (child->Parent != this) if (child->Parent != this)
return false; return false;
@ -514,9 +564,10 @@ public:
return true; return true;
} }
//! Moves a child to the back, so it's siblings are drawn on top of it //! Moves a child to the back, so it's siblings are drawn on top of it
/** \return True if successful, false if not. */ /** \return True if successful, false if not. */
virtual bool sendToBack(IGUIElement *child) virtual bool sendToBack(IGUIElement* child)
{ {
if (child->Parent != this) if (child->Parent != this)
return false; return false;
@ -528,11 +579,12 @@ public:
} }
//! Returns list with children of this element //! Returns list with children of this element
virtual const std::list<IGUIElement *> &getChildren() const virtual const std::list<IGUIElement*>& getChildren() const
{ {
return Children; return Children;
} }
//! Finds the first element with the given id. //! Finds the first element with the given id.
/** \param id: Id to search for. /** \param id: Id to search for.
\param searchchildren: Set this to true, if also children of this \param searchchildren: Set this to true, if also children of this
@ -540,11 +592,12 @@ public:
should be searched too. should be searched too.
\return Returns the first element with the given id. If no element \return Returns the first element with the given id. If no element
with this id was found, 0 is returned. */ with this id was found, 0 is returned. */
virtual IGUIElement *getElementFromId(s32 id, bool searchchildren = false) const virtual IGUIElement* getElementFromId(s32 id, bool searchchildren=false) const
{ {
IGUIElement *e = 0; IGUIElement* e = 0;
for (auto child : Children) { for (auto child : Children)
{
if (child->getID() == id) if (child->getID() == id)
return child; return child;
@ -558,21 +611,25 @@ public:
return e; return e;
} }
//! returns true if the given element is a child of this one. //! returns true if the given element is a child of this one.
//! \param child: The child element to check //! \param child: The child element to check
bool isMyChild(IGUIElement *child) const bool isMyChild(IGUIElement* child) const
{ {
if (!child) if (!child)
return false; return false;
do { do
{
if (child->Parent) if (child->Parent)
child = child->Parent; child = child->Parent;
} while (child->Parent && child != this); } while (child->Parent && child != this);
return child == this; return child == this;
} }
//! searches elements to find the closest next element to tab to //! searches elements to find the closest next element to tab to
/** \param startOrder: The TabOrder of the current element, -1 if none /** \param startOrder: The TabOrder of the current element, -1 if none
\param reverse: true if searching for a lower number \param reverse: true if searching for a lower number
@ -583,58 +640,74 @@ public:
\param includeDisabled: includes disabled elements in the search (default=false) \param includeDisabled: includes disabled elements in the search (default=false)
\return true if successfully found an element, false to continue searching/fail */ \return true if successfully found an element, false to continue searching/fail */
bool getNextElement(s32 startOrder, bool reverse, bool group, bool getNextElement(s32 startOrder, bool reverse, bool group,
IGUIElement *&first, IGUIElement *&closest, bool includeInvisible = false, IGUIElement*& first, IGUIElement*& closest, bool includeInvisible=false,
bool includeDisabled = false) const bool includeDisabled=false) const
{ {
// we'll stop searching if we find this number // we'll stop searching if we find this number
s32 wanted = startOrder + (reverse ? -1 : 1); s32 wanted = startOrder + ( reverse ? -1 : 1 );
if (wanted == -2) if (wanted==-2)
wanted = 1073741824; // maximum s32 wanted = 1073741824; // maximum s32
auto it = Children.begin(); auto it = Children.begin();
s32 closestOrder, currentOrder; s32 closestOrder, currentOrder;
while (it != Children.end()) { while(it != Children.end())
{
// ignore invisible elements and their children // ignore invisible elements and their children
if (((*it)->isVisible() || includeInvisible) && if ( ( (*it)->isVisible() || includeInvisible ) &&
(group == true || (*it)->isTabGroup() == false)) { (group == true || (*it)->isTabGroup() == false) )
{
// ignore disabled, but children are checked (disabled is currently per element ignoring parent states) // ignore disabled, but children are checked (disabled is currently per element ignoring parent states)
if ((*it)->isEnabled() || includeDisabled) { if ( (*it)->isEnabled() || includeDisabled )
{
// only check tab stops and those with the same group status // only check tab stops and those with the same group status
if ((*it)->isTabStop() && ((*it)->isTabGroup() == group)) { if ((*it)->isTabStop() && ((*it)->isTabGroup() == group))
{
currentOrder = (*it)->getTabOrder(); currentOrder = (*it)->getTabOrder();
// is this what we're looking for? // is this what we're looking for?
if (currentOrder == wanted) { if (currentOrder == wanted)
{
closest = *it; closest = *it;
return true; return true;
} }
// is it closer than the current closest? // is it closer than the current closest?
if (closest) { if (closest)
{
closestOrder = closest->getTabOrder(); closestOrder = closest->getTabOrder();
if ((reverse && currentOrder > closestOrder && currentOrder < startOrder) || (!reverse && currentOrder < closestOrder && currentOrder > startOrder)) { if ( ( reverse && currentOrder > closestOrder && currentOrder < startOrder)
||(!reverse && currentOrder < closestOrder && currentOrder > startOrder))
{
closest = *it; closest = *it;
} }
} else if ((reverse && currentOrder < startOrder) || (!reverse && currentOrder > startOrder)) { }
else
if ( (reverse && currentOrder < startOrder) || (!reverse && currentOrder > startOrder) )
{
closest = *it; closest = *it;
} }
// is it before the current first? // is it before the current first?
if (first) { if (first)
{
closestOrder = first->getTabOrder(); closestOrder = first->getTabOrder();
if ((reverse && closestOrder < currentOrder) || (!reverse && closestOrder > currentOrder)) { if ( (reverse && closestOrder < currentOrder) || (!reverse && closestOrder > currentOrder) )
{
first = *it; first = *it;
} }
} else { }
else
{
first = *it; first = *it;
} }
} }
} }
// search within children // search within children
if ((*it)->getNextElement(startOrder, reverse, group, first, closest, includeInvisible, includeDisabled)) { if ((*it)->getNextElement(startOrder, reverse, group, first, closest, includeInvisible, includeDisabled))
{
return true; return true;
} }
} }
@ -643,6 +716,7 @@ public:
return false; return false;
} }
//! Returns the type of the gui element. //! Returns the type of the gui element.
/** This is needed for the .NET wrapper but will be used /** This is needed for the .NET wrapper but will be used
later for serializing and deserializing. later for serializing and deserializing.
@ -667,45 +741,51 @@ public:
return type == Type; return type == Type;
} }
//! Returns the type name of the gui element. //! Returns the type name of the gui element.
/** This is needed serializing elements. */ /** This is needed serializing elements. */
virtual const c8 *getTypeName() const virtual const c8* getTypeName() const
{ {
return GUIElementTypeNames[Type]; return GUIElementTypeNames[Type];
} }
//! Returns the name of the element. //! Returns the name of the element.
/** \return Name as character string. */ /** \return Name as character string. */
virtual const c8 *getName() const virtual const c8* getName() const
{ {
return Name.c_str(); return Name.c_str();
} }
//! Sets the name of the element. //! Sets the name of the element.
/** \param name New name of the gui element. */ /** \param name New name of the gui element. */
virtual void setName(const c8 *name) virtual void setName(const c8* name)
{ {
Name = name; Name = name;
} }
//! Sets the name of the element. //! Sets the name of the element.
/** \param name New name of the gui element. */ /** \param name New name of the gui element. */
virtual void setName(const core::stringc &name) virtual void setName(const core::stringc& name)
{ {
Name = name; Name = name;
} }
//! Returns whether the element takes input from the IME //! Returns whether the element takes input from the IME
virtual bool acceptsIME() virtual bool acceptsIME()
{ {
return false; return false;
} }
protected: protected:
// not virtual because needed in constructor // not virtual because needed in constructor
void addChildToEnd(IGUIElement *child) void addChildToEnd(IGUIElement* child)
{
if (child)
{ {
if (child) {
child->grab(); // prevent destruction when removed child->grab(); // prevent destruction when removed
child->remove(); // remove from old parent child->remove(); // remove from old parent
child->LastParentRect = getAbsolutePosition(); child->LastParentRect = getAbsolutePosition();
@ -715,9 +795,8 @@ protected:
} }
#ifndef NDEBUG #ifndef NDEBUG
template <typename Iterator> template<typename Iterator>
static size_t _fastSetChecksum(Iterator begin, Iterator end) static size_t _fastSetChecksum(Iterator begin, Iterator end) {
{
std::hash<typename Iterator::value_type> hasher; std::hash<typename Iterator::value_type> hasher;
size_t checksum = 0; size_t checksum = 0;
for (Iterator it = begin; it != end; ++it) { for (Iterator it = begin; it != end; ++it) {
@ -730,12 +809,13 @@ protected:
// Reorder children [from, to) to the order given by `neworder` // Reorder children [from, to) to the order given by `neworder`
void reorderChildren( void reorderChildren(
std::list<IGUIElement *>::iterator from, std::list<IGUIElement*>::iterator from,
std::list<IGUIElement *>::iterator to, std::list<IGUIElement*>::iterator to,
const std::vector<IGUIElement *> &neworder) const std::vector<IGUIElement*> &neworder)
{ {
assert(_fastSetChecksum(from, to) == _fastSetChecksum(neworder.begin(), neworder.end())); assert(_fastSetChecksum(from, to) == _fastSetChecksum(neworder.begin(), neworder.end()));
for (auto e : neworder) { for (auto e : neworder)
{
*from = e; *from = e;
e->ParentPos = from; e->ParentPos = from;
++from; ++from;
@ -743,22 +823,26 @@ protected:
assert(from == to); assert(from == to);
} }
// not virtual because needed in constructor // not virtual because needed in constructor
void recalculateAbsolutePosition(bool recursive) void recalculateAbsolutePosition(bool recursive)
{ {
core::rect<s32> parentAbsolute(0, 0, 0, 0); core::rect<s32> parentAbsolute(0,0,0,0);
core::rect<s32> parentAbsoluteClip; core::rect<s32> parentAbsoluteClip;
f32 fw = 0.f, fh = 0.f; f32 fw=0.f, fh=0.f;
if (Parent) { if (Parent)
{
parentAbsolute = Parent->AbsoluteRect; parentAbsolute = Parent->AbsoluteRect;
if (NoClip) { if (NoClip)
IGUIElement *p = this; {
IGUIElement* p=this;
while (p->Parent) while (p->Parent)
p = p->Parent; p = p->Parent;
parentAbsoluteClip = p->AbsoluteClippingRect; parentAbsoluteClip = p->AbsoluteClippingRect;
} else }
else
parentAbsoluteClip = Parent->AbsoluteClippingRect; parentAbsoluteClip = Parent->AbsoluteClippingRect;
} }
@ -771,56 +855,60 @@ protected:
if (AlignTop == EGUIA_SCALE || AlignBottom == EGUIA_SCALE) if (AlignTop == EGUIA_SCALE || AlignBottom == EGUIA_SCALE)
fh = (f32)parentAbsolute.getHeight(); fh = (f32)parentAbsolute.getHeight();
switch (AlignLeft) { switch (AlignLeft)
{
case EGUIA_UPPERLEFT: case EGUIA_UPPERLEFT:
break; break;
case EGUIA_LOWERRIGHT: case EGUIA_LOWERRIGHT:
DesiredRect.UpperLeftCorner.X += diffx; DesiredRect.UpperLeftCorner.X += diffx;
break; break;
case EGUIA_CENTER: case EGUIA_CENTER:
DesiredRect.UpperLeftCorner.X += diffx / 2; DesiredRect.UpperLeftCorner.X += diffx/2;
break; break;
case EGUIA_SCALE: case EGUIA_SCALE:
DesiredRect.UpperLeftCorner.X = core::round32(ScaleRect.UpperLeftCorner.X * fw); DesiredRect.UpperLeftCorner.X = core::round32(ScaleRect.UpperLeftCorner.X * fw);
break; break;
} }
switch (AlignRight) { switch (AlignRight)
{
case EGUIA_UPPERLEFT: case EGUIA_UPPERLEFT:
break; break;
case EGUIA_LOWERRIGHT: case EGUIA_LOWERRIGHT:
DesiredRect.LowerRightCorner.X += diffx; DesiredRect.LowerRightCorner.X += diffx;
break; break;
case EGUIA_CENTER: case EGUIA_CENTER:
DesiredRect.LowerRightCorner.X += diffx / 2; DesiredRect.LowerRightCorner.X += diffx/2;
break; break;
case EGUIA_SCALE: case EGUIA_SCALE:
DesiredRect.LowerRightCorner.X = core::round32(ScaleRect.LowerRightCorner.X * fw); DesiredRect.LowerRightCorner.X = core::round32(ScaleRect.LowerRightCorner.X * fw);
break; break;
} }
switch (AlignTop) { switch (AlignTop)
{
case EGUIA_UPPERLEFT: case EGUIA_UPPERLEFT:
break; break;
case EGUIA_LOWERRIGHT: case EGUIA_LOWERRIGHT:
DesiredRect.UpperLeftCorner.Y += diffy; DesiredRect.UpperLeftCorner.Y += diffy;
break; break;
case EGUIA_CENTER: case EGUIA_CENTER:
DesiredRect.UpperLeftCorner.Y += diffy / 2; DesiredRect.UpperLeftCorner.Y += diffy/2;
break; break;
case EGUIA_SCALE: case EGUIA_SCALE:
DesiredRect.UpperLeftCorner.Y = core::round32(ScaleRect.UpperLeftCorner.Y * fh); DesiredRect.UpperLeftCorner.Y = core::round32(ScaleRect.UpperLeftCorner.Y * fh);
break; break;
} }
switch (AlignBottom) { switch (AlignBottom)
{
case EGUIA_UPPERLEFT: case EGUIA_UPPERLEFT:
break; break;
case EGUIA_LOWERRIGHT: case EGUIA_LOWERRIGHT:
DesiredRect.LowerRightCorner.Y += diffy; DesiredRect.LowerRightCorner.Y += diffy;
break; break;
case EGUIA_CENTER: case EGUIA_CENTER:
DesiredRect.LowerRightCorner.Y += diffy / 2; DesiredRect.LowerRightCorner.Y += diffy/2;
break; break;
case EGUIA_SCALE: case EGUIA_SCALE:
DesiredRect.LowerRightCorner.Y = core::round32(ScaleRect.LowerRightCorner.Y * fh); DesiredRect.LowerRightCorner.Y = core::round32(ScaleRect.LowerRightCorner.Y * fh);
@ -854,23 +942,26 @@ protected:
LastParentRect = parentAbsolute; LastParentRect = parentAbsolute;
if (recursive) { if ( recursive )
{
// update all children // update all children
for (auto child : Children) { for (auto child : Children)
{
child->recalculateAbsolutePosition(recursive); child->recalculateAbsolutePosition(recursive);
} }
} }
} }
protected: protected:
//! List of all children of this element //! List of all children of this element
std::list<IGUIElement *> Children; std::list<IGUIElement*> Children;
//! Pointer to the parent //! Pointer to the parent
IGUIElement *Parent; IGUIElement* Parent;
//! Our position in the parent list. Only valid when Parent != nullptr //! Our position in the parent list. Only valid when Parent != nullptr
std::list<IGUIElement *>::iterator ParentPos; std::list<IGUIElement*>::iterator ParentPos;
//! relative rect of element //! relative rect of element
core::rect<s32> RelativeRect; core::rect<s32> RelativeRect;
@ -931,11 +1022,15 @@ protected:
EGUI_ALIGNMENT AlignLeft, AlignRight, AlignTop, AlignBottom; EGUI_ALIGNMENT AlignLeft, AlignRight, AlignTop, AlignBottom;
//! GUI Environment //! GUI Environment
IGUIEnvironment *Environment; IGUIEnvironment* Environment;
//! type of element //! type of element
EGUI_ELEMENT_TYPE Type; EGUI_ELEMENT_TYPE Type;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "IGUISkin.h" #include "IGUISkin.h"
@ -13,20 +14,20 @@
namespace irr namespace irr
{ {
class IOSOperator; class IOSOperator;
class IEventReceiver; class IEventReceiver;
namespace io namespace io
{ {
class IReadFile; class IReadFile;
class IWriteFile; class IWriteFile;
class IFileSystem; class IFileSystem;
} // end namespace io } // end namespace io
namespace video namespace video
{ {
class IVideoDriver; class IVideoDriver;
class ITexture; class ITexture;
} // end namespace video } // end namespace video
namespace gui namespace gui
{ {
@ -58,10 +59,11 @@ class IGUIWindow;
class IGUIEnvironment : public virtual IReferenceCounted class IGUIEnvironment : public virtual IReferenceCounted
{ {
public: public:
//! Draws all gui elements by traversing the GUI environment starting at the root node. //! Draws all gui elements by traversing the GUI environment starting at the root node.
/** \param When true ensure the GuiEnvironment (aka the RootGUIElement) has the same size as the current driver screensize. /** \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. */ Can be set to false to control that size yourself, p.E when not the full size should be used for UI. */
virtual void drawAll(bool useScreenSize = true) = 0; virtual void drawAll(bool useScreenSize=true) = 0;
//! Sets the focus to an element. //! Sets the focus to an element.
/** Causes a EGET_ELEMENT_FOCUS_LOST event followed by a /** Causes a EGET_ELEMENT_FOCUS_LOST event followed by a
@ -69,11 +71,11 @@ public:
then the focus will not be changed. then the focus will not be changed.
\param element Pointer to the element which shall get the focus. \param element Pointer to the element which shall get the focus.
\return True on success, false on failure */ \return True on success, false on failure */
virtual bool setFocus(IGUIElement *element) = 0; virtual bool setFocus(IGUIElement* element) = 0;
//! Returns the element which holds the focus. //! Returns the element which holds the focus.
/** \return Pointer to the element with focus. */ /** \return Pointer to the element with focus. */
virtual IGUIElement *getFocus() const = 0; virtual IGUIElement* getFocus() const = 0;
//! Returns the element which was last under the mouse cursor //! Returns the element which was last under the mouse cursor
/** NOTE: This information is updated _after_ the user-eventreceiver /** NOTE: This information is updated _after_ the user-eventreceiver
@ -81,32 +83,32 @@ public:
mouse events you have to use instead: mouse events you have to use instead:
IGUIEnvironment::getRootGUIElement()->getElementFromPoint(mousePos); IGUIEnvironment::getRootGUIElement()->getElementFromPoint(mousePos);
\return Pointer to the element under the mouse. */ \return Pointer to the element under the mouse. */
virtual IGUIElement *getHovered() const = 0; virtual IGUIElement* getHovered() const = 0;
//! Removes the focus from an element. //! Removes the focus from an element.
/** Causes a EGET_ELEMENT_FOCUS_LOST event. If the event is absorbed /** Causes a EGET_ELEMENT_FOCUS_LOST event. If the event is absorbed
then the focus will not be changed. then the focus will not be changed.
\param element Pointer to the element which shall lose the focus. \param element Pointer to the element which shall lose the focus.
\return True on success, false on failure */ \return True on success, false on failure */
virtual bool removeFocus(IGUIElement *element) = 0; virtual bool removeFocus(IGUIElement* element) = 0;
//! Returns whether the element has focus //! Returns whether the element has focus
/** \param element Pointer to the element which is tested. /** \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 \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. */ \return True if the element has focus, else false. */
virtual bool hasFocus(const IGUIElement *element, bool checkSubElements = false) const = 0; virtual bool hasFocus(const IGUIElement* element, bool checkSubElements=false) const = 0;
//! Returns the current video driver. //! Returns the current video driver.
/** \return Pointer to the video driver. */ /** \return Pointer to the video driver. */
virtual video::IVideoDriver *getVideoDriver() const = 0; virtual video::IVideoDriver* getVideoDriver() const = 0;
//! Returns the file system. //! Returns the file system.
/** \return Pointer to the file system. */ /** \return Pointer to the file system. */
virtual io::IFileSystem *getFileSystem() const = 0; virtual io::IFileSystem* getFileSystem() const = 0;
//! returns a pointer to the OS operator //! returns a pointer to the OS operator
/** \return Pointer to the OS operator. */ /** \return Pointer to the OS operator. */
virtual IOSOperator *getOSOperator() const = 0; virtual IOSOperator* getOSOperator() const = 0;
//! Removes all elements from the environment. //! Removes all elements from the environment.
virtual void clear() = 0; virtual void clear() = 0;
@ -116,17 +118,17 @@ public:
use this method, it is used by the engine internally. use this method, it is used by the engine internally.
\param event The event to post. \param event The event to post.
\return True if succeeded, else false. */ \return True if succeeded, else false. */
virtual bool postEventFromUser(const SEvent &event) = 0; virtual bool postEventFromUser(const SEvent& event) = 0;
//! This sets a new event receiver for gui events. //! This sets a new event receiver for gui events.
/** Usually you do not have to /** Usually you do not have to
use this method, it is used by the engine internally. use this method, it is used by the engine internally.
\param evr Pointer to the new receiver. */ \param evr Pointer to the new receiver. */
virtual void setUserEventReceiver(IEventReceiver *evr) = 0; virtual void setUserEventReceiver(IEventReceiver* evr) = 0;
//! Returns pointer to the current gui skin. //! Returns pointer to the current gui skin.
/** \return Pointer to the GUI skin. */ /** \return Pointer to the GUI skin. */
virtual IGUISkin *getSkin() const = 0; virtual IGUISkin* getSkin() const = 0;
//! Sets a new GUI Skin //! Sets a new GUI Skin
/** You can use this to change the appearance of the whole GUI /** You can use this to change the appearance of the whole GUI
@ -141,7 +143,7 @@ public:
\endcode \endcode
\param skin New skin to use. \param skin New skin to use.
*/ */
virtual void setSkin(IGUISkin *skin) = 0; virtual void setSkin(IGUISkin* skin) = 0;
//! Creates a new GUI Skin based on a template. //! Creates a new GUI Skin based on a template.
/** Use setSkin() to set the created skin. /** Use setSkin() to set the created skin.
@ -149,7 +151,8 @@ public:
\return Pointer to the created skin. \return Pointer to the created skin.
If you no longer need it, you should call IGUISkin::drop(). If you no longer need it, you should call IGUISkin::drop().
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IGUISkin *createSkin(EGUI_SKIN_TYPE type) = 0; virtual IGUISkin* createSkin(EGUI_SKIN_TYPE type) = 0;
//! Creates the image list from the given texture. //! Creates the image list from the given texture.
/** \param texture Texture to split into images /** \param texture Texture to split into images
@ -158,9 +161,9 @@ public:
\return Pointer to the font. Returns 0 if the font could not be loaded. \return Pointer to the font. Returns 0 if the font could not be loaded.
This pointer should not be dropped. See IReferenceCounted::drop() for This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */ more information. */
virtual IGUIImageList *createImageList(video::ITexture *texture, virtual IGUIImageList* createImageList( video::ITexture* texture,
core::dimension2d<s32> imageSize, core::dimension2d<s32> imageSize,
bool useAlphaChannel) = 0; bool useAlphaChannel ) = 0;
//! Returns pointer to the font with the specified filename. //! Returns pointer to the font with the specified filename.
/** Loads the font if it was not loaded before. /** Loads the font if it was not loaded before.
@ -168,7 +171,7 @@ public:
\return Pointer to the font. Returns 0 if the font could not be loaded. \return Pointer to the font. Returns 0 if the font could not be loaded.
This pointer should not be dropped. See IReferenceCounted::drop() for This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */ more information. */
virtual IGUIFont *getFont(const io::path &filename) = 0; virtual IGUIFont* getFont(const io::path& filename) = 0;
//! Adds an externally loaded font to the font list. //! Adds an externally loaded font to the font list.
/** This method allows to attach an already loaded font to the list of /** This method allows to attach an already loaded font to the list of
@ -176,29 +179,29 @@ public:
\param name Name the font should be stored as. \param name Name the font should be stored as.
\param font Pointer to font to add. \param font Pointer to font to add.
\return Pointer to the font stored. This can differ from given parameter if the name previously existed. */ \return Pointer to the font stored. This can differ from given parameter if the name previously existed. */
virtual IGUIFont *addFont(const io::path &name, IGUIFont *font) = 0; virtual IGUIFont* addFont(const io::path& name, IGUIFont* font) = 0;
//! remove loaded font //! remove loaded font
virtual void removeFont(IGUIFont *font) = 0; virtual void removeFont(IGUIFont* font) = 0;
//! Returns the default built-in font. //! Returns the default built-in font.
/** \return Pointer to the default built-in font. /** \return Pointer to the default built-in font.
This pointer should not be dropped. See IReferenceCounted::drop() for This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */ more information. */
virtual IGUIFont *getBuiltInFont() const = 0; virtual IGUIFont* getBuiltInFont() const = 0;
//! Returns pointer to the sprite bank which was added with addEmptySpriteBank //! Returns pointer to the sprite bank which was added with addEmptySpriteBank
/** TODO: This should load files in the future, but not implemented so far. /** TODO: This should load files in the future, but not implemented so far.
\param filename Name of a spritebank added with addEmptySpriteBank \param filename Name of a spritebank added with addEmptySpriteBank
\return Pointer to the sprite bank. Returns 0 if it could not be loaded. \return Pointer to the sprite bank. Returns 0 if it could not be loaded.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual IGUISpriteBank *getSpriteBank(const io::path &filename) = 0; virtual IGUISpriteBank* getSpriteBank(const io::path& filename) = 0;
//! Adds an empty sprite bank to the manager //! Adds an empty sprite bank to the manager
/** \param name Name of the new sprite bank. /** \param name Name of the new sprite bank.
\return Pointer to the sprite bank. \return Pointer to the sprite bank.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual IGUISpriteBank *addEmptySpriteBank(const io::path &name) = 0; virtual IGUISpriteBank* addEmptySpriteBank(const io::path& name) = 0;
//! Returns the root gui element. //! Returns the root gui element.
/** This is the first gui element, the (direct or indirect) parent of all /** This is the first gui element, the (direct or indirect) parent of all
@ -207,7 +210,7 @@ public:
\return Pointer to the root element of the GUI. The returned pointer \return Pointer to the root element of the GUI. The returned pointer
should not be dropped. See IReferenceCounted::drop() for more should not be dropped. See IReferenceCounted::drop() for more
information. */ information. */
virtual IGUIElement *getRootGUIElement() = 0; virtual IGUIElement* getRootGUIElement() = 0;
//! Adds a button element. //! Adds a button element.
/** \param rectangle Rectangle specifying the borders of the button. /** \param rectangle Rectangle specifying the borders of the button.
@ -218,8 +221,8 @@ public:
\return Pointer to the created button. Returns 0 if an error occurred. \return Pointer to the created button. Returns 0 if an error occurred.
This pointer should not be dropped. See IReferenceCounted::drop() for This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */ more information. */
virtual IGUIButton *addButton(const core::rect<s32> &rectangle, virtual IGUIButton* addButton(const core::rect<s32>& rectangle,
IGUIElement *parent = 0, s32 id = -1, const wchar_t *text = 0, const wchar_t *tooltiptext = 0) = 0; IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0, const wchar_t* tooltiptext = 0) = 0;
//! Adds a scrollbar. //! Adds a scrollbar.
/** \param horizontal Specifies if the scroll bar is drawn horizontal /** \param horizontal Specifies if the scroll bar is drawn horizontal
@ -230,8 +233,8 @@ public:
\return Pointer to the created scrollbar. Returns 0 if an error \return Pointer to the created scrollbar. Returns 0 if an error
occurred. This pointer should not be dropped. See occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUIScrollBar *addScrollBar(bool horizontal, const core::rect<s32> &rectangle, virtual IGUIScrollBar* addScrollBar(bool horizontal, const core::rect<s32>& rectangle,
IGUIElement *parent = 0, s32 id = -1) = 0; IGUIElement* parent=0, s32 id=-1) = 0;
//! Adds an image element. //! Adds an image element.
/** \param image Image to be displayed. /** \param image Image to be displayed.
@ -245,8 +248,8 @@ public:
\return Pointer to the created image element. Returns 0 if an error \return Pointer to the created image element. Returns 0 if an error
occurred. This pointer should not be dropped. See occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUIImage *addImage(video::ITexture *image, core::position2d<s32> pos, virtual IGUIImage* addImage(video::ITexture* image, core::position2d<s32> pos,
bool useAlphaChannel = true, IGUIElement *parent = 0, s32 id = -1, const wchar_t *text = 0) = 0; bool useAlphaChannel=true, IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0) = 0;
//! Adds an image element. //! Adds an image element.
/** Use IGUIImage::setImage later to set the image to be displayed. /** Use IGUIImage::setImage later to set the image to be displayed.
@ -259,8 +262,8 @@ public:
\return Pointer to the created image element. Returns 0 if an error \return Pointer to the created image element. Returns 0 if an error
occurred. This pointer should not be dropped. See occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUIImage *addImage(const core::rect<s32> &rectangle, virtual IGUIImage* addImage(const core::rect<s32>& rectangle,
IGUIElement *parent = 0, s32 id = -1, const wchar_t *text = 0, bool useAlphaChannel = true) = 0; IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0, bool useAlphaChannel=true) = 0;
//! Adds a checkbox element. //! Adds a checkbox element.
/** \param checked Define the initial state of the check box. /** \param checked Define the initial state of the check box.
@ -271,8 +274,8 @@ public:
\return Pointer to the created check box. Returns 0 if an error \return Pointer to the created check box. Returns 0 if an error
occurred. This pointer should not be dropped. See occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUICheckBox *addCheckBox(bool checked, const core::rect<s32> &rectangle, virtual IGUICheckBox* addCheckBox(bool checked, const core::rect<s32>& rectangle,
IGUIElement *parent = 0, s32 id = -1, const wchar_t *text = 0) = 0; IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0) = 0;
//! Adds a list box element. //! Adds a list box element.
/** \param rectangle Rectangle specifying the borders of the list box. /** \param rectangle Rectangle specifying the borders of the list box.
@ -282,8 +285,8 @@ public:
\return Pointer to the created list box. Returns 0 if an error occurred. \return Pointer to the created list box. Returns 0 if an error occurred.
This pointer should not be dropped. See IReferenceCounted::drop() for This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */ more information. */
virtual IGUIListBox *addListBox(const core::rect<s32> &rectangle, virtual IGUIListBox* addListBox(const core::rect<s32>& rectangle,
IGUIElement *parent = 0, s32 id = -1, bool drawBackground = false) = 0; IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) = 0;
//! Adds a file open dialog. //! Adds a file open dialog.
/** \param title Text to be displayed as the title of the dialog. /** \param title Text to be displayed as the title of the dialog.
@ -299,9 +302,9 @@ public:
\return Pointer to the created file open dialog. Returns 0 if an error \return Pointer to the created file open dialog. Returns 0 if an error
occurred. This pointer should not be dropped. See occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUIFileOpenDialog *addFileOpenDialog(const wchar_t *title = 0, virtual IGUIFileOpenDialog* addFileOpenDialog(const wchar_t* title=0,
bool modal = true, IGUIElement *parent = 0, s32 id = -1, bool modal=true, IGUIElement* parent=0, s32 id=-1,
bool restoreCWD = false, io::path::char_type *startDir = 0) = 0; bool restoreCWD=false, io::path::char_type* startDir=0) = 0;
//! Adds a static text. //! Adds a static text.
/** \param text Text to be displayed. Can be altered after creation by SetText(). /** \param text Text to be displayed. Can be altered after creation by SetText().
@ -315,8 +318,8 @@ public:
\return Pointer to the created static text. Returns 0 if an error \return Pointer to the created static text. Returns 0 if an error
occurred. This pointer should not be dropped. See occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUIStaticText *addStaticText(const wchar_t *text, const core::rect<s32> &rectangle, virtual IGUIStaticText* addStaticText(const wchar_t* text, const core::rect<s32>& rectangle,
bool border = false, bool wordWrap = true, IGUIElement *parent = 0, s32 id = -1, bool border=false, bool wordWrap=true, IGUIElement* parent=0, s32 id=-1,
bool fillBackground = false) = 0; bool fillBackground = false) = 0;
//! Adds an edit box. //! Adds an edit box.
@ -334,8 +337,8 @@ public:
\return Pointer to the created edit box. Returns 0 if an error occurred. \return Pointer to the created edit box. Returns 0 if an error occurred.
This pointer should not be dropped. See IReferenceCounted::drop() for This pointer should not be dropped. See IReferenceCounted::drop() for
more information. */ more information. */
virtual IGUIEditBox *addEditBox(const wchar_t *text, const core::rect<s32> &rectangle, virtual IGUIEditBox* addEditBox(const wchar_t* text, const core::rect<s32>& rectangle,
bool border = true, IGUIElement *parent = 0, s32 id = -1) = 0; bool border=true, IGUIElement* parent=0, s32 id=-1) = 0;
//! Adds a tab control to the environment. //! Adds a tab control to the environment.
/** \param rectangle Rectangle specifying the borders of the tab control. /** \param rectangle Rectangle specifying the borders of the tab control.
@ -350,9 +353,9 @@ public:
\return Pointer to the created tab control element. Returns 0 if an \return Pointer to the created tab control element. Returns 0 if an
error occurred. This pointer should not be dropped. See error occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUITabControl *addTabControl(const core::rect<s32> &rectangle, virtual IGUITabControl* addTabControl(const core::rect<s32>& rectangle,
IGUIElement *parent = 0, bool fillbackground = false, IGUIElement* parent=0, bool fillbackground=false,
bool border = true, s32 id = -1) = 0; bool border=true, s32 id=-1) = 0;
//! Adds tab to the environment. //! Adds tab to the environment.
/** You can use this element to group other elements. This is not used /** You can use this element to group other elements. This is not used
@ -365,8 +368,8 @@ public:
\return Pointer to the created tab. Returns 0 if an \return Pointer to the created tab. Returns 0 if an
error occurred. This pointer should not be dropped. See error occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUITab *addTab(const core::rect<s32> &rectangle, virtual IGUITab* addTab(const core::rect<s32>& rectangle,
IGUIElement *parent = 0, s32 id = -1) = 0; IGUIElement* parent=0, s32 id=-1) = 0;
//! Adds a combo box to the environment. //! Adds a combo box to the environment.
/** \param rectangle Rectangle specifying the borders of the combo box. /** \param rectangle Rectangle specifying the borders of the combo box.
@ -376,8 +379,8 @@ public:
\return Pointer to the created combo box. Returns 0 if an \return Pointer to the created combo box. Returns 0 if an
error occurred. This pointer should not be dropped. See error occurred. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IGUIComboBox *addComboBox(const core::rect<s32> &rectangle, virtual IGUIComboBox* addComboBox(const core::rect<s32>& rectangle,
IGUIElement *parent = 0, s32 id = -1) = 0; IGUIElement* parent=0, s32 id=-1) = 0;
//! Find the next element which would be selected when pressing the tab-key //! Find the next element which would be selected when pressing the tab-key
/** If you set the focus for the result you can manually force focus-changes like they /** If you set the focus for the result you can manually force focus-changes like they
@ -385,7 +388,7 @@ public:
\param reverse When true it will search backward (toward lower TabOrder numbers, like shift+tab) \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) \param group When true it will search for the next tab-group (like ctrl+tab)
*/ */
virtual IGUIElement *getNextElement(bool reverse = false, bool group = false) = 0; virtual IGUIElement* getNextElement(bool reverse=false, bool group=false) = 0;
//! Set the way the gui will handle automatic focus changes //! Set the way the gui will handle automatic focus changes
/** The default is (EFF_SET_ON_LMOUSE_DOWN | EFF_SET_ON_TAB). /** The default is (EFF_SET_ON_LMOUSE_DOWN | EFF_SET_ON_TAB).
@ -407,8 +410,12 @@ public:
Note that in general just calling IGUIElement::remove() is enough. Note that in general just calling IGUIElement::remove() is enough.
Unless you create your own GUI elements removing themselves you won't need it. Unless you create your own GUI elements removing themselves you won't need it.
\param element: Element to remove */ \param element: Element to remove */
virtual void addToDeletionQueue(IGUIElement *element) = 0; virtual void addToDeletionQueue(IGUIElement* element) = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IGUIElement.h"
#include "path.h" #include "path.h"
@ -12,33 +13,38 @@ namespace irr
namespace gui namespace gui
{ {
//! Standard file chooser dialog. //! Standard file chooser dialog.
/** \warning When the user selects a folder this does change the current working directory /** \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
\li EGET_FILE_SELECTED
\li EGET_FILE_CHOOSE_DIALOG_CANCELLED
*/
class IGUIFileOpenDialog : public IGUIElement
{
public:
\par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_DIRECTORY_SELECTED
\li EGET_FILE_SELECTED
\li EGET_FILE_CHOOSE_DIALOG_CANCELLED
*/
class IGUIFileOpenDialog : public IGUIElement
{
public:
//! constructor //! constructor
IGUIFileOpenDialog(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIFileOpenDialog(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_FILE_OPEN_DIALOG, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_FILE_OPEN_DIALOG, environment, parent, id, rectangle) {}
//! Returns the filename of the selected file converted to wide characters. Returns NULL if no file was selected. //! Returns the filename of the selected file converted to wide characters. Returns NULL if no file was selected.
virtual const wchar_t *getFileName() const = 0; virtual const wchar_t* getFileName() const = 0;
//! Returns the filename of the selected file. Is empty if no file was selected. //! Returns the filename of the selected file. Is empty if no file was selected.
virtual const io::path &getFileNameP() const = 0; virtual const io::path& getFileNameP() const = 0;
//! Returns the directory of the selected file. Empty if no directory was selected. //! Returns the directory of the selected file. Empty if no directory was selected.
virtual const io::path &getDirectoryName() const = 0; virtual const io::path& getDirectoryName() const = 0;
//! Returns the directory of the selected file converted to wide characters. Returns NULL 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 wchar_t *getDirectoryNameW() const = 0; virtual const wchar_t* getDirectoryNameW() const = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "SColor.h" #include "SColor.h"
@ -38,6 +39,7 @@ enum EGUI_FONT_TYPE
class IGUIFont : public virtual IReferenceCounted class IGUIFont : public virtual IReferenceCounted
{ {
public: public:
//! Draws some text and clips it to the specified rectangle if wanted. //! Draws some text and clips it to the specified rectangle if wanted.
/** \param text: Text to draw /** \param text: Text to draw
\param position: Rectangle specifying position where to draw the text. \param position: Rectangle specifying position where to draw the text.
@ -46,30 +48,30 @@ public:
\param vcenter: Specifies if the text should be centered vertically into the rectangle. \param vcenter: Specifies if the text should be centered vertically into the rectangle.
\param clip: Optional pointer to a rectangle against which the text will be clipped. \param clip: Optional pointer to a rectangle against which the text will be clipped.
If the pointer is null, no clipping will be done. */ If the pointer is null, no clipping will be done. */
virtual void draw(const core::stringw &text, const core::rect<s32> &position, virtual void draw(const core::stringw& text, const core::rect<s32>& position,
video::SColor color, bool hcenter = false, bool vcenter = false, video::SColor color, bool hcenter=false, bool vcenter=false,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip=0) = 0;
//! Calculates the width and height of a given string of text. //! Calculates the width and height of a given string of text.
/** \return Returns width and height of the area covered by the text if /** \return Returns width and height of the area covered by the text if
it would be drawn. */ it would be drawn. */
virtual core::dimension2d<u32> getDimension(const wchar_t *text) const = 0; virtual core::dimension2d<u32> getDimension(const wchar_t* text) const = 0;
//! Calculates the index of the character in the text which is on a specific position. //! Calculates the index of the character in the text which is on a specific position.
/** \param text: Text string. /** \param text: Text string.
\param pixel_x: X pixel position of which the index of the character will be returned. \param pixel_x: X pixel position of which the index of the character will be returned.
\return Returns zero based index of the character in the text, and -1 if no no character \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). */ is on this position. (=the text is too short). */
virtual s32 getCharacterFromPos(const wchar_t *text, s32 pixel_x) const = 0; virtual s32 getCharacterFromPos(const wchar_t* text, s32 pixel_x) const = 0;
//! Returns the type of this font //! Returns the type of this font
virtual EGUI_FONT_TYPE getType() const { return EGFT_CUSTOM; } virtual EGUI_FONT_TYPE getType() const { return EGFT_CUSTOM; }
//! Sets global kerning width for the font. //! Sets global kerning width for the font.
virtual void setKerningWidth(s32 kerning) = 0; virtual void setKerningWidth (s32 kerning) = 0;
//! Sets global kerning height for the font. //! Sets global kerning height for the font.
virtual void setKerningHeight(s32 kerning) = 0; virtual void setKerningHeight (s32 kerning) = 0;
//! Gets kerning values (distance between letters) for the font. If no parameters are provided, //! Gets kerning values (distance between letters) for the font. If no parameters are provided,
/** the global kerning distance is returned. /** the global kerning distance is returned.
@ -82,7 +84,7 @@ public:
which supports kerning pairs a string such as 'Wo' may have the 'o' which supports kerning pairs a string such as 'Wo' may have the 'o'
tucked neatly under the 'W'. tucked neatly under the 'W'.
*/ */
virtual s32 getKerningWidth(const wchar_t *thisLetter = 0, const wchar_t *previousLetter = 0) const = 0; virtual s32 getKerningWidth(const wchar_t* thisLetter=0, const wchar_t* previousLetter=0) const = 0;
//! Returns the distance between letters //! Returns the distance between letters
virtual s32 getKerningHeight() const = 0; virtual s32 getKerningHeight() const = 0;
@ -92,8 +94,11 @@ public:
most fonts. most fonts.
\param s String of symbols which are not send down to the videodriver \param s String of symbols which are not send down to the videodriver
*/ */
virtual void setInvisibleCharacters(const wchar_t *s) = 0; virtual void setInvisibleCharacters( const wchar_t *s ) = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -10,17 +11,18 @@ namespace irr
{ {
namespace gui namespace gui
{ {
class IGUISpriteBank; class IGUISpriteBank;
//! Font interface. //! Font interface.
class IGUIFontBitmap : public IGUIFont class IGUIFontBitmap : public IGUIFont
{ {
public: public:
//! Returns the type of this font //! Returns the type of this font
EGUI_FONT_TYPE getType() const override { return EGFT_BITMAP; } EGUI_FONT_TYPE getType() const override { return EGFT_BITMAP; }
//! returns the parsed Symbol Information //! returns the parsed Symbol Information
virtual IGUISpriteBank *getSpriteBank() const = 0; virtual IGUISpriteBank* getSpriteBank() const = 0;
//! returns the sprite number from a given character //! returns the sprite number from a given character
virtual u32 getSpriteNoFromChar(const wchar_t *c) const = 0; virtual u32 getSpriteNoFromChar(const wchar_t *c) const = 0;
@ -34,8 +36,11 @@ public:
kerning value. For example, EGFT_BITMAP will add the right kerning value of previousLetter to the kerning value. For example, EGFT_BITMAP will add the right kerning value of previousLetter to the
left side kerning value of thisLetter, then add the global value. left side kerning value of thisLetter, then add the global value.
*/ */
s32 getKerningWidth(const wchar_t *thisLetter = 0, const wchar_t *previousLetter = 0) const override = 0; s32 getKerningWidth(const wchar_t* thisLetter=0, const wchar_t* previousLetter=0) const override = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -10,23 +11,24 @@ namespace irr
{ {
namespace video namespace video
{ {
class ITexture; class ITexture;
} }
namespace gui namespace gui
{ {
//! GUI element displaying an image. //! GUI element displaying an image.
class IGUIImage : public IGUIElement class IGUIImage : public IGUIElement
{ {
public: public:
//! constructor //! constructor
IGUIImage(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIImage(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_IMAGE, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_IMAGE, environment, parent, id, rectangle) {}
//! Sets an image texture //! Sets an image texture
virtual void setImage(video::ITexture *image) = 0; virtual void setImage(video::ITexture* image) = 0;
//! Gets the image texture //! Gets the image texture
virtual video::ITexture *getImage() const = 0; virtual video::ITexture* getImage() const = 0;
//! Sets the color of the image //! Sets the color of the image
/** \param color Color with which the image is drawn. If the color /** \param color Color with which the image is drawn. If the color
@ -50,7 +52,7 @@ public:
//! Sets the source rectangle of the image. By default the full image is used. //! 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). */ /** \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; virtual void setSourceRect(const core::rect<s32>& sourceRect) = 0;
//! Returns the customized source rectangle of the image to be used. //! 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. */ /** By default an empty rectangle of width and height 0 is returned which means the full image is used. */
@ -64,7 +66,7 @@ public:
Unlike normal clipping this does not affect the gui-children. Unlike normal clipping this does not affect the gui-children.
\param drawBoundUVs: Coordinates between 0 and 1 where 0 are for left+top and 1 for right+bottom \param drawBoundUVs: Coordinates between 0 and 1 where 0 are for left+top and 1 for right+bottom
*/ */
virtual void setDrawBounds(const core::rect<f32> &drawBoundUVs = core::rect<f32>(0.f, 0.f, 1.f, 1.f)) = 0; virtual void setDrawBounds(const core::rect<f32>& drawBoundUVs = core::rect<f32>(0.f, 0.f, 1.f, 1.f)) = 0;
//! Get drawing-area restrictions. //! Get drawing-area restrictions.
virtual core::rect<f32> getDrawBounds() const = 0; virtual core::rect<f32> getDrawBounds() const = 0;
@ -76,7 +78,10 @@ public:
//! Checks if a background is drawn when no texture is set //! Checks if a background is drawn when no texture is set
/** \return true if background drawing is enabled, false otherwise */ /** \return true if background drawing is enabled, false otherwise */
virtual bool isDrawBackgroundEnabled() const = 0; virtual bool isDrawBackgroundEnabled() const = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -1,7 +1,8 @@
// 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 "IGUIElement.h"
#include "rect.h" #include "rect.h"
@ -16,16 +17,17 @@ namespace gui
class IGUIImageList : public virtual IReferenceCounted class IGUIImageList : public virtual IReferenceCounted
{ {
public: public:
//! Destructor //! Destructor
virtual ~IGUIImageList(){}; virtual ~IGUIImageList() {};
//! Draws an image and clips it to the specified rectangle if wanted //! Draws an image and clips it to the specified rectangle if wanted
//! \param index: Index of the image //! \param index: Index of the image
//! \param destPos: Position of the image to draw //! \param destPos: Position of the image to draw
//! \param clip: Optional pointer to a rectangle against which the text will be clipped. //! \param clip: Optional pointer to a rectangle against which the text will be clipped.
//! If the pointer is null, no clipping will be done. //! If the pointer is null, no clipping will be done.
virtual void draw(s32 index, const core::position2d<s32> &destPos, virtual void draw(s32 index, const core::position2d<s32>& destPos,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip = 0) = 0;
//! Returns the count of Images in the list. //! Returns the count of Images in the list.
//! \return Returns the count of Images in the list. //! \return Returns the count of Images in the list.
@ -38,3 +40,6 @@ public:
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IGUIElement.h"
#include "SColor.h" #include "SColor.h"
@ -11,14 +12,14 @@ namespace irr
{ {
namespace gui namespace gui
{ {
class IGUISpriteBank; class IGUISpriteBank;
class IGUIScrollBar; class IGUIScrollBar;
//! Enumeration for listbox colors //! Enumeration for listbox colors
enum EGUI_LISTBOX_COLOR enum EGUI_LISTBOX_COLOR
{ {
//! Color of text //! Color of text
EGUI_LBC_TEXT = 0, EGUI_LBC_TEXT=0,
//! Color of selected text //! Color of selected text
EGUI_LBC_TEXT_HIGHLIGHT, EGUI_LBC_TEXT_HIGHLIGHT,
//! Color of icon //! Color of icon
@ -27,34 +28,35 @@ enum EGUI_LISTBOX_COLOR
EGUI_LBC_ICON_HIGHLIGHT, EGUI_LBC_ICON_HIGHLIGHT,
//! Not used, just counts the number of available colors //! Not used, just counts the number of available colors
EGUI_LBC_COUNT EGUI_LBC_COUNT
}; };
//! Default list box GUI element.
/** \par This element can create the following events of type EGUI_EVENT_TYPE: //! Default list box GUI element.
\li EGET_LISTBOX_CHANGED /** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_LISTBOX_SELECTED_AGAIN \li EGET_LISTBOX_CHANGED
*/ \li EGET_LISTBOX_SELECTED_AGAIN
class IGUIListBox : public IGUIElement */
{ class IGUIListBox : public IGUIElement
public: {
public:
//! constructor //! constructor
IGUIListBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIListBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_LIST_BOX, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_LIST_BOX, environment, parent, id, rectangle) {}
//! returns amount of list items //! returns amount of list items
virtual u32 getItemCount() const = 0; virtual u32 getItemCount() const = 0;
//! returns string of a list item. the may id be a value from 0 to itemCount-1 //! returns string of a list item. the may id be a value from 0 to itemCount-1
virtual const wchar_t *getListItem(u32 id) const = 0; virtual const wchar_t* getListItem(u32 id) const = 0;
//! adds an list item, returns id of item //! adds an list item, returns id of item
virtual u32 addItem(const wchar_t *text) = 0; virtual u32 addItem(const wchar_t* text) = 0;
//! adds an list item with an icon //! adds an list item with an icon
/** \param text Text of list entry /** \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 \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 */ \return The id of the new created item */
virtual u32 addItem(const wchar_t *text, s32 icon) = 0; virtual u32 addItem(const wchar_t* text, s32 icon) = 0;
//! Removes an item from the list //! Removes an item from the list
virtual void removeItem(u32 index) = 0; virtual void removeItem(u32 index) = 0;
@ -71,7 +73,7 @@ public:
default. A sprite can be displayed in front of every list item. default. A sprite can be displayed in front of every list item.
An icon is an index within the icon sprite bank. Several An icon is an index within the icon sprite bank. Several
default icons are available in the skin through getIcon. */ default icons are available in the skin through getIcon. */
virtual void setSpriteBank(IGUISpriteBank *bank) = 0; virtual void setSpriteBank(IGUISpriteBank* bank) = 0;
//! clears the list, deletes all items in the listbox //! clears the list, deletes all items in the listbox
virtual void clear() = 0; virtual void clear() = 0;
@ -113,24 +115,28 @@ public:
virtual video::SColor getItemDefaultColor(EGUI_LISTBOX_COLOR colorType) const = 0; virtual video::SColor getItemDefaultColor(EGUI_LISTBOX_COLOR colorType) const = 0;
//! set the item at the given index //! set the item at the given index
virtual void setItem(u32 index, const wchar_t *text, s32 icon) = 0; virtual void setItem(u32 index, const wchar_t* text, s32 icon) = 0;
//! Insert the item at the given index //! Insert the item at the given index
/** \return The index on success or -1 on failure. */ /** \return The index on success or -1 on failure. */
virtual s32 insertItem(u32 index, const wchar_t *text, s32 icon) = 0; virtual s32 insertItem(u32 index, const wchar_t* text, s32 icon) = 0;
//! Swap the items at the given indices //! Swap the items at the given indices
virtual void swapItems(u32 index1, u32 index2) = 0; virtual void swapItems(u32 index1, u32 index2) = 0;
//! set global itemHeight //! set global itemHeight
virtual void setItemHeight(s32 height) = 0; virtual void setItemHeight( s32 height ) = 0;
//! Sets whether to draw the background //! Sets whether to draw the background
virtual void setDrawBackground(bool draw) = 0; virtual void setDrawBackground(bool draw) = 0;
//! Access the vertical scrollbar //! Access the vertical scrollbar
virtual IGUIScrollBar *getVerticalScrollBar() const = 0; virtual IGUIScrollBar* getVerticalScrollBar() const = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,16 +12,17 @@ namespace irr
namespace gui namespace gui
{ {
//! Default scroll bar GUI element. //! Default scroll bar GUI element.
/** \par This element can create the following events of type EGUI_EVENT_TYPE: /** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_SCROLL_BAR_CHANGED \li EGET_SCROLL_BAR_CHANGED
*/ */
class IGUIScrollBar : public IGUIElement class IGUIScrollBar : public IGUIElement
{ {
public: public:
//! constructor //! constructor
IGUIScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIScrollBar(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_SCROLL_BAR, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_SCROLL_BAR, environment, parent, id, rectangle) {}
//! sets the maximum value of the scrollbar. //! sets the maximum value of the scrollbar.
virtual void setMax(s32 max) = 0; virtual void setMax(s32 max) = 0;
@ -53,7 +55,11 @@ public:
//! sets the current position of the scrollbar //! sets the current position of the scrollbar
virtual void setPos(s32 pos) = 0; virtual void setPos(s32 pos) = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_SKIN_H_INCLUDED__
#define __I_GUI_SKIN_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
#include "EGUIAlignment.h" #include "EGUIAlignment.h"
@ -13,23 +14,23 @@ namespace irr
{ {
namespace gui namespace gui
{ {
class IGUIFont; class IGUIFont;
class IGUISpriteBank; class IGUISpriteBank;
class IGUIElement; class IGUIElement;
//! Enumeration of available default skins. //! Enumeration of available default skins.
/** To set one of the skins, use the following code, for example to set /** To set one of the skins, use the following code, for example to set
the Windows classic skin: the Windows classic skin:
\code \code
gui::IGUISkin* newskin = environment->createSkin(gui::EGST_WINDOWS_CLASSIC); gui::IGUISkin* newskin = environment->createSkin(gui::EGST_WINDOWS_CLASSIC);
environment->setSkin(newskin); environment->setSkin(newskin);
newskin->drop(); newskin->drop();
\endcode \endcode
*/ */
enum EGUI_SKIN_TYPE enum EGUI_SKIN_TYPE
{ {
//! Default windows look and feel //! Default windows look and feel
EGST_WINDOWS_CLASSIC = 0, EGST_WINDOWS_CLASSIC=0,
//! Like EGST_WINDOWS_CLASSIC, but with metallic shaded windows and buttons //! Like EGST_WINDOWS_CLASSIC, but with metallic shaded windows and buttons
EGST_WINDOWS_METALLIC, EGST_WINDOWS_METALLIC,
@ -42,10 +43,11 @@ enum EGUI_SKIN_TYPE
//! this value is not used, it only specifies the number of skin types //! this value is not used, it only specifies the number of skin types
EGST_COUNT EGST_COUNT
}; };
//! Names for gui element types //! Names for gui element types
const c8 *const GUISkinTypeNames[EGST_COUNT + 1] = { const c8* const GUISkinTypeNames[EGST_COUNT+1] =
{
"windowsClassic", "windowsClassic",
"windowsMetallic", "windowsMetallic",
"burning", "burning",
@ -53,9 +55,10 @@ const c8 *const GUISkinTypeNames[EGST_COUNT + 1] = {
0, 0,
}; };
//! Enumeration for skin colors
enum EGUI_DEFAULT_COLOR //! Enumeration for skin colors
{ enum EGUI_DEFAULT_COLOR
{
//! Dark shadow for three-dimensional display elements. //! Dark shadow for three-dimensional display elements.
EGDC_3D_DARK_SHADOW = 0, EGDC_3D_DARK_SHADOW = 0,
//! Shadow color for three-dimensional display elements (for edges facing away from the light source). //! Shadow color for three-dimensional display elements (for edges facing away from the light source).
@ -110,10 +113,11 @@ enum EGUI_DEFAULT_COLOR
//! this value is not used, it only specifies the amount of default colors //! this value is not used, it only specifies the amount of default colors
//! available. //! available.
EGDC_COUNT EGDC_COUNT
}; };
//! Names for default skin colors //! Names for default skin colors
const c8 *const GUISkinColorNames[EGDC_COUNT + 1] = { const c8* const GUISkinColorNames[EGDC_COUNT+1] =
{
"3DDarkShadow", "3DDarkShadow",
"3DShadow", "3DShadow",
"3DFace", "3DFace",
@ -142,9 +146,9 @@ const c8 *const GUISkinColorNames[EGDC_COUNT + 1] = {
0, 0,
}; };
//! Enumeration for default sizes. //! Enumeration for default sizes.
enum EGUI_DEFAULT_SIZE enum EGUI_DEFAULT_SIZE
{ {
//! default with / height of scrollbar. Also width of drop-down button in comboboxes. //! default with / height of scrollbar. Also width of drop-down button in comboboxes.
EGDS_SCROLLBAR_SIZE = 0, EGDS_SCROLLBAR_SIZE = 0,
//! height of menu //! height of menu
@ -195,10 +199,12 @@ enum EGUI_DEFAULT_SIZE
//! this value is not used, it only specifies the amount of default sizes //! this value is not used, it only specifies the amount of default sizes
//! available. //! available.
EGDS_COUNT EGDS_COUNT
}; };
//! Names for default skin sizes
const c8 *const GUISkinSizeNames[EGDS_COUNT + 1] = { //! Names for default skin sizes
const c8* const GUISkinSizeNames[EGDS_COUNT+1] =
{
"ScrollBarSize", "ScrollBarSize",
"MenuHeight", "MenuHeight",
"WindowButtonWidth", "WindowButtonWidth",
@ -222,11 +228,12 @@ const c8 *const GUISkinSizeNames[EGDS_COUNT + 1] = {
"ButtonPressedTextOffsetY", "ButtonPressedTextOffsetY",
"ButtonPressedSpriteOffsetX", "ButtonPressedSpriteOffsetX",
"ButtonPressedSpriteOffsetY", "ButtonPressedSpriteOffsetY",
0, 0
}; };
enum EGUI_DEFAULT_TEXT
{ enum EGUI_DEFAULT_TEXT
{
//! Text for the OK button on a message box //! Text for the OK button on a message box
EGDT_MSG_BOX_OK = 0, EGDT_MSG_BOX_OK = 0,
//! Text for the Cancel button on a message box //! Text for the Cancel button on a message box
@ -246,10 +253,11 @@ enum EGUI_DEFAULT_TEXT
//! this value is not used, it only specifies the number of default texts //! this value is not used, it only specifies the number of default texts
EGDT_COUNT EGDT_COUNT
}; };
//! Names for default skin sizes //! Names for default skin sizes
const c8 *const GUISkinTextNames[EGDT_COUNT + 1] = { const c8* const GUISkinTextNames[EGDT_COUNT+1] =
{
"MessageBoxOkay", "MessageBoxOkay",
"MessageBoxCancel", "MessageBoxCancel",
"MessageBoxYes", "MessageBoxYes",
@ -258,12 +266,12 @@ const c8 *const GUISkinTextNames[EGDT_COUNT + 1] = {
"WindowButtonMaximize", "WindowButtonMaximize",
"WindowButtonMinimize", "WindowButtonMinimize",
"WindowButtonRestore", "WindowButtonRestore",
0, 0
}; };
//! Customizable symbols for GUI //! Customizable symbols for GUI
enum EGUI_DEFAULT_ICON enum EGUI_DEFAULT_ICON
{ {
//! maximize window button //! maximize window button
EGDI_WINDOW_MAXIMIZE = 0, EGDI_WINDOW_MAXIMIZE = 0,
//! restore window button //! restore window button
@ -314,9 +322,10 @@ enum EGUI_DEFAULT_ICON
//! value not used, it only specifies the number of icons //! value not used, it only specifies the number of icons
EGDI_COUNT EGDI_COUNT
}; };
const c8 *const GUISkinIconNames[EGDI_COUNT + 1] = { const c8* const GUISkinIconNames[EGDI_COUNT+1] =
{
"windowMaximize", "windowMaximize",
"windowRestore", "windowRestore",
"windowClose", "windowClose",
@ -340,14 +349,14 @@ const c8 *const GUISkinIconNames[EGDI_COUNT + 1] = {
"collapse", "collapse",
"file", "file",
"directory", "directory",
0, 0
}; };
// Customizable fonts // Customizable fonts
enum EGUI_DEFAULT_FONT enum EGUI_DEFAULT_FONT
{ {
//! For static text, edit boxes, lists and most other places //! For static text, edit boxes, lists and most other places
EGDF_DEFAULT = 0, EGDF_DEFAULT=0,
//! Font for buttons //! Font for buttons
EGDF_BUTTON, EGDF_BUTTON,
//! Font for window title bars //! Font for window title bars
@ -359,21 +368,23 @@ enum EGUI_DEFAULT_FONT
//! this value is not used, it only specifies the amount of default fonts //! this value is not used, it only specifies the amount of default fonts
//! available. //! available.
EGDF_COUNT EGDF_COUNT
}; };
const c8 *const GUISkinFontNames[EGDF_COUNT + 1] = { const c8* const GUISkinFontNames[EGDF_COUNT+1] =
{
"defaultFont", "defaultFont",
"buttonFont", "buttonFont",
"windowFont", "windowFont",
"menuFont", "menuFont",
"tooltipFont", "tooltipFont",
0, 0
}; };
//! A skin modifies the look of the GUI elements. //! A skin modifies the look of the GUI elements.
class IGUISkin : virtual public IReferenceCounted class IGUISkin : virtual public IReferenceCounted
{ {
public: public:
//! returns default color //! returns default color
virtual video::SColor getColor(EGUI_DEFAULT_COLOR color) const = 0; virtual video::SColor getColor(EGUI_DEFAULT_COLOR color) const = 0;
@ -386,27 +397,27 @@ public:
//! Returns a default text. //! Returns a default text.
/** For example for Message box button captions: /** For example for Message box button captions:
"OK", "Cancel", "Yes", "No" and so on. */ "OK", "Cancel", "Yes", "No" and so on. */
virtual const wchar_t *getDefaultText(EGUI_DEFAULT_TEXT text) const = 0; virtual const wchar_t* getDefaultText(EGUI_DEFAULT_TEXT text) const = 0;
//! Sets a default text. //! Sets a default text.
/** For example for Message box button captions: /** For example for Message box button captions:
"OK", "Cancel", "Yes", "No" and so on. */ "OK", "Cancel", "Yes", "No" and so on. */
virtual void setDefaultText(EGUI_DEFAULT_TEXT which, const wchar_t *newText) = 0; virtual void setDefaultText(EGUI_DEFAULT_TEXT which, const wchar_t* newText) = 0;
//! sets a default size //! sets a default size
virtual void setSize(EGUI_DEFAULT_SIZE which, s32 size) = 0; virtual void setSize(EGUI_DEFAULT_SIZE which, s32 size) = 0;
//! returns the default font //! returns the default font
virtual IGUIFont *getFont(EGUI_DEFAULT_FONT which = EGDF_DEFAULT) const = 0; virtual IGUIFont* getFont(EGUI_DEFAULT_FONT which=EGDF_DEFAULT) const = 0;
//! sets a default font //! sets a default font
virtual void setFont(IGUIFont *font, EGUI_DEFAULT_FONT which = EGDF_DEFAULT) = 0; virtual void setFont(IGUIFont* font, EGUI_DEFAULT_FONT which=EGDF_DEFAULT) = 0;
//! returns the sprite bank //! returns the sprite bank
virtual IGUISpriteBank *getSpriteBank() const = 0; virtual IGUISpriteBank* getSpriteBank() const = 0;
//! sets the sprite bank //! sets the sprite bank
virtual void setSpriteBank(IGUISpriteBank *bank) = 0; virtual void setSpriteBank(IGUISpriteBank* bank) = 0;
//! Returns a default icon //! Returns a default icon
/** Returns the sprite index within the sprite bank */ /** Returns the sprite index within the sprite bank */
@ -428,9 +439,9 @@ public:
implementations to find out how to draw the part exactly. implementations to find out how to draw the part exactly.
\param rect: Defining area where to draw. \param rect: Defining area where to draw.
\param clip: Clip area. */ \param clip: Clip area. */
virtual void draw3DButtonPaneStandard(IGUIElement *element, virtual void draw3DButtonPaneStandard(IGUIElement* element,
const core::rect<s32> &rect, const core::rect<s32>& rect,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip=0) = 0;
//! draws a pressed 3d button pane //! draws a pressed 3d button pane
/** Used for drawing for example buttons in pressed state. /** Used for drawing for example buttons in pressed state.
@ -441,9 +452,9 @@ public:
implementations to find out how to draw the part exactly. implementations to find out how to draw the part exactly.
\param rect: Defining area where to draw. \param rect: Defining area where to draw.
\param clip: Clip area. */ \param clip: Clip area. */
virtual void draw3DButtonPanePressed(IGUIElement *element, virtual void draw3DButtonPanePressed(IGUIElement* element,
const core::rect<s32> &rect, const core::rect<s32>& rect,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip=0) = 0;
//! draws a sunken 3d pane //! draws a sunken 3d pane
/** Used for drawing the background of edit, combo or check boxes. /** Used for drawing the background of edit, combo or check boxes.
@ -457,10 +468,10 @@ public:
color or not be drawn at all. color or not be drawn at all.
\param rect: Defining area where to draw. \param rect: Defining area where to draw.
\param clip: Clip area. */ \param clip: Clip area. */
virtual void draw3DSunkenPane(IGUIElement *element, virtual void draw3DSunkenPane(IGUIElement* element,
video::SColor bgcolor, bool flat, bool fillBackGround, video::SColor bgcolor, bool flat, bool fillBackGround,
const core::rect<s32> &rect, const core::rect<s32>& rect,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip=0) = 0;
//! draws a window background //! draws a window background
/** Used for drawing the background of dialogs and windows. /** Used for drawing the background of dialogs and windows.
@ -476,11 +487,11 @@ public:
That is the area without borders and without titlebar. That is the area without borders and without titlebar.
\return Returns rect where it would be good to draw title bar text. This will \return Returns rect where it would be good to draw title bar text. This will
work even when checkClientArea is set to a non-null value.*/ work even when checkClientArea is set to a non-null value.*/
virtual core::rect<s32> draw3DWindowBackground(IGUIElement *element, virtual core::rect<s32> draw3DWindowBackground(IGUIElement* element,
bool drawTitleBar, video::SColor titleBarColor, bool drawTitleBar, video::SColor titleBarColor,
const core::rect<s32> &rect, const core::rect<s32>& rect,
const core::rect<s32> *clip = 0, const core::rect<s32>* clip=0,
core::rect<s32> *checkClientArea = 0) = 0; core::rect<s32>* checkClientArea=0) = 0;
//! draws a standard 3d menu pane //! draws a standard 3d menu pane
/** Used for drawing for menus and context menus. /** Used for drawing for menus and context menus.
@ -491,9 +502,9 @@ public:
implementations to find out how to draw the part exactly. implementations to find out how to draw the part exactly.
\param rect: Defining area where to draw. \param rect: Defining area where to draw.
\param clip: Clip area. */ \param clip: Clip area. */
virtual void draw3DMenuPane(IGUIElement *element, virtual void draw3DMenuPane(IGUIElement* element,
const core::rect<s32> &rect, const core::rect<s32>& rect,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip=0) = 0;
//! draws a standard 3d tool bar //! draws a standard 3d tool bar
/** Used for drawing for toolbars and menus. /** Used for drawing for toolbars and menus.
@ -502,9 +513,9 @@ public:
implementations to find out how to draw the part exactly. implementations to find out how to draw the part exactly.
\param rect: Defining area where to draw. \param rect: Defining area where to draw.
\param clip: Clip area. */ \param clip: Clip area. */
virtual void draw3DToolBar(IGUIElement *element, virtual void draw3DToolBar(IGUIElement* element,
const core::rect<s32> &rect, const core::rect<s32>& rect,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip=0) = 0;
//! draws a tab button //! draws a tab button
/** Used for drawing for tab buttons on top of tabs. /** Used for drawing for tab buttons on top of tabs.
@ -515,8 +526,8 @@ public:
\param rect: Defining area where to draw. \param rect: Defining area where to draw.
\param clip: Clip area. \param clip: Clip area.
\param alignment Alignment of GUI element. */ \param alignment Alignment of GUI element. */
virtual void draw3DTabButton(IGUIElement *element, bool active, virtual void draw3DTabButton(IGUIElement* element, bool active,
const core::rect<s32> &rect, const core::rect<s32> *clip = 0, gui::EGUI_ALIGNMENT alignment = EGUIA_UPPERLEFT) = 0; const core::rect<s32>& rect, const core::rect<s32>* clip=0, gui::EGUI_ALIGNMENT alignment=EGUIA_UPPERLEFT) = 0;
//! draws a tab control body //! draws a tab control body
/** \param element: Pointer to the element which wishes to draw this. This parameter /** \param element: Pointer to the element which wishes to draw this. This parameter
@ -528,8 +539,8 @@ public:
\param clip: Clip area. \param clip: Clip area.
\param tabHeight Height of tab. \param tabHeight Height of tab.
\param alignment Alignment of GUI element. */ \param alignment Alignment of GUI element. */
virtual void draw3DTabBody(IGUIElement *element, bool border, bool background, virtual void draw3DTabBody(IGUIElement* element, bool border, bool background,
const core::rect<s32> &rect, const core::rect<s32> *clip = 0, s32 tabHeight = -1, gui::EGUI_ALIGNMENT alignment = EGUIA_UPPERLEFT) = 0; const core::rect<s32>& rect, const core::rect<s32>* clip=0, s32 tabHeight=-1, gui::EGUI_ALIGNMENT alignment=EGUIA_UPPERLEFT ) = 0;
//! draws an icon, usually from the skin's sprite bank //! draws an icon, usually from the skin's sprite bank
/** \param element: Pointer to the element which wishes to draw this icon. /** \param element: Pointer to the element which wishes to draw this icon.
@ -541,9 +552,9 @@ public:
\param currenttime: The present time, used to calculate the frame number \param currenttime: The present time, used to calculate the frame number
\param loop: Whether the animation should loop or not \param loop: Whether the animation should loop or not
\param clip: Clip area. */ \param clip: Clip area. */
virtual void drawIcon(IGUIElement *element, EGUI_DEFAULT_ICON icon, virtual void drawIcon(IGUIElement* element, EGUI_DEFAULT_ICON icon,
const core::position2di position, u32 starttime = 0, u32 currenttime = 0, const core::position2di position, u32 starttime=0, u32 currenttime=0,
bool loop = false, const core::rect<s32> *clip = 0) = 0; bool loop=false, const core::rect<s32>* clip=0) = 0;
//! draws a 2d rectangle. //! draws a 2d rectangle.
/** \param element: Pointer to the element which wishes to draw this icon. /** \param element: Pointer to the element which wishes to draw this icon.
@ -554,12 +565,16 @@ public:
\param pos: Position of the rectangle. \param pos: Position of the rectangle.
\param clip: Pointer to rectangle against which the rectangle will be clipped. \param clip: Pointer to rectangle against which the rectangle will be clipped.
If the pointer is null, no clipping will be performed. */ If the pointer is null, no clipping will be performed. */
virtual void draw2DRectangle(IGUIElement *element, const video::SColor &color, virtual void draw2DRectangle(IGUIElement* element, const video::SColor &color,
const core::rect<s32> &pos, const core::rect<s32> *clip = 0) = 0; const core::rect<s32>& pos, const core::rect<s32>* clip = 0) = 0;
//! get the type of this skin //! get the type of this skin
virtual EGUI_SKIN_TYPE getType() const { return EGST_UNKNOWN; } virtual EGUI_SKIN_TYPE getType() const { return EGST_UNKNOWN; }
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "irrArray.h" #include "irrArray.h"
@ -14,7 +15,7 @@ namespace irr
namespace video namespace video
{ {
class ITexture; class ITexture;
} // end namespace video } // end namespace video
namespace gui namespace gui
@ -24,13 +25,12 @@ namespace gui
// Note for implementer: Can't fix variable names to uppercase as this is a public interface used since a while // Note for implementer: Can't fix variable names to uppercase as this is a public interface used since a while
struct SGUISpriteFrame struct SGUISpriteFrame
{ {
SGUISpriteFrame() : SGUISpriteFrame() : textureNumber(0), rectNumber(0)
textureNumber(0), rectNumber(0)
{ {
} }
SGUISpriteFrame(u32 textureIndex, u32 positionIndex) : SGUISpriteFrame(u32 textureIndex, u32 positionIndex)
textureNumber(textureIndex), rectNumber(positionIndex) : textureNumber(textureIndex), rectNumber(positionIndex)
{ {
} }
@ -45,10 +45,8 @@ struct SGUISpriteFrame
// Note for implementer: Can't fix variable names to uppercase as this is a public interface used since a while // 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);
} }
@ -57,35 +55,37 @@ struct SGUISprite
u32 frameTime; 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;
@ -103,11 +103,11 @@ public:
\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
/** /**
@ -120,19 +120,23 @@ public:
(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 gui
} // end namespace irr } // end namespace irr
#endif // __I_GUI_SPRITE_BANK_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// 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 "IGUIElement.h"
#include "SColor.h" #include "SColor.h"
@ -11,29 +12,30 @@ namespace irr
{ {
namespace gui namespace gui
{ {
class IGUIFont; class IGUIFont;
//! Multi or single line text label.
class IGUIStaticText : public IGUIElement
{
public:
//! Multi or single line text label.
class IGUIStaticText : public IGUIElement
{
public:
//! constructor //! constructor
IGUIStaticText(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIStaticText(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_STATIC_TEXT, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_STATIC_TEXT, environment, parent, id, rectangle) {}
//! Sets another skin independent font. //! Sets another skin independent font.
/** If this is set to zero, the button uses the font of the skin. /** If this is set to zero, the button uses the font of the skin.
\param font: New font to set. */ \param font: New font to set. */
virtual void setOverrideFont(IGUIFont *font = 0) = 0; virtual void setOverrideFont(IGUIFont* font=0) = 0;
//! Gets the override font (if any) //! Gets the override font (if any)
/** \return The override font (may be 0) */ /** \return The override font (may be 0) */
virtual IGUIFont *getOverrideFont(void) const = 0; virtual IGUIFont* getOverrideFont(void) const = 0;
//! Get the font which is used right now for drawing //! Get the font which is used right now for drawing
/** Currently this is the override font when one is set and the /** Currently this is the override font when one is set and the
font of the active skin otherwise */ font of the active skin otherwise */
virtual IGUIFont *getActiveFont() const = 0; virtual IGUIFont* getActiveFont() const = 0;
//! Sets another color for the text. //! Sets another color for the text.
/** If set, the static text does not use the EGDC_BUTTON_TEXT color defined /** If set, the static text does not use the EGDC_BUTTON_TEXT color defined
@ -127,7 +129,11 @@ public:
//! Checks whether the text in this element should be interpreted as right-to-left //! Checks whether the text in this element should be interpreted as right-to-left
virtual bool isRightToLeft() const = 0; virtual bool isRightToLeft() const = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IGUIElement.h"
#include "SColor.h" #include "SColor.h"
@ -12,30 +13,31 @@ 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:
\li EGET_TAB_CHANGED
*/
class IGUITabControl : public IGUIElement
{
public:
//! A standard tab control
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_TAB_CHANGED
*/
class IGUITabControl : public IGUIElement
{
public:
//! constructor //! constructor
IGUITabControl(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUITabControl(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_TAB_CONTROL, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_TAB_CONTROL, environment, parent, id, rectangle) {}
//! Adds a tab //! Adds a tab
virtual IGUITab *addTab(const wchar_t *caption, s32 id = -1) = 0; virtual IGUITab* addTab(const wchar_t* caption, s32 id=-1) = 0;
//! Adds an existing tab //! Adds an existing tab
/** Note that it will also add the tab as a child of this TabControl. /** Note that it will also add the tab as a child of this TabControl.
\return Index of added tab or -1 for failure*/ \return Index of added tab or -1 for failure*/
virtual s32 addTab(IGUITab *tab) = 0; virtual s32 addTab(IGUITab* tab) = 0;
//! Insert the tab at the given index //! Insert the tab at the given index
/** \return The tab on success or NULL on failure. */ /** \return The tab on success or NULL on failure. */
virtual IGUITab *insertTab(s32 idx, const wchar_t *caption, s32 id = -1) = 0; virtual IGUITab* insertTab(s32 idx, const wchar_t* caption, s32 id=-1) = 0;
//! Insert an existing tab //! Insert an existing tab
/** Note that it will also add the tab as a child of this TabControl. /** Note that it will also add the tab as a child of this TabControl.
@ -47,7 +49,7 @@ public:
When true it reserves space for the index, doesn't move but replaces tabs When true it reserves space for the index, doesn't move but replaces tabs
and it doesn't change the active tab. and it doesn't change the active tab.
\return Index of added tab (should be same as the one passed) or -1 for failure*/ \return Index of added tab (should be same as the one passed) or -1 for failure*/
virtual s32 insertTab(s32 idx, IGUITab *tab, bool serializationMode = false) = 0; virtual s32 insertTab(s32 idx, IGUITab* tab, bool serializationMode=false) = 0;
//! Removes a tab from the tabcontrol //! Removes a tab from the tabcontrol
virtual void removeTab(s32 idx) = 0; virtual void removeTab(s32 idx) = 0;
@ -62,7 +64,7 @@ public:
/** \param idx: zero based index of tab. Is a value between 0 and getTabcount()-1; /** \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 \return Returns pointer to the Tab. Returns 0 if no tab
is corresponding to this tab. */ is corresponding to this tab. */
virtual IGUITab *getTab(s32 idx) const = 0; virtual IGUITab* getTab(s32 idx) const = 0;
//! For given element find if it's a tab and return it's zero-based index (or -1 for not found) //! For given element find if it's a tab and return it's zero-based index (or -1 for not found)
/** \param tab Tab for which we are looking (usually you will look for an IGUITab* type as only /** \param tab Tab for which we are looking (usually you will look for an IGUITab* type as only
@ -89,45 +91,46 @@ public:
virtual s32 getTabAt(s32 xpos, s32 ypos) const = 0; virtual s32 getTabAt(s32 xpos, s32 ypos) const = 0;
//! Set the height of the tabs //! Set the height of the tabs
virtual void setTabHeight(s32 height) = 0; virtual void setTabHeight( s32 height ) = 0;
//! Get the height of the tabs //! Get the height of the tabs
/** return Returns the height of the tabs */ /** return Returns the height of the tabs */
virtual s32 getTabHeight() const = 0; virtual s32 getTabHeight() const = 0;
//! set the maximal width of a tab. Per default width is 0 which means "no width restriction". //! set the maximal width of a tab. Per default width is 0 which means "no width restriction".
virtual void setTabMaxWidth(s32 width) = 0; virtual void setTabMaxWidth(s32 width ) = 0;
//! get the maximal width of a tab //! get the maximal width of a tab
virtual s32 getTabMaxWidth() const = 0; virtual s32 getTabMaxWidth() const = 0;
//! Set the alignment of the tabs //! Set the alignment of the tabs
/** Use EGUIA_UPPERLEFT or EGUIA_LOWERRIGHT */ /** Use EGUIA_UPPERLEFT or EGUIA_LOWERRIGHT */
virtual void setTabVerticalAlignment(gui::EGUI_ALIGNMENT alignment) = 0; virtual void setTabVerticalAlignment( gui::EGUI_ALIGNMENT alignment ) = 0;
//! Get the alignment of the tabs //! Get the alignment of the tabs
/** return Returns the alignment of the tabs */ /** return Returns the alignment of the tabs */
virtual gui::EGUI_ALIGNMENT getTabVerticalAlignment() const = 0; virtual gui::EGUI_ALIGNMENT getTabVerticalAlignment() const = 0;
//! Set the extra width added to tabs on each side of the text //! Set the extra width added to tabs on each side of the text
virtual void setTabExtraWidth(s32 extraWidth) = 0; virtual void setTabExtraWidth( s32 extraWidth ) = 0;
//! Get 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
/** return Returns the extra width of the tabs */ /** return Returns the extra width of the tabs */
virtual s32 getTabExtraWidth() const = 0; 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
{
public:
//! 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
{
public:
//! constructor //! constructor
IGUITab(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUITab(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_TAB, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_TAB, environment, parent, id, rectangle) {}
//! sets if the tab should draw its background //! sets if the tab should draw its background
virtual void setDrawBackground(bool draw = true) = 0; virtual void setDrawBackground(bool draw=true) = 0;
//! sets the color of the background, if it should be drawn. //! sets the color of the background, if it should be drawn.
virtual void setBackgroundColor(video::SColor c) = 0; virtual void setBackgroundColor(video::SColor c) = 0;
@ -143,7 +146,10 @@ public:
//! gets the color of the text //! gets the color of the text
virtual video::SColor getTextColor() const = 0; virtual video::SColor getTextColor() const = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -10,25 +11,30 @@ namespace irr
{ {
namespace video namespace video
{ {
class ITexture; class ITexture;
} // end namespace video } // end namespace video
namespace gui 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
{
public:
//! Stays at the top of its parent like the menu bar and contains tool buttons
class IGUIToolBar : public IGUIElement
{
public:
//! constructor //! constructor
IGUIToolBar(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) : IGUIToolBar(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
IGUIElement(EGUIET_TOOL_BAR, environment, parent, id, rectangle) {} : IGUIElement(EGUIET_TOOL_BAR, environment, parent, id, rectangle) {}
//! Adds a button to the tool bar //! Adds a button to the tool bar
virtual IGUIButton *addButton(s32 id = -1, const wchar_t *text = 0, const wchar_t *tooltiptext = 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, video::ITexture* img=0, video::ITexture* pressedimg=0,
bool isPushButton = false, bool useAlphaChannel = false) = 0; bool isPushButton=false, bool useAlphaChannel=false) = 0;
}; };
} // end namespace gui } // end namespace gui
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,13 +2,14 @@
// 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 "IReferenceCounted.h"
#include "position2d.h" #include "position2d.h"
#include "rect.h" #include "rect.h"
#include "SColor.h" #include "SColor.h"
#include <cstring> #include <string.h>
namespace irr namespace irr
{ {
@ -23,9 +24,13 @@ NOTE: Floating point formats are not well supported yet. Basically only getData(
class IImage : public virtual IReferenceCounted class IImage : public virtual IReferenceCounted
{ {
public: public:
//! constructor //! constructor
IImage(ECOLOR_FORMAT format, const core::dimension2d<u32> &size, bool deleteMemory) : 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) Format(format), Size(size), Data(0), MipMapsData(0), BytesPerPixel(0), Pitch(0), DeleteMemory(deleteMemory), DeleteMipMapsMemory(false)
#if defined(IRRLICHT_sRGB)
,Format_sRGB(1)
#endif
{ {
BytesPerPixel = getBitsPerPixelFromFormat(Format) / 8; BytesPerPixel = getBitsPerPixelFromFormat(Format) / 8;
Pitch = BytesPerPixel * Size.Width; Pitch = BytesPerPixel * Size.Width;
@ -47,8 +52,20 @@ public:
return Format; return Format;
} }
#if defined(IRRLICHT_sRGB)
//! Texture is linear/sRGB (should be part of ColorFormat: default yes)
int get_sRGB() const
{
return Format_sRGB;
}
void set_sRGB(int val)
{
Format_sRGB = val;
}
#endif
//! Returns width and height of image data. //! Returns width and height of image data.
const core::dimension2d<u32> &getDimension() const const core::dimension2d<u32>& getDimension() const
{ {
return Size; return Size;
} }
@ -87,7 +104,8 @@ public:
//! Returns mask for red value of a pixel //! Returns mask for red value of a pixel
u32 getRedMask() const u32 getRedMask() const
{ {
switch (Format) { switch (Format)
{
case ECF_A1R5G5B5: case ECF_A1R5G5B5:
return 0x1F << 10; return 0x1F << 10;
case ECF_R5G6B5: case ECF_R5G6B5:
@ -104,7 +122,8 @@ public:
//! Returns mask for green value of a pixel //! Returns mask for green value of a pixel
u32 getGreenMask() const u32 getGreenMask() const
{ {
switch (Format) { switch (Format)
{
case ECF_A1R5G5B5: case ECF_A1R5G5B5:
return 0x1F << 5; return 0x1F << 5;
case ECF_R5G6B5: case ECF_R5G6B5:
@ -121,7 +140,8 @@ public:
//! Returns mask for blue value of a pixel //! Returns mask for blue value of a pixel
u32 getBlueMask() const u32 getBlueMask() const
{ {
switch (Format) { switch (Format)
{
case ECF_A1R5G5B5: case ECF_A1R5G5B5:
return 0x1F; return 0x1F;
case ECF_R5G6B5: case ECF_R5G6B5:
@ -138,7 +158,8 @@ public:
//! Returns mask for alpha value of a pixel //! Returns mask for alpha value of a pixel
u32 getAlphaMask() const u32 getAlphaMask() const
{ {
switch (Format) { switch (Format)
{
case ECF_A1R5G5B5: case ECF_A1R5G5B5:
return 0x1 << 15; return 0x1 << 15;
case ECF_R5G6B5: case ECF_R5G6B5:
@ -157,7 +178,7 @@ public:
\return Pointer to the image data. What type of data is pointed to \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 depends on the color format of the image. For example if the color
format is ECF_A8R8G8B8, it is of u32. */ format is ECF_A8R8G8B8, it is of u32. */
void *getData() const void* getData() const
{ {
return Data; return Data;
} }
@ -170,38 +191,43 @@ public:
return getMipMapsSize(Size, mipmapLevel); return getMipMapsSize(Size, mipmapLevel);
} }
//! Calculate mipmap size for a certain level //! Calculate mipmap size for a certain level
/** level 0 will be full image size. Every further level is half the size. */ /** level 0 will be full image size. Every further level is half the size. */
static core::dimension2du getMipMapsSize(const core::dimension2du &sizeLevel0, u32 mipmapLevel) static core::dimension2du getMipMapsSize(const core::dimension2du& sizeLevel0, u32 mipmapLevel)
{ {
core::dimension2du result(sizeLevel0); core::dimension2du result(sizeLevel0);
u32 i = 0; u32 i=0;
while (i != mipmapLevel) { while (i != mipmapLevel)
if (result.Width > 1) {
if (result.Width>1)
result.Width >>= 1; result.Width >>= 1;
if (result.Height > 1) if (result.Height>1)
result.Height >>= 1; result.Height>>=1;
++i; ++i;
if (result.Width == 1 && result.Height == 1 && i < mipmapLevel) if ( result.Width == 1 && result.Height == 1 && i < mipmapLevel )
return core::dimension2du(0, 0); return core::dimension2du(0,0);
} }
return result; return result;
} }
//! Get mipmaps data. //! Get mipmaps data.
/** Note that different mip levels are just behind each other in memory block. /** 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. 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. There is no level 0 - use getData to get the original image data.
*/ */
void *getMipMapsData(irr::u32 mipLevel = 1) const void* getMipMapsData(irr::u32 mipLevel=1) const
{
if ( MipMapsData && mipLevel > 0)
{ {
if (MipMapsData && mipLevel > 0) {
size_t dataSize = 0; size_t dataSize = 0;
core::dimension2du mipSize(Size); core::dimension2du mipSize(Size);
u32 i = 1; // We want the start of data for this level, not end. u32 i = 1; // We want the start of data for this level, not end.
while (i != mipLevel) { while (i != mipLevel)
{
if (mipSize.Width > 1) if (mipSize.Width > 1)
mipSize.Width >>= 1; mipSize.Width >>= 1;
@ -211,7 +237,7 @@ public:
dataSize += getDataSizeFromFormat(Format, mipSize.Width, mipSize.Height); dataSize += getDataSizeFromFormat(Format, mipSize.Width, mipSize.Height);
++i; ++i;
if (mipSize.Width == 1 && mipSize.Height == 1 && i < mipLevel) if ( mipSize.Width == 1 && mipSize.Height == 1 && i < mipLevel)
return 0; return 0;
} }
@ -230,26 +256,33 @@ public:
will by copied internally. will by copied internally.
\param deleteMemory Whether the memory is deallocated upon \param deleteMemory Whether the memory is deallocated upon
destruction. */ destruction. */
void setMipMapsData(void *data, bool ownForeignMemory) void setMipMapsData(void* data, bool ownForeignMemory)
{
if (data != MipMapsData)
{
if (DeleteMipMapsMemory)
{ {
if (data != MipMapsData) {
if (DeleteMipMapsMemory) {
delete[] MipMapsData; delete[] MipMapsData;
DeleteMipMapsMemory = false; DeleteMipMapsMemory = false;
} }
if (data) { if (data)
if (ownForeignMemory) { {
MipMapsData = static_cast<u8 *>(data); if (ownForeignMemory)
{
MipMapsData = static_cast<u8*>(data);
DeleteMipMapsMemory = false; DeleteMipMapsMemory = false;
} else { }
else
{
u32 dataSize = 0; u32 dataSize = 0;
u32 width = Size.Width; u32 width = Size.Width;
u32 height = Size.Height; u32 height = Size.Height;
do { do
{
if (width > 1) if (width > 1)
width >>= 1; width >>= 1;
@ -264,7 +297,9 @@ public:
DeleteMipMapsMemory = true; DeleteMipMapsMemory = true;
} }
} else { }
else
{
MipMapsData = 0; MipMapsData = 0;
} }
} }
@ -274,50 +309,51 @@ public:
virtual SColor getPixel(u32 x, u32 y) const = 0; virtual SColor getPixel(u32 x, u32 y) const = 0;
//! Sets a pixel //! Sets a pixel
virtual void setPixel(u32 x, u32 y, const SColor &color, bool blend = false) = 0; virtual void setPixel(u32 x, u32 y, const SColor &color, bool blend = false ) = 0;
//! Copies this surface into another, if it has the exact same size and format. //! Copies this surface into another, if it has the exact same size and format.
/** NOTE: mipmaps are ignored /** NOTE: mipmaps are ignored
\return True if it was copied, false otherwise. \return True if it was copied, false otherwise.
*/ */
virtual bool copyToNoScaling(void *target, u32 width, u32 height, ECOLOR_FORMAT format = ECF_A8R8G8B8, u32 pitch = 0) const = 0; virtual bool copyToNoScaling(void *target, u32 width, u32 height, ECOLOR_FORMAT format=ECF_A8R8G8B8, u32 pitch=0) const = 0;
//! Copies the image into the target, scaling the image to fit //! Copies the image into the target, scaling the image to fit
/** NOTE: mipmaps are ignored */ /** NOTE: mipmaps are ignored */
virtual void copyToScaling(void *target, u32 width, u32 height, ECOLOR_FORMAT format = ECF_A8R8G8B8, u32 pitch = 0) = 0; virtual void copyToScaling(void* target, u32 width, u32 height, ECOLOR_FORMAT format=ECF_A8R8G8B8, u32 pitch=0) =0;
//! Copies the image into the target, scaling the image to fit //! Copies the image into the target, scaling the image to fit
/** NOTE: mipmaps are ignored */ /** NOTE: mipmaps are ignored */
virtual void copyToScaling(IImage *target) = 0; virtual void copyToScaling(IImage* target) =0;
//! copies this surface into another //! copies this surface into another
/** NOTE: mipmaps are ignored */ /** NOTE: mipmaps are ignored */
virtual void copyTo(IImage *target, const core::position2d<s32> &pos = core::position2d<s32>(0, 0)) = 0; virtual void copyTo(IImage* target, const core::position2d<s32>& pos=core::position2d<s32>(0,0)) =0;
//! copies this surface into another //! copies this surface into another
/** NOTE: mipmaps are ignored */ /** NOTE: mipmaps are ignored */
virtual void copyTo(IImage *target, const core::position2d<s32> &pos, const core::rect<s32> &sourceRect, const core::rect<s32> *clipRect = 0) = 0; 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 //! copies this surface into another, using the alpha mask and cliprect and a color to add with
/** NOTE: mipmaps are ignored /** NOTE: mipmaps are ignored
\param combineAlpha - When true then combine alpha channels. When false replace target image alpha with source image alpha. \param combineAlpha - When true then combine alpha channels. When false replace target image alpha with source image alpha.
*/ */
virtual void copyToWithAlpha(IImage *target, const core::position2d<s32> &pos, virtual void copyToWithAlpha(IImage* target, const core::position2d<s32>& pos,
const core::rect<s32> &sourceRect, const SColor &color, const core::rect<s32>& sourceRect, const SColor &color,
const core::rect<s32> *clipRect = 0, const core::rect<s32>* clipRect = 0,
bool combineAlpha = false) = 0; bool combineAlpha=false) =0;
//! copies this surface into another, scaling it to fit, applying a box filter //! copies this surface into another, scaling it to fit, applying a box filter
/** NOTE: mipmaps are ignored */ /** NOTE: mipmaps are ignored */
virtual void copyToScalingBoxFilter(IImage *target, s32 bias = 0, bool blend = false) = 0; virtual void copyToScalingBoxFilter(IImage* target, s32 bias = 0, bool blend = false) = 0;
//! fills the surface with given color //! fills the surface with given color
virtual void fill(const SColor &color) = 0; virtual void fill(const SColor &color) =0;
//! get the amount of Bits per Pixel of the given color format //! get the amount of Bits per Pixel of the given color format
static u32 getBitsPerPixelFromFormat(const ECOLOR_FORMAT format) static u32 getBitsPerPixelFromFormat(const ECOLOR_FORMAT format)
{ {
switch (format) { switch(format)
{
case ECF_A1R5G5B5: case ECF_A1R5G5B5:
return 16; return 16;
case ECF_R5G6B5: case ECF_R5G6B5:
@ -376,7 +412,8 @@ public:
//! check if the color format is only viable for depth/stencil textures //! check if the color format is only viable for depth/stencil textures
static bool isDepthFormat(const ECOLOR_FORMAT format) static bool isDepthFormat(const ECOLOR_FORMAT format)
{ {
switch (format) { switch(format)
{
case ECF_D16: case ECF_D16:
case ECF_D32: case ECF_D32:
case ECF_D24S8: case ECF_D24S8:
@ -392,7 +429,8 @@ public:
if (isCompressedFormat(format)) if (isCompressedFormat(format))
return false; return false;
switch (format) { switch(format)
{
case ECF_R16F: case ECF_R16F:
case ECF_G16R16F: case ECF_G16R16F:
case ECF_A16B16G16R16F: case ECF_A16B16G16R16F:
@ -410,15 +448,23 @@ protected:
ECOLOR_FORMAT Format; ECOLOR_FORMAT Format;
core::dimension2d<u32> Size; core::dimension2d<u32> Size;
u8 *Data; u8* Data;
u8 *MipMapsData; u8* MipMapsData;
u32 BytesPerPixel; u32 BytesPerPixel;
u32 Pitch; u32 Pitch;
bool DeleteMemory; bool DeleteMemory;
bool DeleteMipMapsMemory; bool DeleteMipMapsMemory;
#if defined(IRRLICHT_sRGB)
int Format_sRGB;
#endif
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "IImage.h" #include "IImage.h"
@ -14,7 +15,7 @@ namespace irr
{ {
namespace io namespace io
{ {
class IReadFile; class IReadFile;
} // end namespace io } // end namespace io
namespace video namespace video
{ {
@ -27,23 +28,28 @@ IVideoDriver::addExternalImageLoader() to the engine. */
class IImageLoader : public virtual IReferenceCounted class IImageLoader : public virtual IReferenceCounted
{ {
public: public:
//! Check if the file might be loaded by this class //! Check if the file might be loaded by this class
/** Check is based on the file extension (e.g. ".tga") /** Check is based on the file extension (e.g. ".tga")
\param filename Name of file to check. \param filename Name of file to check.
\return True if file seems to be loadable. */ \return True if file seems to be loadable. */
virtual bool isALoadableFileExtension(const io::path &filename) const = 0; virtual bool isALoadableFileExtension(const io::path& filename) const = 0;
//! Check if the file might be loaded by this class //! Check if the file might be loaded by this class
/** Check might look into the file. /** Check might look into the file.
\param file File handle to check. \param file File handle to check.
\return True if file seems to be loadable. */ \return True if file seems to be loadable. */
virtual bool isALoadableFileFormat(io::IReadFile *file) const = 0; virtual bool isALoadableFileFormat(io::IReadFile* file) const = 0;
//! Creates a surface from the file //! Creates a surface from the file
/** \param file File handle to check. /** \param file File handle to check.
\return Pointer to newly created image, or 0 upon error. */ \return Pointer to newly created image, or 0 upon error. */
virtual IImage *loadImage(io::IReadFile *file) const = 0; virtual IImage* loadImage(io::IReadFile* file) const = 0;
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "irrString.h" #include "irrString.h"
@ -12,12 +13,13 @@ namespace irr
{ {
namespace io namespace io
{ {
class IWriteFile; class IWriteFile;
} // end namespace io } // end namespace io
namespace video namespace video
{ {
class IImage; class IImage;
//! Interface for writing software image data. //! Interface for writing software image data.
class IImageWriter : public IReferenceCounted class IImageWriter : public IReferenceCounted
@ -26,7 +28,7 @@ public:
//! Check if this writer can write a file with the given extension //! Check if this writer can write a file with the given extension
/** \param filename Name of the file to check. /** \param filename Name of the file to check.
\return True if file extension specifies a writable type. */ \return True if file extension specifies a writable type. */
virtual bool isAWriteableFileExtension(const io::path &filename) const = 0; virtual bool isAWriteableFileExtension(const io::path& filename) const = 0;
//! Write image to file //! Write image to file
/** \param file File handle to write to. /** \param file File handle to write to.
@ -38,3 +40,6 @@ public:
} // namespace video } // namespace video
} // namespace irr } // namespace irr
#endif // _I_IMAGE_WRITER_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "irrArray.h" #include "irrArray.h"
@ -20,32 +21,33 @@ namespace video
namespace scene namespace scene
{ {
class IIndexBuffer : public virtual IReferenceCounted class IIndexBuffer : public virtual IReferenceCounted
{ {
public: public:
virtual void *getData() = 0;
virtual video::E_INDEX_TYPE getType() const = 0; virtual void* getData() =0;
virtual void setType(video::E_INDEX_TYPE IndexType) = 0;
virtual u32 stride() const = 0; virtual video::E_INDEX_TYPE getType() 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 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 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;
//! get the current hardware mapping hint //! get the current hardware mapping hint
virtual E_HARDWARE_MAPPING getHardwareMappingHint() const = 0; virtual E_HARDWARE_MAPPING getHardwareMappingHint() const =0;
//! set the hardware mapping hint, for driver //! set the hardware mapping hint, for driver
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING NewMappingHint) = 0; virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) =0;
//! flags the meshbuffer as changed, reloads hardware buffers //! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty() = 0; virtual void setDirty() = 0;
@ -53,7 +55,11 @@ public:
//! Get the currently used ID for identification of changes. //! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ /** This shouldn't be used for anything outside the VideoDriver. */
virtual u32 getChangedID() const = 0; virtual u32 getChangedID() const = 0;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -32,10 +33,12 @@ enum ELOG_LEVEL
ELL_NONE ELL_NONE
}; };
//! Interface for logging messages, warnings and errors //! Interface for logging messages, warnings and errors
class ILogger : public virtual IReferenceCounted class ILogger : public virtual IReferenceCounted
{ {
public: public:
//! Destructor //! Destructor
virtual ~ILogger() {} virtual ~ILogger() {}
@ -58,7 +61,7 @@ public:
is just an informational text, set it to ELL_INFORMATION. Texts are is just an informational text, set it to ELL_INFORMATION. Texts are
filtered with these levels. If you want to be a text displayed, filtered with these levels. If you want to be a text displayed,
independent on what level filter is set, use ELL_NONE. */ independent on what level filter is set, use ELL_NONE. */
virtual void log(const c8 *text, ELOG_LEVEL ll = ELL_INFORMATION) = 0; virtual void log(const c8* text, ELOG_LEVEL ll=ELL_INFORMATION) = 0;
//! Prints out a text into the log //! Prints out a text into the log
/** \param text: Text to print out. /** \param text: Text to print out.
@ -69,7 +72,31 @@ public:
is just an informational text, set it to ELL_INFORMATION. Texts are is just an informational text, set it to ELL_INFORMATION. Texts are
filtered with these levels. If you want to be a text displayed, filtered with these levels. If you want to be a text displayed,
independent on what level filter is set, use ELL_NONE. */ independent on what level filter is set, use ELL_NONE. */
virtual void log(const c8 *text, const c8 *hint, ELOG_LEVEL ll = ELL_INFORMATION) = 0; virtual void log(const c8* text, const 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 } // end namespace
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "SMaterial.h" #include "SMaterial.h"
@ -24,6 +25,7 @@ engine with new materials. */
class IMaterialRenderer : public virtual IReferenceCounted class IMaterialRenderer : public virtual IReferenceCounted
{ {
public: public:
//! Called by the IVideoDriver implementation the let the renderer set its needed render states. //! Called by the IVideoDriver implementation the let the renderer set its needed render states.
/** This is called during the IVideoDriver::setMaterial() call. /** This is called during the IVideoDriver::setMaterial() call.
When overriding this, you can set some renderstates or for example a When overriding this, you can set some renderstates or for example a
@ -46,8 +48,8 @@ public:
fogenable. fogenable.
\param services: Interface providing some methods for changing \param services: Interface providing some methods for changing
advanced, internal states of a IVideoDriver. */ advanced, internal states of a IVideoDriver. */
virtual void OnSetMaterial(const SMaterial &material, const SMaterial &lastMaterial, virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
bool resetAllRenderstates, IMaterialRendererServices *services) {} bool resetAllRenderstates, IMaterialRendererServices* services) {}
//! Called every time before a new bunch of geometry is being drawn using this material with for example drawIndexedTriangleList() call. //! Called every time before a new bunch of geometry is being drawn using this material with for example drawIndexedTriangleList() call.
/** OnSetMaterial should normally only be called if the renderer decides /** OnSetMaterial should normally only be called if the renderer decides
@ -67,7 +69,7 @@ public:
example if he doesn't support the specified vertex type. This is example if he doesn't support the specified vertex type. This is
actually done in D3D9 when using a normal mapped material with actually done in D3D9 when using a normal mapped material with
a vertex type other than EVT_TANGENTS. */ a vertex type other than EVT_TANGENTS. */
virtual bool OnRender(IMaterialRendererServices *service, E_VERTEX_TYPE vtxtype) { return true; } virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) { return true; }
//! Called by the IVideoDriver to unset this material. //! Called by the IVideoDriver to unset this material.
/** Called during the IVideoDriver::setMaterial() call before the new /** Called during the IVideoDriver::setMaterial() call before the new
@ -94,8 +96,12 @@ public:
//! Access the callback provided by the users when creating shader materials //! Access the callback provided by the users when creating shader materials
/** \returns Returns either the users provided callback or 0 when no such /** \returns Returns either the users provided callback or 0 when no such
callback exists. Non-shader materials will always return 0. */ callback exists. Non-shader materials will always return 0. */
virtual IShaderConstantSetCallBack *getShaderConstantSetCallBack() const { return 0; } virtual IShaderConstantSetCallBack* getShaderConstantSetCallBack() const { return 0; }
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "SMaterial.h"
#include "S3DVertex.h" #include "S3DVertex.h"
@ -14,10 +15,12 @@ namespace video
class IVideoDriver; class IVideoDriver;
//! Interface providing some methods for changing advanced, internal states of a IVideoDriver. //! Interface providing some methods for changing advanced, internal states of a IVideoDriver.
class IMaterialRendererServices class IMaterialRendererServices
{ {
public: public:
//! Destructor //! Destructor
virtual ~IMaterialRendererServices() {} virtual ~IMaterialRendererServices() {}
@ -31,12 +34,12 @@ public:
\param lastMaterial The material used until now. \param lastMaterial The material used until now.
\param resetAllRenderstates Set to true if all renderstates should be \param resetAllRenderstates Set to true if all renderstates should be
set, regardless of their current state. */ set, regardless of their current state. */
virtual void setBasicRenderStates(const SMaterial &material, virtual void setBasicRenderStates(const SMaterial& material,
const SMaterial &lastMaterial, const SMaterial& lastMaterial,
bool resetAllRenderstates) = 0; bool resetAllRenderstates) = 0;
//! Return an index constant for the vertex shader based on a uniform variable name. //! Return an index constant for the vertex shader based on a uniform variable name.
virtual s32 getVertexShaderConstantID(const c8 *name) = 0; virtual s32 getVertexShaderConstantID(const c8* name) = 0;
//! Sets a value for a vertex shader uniform variable. //! Sets a value for a vertex shader uniform variable.
/** \param index Index of the variable (as received from getVertexShaderConstantID) /** \param index Index of the variable (as received from getVertexShaderConstantID)
@ -44,16 +47,27 @@ public:
\param count Amount of floats in array. \param count Amount of floats in array.
\return True if successful. \return True if successful.
*/ */
virtual bool setVertexShaderConstant(s32 index, const f32 *floats, int count) = 0; virtual bool setVertexShaderConstant(s32 index, const f32* floats, int count) = 0;
//! Int interface for the above. //! Int interface for the above.
virtual bool setVertexShaderConstant(s32 index, const s32 *ints, int count) = 0; virtual bool setVertexShaderConstant(s32 index, const s32* ints, int count) = 0;
//! Uint interface for the above. //! Uint interface for the above.
virtual bool setVertexShaderConstant(s32 index, const u32 *ints, int count) = 0; /* NOTE: UINT only works with GLSL, not supported for other shaders.
Also GLES drivers in Irrlicht do not support it as this needs at least GLES 3.0.
*/
virtual bool setVertexShaderConstant(s32 index, const u32* ints, int count) = 0;
//! 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 for the given uniform variable name //! Return an index constant for the pixel shader for the given uniform variable name
virtual s32 getPixelShaderConstantID(const c8 *name) = 0; virtual s32 getPixelShaderConstantID(const c8* name) = 0;
//! Sets a value for the given pixel shader uniform variable //! Sets a value for the given pixel shader uniform variable
/** This can be used if you used a high level shader language like GLSL /** This can be used if you used a high level shader language like GLSL
@ -63,18 +77,32 @@ public:
\param floats Pointer to array of floats \param floats Pointer to array of floats
\param count Amount of floats in array. \param count Amount of floats in array.
\return True if successful. */ \return True if successful. */
virtual bool setPixelShaderConstant(s32 index, const f32 *floats, int count) = 0; virtual bool setPixelShaderConstant(s32 index, const f32* floats, int count) = 0;
//! Int interface for the above. //! Int interface for the above.
virtual bool setPixelShaderConstant(s32 index, const s32 *ints, int count) = 0; virtual bool setPixelShaderConstant(s32 index, const s32* ints, int count) = 0;
//! Uint interface for the above. //! Uint interface for the above.
virtual bool setPixelShaderConstant(s32 index, const u32 *ints, int count) = 0; /* 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 //! Get pointer to the IVideoDriver interface
/** \return Pointer to the IVideoDriver interface */ /** \return Pointer to the IVideoDriver interface */
virtual IVideoDriver *getVideoDriver() = 0; virtual IVideoDriver* getVideoDriver() = 0;
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -11,10 +12,10 @@ namespace irr
namespace io namespace io
{ {
//! Interface providing read access to a memory read file. //! Interface providing read access to a memory read file.
class IMemoryReadFile : public IReadFile class IMemoryReadFile : public IReadFile
{ {
public: public:
//! Get direct access to internal buffer of memory block used as file. //! Get direct access to internal buffer of memory block used as file.
/** It's usually better to use the IReadFile functions to access /** It's usually better to use the IReadFile functions to access
the file content. But as that buffer exist over the full life-time the file content. But as that buffer exist over the full life-time
@ -22,6 +23,9 @@ public:
data-copy which read() needs. data-copy which read() needs.
*/ */
virtual const void *getBuffer() const = 0; virtual const void *getBuffer() const = 0;
}; };
} // end namespace io } // end namespace io
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "SMaterial.h" #include "SMaterial.h"
@ -12,11 +13,11 @@ namespace irr
{ {
namespace scene namespace scene
{ {
//! Possible types of meshes. //! Possible types of meshes.
// Note: Was previously only used in IAnimatedMesh so it still has the "animated" in the name. // Note: Was previously only used in IAnimatedMesh so it still has the "animated" in the name.
// But can now be used for all mesh-types as we need those casts as well. // But can now be used for all mesh-types as we need those casts as well.
enum E_ANIMATED_MESH_TYPE enum E_ANIMATED_MESH_TYPE
{ {
//! Unknown animated mesh type. //! Unknown animated mesh type.
EAMT_UNKNOWN = 0, EAMT_UNKNOWN = 0,
@ -57,18 +58,20 @@ enum E_ANIMATED_MESH_TYPE
//! generic non-animated mesh //! generic non-animated mesh
EAMT_STATIC 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
{
public:
//! Get the amount of mesh buffers. //! Get the amount of mesh buffers.
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */ /** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
virtual u32 getMeshBufferCount() const = 0; virtual u32 getMeshBufferCount() const = 0;
@ -78,34 +81,34 @@ public:
getMeshBufferCount() - 1; getMeshBufferCount() - 1;
\return Pointer to the mesh buffer or 0 if there is no such \return Pointer to the mesh buffer or 0 if there is no such
mesh buffer. */ mesh buffer. */
virtual IMeshBuffer *getMeshBuffer(u32 nr) const = 0; virtual IMeshBuffer* getMeshBuffer(u32 nr) const = 0;
//! Get pointer to a mesh buffer which fits a material //! Get pointer to a mesh buffer which fits a material
/** \param material: material to search for /** \param material: material to search for
\return Pointer to the mesh buffer or 0 if there is no such \return Pointer to the mesh buffer or 0 if there is no such
mesh buffer. */ mesh buffer. */
virtual IMeshBuffer *getMeshBuffer(const video::SMaterial &material) const = 0; virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const = 0;
//! Get an axis aligned bounding box of the mesh. //! Get an axis aligned bounding box of the mesh.
/** \return Bounding box of this mesh. */ /** \return Bounding box of this mesh. */
virtual const core::aabbox3d<f32> &getBoundingBox() const = 0; virtual const core::aabbox3d<f32>& getBoundingBox() const = 0;
//! Set user-defined axis aligned bounding box //! Set user-defined axis aligned bounding box
/** \param box New bounding box to use for the mesh. */ /** \param box New bounding box to use for the mesh. */
virtual void setBoundingBox(const core::aabbox3df &box) = 0; virtual void setBoundingBox( const core::aabbox3df& box) = 0;
//! Set the hardware mapping hint //! Set the hardware mapping hint
/** This methods allows to define optimization hints for the /** This methods allows to define optimization hints for the
hardware. This enables, e.g., the use of hardware buffers on hardware. This enables, e.g., the use of hardware buffers on
platforms that support this feature. This can lead to noticeable platforms that support this feature. This can lead to noticeable
performance gains. */ performance gains. */
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) = 0; virtual void setHardwareMappingHint(E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) = 0;
//! Flag the meshbuffer as changed, reloads hardware buffers //! Flag the meshbuffer as changed, reloads hardware buffers
/** This method has to be called every time the vertices or /** This method has to be called every time the vertices or
indices have changed. Otherwise, changes won't be updated indices have changed. Otherwise, changes won't be updated
on the GPU in the next render cycle. */ on the GPU in the next render cycle. */
virtual void setDirty(E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) = 0; virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) = 0;
//! Returns the type of the meshes. //! Returns the type of the meshes.
/** This is useful for making a safe downcast. For example, /** This is useful for making a safe downcast. For example,
@ -117,7 +120,10 @@ public:
{ {
return EAMT_STATIC; return EAMT_STATIC;
} }
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "SMaterial.h" #include "SMaterial.h"
@ -16,35 +17,36 @@ namespace irr
{ {
namespace scene namespace scene
{ {
//! Struct for holding a mesh with a single material. //! Struct for holding a mesh with a single material.
/** A part of an IMesh which has the same material on each face of that /** A part of an IMesh which has the same material on each face of that
group. Logical groups of an IMesh need not be put into separate mesh group. Logical groups of an IMesh need not be put into separate mesh
buffers, but can be. Separately animated parts of the mesh must be put buffers, but can be. Separately animated parts of the mesh must be put
into separate mesh buffers. into separate mesh buffers.
Some mesh buffer implementations have limitations on the number of Some mesh buffer implementations have limitations on the number of
vertices the buffer can hold. In that case, logical grouping can help. vertices the buffer can hold. In that case, logical grouping can help.
Moreover, the number of vertices should be optimized for the GPU upload, Moreover, the number of vertices should be optimized for the GPU upload,
which often depends on the type of gfx card. Typical figures are which often depends on the type of gfx card. Typical figures are
1000-10000 vertices per buffer. 1000-10000 vertices per buffer.
SMeshBuffer is a simple implementation of a MeshBuffer, which supports SMeshBuffer is a simple implementation of a MeshBuffer, which supports
up to 65535 vertices. up to 65535 vertices.
Since meshbuffers are used for drawing, and hence will be exposed Since meshbuffers are used for drawing, and hence will be exposed
to the driver, chances are high that they are grab()'ed from somewhere. to the driver, chances are high that they are grab()'ed from somewhere.
It's therefore required to dynamically allocate meshbuffers which are It's therefore required to dynamically allocate meshbuffers which are
passed to a video driver and only drop the buffer once it's not used in passed to a video driver and only drop the buffer once it's not used in
the current code block anymore. the current code block anymore.
*/ */
class IMeshBuffer : public virtual IReferenceCounted class IMeshBuffer : public virtual IReferenceCounted
{ {
public: public:
//! Get the material of this meshbuffer
/** \return Material of this buffer. */
virtual video::SMaterial &getMaterial() = 0;
//! Get the material of this meshbuffer //! Get the material of this meshbuffer
/** \return Material of this buffer. */ /** \return Material of this buffer. */
virtual const video::SMaterial &getMaterial() const = 0; virtual video::SMaterial& getMaterial() = 0;
//! Get the material of this meshbuffer
/** \return Material of this buffer. */
virtual const video::SMaterial& getMaterial() const = 0;
//! Get type of vertex data which is stored in this meshbuffer. //! Get type of vertex data which is stored in this meshbuffer.
/** \return Vertex type of this buffer. */ /** \return Vertex type of this buffer. */
@ -53,12 +55,12 @@ public:
//! Get access to vertex data. The data is an array of vertices. //! Get access to vertex data. The data is an array of vertices.
/** Which vertex type is used can be determined by getVertexType(). /** Which vertex type is used can be determined by getVertexType().
\return Pointer to array of vertices. */ \return Pointer to array of vertices. */
virtual const void *getVertices() const = 0; virtual const void* getVertices() const = 0;
//! Get access to vertex data. The data is an array of vertices. //! Get access to vertex data. The data is an array of vertices.
/** Which vertex type is used can be determined by getVertexType(). /** Which vertex type is used can be determined by getVertexType().
\return Pointer to array of vertices. */ \return Pointer to array of vertices. */
virtual void *getVertices() = 0; virtual void* getVertices() = 0;
//! Get amount of vertices in meshbuffer. //! Get amount of vertices in meshbuffer.
/** \return Number of vertices in this buffer. */ /** \return Number of vertices in this buffer. */
@ -66,15 +68,15 @@ public:
//! Get type of index data which is stored in this meshbuffer. //! Get type of index data which is stored in this meshbuffer.
/** \return Index type of this buffer. */ /** \return Index type of this buffer. */
virtual video::E_INDEX_TYPE getIndexType() const = 0; virtual video::E_INDEX_TYPE getIndexType() const =0;
//! Get access to indices. //! Get access to indices.
/** \return Pointer to indices array. */ /** \return Pointer to indices array. */
virtual const u16 *getIndices() const = 0; virtual const u16* getIndices() const = 0;
//! Get access to indices. //! Get access to indices.
/** \return Pointer to indices array. */ /** \return Pointer to indices array. */
virtual u16 *getIndices() = 0; virtual u16* getIndices() = 0;
//! Get amount of indices in this meshbuffer. //! Get amount of indices in this meshbuffer.
/** \return Number of indices in this buffer. */ /** \return Number of indices in this buffer. */
@ -82,33 +84,33 @@ public:
//! Get the axis aligned bounding box of this meshbuffer. //! Get the axis aligned bounding box of this meshbuffer.
/** \return Axis aligned bounding box of this buffer. */ /** \return Axis aligned bounding box of this buffer. */
virtual const core::aabbox3df &getBoundingBox() const = 0; virtual const core::aabbox3df& getBoundingBox() const = 0;
//! Set axis aligned bounding box //! Set axis aligned bounding box
/** \param box User defined axis aligned bounding box to use /** \param box User defined axis aligned bounding box to use
for this buffer. */ for this buffer. */
virtual void setBoundingBox(const core::aabbox3df &box) = 0; virtual void setBoundingBox(const core::aabbox3df& box) = 0;
//! Recalculates the bounding box. Should be called if the mesh changed. //! Recalculates the bounding box. Should be called if the mesh changed.
virtual void recalculateBoundingBox() = 0; virtual void recalculateBoundingBox() = 0;
//! returns position of vertex i //! returns position of vertex i
virtual const core::vector3df &getPosition(u32 i) const = 0; virtual const core::vector3df& getPosition(u32 i) const = 0;
//! returns position of vertex i //! returns position of vertex i
virtual core::vector3df &getPosition(u32 i) = 0; virtual core::vector3df& getPosition(u32 i) = 0;
//! returns normal of vertex i //! returns normal of vertex i
virtual const core::vector3df &getNormal(u32 i) const = 0; virtual const core::vector3df& getNormal(u32 i) const = 0;
//! returns normal of vertex i //! returns normal of vertex i
virtual core::vector3df &getNormal(u32 i) = 0; virtual core::vector3df& getNormal(u32 i) = 0;
//! returns texture coord of vertex i //! returns texture coord of vertex i
virtual const core::vector2df &getTCoords(u32 i) const = 0; virtual const core::vector2df& getTCoords(u32 i) const = 0;
//! returns texture coord of vertex i //! returns texture coord of vertex i
virtual core::vector2df &getTCoords(u32 i) = 0; virtual core::vector2df& getTCoords(u32 i) = 0;
//! Append the vertices and indices to the current buffer //! Append the vertices and indices to the current buffer
/** Only works for compatible vertex types. /** Only works for compatible vertex types.
@ -116,7 +118,12 @@ public:
\param numVertices Number of vertices in the array. \param numVertices Number of vertices in the array.
\param indices Pointer to index array. \param indices Pointer to index array.
\param numIndices Number of indices in array. */ \param numIndices Number of indices in array. */
virtual void append(const void *const vertices, u32 numVertices, const u16 *const indices, u32 numIndices) = 0; virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) = 0;
//! Append the meshbuffer to the current buffer
/** Only works for compatible vertex types
\param other Buffer to append to this one. */
virtual void append(const IMeshBuffer* const other) = 0;
//! get the current hardware mapping hint //! get the current hardware mapping hint
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const = 0; virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const = 0;
@ -125,10 +132,10 @@ public:
virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const = 0; virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const = 0;
//! set the hardware mapping hint, for driver //! set the hardware mapping hint, for driver
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) = 0; virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) = 0;
//! flags the meshbuffer as changed, reloads hardware buffers //! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) = 0; virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) = 0;
//! Get the currently used ID for identification of changes. //! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ /** This shouldn't be used for anything outside the VideoDriver. */
@ -156,27 +163,23 @@ public:
virtual u32 getPrimitiveCount() const virtual u32 getPrimitiveCount() const
{ {
const u32 indexCount = getIndexCount(); const u32 indexCount = getIndexCount();
switch (getPrimitiveType()) { switch (getPrimitiveType())
case scene::EPT_POINTS: {
return indexCount; case scene::EPT_POINTS: return indexCount;
case scene::EPT_LINE_STRIP: case scene::EPT_LINE_STRIP: return indexCount-1;
return indexCount - 1; case scene::EPT_LINE_LOOP: return indexCount;
case scene::EPT_LINE_LOOP: case scene::EPT_LINES: return indexCount/2;
return indexCount; case scene::EPT_TRIANGLE_STRIP: return (indexCount-2);
case scene::EPT_LINES: case scene::EPT_TRIANGLE_FAN: return (indexCount-2);
return indexCount / 2; case scene::EPT_TRIANGLES: return indexCount/3;
case scene::EPT_TRIANGLE_STRIP: case scene::EPT_POINT_SPRITES: return indexCount;
return (indexCount - 2);
case scene::EPT_TRIANGLE_FAN:
return (indexCount - 2);
case scene::EPT_TRIANGLES:
return indexCount / 3;
case scene::EPT_POINT_SPRITES:
return indexCount;
} }
return 0; return 0;
} }
};
};
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "path.h" #include "path.h"
@ -12,20 +13,21 @@ namespace irr
namespace scene namespace scene
{ {
class IMesh; class IMesh;
class IAnimatedMesh; class IAnimatedMesh;
class IAnimatedMeshSceneNode; class IAnimatedMeshSceneNode;
class IMeshLoader; class IMeshLoader;
//! The mesh cache stores already loaded meshes and provides an interface to them.
/** You can access it using ISceneManager::getMeshCache(). All existing
scene managers will return a pointer to the same mesh cache, because it
is shared between them. With this interface, it is possible to manually
add new loaded meshes (if ISceneManager::getMesh() is not sufficient),
to remove them and to iterate through already loaded meshes. */
class IMeshCache : public virtual IReferenceCounted
{
public:
//! The mesh cache stores already loaded meshes and provides an interface to them.
/** You can access it using ISceneManager::getMeshCache(). All existing
scene managers will return a pointer to the same mesh cache, because it
is shared between them. With this interface, it is possible to manually
add new loaded meshes (if ISceneManager::getMesh() is not sufficient),
to remove them and to iterate through already loaded meshes. */
class IMeshCache : public virtual IReferenceCounted
{
public:
//! Destructor //! Destructor
virtual ~IMeshCache() {} virtual ~IMeshCache() {}
@ -45,14 +47,14 @@ public:
set by this method. set by this method.
\param mesh Pointer to a mesh which will now be referenced by \param mesh Pointer to a mesh which will now be referenced by
this name. */ this name. */
virtual void addMesh(const io::path &name, IAnimatedMesh *mesh) = 0; virtual void addMesh(const io::path& name, IAnimatedMesh* mesh) = 0;
//! Removes the mesh from the cache. //! Removes the mesh from the cache.
/** After loading a mesh with getMesh(), the mesh can be /** After loading a mesh with getMesh(), the mesh can be
removed from the cache using this method, freeing a lot of removed from the cache using this method, freeing a lot of
memory. memory.
\param mesh Pointer to the mesh which shall be removed. */ \param mesh Pointer to the mesh which shall be removed. */
virtual void removeMesh(const IMesh *const mesh) = 0; virtual void removeMesh(const IMesh* const mesh) = 0;
//! Returns amount of loaded meshes in the cache. //! Returns amount of loaded meshes in the cache.
/** You can load new meshes into the cache using getMesh() and /** You can load new meshes into the cache using getMesh() and
@ -65,7 +67,7 @@ public:
//! Returns current index number of the mesh or -1 when not found. //! Returns current index number of the mesh or -1 when not found.
/** \param mesh Pointer to the mesh to search for. /** \param mesh Pointer to the mesh to search for.
\return Index of the mesh in the cache, or -1 if not found. */ \return Index of the mesh in the cache, or -1 if not found. */
virtual s32 getMeshIndex(const IMesh *const mesh) const = 0; virtual s32 getMeshIndex(const IMesh* const mesh) const = 0;
//! Returns a mesh based on its index number. //! Returns a mesh based on its index number.
/** \param index: Index of the mesh, number between 0 and /** \param index: Index of the mesh, number between 0 and
@ -74,22 +76,22 @@ public:
or removed. or removed.
\return Pointer to the mesh or 0 if there is none with this \return Pointer to the mesh or 0 if there is none with this
number. */ number. */
virtual IAnimatedMesh *getMeshByIndex(u32 index) = 0; virtual IAnimatedMesh* getMeshByIndex(u32 index) = 0;
//! Returns a mesh based on its name. //! Returns a mesh based on its name.
/** \param name Name of the mesh. Usually a filename. /** \param name Name of the mesh. Usually a filename.
\return Pointer to the mesh or 0 if there is none with this number. */ \return Pointer to the mesh or 0 if there is none with this number. */
virtual IAnimatedMesh *getMeshByName(const io::path &name) = 0; virtual IAnimatedMesh* getMeshByName(const io::path& name) = 0;
//! Get the name of a loaded mesh, based on its index. //! Get the name of a loaded mesh, based on its index.
/** \param index: Index of the mesh, number between 0 and getMeshCount()-1. /** \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. */ \return The name if mesh was found and has a name, else the path is empty. */
virtual const io::SNamedPath &getMeshName(u32 index) const = 0; virtual const io::SNamedPath& getMeshName(u32 index) const = 0;
//! Get the name of the loaded mesh if there is any. //! Get the name of the loaded mesh if there is any.
/** \param mesh Pointer to mesh to query. /** \param mesh Pointer to mesh to query.
\return The name if mesh was found and has a name, else the path is empty. */ \return The name if mesh was found and has a name, else the path is empty. */
virtual const io::SNamedPath &getMeshName(const IMesh *const mesh) const = 0; virtual const io::SNamedPath& getMeshName(const IMesh* const mesh) const = 0;
//! Renames a loaded mesh. //! Renames a loaded mesh.
/** Note that renaming meshes might change the ordering of the /** Note that renaming meshes might change the ordering of the
@ -98,7 +100,7 @@ public:
\param index The index of the mesh in the cache. \param index The index of the mesh in the cache.
\param name New name for the mesh. \param name New name for the mesh.
\return True if mesh was renamed. */ \return True if mesh was renamed. */
virtual bool renameMesh(u32 index, const io::path &name) = 0; virtual bool renameMesh(u32 index, const io::path& name) = 0;
//! Renames the loaded mesh //! Renames the loaded mesh
/** Note that renaming meshes might change the ordering of the /** Note that renaming meshes might change the ordering of the
@ -107,12 +109,12 @@ public:
\param mesh Mesh to be renamed. \param mesh Mesh to be renamed.
\param name New name for the mesh. \param name New name for the mesh.
\return True if mesh was renamed. */ \return True if mesh was renamed. */
virtual bool renameMesh(const IMesh *const mesh, const io::path &name) = 0; virtual bool renameMesh(const IMesh* const mesh, const io::path& name) = 0;
//! Check if a mesh was already loaded. //! Check if a mesh was already loaded.
/** \param name Name of the mesh. Usually a filename. /** \param name Name of the mesh. Usually a filename.
\return True if the mesh has been loaded, else false. */ \return True if the mesh has been loaded, else false. */
virtual bool isMeshLoaded(const io::path &name) = 0; virtual bool isMeshLoaded(const io::path& name) = 0;
//! Clears the whole mesh cache, removing all meshes. //! Clears the whole mesh cache, removing all meshes.
/** All meshes will be reloaded completely when using ISceneManager::getMesh() /** All meshes will be reloaded completely when using ISceneManager::getMesh()
@ -125,7 +127,11 @@ public:
/** Warning: If you have pointers to meshes that were loaded with ISceneManager::getMesh() /** Warning: If you have pointers to meshes that were loaded with ISceneManager::getMesh()
and you did not grab them, then they may become invalid. */ and you did not grab them, then they may become invalid. */
virtual void clearUnusedMeshes() = 0; virtual void clearUnusedMeshes() = 0;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "path.h" #include "path.h"
@ -11,11 +12,11 @@ namespace irr
{ {
namespace io namespace io
{ {
class IReadFile; class IReadFile;
} // end namespace io } // end namespace io
namespace scene namespace scene
{ {
class IAnimatedMesh; class IAnimatedMesh;
//! Class which is able to load an animated mesh from a file. //! Class which is able to load an animated mesh from a file.
/** If you want Irrlicht be able to load meshes of /** If you want Irrlicht be able to load meshes of
@ -25,6 +26,7 @@ ISceneManager::addExternalMeshLoader() to the engine. */
class IMeshLoader : public virtual IReferenceCounted class IMeshLoader : public virtual IReferenceCounted
{ {
public: public:
//! Constructor //! Constructor
IMeshLoader() {} IMeshLoader() {}
@ -36,15 +38,18 @@ public:
only. only.
\param filename Name of the file to test. \param filename Name of the file to test.
\return True if the file might be loaded by this class. */ \return True if the file might be loaded by this class. */
virtual bool isALoadableFileExtension(const io::path &filename) const = 0; virtual bool isALoadableFileExtension(const io::path& filename) const = 0;
//! Creates/loads an animated mesh from the file. //! Creates/loads an animated mesh from the file.
/** \param file File handler to load the file from. /** \param file File handler to load the file from.
\return Pointer to the created mesh. Returns 0 if loading failed. \return Pointer to the created mesh. Returns 0 if loading failed.
If you no longer need the mesh, you should call IAnimatedMesh::drop(). If you no longer need the mesh, you should call IAnimatedMesh::drop().
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IAnimatedMesh *createMesh(io::IReadFile *file) = 0; virtual IAnimatedMesh* createMesh(io::IReadFile* file) = 0;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "vector3d.h" #include "vector3d.h"
@ -17,35 +18,36 @@ 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
fixing problems with wrong imported or exported meshes quickly after
loading. It is not intended for doing mesh modifications and/or
animations during runtime.
*/
class IMeshManipulator : public virtual IReferenceCounted
{
public:
//! An interface for easy manipulation of meshes.
/** Scale, set alpha value, flip surfaces, and so on. This exists for
fixing problems with wrong imported or exported meshes quickly after
loading. It is not intended for doing mesh modifications and/or
animations during runtime.
*/
class IMeshManipulator : public virtual IReferenceCounted
{
public:
//! Recalculates all normals of the mesh. //! Recalculates all normals of the mesh.
/** \param mesh: Mesh on which the operation is performed. /** \param mesh: Mesh on which the operation is performed.
\param smooth: If the normals shall be smoothed. \param smooth: If the normals shall be smoothed.
\param angleWeighted: If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. */ \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, virtual void recalculateNormals(IMesh* mesh, bool smooth = false,
bool angleWeighted = false) const = 0; bool angleWeighted = false) const=0;
//! Recalculates all normals of the mesh buffer. //! Recalculates all normals of the mesh buffer.
/** \param buffer: Mesh buffer on which the operation is performed. /** \param buffer: Mesh buffer on which the operation is performed.
\param smooth: If the normals shall be smoothed. \param smooth: If the normals shall be smoothed.
\param angleWeighted: If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. */ \param angleWeighted: If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. */
virtual void recalculateNormals(IMeshBuffer *buffer, virtual void recalculateNormals(IMeshBuffer* buffer,
bool smooth = false, bool angleWeighted = false) const = 0; bool smooth = false, bool angleWeighted = false) const=0;
//! Scales the actual mesh, not a scene node. //! Scales the actual mesh, not a scene node.
/** \param mesh Mesh on which the operation is performed. /** \param mesh Mesh on which the operation is performed.
\param factor Scale factor for each axis. */ \param factor Scale factor for each axis. */
void scale(IMesh *mesh, const core::vector3df &factor) const void scale(IMesh* mesh, const core::vector3df& factor) const
{ {
apply(SVertexPositionScaleManipulator(factor), mesh, true); apply(SVertexPositionScaleManipulator(factor), mesh, true);
} }
@ -53,7 +55,7 @@ public:
//! Scales the actual meshbuffer, not a scene node. //! Scales the actual meshbuffer, not a scene node.
/** \param buffer Meshbuffer on which the operation is performed. /** \param buffer Meshbuffer on which the operation is performed.
\param factor Scale factor for each axis. */ \param factor Scale factor for each axis. */
void scale(IMeshBuffer *buffer, const core::vector3df &factor) const void scale(IMeshBuffer* buffer, const core::vector3df& factor) const
{ {
apply(SVertexPositionScaleManipulator(factor), buffer, true); apply(SVertexPositionScaleManipulator(factor), buffer, true);
} }
@ -65,17 +67,17 @@ public:
\return Cloned mesh. If you no longer need the \return Cloned mesh. If you no longer need the
cloned mesh, you should call SMesh::drop(). See cloned mesh, you should call SMesh::drop(). See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual SMesh *createMeshCopy(IMesh *mesh) const = 0; virtual SMesh* createMeshCopy(IMesh* mesh) const = 0;
//! Get amount of polygons in mesh. //! Get amount of polygons in mesh.
/** \param mesh Input mesh /** \param mesh Input mesh
\return Number of polygons in mesh. */ \return Number of polygons in mesh. */
virtual s32 getPolyCount(IMesh *mesh) const = 0; virtual s32 getPolyCount(IMesh* mesh) const = 0;
//! Get amount of polygons in mesh. //! Get amount of polygons in mesh.
/** \param mesh Input mesh /** \param mesh Input mesh
\return Number of polygons in mesh. */ \return Number of polygons in mesh. */
virtual s32 getPolyCount(IAnimatedMesh *mesh) const = 0; virtual s32 getPolyCount(IAnimatedMesh* mesh) const = 0;
//! Create a new AnimatedMesh and adds the mesh to it //! Create a new AnimatedMesh and adds the mesh to it
/** \param mesh Input mesh /** \param mesh Input mesh
@ -84,7 +86,7 @@ public:
content. When you don't need the animated mesh anymore, you content. When you don't need the animated mesh anymore, you
should call IAnimatedMesh::drop(). See should call IAnimatedMesh::drop(). See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IAnimatedMesh *createAnimatedMesh(IMesh *mesh, virtual IAnimatedMesh * createAnimatedMesh(IMesh* mesh,
scene::E_ANIMATED_MESH_TYPE type = scene::EAMT_UNKNOWN) const = 0; scene::E_ANIMATED_MESH_TYPE type = scene::EAMT_UNKNOWN) const = 0;
//! Apply a manipulator on the Meshbuffer //! Apply a manipulator on the Meshbuffer
@ -93,27 +95,30 @@ public:
\param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation. \param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation.
\return True if the functor was successfully applied, else false. */ \return True if the functor was successfully applied, else false. */
template <typename Functor> template <typename Functor>
bool apply(const Functor &func, IMeshBuffer *buffer, bool boundingBoxUpdate = false) const bool apply(const Functor& func, IMeshBuffer* buffer, bool boundingBoxUpdate=false) const
{ {
return apply_(func, buffer, boundingBoxUpdate, func); return apply_(func, buffer, boundingBoxUpdate, func);
} }
//! Apply a manipulator on the Mesh //! Apply a manipulator on the Mesh
/** \param func A functor defining the mesh manipulation. /** \param func A functor defining the mesh manipulation.
\param mesh The Mesh to apply the manipulator to. \param mesh The Mesh to apply the manipulator to.
\param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation. \param boundingBoxUpdate Specifies if the bounding box should be updated during manipulation.
\return True if the functor was successfully applied, else false. */ \return True if the functor was successfully applied, else false. */
template <typename Functor> template <typename Functor>
bool apply(const Functor &func, IMesh *mesh, bool boundingBoxUpdate = false) const bool apply(const Functor& func, IMesh* mesh, bool boundingBoxUpdate=false) const
{ {
if (!mesh) if (!mesh)
return true; return true;
bool result = true; bool result = true;
core::aabbox3df bufferbox; core::aabbox3df bufferbox;
for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) { for (u32 i=0; i<mesh->getMeshBufferCount(); ++i)
{
result &= apply(func, mesh->getMeshBuffer(i), boundingBoxUpdate); result &= apply(func, mesh->getMeshBuffer(i), boundingBoxUpdate);
if (boundingBoxUpdate) { if (boundingBoxUpdate)
if (0 == i) {
if (0==i)
bufferbox.reset(mesh->getMeshBuffer(i)->getBoundingBox()); bufferbox.reset(mesh->getMeshBuffer(i)->getBoundingBox());
else else
bufferbox.addInternalBox(mesh->getMeshBuffer(i)->getBoundingBox()); bufferbox.addInternalBox(mesh->getMeshBuffer(i)->getBoundingBox());
@ -132,29 +137,38 @@ protected:
\param typeTest Unused parameter, which handles the proper call selection based on the type of the Functor which is passed in two times. \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 if the functor was successfully applied, else false. */ \return True if the functor was successfully applied, else false. */
template <typename Functor> template <typename Functor>
bool apply_(const Functor &func, IMeshBuffer *buffer, bool boundingBoxUpdate, const IVertexManipulator &typeTest) const bool apply_(const Functor& func, IMeshBuffer* buffer, bool boundingBoxUpdate, const IVertexManipulator& typeTest) const
{ {
if (!buffer) if (!buffer)
return true; return true;
core::aabbox3df bufferbox; core::aabbox3df bufferbox;
for (u32 i = 0; i < buffer->getVertexCount(); ++i) { for (u32 i=0; i<buffer->getVertexCount(); ++i)
switch (buffer->getVertexType()) { {
case video::EVT_STANDARD: { switch (buffer->getVertexType())
video::S3DVertex *verts = (video::S3DVertex *)buffer->getVertices(); {
case video::EVT_STANDARD:
{
video::S3DVertex* verts = (video::S3DVertex*)buffer->getVertices();
func(verts[i]); func(verts[i]);
} break;
case video::EVT_2TCOORDS: {
video::S3DVertex2TCoords *verts = (video::S3DVertex2TCoords *)buffer->getVertices();
func(verts[i]);
} break;
case video::EVT_TANGENTS: {
video::S3DVertexTangents *verts = (video::S3DVertexTangents *)buffer->getVertices();
func(verts[i]);
} break;
} }
if (boundingBoxUpdate) { break;
if (0 == i) case video::EVT_2TCOORDS:
{
video::S3DVertex2TCoords* verts = (video::S3DVertex2TCoords*)buffer->getVertices();
func(verts[i]);
}
break;
case video::EVT_TANGENTS:
{
video::S3DVertexTangents* verts = (video::S3DVertexTangents*)buffer->getVertices();
func(verts[i]);
}
break;
}
if (boundingBoxUpdate)
{
if (0==i)
bufferbox.reset(buffer->getPosition(0)); bufferbox.reset(buffer->getPosition(0));
else else
bufferbox.addInternalPoint(buffer->getPosition(i)); bufferbox.addInternalPoint(buffer->getPosition(i));
@ -168,3 +182,6 @@ protected:
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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"
@ -13,26 +14,28 @@ namespace scene
class IMesh; class IMesh;
//! A scene node displaying a static mesh //! A scene node displaying a static mesh
class IMeshSceneNode : public ISceneNode class IMeshSceneNode : public ISceneNode
{ {
public: public:
//! Constructor //! Constructor
/** Use setMesh() to set the mesh to display. /** Use setMesh() to set the mesh to display.
*/ */
IMeshSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id, IMeshSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
const core::vector3df &position = core::vector3df(0, 0, 0), const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df &rotation = core::vector3df(0, 0, 0), const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1, 1, 1)) : const core::vector3df& scale = core::vector3df(1,1,1))
ISceneNode(parent, mgr, id, position, rotation, scale) {} : ISceneNode(parent, mgr, id, position, rotation, scale) {}
//! Sets a new mesh to display //! Sets a new mesh to display
/** \param mesh Mesh to display. */ /** \param mesh Mesh to display. */
virtual void setMesh(IMesh *mesh) = 0; virtual void setMesh(IMesh* mesh) = 0;
//! Get the currently defined mesh for display. //! Get the currently defined mesh for display.
/** \return Pointer to mesh which is displayed by this node. */ /** \return Pointer to mesh which is displayed by this node. */
virtual IMesh *getMesh(void) = 0; virtual IMesh* getMesh(void) = 0;
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style. //! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
/** In this way it is possible to change the materials of a mesh /** In this way it is possible to change the materials of a mesh
@ -48,3 +51,7 @@ public:
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

55
include/IMeshWriter.h Normal file
View File

@ -0,0 +1,55 @@
// 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
#pragma once
#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

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "irrString.h" #include "irrString.h"
@ -15,31 +16,34 @@ class IOSOperator : public virtual IReferenceCounted
{ {
public: public:
//! Get the current OS version as string. //! Get the current OS version as string.
virtual const core::stringc &getOperatingSystemVersion() const = 0; virtual const core::stringc& getOperatingSystemVersion() const = 0;
//! Copies text to the clipboard //! Copies text to the clipboard
//! \param text: text in utf-8 //! \param text: text in utf-8
virtual void copyToClipboard(const c8 *text) const = 0; virtual void copyToClipboard(const c8* text) const = 0;
//! Copies text to the primary selection //! Copies text to the primary selection
//! This is a no-op on some platforms. //! This is a no-op on some platforms.
//! \param text: text in utf-8 //! \param text: text in utf-8
virtual void copyToPrimarySelection(const c8 *text) const = 0; virtual void copyToPrimarySelection(const c8* text) const = 0;
//! Get text from the clipboard //! Get text from the clipboard
//! \return Returns 0 if no string is in there, otherwise an utf-8 string. //! \return Returns 0 if no string is in there, otherwise an utf-8 string.
virtual const c8 *getTextFromClipboard() const = 0; virtual const c8* getTextFromClipboard() const = 0;
//! Get text from the primary selection //! Get text from the primary selection
//! This is a no-op on some platforms. //! This is a no-op on some platforms.
//! \return Returns 0 if no string is in there, otherwise an utf-8 string. //! \return Returns 0 if no string is in there, otherwise an utf-8 string.
virtual const c8 *getTextFromPrimarySelection() const = 0; virtual const c8* getTextFromPrimarySelection() const = 0;
//! Get the total and available system RAM //! Get the total and available system RAM
/** \param totalBytes: will contain the total system memory in Kilobytes (1024 B) /** \param totalBytes: will contain the total system memory in Kilobytes (1024 B)
\param availableBytes: will contain the available memory in Kilobytes (1024 B) \param availableBytes: will contain the available memory in Kilobytes (1024 B)
\return True if successful, false if not */ \return True if successful, false if not */
virtual bool getSystemMemory(u32 *totalBytes, u32 *availableBytes) const = 0; virtual bool getSystemMemory(u32* totalBytes, u32* availableBytes) const = 0;
}; };
} // end namespace } // end namespace
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "coreutil.h" #include "coreutil.h"
@ -13,15 +14,15 @@ namespace irr
namespace io namespace io
{ {
//! Interface providing read access to a file. //! Interface providing read access to a file.
class IReadFile : public virtual IReferenceCounted class IReadFile : public virtual IReferenceCounted
{ {
public: public:
//! Reads an amount of bytes from the file. //! Reads an amount of bytes from the file.
/** \param buffer Pointer to buffer where read bytes are written to. /** \param buffer Pointer to buffer where read bytes are written to.
\param sizeToRead Amount of bytes to read from the file. \param sizeToRead Amount of bytes to read from the file.
\return How many bytes were read. */ \return How many bytes were read. */
virtual size_t read(void *buffer, size_t sizeToRead) = 0; virtual size_t read(void* buffer, size_t sizeToRead) = 0;
//! Changes position in file //! Changes position in file
/** \param finalPos Destination position in the file. /** \param finalPos Destination position in the file.
@ -41,17 +42,20 @@ public:
//! Get name of file. //! Get name of file.
/** \return File name as zero terminated character string. */ /** \return File name as zero terminated character string. */
virtual const io::path &getFileName() const = 0; virtual const io::path& getFileName() const = 0;
//! Get the type of the class implementing this interface //! Get the type of the class implementing this interface
virtual EREAD_FILE_TYPE getType() const virtual EREAD_FILE_TYPE getType() const
{ {
return EFIT_UNKNOWN; return EFIT_UNKNOWN;
} }
}; };
//! Internal function, please do not use. //! Internal function, please do not use.
IReadFile *createLimitReadFile(const io::path &fileName, IReadFile *alreadyOpenedFile, long pos, long areaSize); IReadFile* createLimitReadFile(const io::path& fileName, IReadFile* alreadyOpenedFile, long pos, long areaSize);
} // end namespace io } // end namespace io
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,47 +2,49 @@
// 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. //! Base class of most objects of the Irrlicht Engine.
/** This class provides reference counting through the methods grab() and drop(). /** This class provides reference counting through the methods grab() and drop().
It also is able to store a debug string for every instance of an object. It also is able to store a debug string for every instance of an object.
Most objects of the Irrlicht Most objects of the Irrlicht
Engine are derived from IReferenceCounted, and so they are reference counted. Engine are derived from IReferenceCounted, and so they are reference counted.
When you create an object in the Irrlicht engine, calling a method 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 which starts with 'create', an object is created, and you get a pointer
to the new object. If you no longer need the object, you have to the new object. If you no longer need the object, you have
to call drop(). This will destroy the object, if grab() was not called to call drop(). This will destroy the object, if grab() was not called
in another part of you program, because this part still needs the object. in another part of you program, because this part still needs the object.
Note, that you only need to call drop() to the object, if you created it, Note, that you only need to call drop() to the object, if you created it,
and the method had a 'create' in 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 If you want to create a texture, you may want to call an imaginable method
IDriver::createTexture. You call IDriver::createTexture. You call
ITexture* texture = driver->createTexture(dimension2d<u32>(128, 128)); ITexture* texture = driver->createTexture(dimension2d<u32>(128, 128));
If you no longer need the texture, call texture->drop(). 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
ITexture* texture = driver->loadTexture("example.jpg");
You will not have to drop the pointer to the loaded texture, because
the name of the method does not start with 'create'. The texture
is stored somewhere by the driver.
*/
class IReferenceCounted
{
public:
If you want to load a texture, you may want to call imaginable method
IDriver::loadTexture. You do this like
ITexture* texture = driver->loadTexture("example.jpg");
You will not have to drop the pointer to the loaded texture, because
the name of the method does not start with 'create'. The texture
is stored somewhere by the driver.
*/
class IReferenceCounted
{
public:
//! Constructor. //! Constructor.
IReferenceCounted() : IReferenceCounted()
DebugName(0), ReferenceCounter(1) : DebugName(0), ReferenceCounter(1)
{ {
} }
@ -117,7 +119,8 @@ public:
_IRR_DEBUG_BREAK_IF(ReferenceCounter <= 0) _IRR_DEBUG_BREAK_IF(ReferenceCounter <= 0)
--ReferenceCounter; --ReferenceCounter;
if (!ReferenceCounter) { if (!ReferenceCounter)
{
delete this; delete this;
return true; return true;
} }
@ -136,27 +139,32 @@ public:
/** The Debugname may only be set and changed by the object /** The Debugname may only be set and changed by the object
itself. This method should only be used in Debug mode. itself. This method should only be used in Debug mode.
\return Returns a string, previously set by setDebugName(); */ \return Returns a string, previously set by setDebugName(); */
const c8 *getDebugName() const const c8* getDebugName() const
{ {
return DebugName; return DebugName;
} }
protected: protected:
//! Sets the debug name of the object. //! Sets the debug name of the object.
/** The Debugname may only be set and changed by the object /** The Debugname may only be set and changed by the object
itself. This method should only be used in Debug mode. itself. This method should only be used in Debug mode.
\param newName: New debug name to set. */ \param newName: New debug name to set. */
void setDebugName(const c8 *newName) void setDebugName(const c8* newName)
{ {
DebugName = newName; DebugName = newName;
} }
private: private:
//! The debug name. //! The debug name.
const c8 *DebugName; const c8* DebugName;
//! The reference counter. Mutable to do reference counting on const objects. //! The reference counter. Mutable to do reference counting on const objects.
mutable s32 ReferenceCounter; mutable s32 ReferenceCounter;
}; };
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "EDriverTypes.h" #include "EDriverTypes.h"
@ -12,43 +13,43 @@ namespace irr
{ {
namespace video namespace video
{ {
class ITexture; class ITexture;
//! Enumeration of cube texture surfaces //! Enumeration of cube texture surfaces
enum E_CUBE_SURFACE enum E_CUBE_SURFACE
{ {
ECS_POSX = 0, ECS_POSX = 0,
ECS_NEGX, ECS_NEGX,
ECS_POSY, ECS_POSY,
ECS_NEGY, ECS_NEGY,
ECS_POSZ, ECS_POSZ,
ECS_NEGZ ECS_NEGZ
}; };
//! Interface of a Render Target.
class IRenderTarget : public virtual IReferenceCounted
{
public:
//! Interface of a Render Target.
class IRenderTarget : public virtual IReferenceCounted
{
public:
//! constructor //! constructor
IRenderTarget() : IRenderTarget() : DepthStencil(0), DriverType(EDT_NULL)
DepthStencil(0), DriverType(EDT_NULL)
{ {
} }
//! Returns an array of previously set textures. //! Returns an array of previously set textures.
const core::array<ITexture *> &getTexture() const const core::array<ITexture*>& getTexture() const
{ {
return Textures; return Textures;
} }
//! Returns a of previously set depth / depth-stencil texture. //! Returns a of previously set depth / depth-stencil texture.
ITexture *getDepthStencil() const ITexture* getDepthStencil() const
{ {
return DepthStencil; return DepthStencil;
} }
//! Returns an array of active surface for cube textures //! Returns an array of active surface for cube textures
const core::array<E_CUBE_SURFACE> &getCubeSurfaces() const const core::array<E_CUBE_SURFACE>& getCubeSurfaces() const
{ {
return CubeSurfaces; return CubeSurfaces;
} }
@ -60,28 +61,34 @@ public:
or depth-stencil buffer. You can pass getDepthStencil() if you don't want to change it. 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. \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 //! Sets one texture + depthStencil
//! You can pass getDepthStencil() for depthStencil if you don't want to change that one //! You can pass getDepthStencil() for depthStencil if you don't want to change that one
void setTexture(ITexture *texture, ITexture *depthStencil) void setTexture(ITexture* texture, ITexture* depthStencil)
{
if ( texture )
{ {
if (texture) {
setTextures(&texture, 1, depthStencil); setTextures(&texture, 1, depthStencil);
} else { }
else
{
setTextures(0, 0, depthStencil); setTextures(0, 0, depthStencil);
} }
} }
//! Set one cube surface texture. //! Set one cube surface texture.
void setTexture(ITexture *texture, ITexture *depthStencil, E_CUBE_SURFACE cubeSurface) void setTexture(ITexture* texture, ITexture* depthStencil, E_CUBE_SURFACE cubeSurface)
{
if ( texture )
{ {
if (texture) {
setTextures(&texture, 1, depthStencil, &cubeSurface, 1); setTextures(&texture, 1, depthStencil, &cubeSurface, 1);
} else { }
else
{
setTextures(0, 0, depthStencil, &cubeSurface, 1); setTextures(0, 0, depthStencil, &cubeSurface, 1);
} }
} }
@ -92,16 +99,17 @@ public:
return DriverType; return DriverType;
} }
protected: protected:
//! Set multiple textures. //! Set multiple textures.
// NOTE: working with pointers instead of arrays to avoid unnecessary memory allocations for the single textures case // NOTE: working with pointers instead of arrays to avoid unnecessary memory allocations for the single textures case
virtual void setTextures(ITexture *const *textures, u32 numTextures, ITexture *depthStencil, const E_CUBE_SURFACE *cubeSurfaces = 0, u32 numCubeSurfaces = 0) = 0; virtual void setTextures(ITexture* const * textures, u32 numTextures, ITexture* depthStencil, const E_CUBE_SURFACE* cubeSurfaces=0, u32 numCubeSurfaces=0) = 0;
//! Textures assigned to render target. //! Textures assigned to render target.
core::array<ITexture *> Textures; core::array<ITexture*> Textures;
//! Depth or packed depth-stencil texture assigned to render target. //! Depth or packed depth-stencil texture assigned to render target.
ITexture *DepthStencil; ITexture* DepthStencil;
//! Active surface of cube textures //! Active surface of cube textures
core::array<E_CUBE_SURFACE> CubeSurfaces; core::array<E_CUBE_SURFACE> CubeSurfaces;
@ -109,11 +117,13 @@ protected:
//! Driver type of render target. //! Driver type of render target.
E_DRIVER_TYPE DriverType; E_DRIVER_TYPE DriverType;
private: private:
// no copying (IReferenceCounted still allows that for reasons which take some time to work around) // no copying (IReferenceCounted still allows that for reasons which take some time to work around)
IRenderTarget(const IRenderTarget &); IRenderTarget(const IRenderTarget&);
IRenderTarget &operator=(const IRenderTarget &); IRenderTarget& operator=(const IRenderTarget&);
}; };
} }
} }
#endif

View File

@ -2,7 +2,8 @@
// 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 "IReferenceCounted.h"
#include "position2d.h" #include "position2d.h"
@ -13,11 +14,12 @@ namespace irr
namespace scene namespace scene
{ {
class ICameraSceneNode; class ICameraSceneNode;
class ISceneCollisionManager : public virtual IReferenceCounted
{
public:
class ISceneCollisionManager : public virtual IReferenceCounted
{
public:
//! Returns a 3d ray which would go through the 2d screen coordinates. //! Returns a 3d ray which would go through the 2d screen coordinates.
/** \param pos: Screen coordinates in pixels. /** \param pos: Screen coordinates in pixels.
\param camera: Camera from which the ray starts. If null, the \param camera: Camera from which the ray starts. If null, the
@ -26,8 +28,11 @@ public:
at a length of the far value of the camera at a position which at a length of the far value of the camera at a position which
would be behind the 2d screen coordinates. */ would be behind the 2d screen coordinates. */
virtual core::line3d<f32> getRayFromScreenCoordinates( virtual core::line3d<f32> getRayFromScreenCoordinates(
const core::position2d<s32> &pos, const ICameraSceneNode *camera = 0) = 0; const core::position2d<s32>& pos, const ICameraSceneNode* camera = 0) = 0;
};
};
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_MANAGER_H_INCLUDED__
#define __I_SCENE_MANAGER_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
#include "irrArray.h" #include "irrArray.h"
@ -12,56 +13,57 @@
#include "dimension2d.h" #include "dimension2d.h"
#include "SColor.h" #include "SColor.h"
#include "ESceneNodeTypes.h" #include "ESceneNodeTypes.h"
#include "EMeshWriterEnums.h"
#include "SceneParameters.h" #include "SceneParameters.h"
#include "ISkinnedMesh.h" #include "ISkinnedMesh.h"
namespace irr namespace irr
{ {
struct SKeyMap; struct SKeyMap;
struct SEvent; struct SEvent;
namespace io namespace io
{ {
class IReadFile; class IReadFile;
class IAttributes; class IAttributes;
class IWriteFile; class IWriteFile;
class IFileSystem; class IFileSystem;
} // end namespace io } // end namespace io
namespace gui namespace gui
{ {
class IGUIFont; class IGUIFont;
class IGUIEnvironment; class IGUIEnvironment;
} // end namespace gui } // end namespace gui
namespace video namespace video
{ {
class IVideoDriver; class IVideoDriver;
class SMaterial; class SMaterial;
class IImage; class IImage;
class ITexture; class ITexture;
} // end namespace video } // end namespace video
namespace scene namespace scene
{ {
//! Enumeration for render passes. //! Enumeration for render passes.
/** A parameter passed to the registerNodeForRendering() method of the ISceneManager, /** A parameter passed to the registerNodeForRendering() method of the ISceneManager,
specifying when the node wants to be drawn in relation to the other nodes. specifying when the node wants to be drawn in relation to the other nodes.
Note: Despite the numbering this is not used as bit-field. Note: Despite the numbering this is not used as bit-field.
*/ */
enum E_SCENE_NODE_RENDER_PASS enum E_SCENE_NODE_RENDER_PASS
{ {
//! No pass currently active //! No pass currently active
ESNRP_NONE = 0, ESNRP_NONE =0,
//! Camera pass. The active view is set up here. The very first pass. //! Camera pass. The active view is set up here. The very first pass.
ESNRP_CAMERA = 1, ESNRP_CAMERA =1,
//! In this pass, lights are transformed into camera space and added to the driver //! In this pass, lights are transformed into camera space and added to the driver
ESNRP_LIGHT = 2, ESNRP_LIGHT =2,
//! This is used for sky boxes. //! This is used for sky boxes.
ESNRP_SKY_BOX = 4, ESNRP_SKY_BOX =4,
//! All normal objects can use this for registering themselves. //! All normal objects can use this for registering themselves.
/** This value will never be returned by /** This value will never be returned by
@ -76,56 +78,58 @@ enum E_SCENE_NODE_RENDER_PASS
render() method call getSceneNodeRenderPass() to find out the render() method call getSceneNodeRenderPass() to find out the
current render pass and render only the corresponding parts of current render pass and render only the corresponding parts of
the node. */ the node. */
ESNRP_AUTOMATIC = 24, ESNRP_AUTOMATIC =24,
//! Solid scene nodes or special scene nodes without materials. //! Solid scene nodes or special scene nodes without materials.
ESNRP_SOLID = 8, ESNRP_SOLID =8,
//! Transparent scene nodes, drawn after solid nodes. They are sorted from back to front and drawn in that order. //! Transparent scene nodes, drawn after solid nodes. They are sorted from back to front and drawn in that order.
ESNRP_TRANSPARENT = 16, ESNRP_TRANSPARENT =16,
//! Transparent effect scene nodes, drawn after Transparent nodes. They are sorted from back to front and drawn in that order. //! Transparent effect scene nodes, drawn after Transparent nodes. They are sorted from back to front and drawn in that order.
ESNRP_TRANSPARENT_EFFECT = 32, ESNRP_TRANSPARENT_EFFECT =32,
//! Drawn after the solid nodes, before the transparent nodes, the time for drawing shadow volumes //! Drawn after the solid nodes, before the transparent nodes, the time for drawing shadow volumes
ESNRP_SHADOW = 64, ESNRP_SHADOW =64,
//! Drawn after transparent effect nodes. For custom gui's. Unsorted (in order nodes registered themselves). //! Drawn after transparent effect nodes. For custom gui's. Unsorted (in order nodes registered themselves).
ESNRP_GUI = 128 ESNRP_GUI = 128
}; };
class IAnimatedMesh; class IAnimatedMesh;
class IAnimatedMeshSceneNode; class IAnimatedMeshSceneNode;
class IBillboardSceneNode; class IBillboardSceneNode;
class ICameraSceneNode; class ICameraSceneNode;
class IDummyTransformationSceneNode; class IDummyTransformationSceneNode;
class IMesh; class IMesh;
class IMeshBuffer; class IMeshBuffer;
class IMeshCache; class IMeshCache;
class ISceneCollisionManager; class ISceneCollisionManager;
class IMeshLoader; class IMeshLoader;
class IMeshManipulator; class IMeshManipulator;
class IMeshSceneNode; class IMeshSceneNode;
class ISceneNode; class IMeshWriter;
class ISceneNodeFactory; class ISceneNode;
class ISceneNodeFactory;
//! The Scene Manager manages scene nodes, mesh resources, cameras and all the other stuff.
/** All Scene nodes can be created only here.
A scene node is a node in the hierarchical scene graph. Every scene node
may have children, which are other scene nodes. Children move relative
the their parents position. If the parent of a node is not visible, its
children won't be visible, too. In this way, it is for example easily
possible to attach a light to a moving car or to place a walking
character on a moving platform on a moving ship.
The SceneManager is also able to load 3d mesh files of different
formats. Take a look at getMesh() to find out what formats are
supported. If these formats are not enough, use
addExternalMeshLoader() to add new formats to the engine.
*/
class ISceneManager : public virtual IReferenceCounted
{
public:
//! The Scene Manager manages scene nodes, mesh resources, cameras and all the other stuff.
/** All Scene nodes can be created only here.
A scene node is a node in the hierarchical scene graph. Every scene node
may have children, which are other scene nodes. Children move relative
the their parents position. If the parent of a node is not visible, its
children won't be visible, too. In this way, it is for example easily
possible to attach a light to a moving car or to place a walking
character on a moving platform on a moving ship.
The SceneManager is also able to load 3d mesh files of different
formats. Take a look at getMesh() to find out what formats are
supported. If these formats are not enough, use
addExternalMeshLoader() to add new formats to the engine.
*/
class ISceneManager : public virtual IReferenceCounted
{
public:
//! Get pointer to an animatable mesh. Loads the file if not loaded already. //! Get pointer to an animatable mesh. Loads the file if not loaded already.
/** /**
* If you want to remove a loaded mesh from the cache again, use removeMesh(). * If you want to remove a loaded mesh from the cache again, use removeMesh().
@ -318,18 +322,18 @@ public:
* \return Null if failed, otherwise pointer to the mesh. * \return Null if failed, otherwise pointer to the mesh.
* This pointer should not be dropped. See IReferenceCounted::drop() for more information. * This pointer should not be dropped. See IReferenceCounted::drop() for more information.
**/ **/
virtual IAnimatedMesh *getMesh(io::IReadFile *file) = 0; virtual IAnimatedMesh* getMesh(io::IReadFile* file) = 0;
//! Get interface to the mesh cache which is shared between all existing scene managers. //! Get interface to the mesh cache which is shared between all existing scene managers.
/** With this interface, it is possible to manually add new loaded /** With this interface, it is possible to manually add new loaded
meshes (if ISceneManager::getMesh() is not sufficient), to remove them and to iterate meshes (if ISceneManager::getMesh() is not sufficient), to remove them and to iterate
through already loaded meshes. */ through already loaded meshes. */
virtual IMeshCache *getMeshCache() = 0; virtual IMeshCache* getMeshCache() = 0;
//! Get the video driver. //! Get the video driver.
/** \return Pointer to the video Driver. /** \return Pointer to the video Driver.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual video::IVideoDriver *getVideoDriver() = 0; virtual video::IVideoDriver* getVideoDriver() = 0;
//! Adds a scene node for rendering an animated mesh model. //! Adds a scene node for rendering an animated mesh model.
/** \param mesh: Pointer to the loaded animated mesh to be displayed. /** \param mesh: Pointer to the loaded animated mesh to be displayed.
@ -342,12 +346,12 @@ public:
\param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed. \param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed.
\return Pointer to the created scene node. \return Pointer to the created scene node.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual IAnimatedMeshSceneNode *addAnimatedMeshSceneNode(IAnimatedMesh *mesh, virtual IAnimatedMeshSceneNode* addAnimatedMeshSceneNode(IAnimatedMesh* mesh,
ISceneNode *parent = 0, s32 id = -1, ISceneNode* parent=0, s32 id=-1,
const core::vector3df &position = core::vector3df(0, 0, 0), const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df &rotation = core::vector3df(0, 0, 0), const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f), const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f),
bool alsoAddIfMeshPointerZero = false) = 0; bool alsoAddIfMeshPointerZero=false) = 0;
//! Adds a scene node for rendering a static mesh. //! Adds a scene node for rendering a static mesh.
/** \param mesh: Pointer to the loaded static mesh to be displayed. /** \param mesh: Pointer to the loaded static mesh to be displayed.
@ -360,11 +364,11 @@ public:
\param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed. \param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed.
\return Pointer to the created scene node. \return Pointer to the created scene node.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual IMeshSceneNode *addMeshSceneNode(IMesh *mesh, ISceneNode *parent = 0, s32 id = -1, virtual IMeshSceneNode* addMeshSceneNode(IMesh* mesh, ISceneNode* parent=0, s32 id=-1,
const core::vector3df &position = core::vector3df(0, 0, 0), const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df &rotation = core::vector3df(0, 0, 0), const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f), const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f),
bool alsoAddIfMeshPointerZero = false) = 0; bool alsoAddIfMeshPointerZero=false) = 0;
//! Adds a camera scene node to the scene graph and sets it as active camera. //! Adds a camera scene node to the scene graph and sets it as active camera.
/** This camera does not react on user input. /** This camera does not react on user input.
@ -383,10 +387,10 @@ public:
Make sure you always have one active camera. Make sure you always have one active camera.
\return Pointer to interface to camera if successful, otherwise 0. \return Pointer to interface to camera if successful, otherwise 0.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ICameraSceneNode *addCameraSceneNode(ISceneNode *parent = 0, virtual ICameraSceneNode* addCameraSceneNode(ISceneNode* parent = 0,
const core::vector3df &position = core::vector3df(0, 0, 0), const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df &lookat = core::vector3df(0, 0, 100), const core::vector3df& lookat = core::vector3df(0,0,100),
s32 id = -1, bool makeActive = true) = 0; s32 id=-1, bool makeActive=true) = 0;
//! Adds a billboard scene node to the scene graph. //! Adds a billboard scene node to the scene graph.
/** A billboard is like a 3d sprite: A 2d element, /** A billboard is like a 3d sprite: A 2d element,
@ -407,9 +411,9 @@ public:
\return Pointer to the billboard if successful, otherwise NULL. \return Pointer to the billboard if successful, otherwise NULL.
This pointer should not be dropped. See This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual IBillboardSceneNode *addBillboardSceneNode(ISceneNode *parent = 0, virtual IBillboardSceneNode* addBillboardSceneNode(ISceneNode* parent = 0,
const core::dimension2d<f32> &size = core::dimension2d<f32>(10.0f, 10.0f), const core::dimension2d<f32>& size = core::dimension2d<f32>(10.0f, 10.0f),
const core::vector3df &position = core::vector3df(0, 0, 0), s32 id = -1, const core::vector3df& position = core::vector3df(0,0,0), s32 id=-1,
video::SColor colorTop = 0xFFFFFFFF, video::SColor colorBottom = 0xFFFFFFFF) = 0; video::SColor colorTop = 0xFFFFFFFF, video::SColor colorBottom = 0xFFFFFFFF) = 0;
//! Adds an empty scene node to the scene graph. //! Adds an empty scene node to the scene graph.
@ -417,7 +421,7 @@ public:
or structuring the scene graph. or structuring the scene graph.
\return Pointer to the created scene node. \return Pointer to the created scene node.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ISceneNode *addEmptySceneNode(ISceneNode *parent = 0, s32 id = -1) = 0; virtual ISceneNode* addEmptySceneNode(ISceneNode* parent=0, s32 id=-1) = 0;
//! Adds a dummy transformation scene node to the scene graph. //! Adds a dummy transformation scene node to the scene graph.
/** This scene node does not render itself, and does not respond to set/getPosition, /** This scene node does not render itself, and does not respond to set/getPosition,
@ -426,8 +430,8 @@ public:
anywhere into the scene graph. anywhere into the scene graph.
\return Pointer to the created scene node. \return Pointer to the created scene node.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual IDummyTransformationSceneNode *addDummyTransformationSceneNode( virtual IDummyTransformationSceneNode* addDummyTransformationSceneNode(
ISceneNode *parent = 0, s32 id = -1) = 0; ISceneNode* parent=0, s32 id=-1) = 0;
//! Gets the root scene node. //! Gets the root scene node.
/** This is the scene node which is parent /** This is the scene node which is parent
@ -436,7 +440,7 @@ public:
be removed from the scene. be removed from the scene.
\return Pointer to the root scene node. \return Pointer to the root scene node.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ISceneNode *getRootSceneNode() = 0; virtual ISceneNode* getRootSceneNode() = 0;
//! Get the first scene node with the specified id. //! Get the first scene node with the specified id.
/** \param id: The id to search for /** \param id: The id to search for
@ -446,7 +450,7 @@ public:
\return Pointer to the first scene node with this id, \return Pointer to the first scene node with this id,
and null if no scene node could be found. and null if no scene node could be found.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ISceneNode *getSceneNodeFromId(s32 id, ISceneNode *start = 0) = 0; virtual ISceneNode* getSceneNodeFromId(s32 id, ISceneNode* start=0) = 0;
//! Get the first scene node with the specified name. //! Get the first scene node with the specified name.
/** \param name: The name to search for /** \param name: The name to search for
@ -456,7 +460,7 @@ public:
\return Pointer to the first scene node with this id, \return Pointer to the first scene node with this id,
and null if no scene node could be found. and null if no scene node could be found.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ISceneNode *getSceneNodeFromName(const c8 *name, ISceneNode *start = 0) = 0; virtual ISceneNode* getSceneNodeFromName(const c8* name, ISceneNode* start=0) = 0;
//! Get the first scene node with the specified type. //! Get the first scene node with the specified type.
/** \param type: The type to search for /** \param type: The type to search for
@ -466,7 +470,7 @@ public:
\return Pointer to the first scene node with this type, \return Pointer to the first scene node with this type,
and null if no scene node could be found. and null if no scene node could be found.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ISceneNode *getSceneNodeFromType(scene::ESCENE_NODE_TYPE type, ISceneNode *start = 0) = 0; virtual ISceneNode* getSceneNodeFromType(scene::ESCENE_NODE_TYPE type, ISceneNode* start=0) = 0;
//! Get scene nodes by type. //! Get scene nodes by type.
/** \param type: Type of scene node to find (ESNT_ANY will return all child nodes). /** \param type: Type of scene node to find (ESNT_ANY will return all child nodes).
@ -475,19 +479,19 @@ public:
node are checked (recursively, so also children of children, etc). If null is specified, node are checked (recursively, so also children of children, etc). If null is specified,
the root scene node is taken as start-node. */ the root scene node is taken as start-node. */
virtual void getSceneNodesFromType(ESCENE_NODE_TYPE type, virtual void getSceneNodesFromType(ESCENE_NODE_TYPE type,
core::array<scene::ISceneNode *> &outNodes, core::array<scene::ISceneNode*>& outNodes,
ISceneNode *start = 0) = 0; ISceneNode* start=0) = 0;
//! Get the current active camera. //! Get the current active camera.
/** \return The active camera is returned. Note that this can /** \return The active camera is returned. Note that this can
be NULL, if there was no camera created yet. be NULL, if there was no camera created yet.
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ICameraSceneNode *getActiveCamera() const = 0; virtual ICameraSceneNode* getActiveCamera() const =0;
//! Sets the currently active camera. //! Sets the currently active camera.
/** The previous active camera will be deactivated. /** The previous active camera will be deactivated.
\param camera: The new camera which should be active. */ \param camera: The new camera which should be active. */
virtual void setActiveCamera(ICameraSceneNode *camera) = 0; virtual void setActiveCamera(ICameraSceneNode* camera) = 0;
//! Registers a node for rendering it at a specific time. //! Registers a node for rendering it at a specific time.
/** This method should only be used by SceneNodes when they get a /** This method should only be used by SceneNodes when they get a
@ -500,7 +504,7 @@ public:
Note: This is _not_ a bitfield. If you want to register a note for several render passes, then Note: This is _not_ a bitfield. If you want to register a note for several render passes, then
call this function once for each pass. call this function once for each pass.
\return scene will be rendered ( passed culling ) */ \return scene will be rendered ( passed culling ) */
virtual u32 registerNodeForRendering(ISceneNode *node, virtual u32 registerNodeForRendering(ISceneNode* node,
E_SCENE_NODE_RENDER_PASS pass = ESNRP_AUTOMATIC) = 0; E_SCENE_NODE_RENDER_PASS pass = ESNRP_AUTOMATIC) = 0;
//! Clear all nodes which are currently registered for rendering //! Clear all nodes which are currently registered for rendering
@ -523,7 +527,7 @@ public:
Using this method it is also possible to override built-in mesh loaders with Using this method it is also possible to override built-in mesh loaders with
newer or updated versions without the need to recompile the engine. newer or updated versions without the need to recompile the engine.
\param externalLoader: Implementation of a new mesh loader. */ \param externalLoader: Implementation of a new mesh loader. */
virtual void addExternalMeshLoader(IMeshLoader *externalLoader) = 0; virtual void addExternalMeshLoader(IMeshLoader* externalLoader) = 0;
//! Returns the number of mesh loaders supported by Irrlicht at this time //! Returns the number of mesh loaders supported by Irrlicht at this time
virtual u32 getMeshLoaderCount() const = 0; virtual u32 getMeshLoaderCount() const = 0;
@ -532,17 +536,17 @@ public:
/** \param index The index of the loader to retrieve. This parameter is an 0-based /** \param index The index of the loader to retrieve. This parameter is an 0-based
array index. array index.
\return A pointer to the specified loader, 0 if the index is incorrect. */ \return A pointer to the specified loader, 0 if the index is incorrect. */
virtual IMeshLoader *getMeshLoader(u32 index) const = 0; virtual IMeshLoader* getMeshLoader(u32 index) const = 0;
//! Get pointer to the scene collision manager. //! Get pointer to the scene collision manager.
/** \return Pointer to the collision manager /** \return Pointer to the collision manager
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ISceneCollisionManager *getSceneCollisionManager() = 0; virtual ISceneCollisionManager* getSceneCollisionManager() = 0;
//! Get pointer to the mesh manipulator. //! Get pointer to the mesh manipulator.
/** \return Pointer to the mesh manipulator /** \return Pointer to the mesh manipulator
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual IMeshManipulator *getMeshManipulator() = 0; virtual IMeshManipulator* getMeshManipulator() = 0;
//! Adds a scene node to the deletion queue. //! Adds a scene node to the deletion queue.
/** The scene node is immediately /** The scene node is immediately
@ -553,12 +557,12 @@ public:
deletion queue is not necessary. deletion queue is not necessary.
See ISceneManager::createDeleteAnimator() for details. See ISceneManager::createDeleteAnimator() for details.
\param node: Node to delete. */ \param node: Node to delete. */
virtual void addToDeletionQueue(ISceneNode *node) = 0; virtual void addToDeletionQueue(ISceneNode* node) = 0;
//! Posts an input event to the environment. //! Posts an input event to the environment.
/** Usually you do not have to /** Usually you do not have to
use this method, it is used by the internal engine. */ use this method, it is used by the internal engine. */
virtual bool postEventFromUser(const SEvent &event) = 0; virtual bool postEventFromUser(const SEvent& event) = 0;
//! Clears the whole scene. //! Clears the whole scene.
/** All scene nodes are removed. */ /** All scene nodes are removed. */
@ -567,7 +571,7 @@ public:
//! Get interface to the parameters set in this scene. //! Get interface to the parameters set in this scene.
/** String parameters can be used by plugins and mesh loaders. /** String parameters can be used by plugins and mesh loaders.
See COLLADA_CREATE_SCENE_INSTANCES and DMF_USE_MATERIALS_DIRS */ See COLLADA_CREATE_SCENE_INSTANCES and DMF_USE_MATERIALS_DIRS */
virtual io::IAttributes *getParameters() = 0; virtual io::IAttributes* getParameters() = 0;
//! Get current render pass. //! Get current render pass.
/** All scene nodes are being rendered in a specific order. /** All scene nodes are being rendered in a specific order.
@ -597,24 +601,29 @@ public:
If you no longer need the new scene manager, you should call If you no longer need the new scene manager, you should call
ISceneManager::drop(). ISceneManager::drop().
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual ISceneManager *createNewSceneManager(bool cloneContent = false) = 0; virtual ISceneManager* createNewSceneManager(bool cloneContent=false) = 0;
//! Get a mesh writer implementation if available
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
for details. */
virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type) = 0;
//! Get a skinned mesh, which is not available as header-only code //! Get a skinned mesh, which is not available as header-only code
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop() /** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
for details. */ for details. */
virtual ISkinnedMesh *createSkinnedMesh() = 0; virtual ISkinnedMesh* createSkinnedMesh() = 0;
//! Sets ambient color of the scene //! Sets ambient color of the scene
virtual void setAmbientLight(const video::SColorf &ambientColor) = 0; virtual void setAmbientLight(const video::SColorf &ambientColor) = 0;
//! Get ambient color of the scene //! Get ambient color of the scene
virtual const video::SColorf &getAmbientLight() const = 0; virtual const video::SColorf& getAmbientLight() const = 0;
//! Get current render pass. //! Get current render pass.
virtual E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const = 0; virtual E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const =0;
//! Set current render pass. //! Set current render pass.
virtual void setCurrentRenderPass(E_SCENE_NODE_RENDER_PASS nextPass) = 0; virtual void setCurrentRenderPass(E_SCENE_NODE_RENDER_PASS nextPass) =0;
//! Check if node is culled in current view frustum //! Check if node is culled in current view frustum
/** Please note that depending on the used culling method this /** Please note that depending on the used culling method this
@ -625,8 +634,12 @@ public:
\param node The scene node which is checked for culling. \param node The scene node which is checked for culling.
\return True if node is not visible in the current scene, else \return True if node is not visible in the current scene, else
false. */ false. */
virtual bool isCulled(const ISceneNode *node) const = 0; virtual bool isCulled(const ISceneNode* node) const =0;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_NODE_H_INCLUDED__
#define __I_SCENE_NODE_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
#include "ESceneNodeTypes.h" #include "ESceneNodeTypes.h"
@ -13,7 +14,6 @@
#include "aabbox3d.h" #include "aabbox3d.h"
#include "matrix4.h" #include "matrix4.h"
#include "IAttributes.h" #include "IAttributes.h"
#include <list> #include <list>
#include <optional> #include <optional>
@ -21,30 +21,30 @@ namespace irr
{ {
namespace scene namespace scene
{ {
class ISceneNode; class ISceneNode;
class ISceneManager; class ISceneManager;
//! Typedef for list of scene nodes //! Typedef for list of scene nodes
typedef std::list<ISceneNode *> ISceneNodeList; typedef std::list<ISceneNode*> ISceneNodeList;
//! Scene node interface.
/** A scene node is a node in the hierarchical scene graph. Every scene
node may have children, which are also scene nodes. Children move
relative to their parent's position. If the parent of a node is not
visible, its children won't be visible either. In this way, it is for
example easily possible to attach a light to a moving car, or to place
a walking character on a moving platform on a moving ship.
*/
class ISceneNode : virtual public IReferenceCounted
{
public:
//! Scene node interface.
/** A scene node is a node in the hierarchical scene graph. Every scene
node may have children, which are also scene nodes. Children move
relative to their parent's position. If the parent of a node is not
visible, its children won't be visible either. In this way, it is for
example easily possible to attach a light to a moving car, or to place
a walking character on a moving platform on a moving ship.
*/
class ISceneNode : virtual public IReferenceCounted
{
public:
//! Constructor //! Constructor
ISceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id = -1, ISceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id=-1,
const core::vector3df &position = core::vector3df(0, 0, 0), const core::vector3df& position = core::vector3df(0,0,0),
const core::vector3df &rotation = core::vector3df(0, 0, 0), const core::vector3df& rotation = core::vector3df(0,0,0),
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) : const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f))
RelativeTranslation(position), : RelativeTranslation(position), RelativeRotation(rotation), RelativeScale(scale),
RelativeRotation(rotation), RelativeScale(scale),
Parent(0), SceneManager(mgr), ID(id), Parent(0), SceneManager(mgr), ID(id),
AutomaticCullingState(EAC_BOX), DebugDataVisible(EDS_OFF), AutomaticCullingState(EAC_BOX), DebugDataVisible(EDS_OFF),
IsVisible(true), IsDebugObject(false) IsVisible(true), IsDebugObject(false)
@ -55,6 +55,7 @@ public:
updateAbsolutePosition(); updateAbsolutePosition();
} }
//! Destructor //! Destructor
virtual ~ISceneNode() virtual ~ISceneNode()
{ {
@ -62,6 +63,7 @@ public:
removeAll(); removeAll();
} }
//! This method is called just before the rendering process of the whole scene. //! This method is called just before the rendering process of the whole scene.
/** Nodes may register themselves in the render pipeline during this call, /** Nodes may register themselves in the render pipeline during this call,
precalculate the geometry which should be rendered, and prevent their precalculate the geometry which should be rendered, and prevent their
@ -78,13 +80,15 @@ public:
*/ */
virtual void OnRegisterSceneNode() virtual void OnRegisterSceneNode()
{ {
if (IsVisible) { if (IsVisible)
{
ISceneNodeList::iterator it = Children.begin(); ISceneNodeList::iterator it = Children.begin();
for (; it != Children.end(); ++it) for (; it != Children.end(); ++it)
(*it)->OnRegisterSceneNode(); (*it)->OnRegisterSceneNode();
} }
} }
//! OnAnimate() is called just before rendering the whole scene. //! OnAnimate() is called just before rendering the whole scene.
/** Nodes may calculate or store animations here, and may do other useful things, /** Nodes may calculate or store animations here, and may do other useful things,
depending on what they are. Also, OnAnimate() should be called for all depending on what they are. Also, OnAnimate() should be called for all
@ -93,7 +97,8 @@ public:
\param timeMs Current time in milliseconds. */ \param timeMs Current time in milliseconds. */
virtual void OnAnimate(u32 timeMs) virtual void OnAnimate(u32 timeMs)
{ {
if (IsVisible) { if (IsVisible)
{
// update absolute position // update absolute position
updateAbsolutePosition(); updateAbsolutePosition();
@ -105,23 +110,35 @@ public:
} }
} }
//! Renders the node. //! Renders the node.
virtual void render() = 0; virtual void render() = 0;
//! Returns the name of the node. //! Returns the name of the node.
/** \return Name as character string. */ /** \return Name as character string. */
virtual const std::optional<std::string> &getName() const virtual const c8* getName() const
{ {
return Name; return Name.c_str();
} }
//! Sets the name of the node. //! Sets the name of the node.
/** \param name New name of the scene node. */ /** \param name New name of the scene node. */
virtual void setName(const std::optional<std::string> &name) virtual void setName(const c8* name)
{ {
Name = name; Name = name;
} }
//! Sets the name of the node.
/** \param name New name of the scene node. */
virtual void setName(const core::stringc& name)
{
Name = name;
}
//! Get the axis aligned, not transformed bounding box of this node. //! Get the axis aligned, not transformed bounding box of this node.
/** This means that if this node is an animated 3d character, /** This means that if this node is an animated 3d character,
moving in a room, the bounding box will always be around the moving in a room, the bounding box will always be around the
@ -130,7 +147,8 @@ public:
getAbsoluteTransformation() or simply use getAbsoluteTransformation() or simply use
getTransformedBoundingBox(), which does the same. getTransformedBoundingBox(), which does the same.
\return The non-transformed bounding box. */ \return The non-transformed bounding box. */
virtual const core::aabbox3d<f32> &getBoundingBox() const = 0; virtual const core::aabbox3d<f32>& getBoundingBox() const = 0;
//! Get the axis aligned, transformed and animated absolute bounding box of this node. //! Get the axis aligned, transformed and animated absolute bounding box of this node.
/** Note: The result is still an axis-aligned bounding box, so it's size /** Note: The result is still an axis-aligned bounding box, so it's size
@ -148,12 +166,12 @@ public:
/** Note: The result is _not_ identical to getTransformedBoundingBox().getEdges(), /** Note: The result is _not_ identical to getTransformedBoundingBox().getEdges(),
but getting an aabbox3d of these edges would then be identical. but getting an aabbox3d of these edges would then be identical.
\param edges Receives an array with the transformed edges */ \param edges Receives an array with the transformed edges */
virtual void getTransformedBoundingBoxEdges(core::array<core::vector3d<f32>> &edges) const virtual void getTransformedBoundingBoxEdges(core::array< core::vector3d<f32> >& edges) const
{ {
edges.set_used(8); edges.set_used(8);
getBoundingBox().getEdges(edges.pointer()); getBoundingBox().getEdges( edges.pointer() );
for (u32 i = 0; i < 8; ++i) for ( u32 i=0; i<8; ++i )
AbsoluteTransformation.transformVect(edges[i]); AbsoluteTransformation.transformVect( edges[i] );
} }
//! Get the absolute transformation of the node. Is recalculated every OnAnimate()-call. //! Get the absolute transformation of the node. Is recalculated every OnAnimate()-call.
@ -163,11 +181,12 @@ public:
update usually happens once per frame in OnAnimate. You can enforce update usually happens once per frame in OnAnimate. You can enforce
an update with updateAbsolutePosition(). an update with updateAbsolutePosition().
\return The absolute transformation matrix. */ \return The absolute transformation matrix. */
virtual const core::matrix4 &getAbsoluteTransformation() const virtual const core::matrix4& getAbsoluteTransformation() const
{ {
return AbsoluteTransformation; return AbsoluteTransformation;
} }
//! Returns the relative transformation of the scene node. //! Returns the relative transformation of the scene node.
/** The relative transformation is stored internally as 3 /** The relative transformation is stored internally as 3
vectors: translation, rotation and scale. To get the relative vectors: translation, rotation and scale. To get the relative
@ -179,7 +198,8 @@ public:
mat.setRotationDegrees(RelativeRotation); mat.setRotationDegrees(RelativeRotation);
mat.setTranslation(RelativeTranslation); mat.setTranslation(RelativeTranslation);
if (RelativeScale != core::vector3df(1.f, 1.f, 1.f)) { if (RelativeScale != core::vector3df(1.f,1.f,1.f))
{
core::matrix4 smat; core::matrix4 smat;
smat.setScale(RelativeScale); smat.setScale(RelativeScale);
mat *= smat; mat *= smat;
@ -188,6 +208,7 @@ public:
return mat; return mat;
} }
//! Returns whether the node should be visible (if all of its parents are visible). //! Returns whether the node should be visible (if all of its parents are visible).
/** This is only an option set by the user, but has nothing to /** This is only an option set by the user, but has nothing to
do with geometry culling do with geometry culling
@ -203,10 +224,10 @@ public:
false if this or any parent node is invisible. */ false if this or any parent node is invisible. */
virtual bool isTrulyVisible() const virtual bool isTrulyVisible() const
{ {
if (!IsVisible) if(!IsVisible)
return false; return false;
if (!Parent) if(!Parent)
return true; return true;
return Parent->isTrulyVisible(); return Parent->isTrulyVisible();
@ -222,6 +243,7 @@ public:
IsVisible = isVisible; IsVisible = isVisible;
} }
//! Get the id of the scene node. //! Get the id of the scene node.
/** This id can be used to identify the node. /** This id can be used to identify the node.
\return The id. */ \return The id. */
@ -230,6 +252,7 @@ public:
return ID; return ID;
} }
//! Sets the id of the scene node. //! Sets the id of the scene node.
/** This id can be used to identify the node. /** This id can be used to identify the node.
\param id The new id. */ \param id The new id. */
@ -238,13 +261,15 @@ public:
ID = id; ID = id;
} }
//! Adds a child to this scene node. //! Adds a child to this scene node.
/** If the scene node already has a parent it is first removed /** If the scene node already has a parent it is first removed
from the other parent. from the other parent.
\param child A pointer to the new child. */ \param child A pointer to the new child. */
virtual void addChild(ISceneNode *child) virtual void addChild(ISceneNode* child)
{
if (child && (child != this))
{ {
if (child && (child != this)) {
// Change scene manager? // Change scene manager?
if (SceneManager != child->SceneManager) if (SceneManager != child->SceneManager)
child->setSceneManager(SceneManager); child->setSceneManager(SceneManager);
@ -257,12 +282,13 @@ public:
} }
} }
//! Removes a child from this scene node. //! Removes a child from this scene node.
/** /**
\param child A pointer to the child which shall be removed. \param child A pointer to the child which shall be removed.
\return True if the child was removed, and false if not, \return True if the child was removed, and false if not,
e.g. because it belongs to a different parent or no parent. */ e.g. because it belongs to a different parent or no parent. */
virtual bool removeChild(ISceneNode *child) virtual bool removeChild(ISceneNode* child)
{ {
if (child->Parent != this) if (child->Parent != this)
return false; return false;
@ -277,6 +303,7 @@ public:
return true; return true;
} }
//! Removes all children of this scene node //! Removes all children of this scene node
/** The scene nodes found in the children list are also dropped /** The scene nodes found in the children list are also dropped
and might be deleted if no other grab exists on them. and might be deleted if no other grab exists on them.
@ -291,6 +318,7 @@ public:
Children.clear(); Children.clear();
} }
//! Removes this scene node from the scene //! Removes this scene node from the scene
/** If no other grab exists for this node, it will be deleted. /** If no other grab exists for this node, it will be deleted.
*/ */
@ -300,6 +328,7 @@ public:
Parent->removeChild(this); Parent->removeChild(this);
} }
//! Returns the material based on the zero based index i. //! Returns the material based on the zero based index i.
/** To get the amount of materials used by this scene node, use /** To get the amount of materials used by this scene node, use
getMaterialCount(). This function is needed for inserting the getMaterialCount(). This function is needed for inserting the
@ -308,11 +337,12 @@ public:
directly modify the material of a scene node. directly modify the material of a scene node.
\param num Zero based index. The maximal value is getMaterialCount() - 1. \param num Zero based index. The maximal value is getMaterialCount() - 1.
\return The material at that index. */ \return The material at that index. */
virtual video::SMaterial &getMaterial(u32 num) virtual video::SMaterial& getMaterial(u32 num)
{ {
return video::IdentityMaterial; return video::IdentityMaterial;
} }
//! Get amount of materials used by this scene node. //! Get amount of materials used by this scene node.
/** \return Current amount of materials of this scene node. */ /** \return Current amount of materials of this scene node. */
virtual u32 getMaterialCount() const virtual u32 getMaterialCount() const
@ -320,69 +350,76 @@ public:
return 0; return 0;
} }
//! Execute a function on all materials of this scene node. //! Execute a function on all materials of this scene node.
/** Useful for setting material properties, e.g. if you want the whole /** Useful for setting material properties, e.g. if you want the whole
mesh to be affected by light. */ mesh to be affected by light. */
template <typename F> template <typename F>
void forEachMaterial(F &&fn) void forEachMaterial(F &&fn) {
{
for (u32 i = 0; i < getMaterialCount(); i++) { for (u32 i = 0; i < getMaterialCount(); i++) {
fn(getMaterial(i)); fn(getMaterial(i));
} }
} }
//! Gets the scale of the scene node relative to its parent. //! Gets the scale of the scene node relative to its parent.
/** This is the scale of this node relative to its parent. /** This is the scale of this node relative to its parent.
If you want the absolute scale, use If you want the absolute scale, use
getAbsoluteTransformation().getScale() getAbsoluteTransformation().getScale()
\return The scale of the scene node. */ \return The scale of the scene node. */
virtual const core::vector3df &getScale() const virtual const core::vector3df& getScale() const
{ {
return RelativeScale; return RelativeScale;
} }
//! Sets the relative scale of the scene node. //! Sets the relative scale of the scene node.
/** \param scale New scale of the node, relative to its parent. */ /** \param scale New scale of the node, relative to its parent. */
virtual void setScale(const core::vector3df &scale) virtual void setScale(const core::vector3df& scale)
{ {
RelativeScale = scale; RelativeScale = scale;
} }
//! Gets the rotation of the node relative to its parent. //! Gets the rotation of the node relative to its parent.
/** Note that this is the relative rotation of the node. /** Note that this is the relative rotation of the node.
If you want the absolute rotation, use If you want the absolute rotation, use
getAbsoluteTransformation().getRotation() getAbsoluteTransformation().getRotation()
\return Current relative rotation of the scene node. */ \return Current relative rotation of the scene node. */
virtual const core::vector3df &getRotation() const virtual const core::vector3df& getRotation() const
{ {
return RelativeRotation; return RelativeRotation;
} }
//! Sets the rotation of the node relative to its parent. //! Sets the rotation of the node relative to its parent.
/** This only modifies the relative rotation of the node. /** This only modifies the relative rotation of the node.
\param rotation New rotation of the node in degrees. */ \param rotation New rotation of the node in degrees. */
virtual void setRotation(const core::vector3df &rotation) virtual void setRotation(const core::vector3df& rotation)
{ {
RelativeRotation = rotation; RelativeRotation = rotation;
} }
//! Gets the position of the node relative to its parent. //! Gets the position of the node relative to its parent.
/** Note that the position is relative to the parent. If you want /** Note that the position is relative to the parent. If you want
the position in world coordinates, use getAbsolutePosition() instead. the position in world coordinates, use getAbsolutePosition() instead.
\return The current position of the node relative to the parent. */ \return The current position of the node relative to the parent. */
virtual const core::vector3df &getPosition() const virtual const core::vector3df& getPosition() const
{ {
return RelativeTranslation; return RelativeTranslation;
} }
//! Sets the position of the node relative to its parent. //! Sets the position of the node relative to its parent.
/** Note that the position is relative to the parent. /** Note that the position is relative to the parent.
\param newpos New relative position of the scene node. */ \param newpos New relative position of the scene node. */
virtual void setPosition(const core::vector3df &newpos) virtual void setPosition(const core::vector3df& newpos)
{ {
RelativeTranslation = newpos; RelativeTranslation = newpos;
} }
//! Gets the absolute position of the node in world coordinates. //! Gets the absolute position of the node in world coordinates.
/** If you want the position of the node relative to its parent, /** If you want the position of the node relative to its parent,
use getPosition() instead. use getPosition() instead.
@ -397,17 +434,19 @@ public:
return AbsoluteTransformation.getTranslation(); return AbsoluteTransformation.getTranslation();
} }
//! Set a culling style or disable culling completely. //! Set a culling style or disable culling completely.
/** Box cullling (EAC_BOX) is set by default. Note that not /** Box cullling (EAC_BOX) is set by default. Note that not
all SceneNodes support culling and that some nodes always cull all SceneNodes support culling and that some nodes always cull
their geometry because it is their only reason for existence, their geometry because it is their only reason for existence,
for example the OctreeSceneNode. for example the OctreeSceneNode.
\param state The culling state to be used. Check E_CULLING_TYPE for possible values.*/ \param state The culling state to be used. Check E_CULLING_TYPE for possible values.*/
void setAutomaticCulling(u32 state) void setAutomaticCulling( u32 state)
{ {
AutomaticCullingState = state; AutomaticCullingState = state;
} }
//! Gets the automatic culling state. //! Gets the automatic culling state.
/** \return The automatic culling state. */ /** \return The automatic culling state. */
u32 getAutomaticCulling() const u32 getAutomaticCulling() const
@ -415,6 +454,7 @@ public:
return AutomaticCullingState; return AutomaticCullingState;
} }
//! Sets if debug data like bounding boxes should be drawn. //! Sets if debug data like bounding boxes should be drawn.
/** A bitwise OR of the types from @ref irr::scene::E_DEBUG_SCENE_TYPE. /** A bitwise OR of the types from @ref irr::scene::E_DEBUG_SCENE_TYPE.
Please note that not all scene nodes support all debug data types. Please note that not all scene nodes support all debug data types.
@ -432,6 +472,7 @@ public:
return DebugDataVisible; return DebugDataVisible;
} }
//! Sets if this scene node is a debug object. //! Sets if this scene node is a debug object.
/** Debug objects have some special properties, for example they can be easily /** Debug objects have some special properties, for example they can be easily
excluded from collision detection or from serialization, etc. */ excluded from collision detection or from serialization, etc. */
@ -440,6 +481,7 @@ public:
IsDebugObject = debugObject; IsDebugObject = debugObject;
} }
//! Returns if this scene node is a debug object. //! Returns if this scene node is a debug object.
/** Debug objects have some special properties, for example they can be easily /** Debug objects have some special properties, for example they can be easily
excluded from collision detection or from serialization, etc. excluded from collision detection or from serialization, etc.
@ -449,16 +491,18 @@ public:
return IsDebugObject; return IsDebugObject;
} }
//! Returns a const reference to the list of all children. //! Returns a const reference to the list of all children.
/** \return The list of all children of this node. */ /** \return The list of all children of this node. */
const std::list<ISceneNode *> &getChildren() const const std::list<ISceneNode*>& getChildren() const
{ {
return Children; return Children;
} }
//! Changes the parent of the scene node. //! Changes the parent of the scene node.
/** \param newParent The new parent to be used. */ /** \param newParent The new parent to be used. */
virtual void setParent(ISceneNode *newParent) virtual void setParent(ISceneNode* newParent)
{ {
grab(); grab();
remove(); remove();
@ -469,25 +513,30 @@ public:
drop(); drop();
} }
//! Updates the absolute position based on the relative and the parents position //! Updates the absolute position based on the relative and the parents position
/** Note: This does not recursively update the parents absolute positions, so if you have a deeper /** Note: This does not recursively update the parents absolute positions, so if you have a deeper
hierarchy you might want to update the parents first.*/ hierarchy you might want to update the parents first.*/
virtual void updateAbsolutePosition() virtual void updateAbsolutePosition()
{ {
if (Parent) { if (Parent)
{
AbsoluteTransformation = AbsoluteTransformation =
Parent->getAbsoluteTransformation() * getRelativeTransformation(); Parent->getAbsoluteTransformation() * getRelativeTransformation();
} else }
else
AbsoluteTransformation = getRelativeTransformation(); AbsoluteTransformation = getRelativeTransformation();
} }
//! Returns the parent of this scene node //! Returns the parent of this scene node
/** \return A pointer to the parent. */ /** \return A pointer to the parent. */
scene::ISceneNode *getParent() const scene::ISceneNode* getParent() const
{ {
return Parent; return Parent;
} }
//! Returns type of the scene node //! Returns type of the scene node
/** \return The type of this node. */ /** \return The type of this node. */
virtual ESCENE_NODE_TYPE getType() const virtual ESCENE_NODE_TYPE getType() const
@ -499,22 +548,23 @@ public:
/** \param newParent An optional new parent. /** \param newParent An optional new parent.
\param newManager An optional new scene manager. \param newManager An optional new scene manager.
\return The newly created clone of this node. */ \return The newly created clone of this node. */
virtual ISceneNode *clone(ISceneNode *newParent = 0, ISceneManager *newManager = 0) virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0)
{ {
return 0; // to be implemented by derived classes return 0; // to be implemented by derived classes
} }
//! Retrieve the scene manager for this node. //! Retrieve the scene manager for this node.
/** \return The node's scene manager. */ /** \return The node's scene manager. */
virtual ISceneManager *getSceneManager(void) const { return SceneManager; } virtual ISceneManager* getSceneManager(void) const { return SceneManager; }
protected:
protected:
//! A clone function for the ISceneNode members. //! A clone function for the ISceneNode members.
/** This method can be used by clone() implementations of /** This method can be used by clone() implementations of
derived classes derived classes
\param toCopyFrom The node from which the values are copied \param toCopyFrom The node from which the values are copied
\param newManager The new scene manager. */ \param newManager The new scene manager. */
void cloneMembers(ISceneNode *toCopyFrom, ISceneManager *newManager) void cloneMembers(ISceneNode* toCopyFrom, ISceneManager* newManager)
{ {
Name = toCopyFrom->Name; Name = toCopyFrom->Name;
AbsoluteTransformation = toCopyFrom->AbsoluteTransformation; AbsoluteTransformation = toCopyFrom->AbsoluteTransformation;
@ -541,7 +591,7 @@ protected:
//! Sets the new scene manager for this node and all children. //! Sets the new scene manager for this node and all children.
//! Called by addChild when moving nodes between scene managers //! Called by addChild when moving nodes between scene managers
void setSceneManager(ISceneManager *newManager) void setSceneManager(ISceneManager* newManager)
{ {
SceneManager = newManager; SceneManager = newManager;
@ -551,7 +601,7 @@ protected:
} }
//! Name of the scene node. //! Name of the scene node.
std::optional<std::string> Name; core::stringc Name;
//! Absolute transformation of the node. //! Absolute transformation of the node.
core::matrix4 AbsoluteTransformation; core::matrix4 AbsoluteTransformation;
@ -566,16 +616,16 @@ protected:
core::vector3df RelativeScale; core::vector3df RelativeScale;
//! List of all children of this node //! List of all children of this node
std::list<ISceneNode *> Children; std::list<ISceneNode*> Children;
//! Iterator pointing to this node in the parent's child list. //! Iterator pointing to this node in the parent's child list.
std::optional<ISceneNodeList::iterator> ThisIterator; std::optional<ISceneNodeList::iterator> ThisIterator;
//! Pointer to the parent //! Pointer to the parent
ISceneNode *Parent; ISceneNode* Parent;
//! Pointer to the scene manager //! Pointer to the scene manager
ISceneManager *SceneManager; ISceneManager* SceneManager;
//! ID of the node. //! ID of the node.
s32 ID; s32 ID;
@ -591,7 +641,11 @@ protected:
//! Is debug object? //! Is debug object?
bool IsDebugObject; bool IsDebugObject;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_SHADER_CONSTANT_SET_CALLBACT_H_INCLUDED__
#define __I_SHADER_CONSTANT_SET_CALLBACT_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
@ -10,8 +11,8 @@ namespace irr
{ {
namespace video namespace video
{ {
class IMaterialRendererServices; class IMaterialRendererServices;
class SMaterial; class SMaterial;
//! Interface making it possible to set constants for gpu programs every frame. //! Interface making it possible to set constants for gpu programs every frame.
/** Implement this interface in an own class and pass a pointer to it to one of /** Implement this interface in an own class and pass a pointer to it to one of
@ -20,6 +21,7 @@ OnSetConstants method will be called every frame now. */
class IShaderConstantSetCallBack : public virtual IReferenceCounted class IShaderConstantSetCallBack : public virtual IReferenceCounted
{ {
public: public:
//! Called to let the callBack know the used material (optional method) //! Called to let the callBack know the used material (optional method)
/** /**
\code \code
@ -39,7 +41,7 @@ public:
} }
\endcode \endcode
*/ */
virtual void OnSetMaterial(const SMaterial &material) {} virtual void OnSetMaterial(const SMaterial& material) { }
//! Called by the engine when the vertex and/or pixel shader constants for an material renderer should be set. //! Called by the engine when the vertex and/or pixel shader constants for an material renderer should be set.
/** /**
@ -72,8 +74,12 @@ public:
\param services: Pointer to an interface providing methods to set the constants for the shader. \param services: Pointer to an interface providing methods to set the constants for the shader.
\param userData: Userdata int which can be specified when creating the shader. \param userData: Userdata int which can be specified when creating the shader.
*/ */
virtual void OnSetConstants(IMaterialRendererServices *services, s32 userData) = 0; virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData) = 0;
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,22 +2,21 @@
// 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_SKINNED_MESH_H_INCLUDED__
#define __I_SKINNED_MESH_H_INCLUDED__
#include "irrArray.h" #include "irrArray.h"
#include "IBoneSceneNode.h" #include "IBoneSceneNode.h"
#include "IAnimatedMesh.h" #include "IAnimatedMesh.h"
#include "SSkinMeshBuffer.h" #include "SSkinMeshBuffer.h"
#include <optional>
namespace irr namespace irr
{ {
namespace scene namespace scene
{ {
enum E_INTERPOLATION_MODE enum E_INTERPOLATION_MODE
{ {
// constant does use the current key-values without interpolation // constant does use the current key-values without interpolation
EIM_CONSTANT = 0, EIM_CONSTANT = 0,
@ -26,12 +25,14 @@ enum E_INTERPOLATION_MODE
//! count of all available interpolation modes //! count of all available interpolation modes
EIM_COUNT EIM_COUNT
}; };
//! Interface for using some special functions of Skinned meshes
class ISkinnedMesh : public IAnimatedMesh
{
public:
//! Interface for using some special functions of Skinned meshes
class ISkinnedMesh : public IAnimatedMesh
{
public:
//! Gets joint count. //! Gets joint count.
/** \return Amount of joints in the skeletal animated mesh. */ /** \return Amount of joints in the skeletal animated mesh. */
virtual u32 getJointCount() const = 0; virtual u32 getJointCount() const = 0;
@ -40,12 +41,12 @@ public:
/** \param number: Zero based index of joint. The last joint /** \param number: Zero based index of joint. The last joint
has the number getJointCount()-1; has the number getJointCount()-1;
\return Name of joint and null if an error happened. */ \return Name of joint and null if an error happened. */
virtual const std::optional<std::string> &getJointName(u32 number) const = 0; virtual const c8* getJointName(u32 number) const = 0;
//! Gets a joint number from its name //! Gets a joint number from its name
/** \param name: Name of the joint. /** \param name: Name of the joint.
\return Number of the joint or std::nullopt if not found. */ \return Number of the joint or -1 if not found. */
virtual std::optional<u32> getJointNumber(const std::string &name) const = 0; virtual s32 getJointNumber(const c8* name) const = 0;
//! Use animation from another mesh //! Use animation from another mesh
/** The animation is linked (not copied) based on joint names /** The animation is linked (not copied) based on joint names
@ -65,7 +66,7 @@ public:
virtual void setInterpolationMode(E_INTERPOLATION_MODE mode) = 0; virtual void setInterpolationMode(E_INTERPOLATION_MODE mode) = 0;
//! Animates this mesh's joints based on frame input //! Animates this mesh's joints based on frame input
virtual void animateMesh(f32 frame, f32 blend) = 0; virtual void animateMesh(f32 frame, f32 blend)=0;
//! Preforms a software skin on this mesh based of joint positions //! Preforms a software skin on this mesh based of joint positions
virtual void skinMesh() = 0; virtual void skinMesh() = 0;
@ -88,10 +89,10 @@ public:
struct SWeight struct SWeight
{ {
//! Index of the mesh buffer //! Index of the mesh buffer
u16 buffer_id; // I doubt 32bits is needed u16 buffer_id; //I doubt 32bits is needed
//! Index of the vertex //! Index of the vertex
u32 vertex_id; // Store global ID here u32 vertex_id; //Store global ID here
//! Weight Strength/Percentage (0-1) //! Weight Strength/Percentage (0-1)
f32 strength; f32 strength;
@ -104,6 +105,7 @@ public:
core::vector3df StaticNormal; core::vector3df StaticNormal;
}; };
//! Animation keyframe which describes a new position //! Animation keyframe which describes a new position
struct SPositionKey struct SPositionKey
{ {
@ -128,20 +130,19 @@ public:
//! Joints //! Joints
struct SJoint struct SJoint
{ {
SJoint() : SJoint() : UseAnimationFrom(0), GlobalSkinningSpace(false),
UseAnimationFrom(0), GlobalSkinningSpace(false), positionHint(-1),scaleHint(-1),rotationHint(-1)
positionHint(-1), scaleHint(-1), rotationHint(-1)
{ {
} }
//! The name of this joint //! The name of this joint
std::optional<std::string> Name; core::stringc Name;
//! Local matrix of this joint //! Local matrix of this joint
core::matrix4 LocalMatrix; core::matrix4 LocalMatrix;
//! List of child joints //! List of child joints
core::array<SJoint *> Children; core::array<SJoint*> Children;
//! List of attached meshes //! List of attached meshes
core::array<u32> AttachedMeshes; core::array<u32> AttachedMeshes;
@ -166,7 +167,7 @@ public:
core::vector3df Animatedscale; core::vector3df Animatedscale;
core::quaternion Animatedrotation; core::quaternion Animatedrotation;
core::matrix4 GlobalInversedMatrix; // the x format pre-calculates this core::matrix4 GlobalInversedMatrix; //the x format pre-calculates this
private: private:
//! Internal members used by CSkinnedMesh //! Internal members used by CSkinnedMesh
@ -180,41 +181,45 @@ public:
s32 rotationHint; s32 rotationHint;
}; };
// Interface for the mesh loaders (finalize should lock these functions, and they should have some prefix like loader_
// these functions will use the needed arrays, set values, etc to help the loaders //Interface for the mesh loaders (finalize should lock these functions, and they should have some prefix like loader_
//these functions will use the needed arrays, set values, etc to help the loaders
//! exposed for loaders: to add mesh buffers //! exposed for loaders: to add mesh buffers
virtual core::array<SSkinMeshBuffer *> &getMeshBuffers() = 0; virtual core::array<SSkinMeshBuffer*>& getMeshBuffers() = 0;
//! exposed for loaders: joints list //! exposed for loaders: joints list
virtual core::array<SJoint *> &getAllJoints() = 0; virtual core::array<SJoint*>& getAllJoints() = 0;
//! exposed for loaders: joints list //! exposed for loaders: joints list
virtual const core::array<SJoint *> &getAllJoints() const = 0; virtual const core::array<SJoint*>& getAllJoints() const = 0;
//! loaders should call this after populating the mesh //! loaders should call this after populating the mesh
virtual void finalize() = 0; virtual void finalize() = 0;
//! Adds a new meshbuffer to the mesh, access it as last one //! Adds a new meshbuffer to the mesh, access it as last one
virtual SSkinMeshBuffer *addMeshBuffer() = 0; virtual SSkinMeshBuffer* addMeshBuffer() = 0;
//! Adds a new joint to the mesh, access it as last one //! Adds a new joint to the mesh, access it as last one
virtual SJoint *addJoint(SJoint *parent = 0) = 0; virtual SJoint* addJoint(SJoint *parent=0) = 0;
//! Adds a new weight to the mesh, access it as last one //! Adds a new weight to the mesh, access it as last one
virtual SWeight *addWeight(SJoint *joint) = 0; virtual SWeight* addWeight(SJoint *joint) = 0;
//! Adds a new position key to the mesh, access it as last one //! Adds a new position key to the mesh, access it as last one
virtual SPositionKey *addPositionKey(SJoint *joint) = 0; virtual SPositionKey* addPositionKey(SJoint *joint) = 0;
//! Adds a new scale key to the mesh, access it as last one //! Adds a new scale key to the mesh, access it as last one
virtual SScaleKey *addScaleKey(SJoint *joint) = 0; virtual SScaleKey* addScaleKey(SJoint *joint) = 0;
//! Adds a new rotation key to the mesh, access it as last one //! Adds a new rotation key to the mesh, access it as last one
virtual SRotationKey *addRotationKey(SJoint *joint) = 0; virtual SRotationKey* addRotationKey(SJoint *joint) = 0;
//! Check if the mesh is non-animated //! Check if the mesh is non-animated
virtual bool isStatic() = 0; virtual bool isStatic()=0;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_TEXTURE_H_INCLUDED__
#define __I_TEXTURE_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
#include "IImage.h" #include "IImage.h"
@ -16,6 +17,7 @@ namespace irr
namespace video namespace video
{ {
//! Enumeration flags used to tell the video driver with setTextureCreationFlag in which format textures should be created. //! Enumeration flags used to tell the video driver with setTextureCreationFlag in which format textures should be created.
enum E_TEXTURE_CREATION_FLAG enum E_TEXTURE_CREATION_FLAG
{ {
@ -175,9 +177,9 @@ and write a warning or an error message to the output buffer.
class ITexture : public virtual IReferenceCounted class ITexture : public virtual IReferenceCounted
{ {
public: public:
//! constructor //! constructor
ITexture(const io::path &name, E_TEXTURE_TYPE type) : ITexture(const io::path& name, E_TEXTURE_TYPE type) : NamedPath(name), DriverType(EDT_NULL), OriginalColorFormat(ECF_UNKNOWN),
NamedPath(name), DriverType(EDT_NULL), OriginalColorFormat(ECF_UNKNOWN),
ColorFormat(ECF_UNKNOWN), Pitch(0), HasMipMaps(false), IsRenderTarget(false), Source(ETS_UNKNOWN), Type(type) ColorFormat(ECF_UNKNOWN), Pitch(0), HasMipMaps(false), IsRenderTarget(false), Source(ETS_UNKNOWN), Type(type)
{ {
} }
@ -205,7 +207,7 @@ public:
\return Returns a pointer to the pixel data. The format of the pixel can \return Returns a pointer to the pixel data. The format of the pixel can
be determined by using getColorFormat(). 0 is returned, if be determined by using getColorFormat(). 0 is returned, if
the texture cannot be locked. */ the texture cannot be locked. */
virtual void *lock(E_TEXTURE_LOCK_MODE mode = ETLM_READ_WRITE, u32 mipmapLevel = 0, u32 layer = 0, E_TEXTURE_LOCK_FLAGS lockFlags = ETLF_FLIP_Y_UP_RTT) = 0; virtual void* lock(E_TEXTURE_LOCK_MODE mode = ETLM_READ_WRITE, u32 mipmapLevel=0, u32 layer = 0, E_TEXTURE_LOCK_FLAGS lockFlags = ETLF_FLIP_Y_UP_RTT) = 0;
//! Unlock function. Must be called after a lock() to the texture. //! Unlock function. Must be called after a lock() to the texture.
/** One should avoid to call unlock more than once before another lock. /** One should avoid to call unlock more than once before another lock.
@ -222,7 +224,7 @@ public:
level. At least one pixel will be always kept. level. At least one pixel will be always kept.
\param layer It informs a texture about which cubemap or texture array layer \param layer It informs a texture about which cubemap or texture array layer
needs mipmap regeneration. */ needs mipmap regeneration. */
virtual void regenerateMipMapLevels(void *data = 0, u32 layer = 0) = 0; virtual void regenerateMipMapLevels(void* data = 0, u32 layer = 0) = 0;
//! Get original size of the texture. //! Get original size of the texture.
/** The texture is usually scaled, if it was created with an unoptimal /** The texture is usually scaled, if it was created with an unoptimal
@ -232,11 +234,11 @@ public:
exact size of the original texture. Use ITexture::getSize() if you want exact size of the original texture. Use ITexture::getSize() if you want
to know the real size it has now stored in the system. to know the real size it has now stored in the system.
\return The original size of the texture. */ \return The original size of the texture. */
const core::dimension2d<u32> &getOriginalSize() const { return OriginalSize; }; const core::dimension2d<u32>& getOriginalSize() const { return OriginalSize; };
//! Get dimension (=size) of the texture. //! Get dimension (=size) of the texture.
/** \return The size of the texture. */ /** \return The size of the texture. */
const core::dimension2d<u32> &getSize() const { return Size; }; const core::dimension2d<u32>& getSize() const { return Size; };
//! Get driver type of texture. //! Get driver type of texture.
/** This is the driver, which created the texture. This method is used /** This is the driver, which created the texture. This method is used
@ -273,7 +275,7 @@ public:
bool isRenderTarget() const { return IsRenderTarget; } bool isRenderTarget() const { return IsRenderTarget; }
//! Get name of texture (in most cases this is the filename) //! Get name of texture (in most cases this is the filename)
const io::SNamedPath &getName() const { return NamedPath; } const io::SNamedPath& getName() const { return NamedPath; }
//! Check where the last IVideoDriver::getTexture found this texture //! Check where the last IVideoDriver::getTexture found this texture
E_TEXTURE_SOURCE getSource() const { return Source; } E_TEXTURE_SOURCE getSource() const { return Source; }
@ -286,7 +288,8 @@ public:
{ {
bool status = false; bool status = false;
switch (ColorFormat) { switch (ColorFormat)
{
case ECF_A8R8G8B8: case ECF_A8R8G8B8:
case ECF_A1R5G5B5: case ECF_A1R5G5B5:
case ECF_A16B16G16R16F: case ECF_A16B16G16R16F:
@ -304,6 +307,7 @@ public:
E_TEXTURE_TYPE getType() const { return Type; } E_TEXTURE_TYPE getType() const { return Type; }
protected: protected:
//! Helper function, helps to get the desired texture creation format from the flags. //! Helper function, helps to get the desired texture creation format from the flags.
/** \return Either ETCF_ALWAYS_32_BIT, ETCF_ALWAYS_16_BIT, /** \return Either ETCF_ALWAYS_32_BIT, ETCF_ALWAYS_16_BIT,
ETCF_OPTIMIZED_FOR_QUALITY, or ETCF_OPTIMIZED_FOR_SPEED. */ ETCF_OPTIMIZED_FOR_QUALITY, or ETCF_OPTIMIZED_FOR_SPEED. */
@ -333,5 +337,9 @@ protected:
E_TEXTURE_TYPE Type; E_TEXTURE_TYPE Type;
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_TIMER_H_INCLUDED__
#define __I_TIMER_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
@ -63,3 +64,5 @@ public:
}; };
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_VERTEX_BUFFER_H_INCLUDED__
#define __I_VERTEX_BUFFER_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
#include "irrArray.h" #include "irrArray.h"
@ -14,35 +15,39 @@ namespace irr
namespace scene namespace scene
{ {
class IVertexBuffer : public virtual IReferenceCounted class IVertexBuffer : public virtual IReferenceCounted
{ {
public: public:
virtual void *getData() = 0; virtual void* getData() =0;
virtual video::E_VERTEX_TYPE getType() const = 0; virtual video::E_VERTEX_TYPE getType() const =0;
virtual void setType(video::E_VERTEX_TYPE vertexType) = 0; virtual void setType(video::E_VERTEX_TYPE vertexType) =0;
virtual u32 stride() const = 0; virtual u32 stride() const =0;
virtual u32 size() const = 0; virtual u32 size() const =0;
virtual void push_back(const video::S3DVertex &element) = 0; virtual void push_back(const video::S3DVertex &element) =0;
virtual video::S3DVertex &operator[](const u32 index) const = 0; virtual video::S3DVertex& operator [](const u32 index) const =0;
virtual video::S3DVertex &getLast() = 0; virtual video::S3DVertex& getLast() =0;
virtual void set_used(u32 usedNow) = 0; virtual void set_used(u32 usedNow) =0;
virtual void reallocate(u32 new_size) = 0; virtual void reallocate(u32 new_size) =0;
virtual u32 allocated_size() const = 0; virtual u32 allocated_size() const =0;
virtual video::S3DVertex *pointer() = 0; virtual video::S3DVertex* pointer() =0;
//! get the current hardware mapping hint //! get the current hardware mapping hint
virtual E_HARDWARE_MAPPING getHardwareMappingHint() const = 0; virtual E_HARDWARE_MAPPING getHardwareMappingHint() const =0;
//! set the hardware mapping hint, for driver //! set the hardware mapping hint, for driver
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING NewMappingHint) = 0; virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) =0;
//! flags the meshbuffer as changed, reloads hardware buffers //! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty() = 0; virtual void setDirty() =0;
//! Get the currently used ID for identification of changes. //! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ /** This shouldn't be used for anything outside the VideoDriver. */
virtual u32 getChangedID() const = 0; virtual u32 getChangedID() const = 0;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -13,6 +13,7 @@
#include "dimension2d.h" #include "dimension2d.h"
#include "position2d.h" #include "position2d.h"
#include "IMeshBuffer.h" #include "IMeshBuffer.h"
#include "triangle3d.h"
#include "EDriverTypes.h" #include "EDriverTypes.h"
#include "EDriverFeatures.h" #include "EDriverFeatures.h"
#include "SExposedVideoData.h" #include "SExposedVideoData.h"
@ -22,32 +23,32 @@ namespace irr
{ {
namespace io namespace io
{ {
class IAttributes; class IAttributes;
class IReadFile; class IReadFile;
class IWriteFile; class IWriteFile;
} // end namespace io } // end namespace io
namespace scene namespace scene
{ {
class IMeshBuffer; class IMeshBuffer;
class IMesh; class IMesh;
class IMeshManipulator; class IMeshManipulator;
class ISceneNode; class ISceneNode;
} // end namespace scene } // end namespace scene
namespace video namespace video
{ {
struct S3DVertex; struct S3DVertex;
struct S3DVertex2TCoords; struct S3DVertex2TCoords;
struct S3DVertexTangents; struct S3DVertexTangents;
class IImageLoader; class IImageLoader;
class IImageWriter; class IImageWriter;
class IMaterialRenderer; class IMaterialRenderer;
class IGPUProgrammingServices; class IGPUProgrammingServices;
class IRenderTarget; class IRenderTarget;
//! enumeration for geometry transformation states //! enumeration for geometry transformation states
enum E_TRANSFORMATION_STATE enum E_TRANSFORMATION_STATE
{ {
//! View transformation //! View transformation
ETS_VIEW = 0, ETS_VIEW = 0,
//! World transformation //! World transformation
@ -59,14 +60,14 @@ enum E_TRANSFORMATION_STATE
ETS_TEXTURE_0, ETS_TEXTURE_0,
//! Only used internally //! Only used internally
ETS_COUNT = ETS_TEXTURE_0 + MATERIAL_MAX_TEXTURES ETS_COUNT = ETS_TEXTURE_0 + MATERIAL_MAX_TEXTURES
}; };
//! Special render targets, which usually map to dedicated hardware //! Special render targets, which usually map to dedicated hardware
/** These render targets (besides 0 and 1) need not be supported by gfx cards */ /** These render targets (besides 0 and 1) need not be supported by gfx cards */
enum E_RENDER_TARGET enum E_RENDER_TARGET
{ {
//! Render target is the main color frame buffer //! Render target is the main color frame buffer
ERT_FRAME_BUFFER = 0, ERT_FRAME_BUFFER=0,
//! Render target is a render texture //! Render target is a render texture
ERT_RENDER_TEXTURE, ERT_RENDER_TEXTURE,
//! Multi-Render target textures //! Multi-Render target textures
@ -87,44 +88,46 @@ enum E_RENDER_TARGET
ERT_AUX_BUFFER3, ERT_AUX_BUFFER3,
//! Auxiliary buffer 4 //! Auxiliary buffer 4
ERT_AUX_BUFFER4 ERT_AUX_BUFFER4
}; };
//! Enum for the flags of clear buffer //! Enum for the flags of clear buffer
enum E_CLEAR_BUFFER_FLAG enum E_CLEAR_BUFFER_FLAG
{ {
ECBF_NONE = 0, ECBF_NONE = 0,
ECBF_COLOR = 1, ECBF_COLOR = 1,
ECBF_DEPTH = 2, ECBF_DEPTH = 2,
ECBF_STENCIL = 4, ECBF_STENCIL = 4,
ECBF_ALL = ECBF_COLOR | ECBF_DEPTH | ECBF_STENCIL ECBF_ALL = ECBF_COLOR|ECBF_DEPTH|ECBF_STENCIL
}; };
//! Enum for the types of fog distributions to choose from //! Enum for the types of fog distributions to choose from
enum E_FOG_TYPE enum E_FOG_TYPE
{ {
EFT_FOG_EXP = 0, EFT_FOG_EXP=0,
EFT_FOG_LINEAR, EFT_FOG_LINEAR,
EFT_FOG_EXP2 EFT_FOG_EXP2
}; };
const c8 *const FogTypeNames[] = { const c8* const FogTypeNames[] =
{
"FogExp", "FogExp",
"FogLinear", "FogLinear",
"FogExp2", "FogExp2",
0, 0
}; };
//! Interface to driver which is able to perform 2d and 3d graphics functions. //! Interface to driver which is able to perform 2d and 3d graphics functions.
/** This interface is one of the most important interfaces of /** This interface is one of the most important interfaces of
the Irrlicht Engine: All rendering and texture manipulation is done with the Irrlicht Engine: All rendering and texture manipulation is done with
this interface. You are able to use the Irrlicht Engine by only this interface. You are able to use the Irrlicht Engine by only
invoking methods of this interface if you like to, although the invoking methods of this interface if you like to, although the
irr::scene::ISceneManager interface provides a lot of powerful classes irr::scene::ISceneManager interface provides a lot of powerful classes
and methods to make the programmer's life easier. and methods to make the programmer's life easier.
*/ */
class IVideoDriver : public virtual IReferenceCounted class IVideoDriver : public virtual IReferenceCounted
{ {
public: public:
//! Applications must call this method before performing any rendering. //! Applications must call this method before performing any rendering.
/** This method can clear the back- and the z-buffer. /** This method can clear the back- and the z-buffer.
\param clearFlag A combination of the E_CLEAR_BUFFER_FLAG bit-flags. \param clearFlag A combination of the E_CLEAR_BUFFER_FLAG bit-flags.
@ -139,12 +142,12 @@ public:
rectangle of the area to be presented. Set to null to present rectangle of the area to be presented. Set to null to present
everything. Note: not implemented in all devices. everything. Note: not implemented in all devices.
\return False if failed. */ \return False if failed. */
virtual bool beginScene(u16 clearFlag = (u16)(ECBF_COLOR | ECBF_DEPTH), SColor clearColor = SColor(255, 0, 0, 0), f32 clearDepth = 1.f, u8 clearStencil = 0, virtual bool beginScene(u16 clearFlag=(u16)(ECBF_COLOR|ECBF_DEPTH), SColor clearColor = SColor(255,0,0,0), f32 clearDepth = 1.f, u8 clearStencil = 0,
const SExposedVideoData &videoData = SExposedVideoData(), core::rect<s32> *sourceRect = 0) = 0; const SExposedVideoData& videoData=SExposedVideoData(), core::rect<s32>* sourceRect = 0) = 0;
//! Alternative beginScene implementation. Can't clear stencil buffer, but otherwise identical to other beginScene //! Alternative beginScene implementation. Can't clear stencil buffer, but otherwise identical to other beginScene
bool beginScene(bool backBuffer, bool zBuffer, SColor color = SColor(255, 0, 0, 0), bool beginScene(bool backBuffer, bool zBuffer, SColor color = SColor(255,0,0,0),
const SExposedVideoData &videoData = SExposedVideoData(), core::rect<s32> *sourceRect = 0) const SExposedVideoData& videoData = SExposedVideoData(), core::rect<s32>* sourceRect = 0)
{ {
u16 flag = 0; u16 flag = 0;
@ -167,14 +170,14 @@ public:
/** Returns true if a feature is available /** Returns true if a feature is available
\param feature Feature to query. \param feature Feature to query.
\return True if the feature is available, false if not. */ \return True if the feature is available, false if not. */
virtual bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const = 0; virtual bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const =0;
//! Disable a feature of the driver. //! Disable a feature of the driver.
/** Can also be used to enable the features again. It is not /** Can also be used to enable the features again. It is not
possible to enable unsupported features this way, though. possible to enable unsupported features this way, though.
\param feature Feature to disable. \param feature Feature to disable.
\param flag When true the feature is disabled, otherwise it is enabled. */ \param flag When true the feature is disabled, otherwise it is enabled. */
virtual void disableFeature(E_VIDEO_DRIVER_FEATURE feature, bool flag = true) = 0; virtual void disableFeature(E_VIDEO_DRIVER_FEATURE feature, bool flag=true) =0;
//! Get attributes of the actual video driver //! Get attributes of the actual video driver
/** The following names can be queried for the given types: /** The following names can be queried for the given types:
@ -193,24 +196,24 @@ public:
ShaderLanguageVersion (int) Version of the high level shader language. Should be Major*100+Minor. ShaderLanguageVersion (int) Version of the high level shader language. Should be Major*100+Minor.
AntiAlias (int) Number of Samples the driver uses for each pixel. 0 and 1 means anti aliasing is off, typical values are 2,4,8,16,32 AntiAlias (int) Number of Samples the driver uses for each pixel. 0 and 1 means anti aliasing is off, typical values are 2,4,8,16,32
*/ */
virtual const io::IAttributes &getDriverAttributes() const = 0; virtual const io::IAttributes& getDriverAttributes() const=0;
//! Check if the driver was recently reset. //! Check if the driver was recently reset.
/** For d3d devices you will need to recreate the RTTs if the /** For d3d devices you will need to recreate the RTTs if the
driver was reset. Should be queried right after beginScene(). driver was reset. Should be queried right after beginScene().
*/ */
virtual bool checkDriverReset() = 0; virtual bool checkDriverReset() =0;
//! Sets transformation matrices. //! Sets transformation matrices.
/** \param state Transformation type to be set, e.g. view, /** \param state Transformation type to be set, e.g. view,
world, or projection. world, or projection.
\param mat Matrix describing the transformation. */ \param mat Matrix describing the transformation. */
virtual void setTransform(E_TRANSFORMATION_STATE state, const core::matrix4 &mat) = 0; virtual void setTransform(E_TRANSFORMATION_STATE state, const core::matrix4& mat) =0;
//! Returns the transformation set by setTransform //! Returns the transformation set by setTransform
/** \param state Transformation type to query /** \param state Transformation type to query
\return Matrix describing the transformation. */ \return Matrix describing the transformation. */
virtual const core::matrix4 &getTransform(E_TRANSFORMATION_STATE state) const = 0; virtual const core::matrix4& getTransform(E_TRANSFORMATION_STATE state) const =0;
//! Retrieve the number of image loaders //! Retrieve the number of image loaders
/** \return Number of image loaders */ /** \return Number of image loaders */
@ -220,7 +223,7 @@ public:
/** \param n The index of the loader to retrieve. This parameter is an 0-based /** \param n The index of the loader to retrieve. This parameter is an 0-based
array index. array index.
\return A pointer to the specified loader, 0 if the index is incorrect. */ \return A pointer to the specified loader, 0 if the index is incorrect. */
virtual IImageLoader *getImageLoader(u32 n) = 0; virtual IImageLoader* getImageLoader(u32 n) = 0;
//! Retrieve the number of image writers //! Retrieve the number of image writers
/** \return Number of image writers */ /** \return Number of image writers */
@ -230,12 +233,12 @@ public:
/** \param n The index of the writer to retrieve. This parameter is an 0-based /** \param n The index of the writer to retrieve. This parameter is an 0-based
array index. array index.
\return A pointer to the specified writer, 0 if the index is incorrect. */ \return A pointer to the specified writer, 0 if the index is incorrect. */
virtual IImageWriter *getImageWriter(u32 n) = 0; virtual IImageWriter* getImageWriter(u32 n) = 0;
//! Sets a material. //! Sets a material.
/** All 3d drawing functions will draw geometry using this material thereafter. /** All 3d drawing functions will draw geometry using this material thereafter.
\param material: Material to be used from now on. */ \param material: Material to be used from now on. */
virtual void setMaterial(const SMaterial &material) = 0; virtual void setMaterial(const SMaterial& material) =0;
//! Get access to a named texture. //! Get access to a named texture.
/** Loads the texture from disk if it is not /** Loads the texture from disk if it is not
@ -247,7 +250,7 @@ public:
\return Pointer to the texture, or 0 if the texture \return Pointer to the texture, or 0 if the texture
could not be loaded. This pointer should not be dropped. See could not be loaded. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual ITexture *getTexture(const io::path &filename) = 0; virtual ITexture* getTexture(const io::path& filename) = 0;
//! Get access to a named texture. //! Get access to a named texture.
/** Loads the texture from disk if it is not /** Loads the texture from disk if it is not
@ -259,7 +262,7 @@ public:
\return Pointer to the texture, or 0 if the texture \return Pointer to the texture, or 0 if the texture
could not be loaded. This pointer should not be dropped. See could not be loaded. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual ITexture *getTexture(io::IReadFile *file) = 0; virtual ITexture* getTexture(io::IReadFile* file) =0;
//! Returns amount of textures currently loaded //! Returns amount of textures currently loaded
/** \return Amount of textures currently loaded */ /** \return Amount of textures currently loaded */
@ -276,8 +279,8 @@ public:
\return Pointer to the newly created texture. This pointer \return Pointer to the newly created texture. This pointer
should not be dropped. See IReferenceCounted::drop() for more should not be dropped. See IReferenceCounted::drop() for more
information. */ information. */
virtual ITexture *addTexture(const core::dimension2d<u32> &size, virtual ITexture* addTexture(const core::dimension2d<u32>& size,
const io::path &name, ECOLOR_FORMAT format = ECF_A8R8G8B8) = 0; const io::path& name, ECOLOR_FORMAT format = ECF_A8R8G8B8) = 0;
//! Creates a texture from an IImage. //! Creates a texture from an IImage.
/** \param name A name for the texture. Later calls of /** \param name A name for the texture. Later calls of
@ -287,7 +290,7 @@ public:
\return Pointer to the newly created texture. This pointer \return Pointer to the newly created texture. This pointer
should not be dropped. See IReferenceCounted::drop() for more should not be dropped. See IReferenceCounted::drop() for more
information. */ information. */
virtual ITexture *addTexture(const io::path &name, IImage *image) = 0; virtual ITexture* addTexture(const io::path& name, IImage* image) = 0;
//! Creates a cubemap texture from loaded IImages. //! Creates a cubemap texture from loaded IImages.
/** \param name A name for the texture. Later calls of getTexture() with this name will return this texture. /** \param name A name for the texture. Later calls of getTexture() with this name will return this texture.
@ -299,8 +302,8 @@ public:
\param imagePosZ Image (positive Z) the texture is created from. \param imagePosZ Image (positive Z) the texture is created from.
\param imageNegZ Image (negative Z) the texture is created from. \param imageNegZ Image (negative Z) the texture is created from.
\return Pointer to the newly created texture. This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ \return Pointer to the newly created texture. This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
virtual ITexture *addTextureCubemap(const io::path &name, IImage *imagePosX, IImage *imageNegX, IImage *imagePosY, virtual ITexture* addTextureCubemap(const io::path& name, IImage* imagePosX, IImage* imageNegX, IImage* imagePosY,
IImage *imageNegY, IImage *imagePosZ, IImage *imageNegZ) = 0; IImage* imageNegY, IImage* imagePosZ, IImage* imageNegZ) = 0;
//! Creates an empty cubemap texture of specified size. //! Creates an empty cubemap texture of specified size.
/** \param sideLen diameter of one side of the cube /** \param sideLen diameter of one side of the cube
@ -311,7 +314,7 @@ public:
that the driver may choose to create the texture in another that the driver may choose to create the texture in another
color format. color format.
\return Pointer to the newly created texture. */ \return Pointer to the newly created texture. */
virtual ITexture *addTextureCubemap(const irr::u32 sideLen, const io::path &name, ECOLOR_FORMAT format = ECF_A8R8G8B8) = 0; virtual ITexture* addTextureCubemap(const irr::u32 sideLen, const io::path& name, ECOLOR_FORMAT format = ECF_A8R8G8B8) = 0;
//! Adds a new render target texture to the texture cache. //! Adds a new render target texture to the texture cache.
/** \param size Size of the texture, in pixels. Width and /** \param size Size of the texture, in pixels. Width and
@ -326,8 +329,8 @@ public:
IReferenceCounted::drop() for more information. IReferenceCounted::drop() for more information.
You may want to remove it from driver texture cache with removeTexture if you no longer need it. You may want to remove it from driver texture cache with removeTexture if you no longer need it.
*/ */
virtual ITexture *addRenderTargetTexture(const core::dimension2d<u32> &size, virtual ITexture* addRenderTargetTexture(const core::dimension2d<u32>& size,
const io::path &name = "rt", const ECOLOR_FORMAT format = ECF_UNKNOWN) = 0; const io::path& name = "rt", const ECOLOR_FORMAT format = ECF_UNKNOWN) =0;
//! Adds a new render target texture with 6 sides for a cubemap map to the texture cache. //! Adds a new render target texture with 6 sides for a cubemap map to the texture cache.
/** \param sideLen Length of one cubemap side. /** \param sideLen Length of one cubemap side.
@ -337,8 +340,8 @@ public:
\return Pointer to the created texture or 0 if the texture \return Pointer to the created texture or 0 if the texture
could not be created. This pointer should not be dropped. See could not be created. This pointer should not be dropped. See
IReferenceCounted::drop() for more information. */ IReferenceCounted::drop() for more information. */
virtual ITexture *addRenderTargetTextureCubemap(const irr::u32 sideLen, virtual ITexture* addRenderTargetTextureCubemap(const irr::u32 sideLen,
const io::path &name = "rt", const ECOLOR_FORMAT format = ECF_UNKNOWN) = 0; const io::path& name = "rt", const ECOLOR_FORMAT format = ECF_UNKNOWN) =0;
//! Removes a texture from the texture cache and deletes it. //! Removes a texture from the texture cache and deletes it.
/** This method can free a lot of memory! /** This method can free a lot of memory!
@ -348,7 +351,7 @@ public:
good idea to set all materials which are using this texture to good idea to set all materials which are using this texture to
0 or another texture first. 0 or another texture first.
\param texture Texture to delete from the engine cache. */ \param texture Texture to delete from the engine cache. */
virtual void removeTexture(ITexture *texture) = 0; virtual void removeTexture(ITexture* texture) =0;
//! Removes all textures from the texture cache and deletes them. //! Removes all textures from the texture cache and deletes them.
/** This method can free a lot of memory! /** This method can free a lot of memory!
@ -357,56 +360,56 @@ public:
by other parts of the engine for storing it longer. So it is a by other parts of the engine for storing it longer. So it is a
good idea to set all materials which are using this texture to good idea to set all materials which are using this texture to
0 or another texture first. */ 0 or another texture first. */
virtual void removeAllTextures() = 0; virtual void removeAllTextures() =0;
//! Remove hardware buffer //! Remove hardware buffer
virtual void removeHardwareBuffer(const scene::IMeshBuffer *mb) = 0; virtual void removeHardwareBuffer(const scene::IMeshBuffer* mb) =0;
//! Remove all hardware buffers //! Remove all hardware buffers
virtual void removeAllHardwareBuffers() = 0; virtual void removeAllHardwareBuffers() =0;
//! Create occlusion query. //! Create occlusion query.
/** Use node for identification and mesh for occlusion test. */ /** Use node for identification and mesh for occlusion test. */
virtual void addOcclusionQuery(scene::ISceneNode *node, virtual void addOcclusionQuery(scene::ISceneNode* node,
const scene::IMesh *mesh = 0) = 0; const scene::IMesh* mesh=0) =0;
//! Remove occlusion query. //! Remove occlusion query.
virtual void removeOcclusionQuery(scene::ISceneNode *node) = 0; virtual void removeOcclusionQuery(scene::ISceneNode* node) =0;
//! Remove all occlusion queries. //! Remove all occlusion queries.
virtual void removeAllOcclusionQueries() = 0; virtual void removeAllOcclusionQueries() =0;
//! Run occlusion query. Draws mesh stored in query. //! Run occlusion query. Draws mesh stored in query.
/** If the mesh shall not be rendered visible, use /** If the mesh shall not be rendered visible, use
overrideMaterial to disable the color and depth buffer. */ overrideMaterial to disable the color and depth buffer. */
virtual void runOcclusionQuery(scene::ISceneNode *node, bool visible = false) = 0; virtual void runOcclusionQuery(scene::ISceneNode* node, bool visible=false) =0;
//! Run all occlusion queries. Draws all meshes stored in queries. //! Run all occlusion queries. Draws all meshes stored in queries.
/** If the meshes shall not be rendered visible, use /** If the meshes shall not be rendered visible, use
overrideMaterial to disable the color and depth buffer. */ overrideMaterial to disable the color and depth buffer. */
virtual void runAllOcclusionQueries(bool visible = false) = 0; virtual void runAllOcclusionQueries(bool visible=false) =0;
//! Update occlusion query. Retrieves results from GPU. //! Update occlusion query. Retrieves results from GPU.
/** If the query shall not block, set the flag to false. /** If the query shall not block, set the flag to false.
Update might not occur in this case, though */ Update might not occur in this case, though */
virtual void updateOcclusionQuery(scene::ISceneNode *node, bool block = true) = 0; virtual void updateOcclusionQuery(scene::ISceneNode* node, bool block=true) =0;
//! Update all occlusion queries. Retrieves results from GPU. //! Update all occlusion queries. Retrieves results from GPU.
/** If the query shall not block, set the flag to false. /** If the query shall not block, set the flag to false.
Update might not occur in this case, though */ Update might not occur in this case, though */
virtual void updateAllOcclusionQueries(bool block = true) = 0; virtual void updateAllOcclusionQueries(bool block=true) =0;
//! Return query result. //! Return query result.
/** Return value is the number of visible pixels/fragments. /** Return value is the number of visible pixels/fragments.
The value is a safe approximation, i.e. can be larger than the The value is a safe approximation, i.e. can be larger than the
actual value of pixels. */ actual value of pixels. */
virtual u32 getOcclusionQueryResult(scene::ISceneNode *node) const = 0; virtual u32 getOcclusionQueryResult(scene::ISceneNode* node) const =0;
//! Create render target. //! Create render target.
virtual IRenderTarget *addRenderTarget() = 0; virtual IRenderTarget* addRenderTarget() = 0;
//! Remove render target. //! Remove render target.
virtual void removeRenderTarget(IRenderTarget *renderTarget) = 0; virtual void removeRenderTarget(IRenderTarget* renderTarget) = 0;
//! Remove all render targets. //! Remove all render targets.
virtual void removeAllRenderTargets() = 0; virtual void removeAllRenderTargets() = 0;
@ -423,8 +426,8 @@ public:
example in picture edit programs. To avoid this problem, you example in picture edit programs. To avoid this problem, you
could use the makeColorKeyTexture method, which takes the could use the makeColorKeyTexture method, which takes the
position of a pixel instead a color value. */ position of a pixel instead a color value. */
virtual void makeColorKeyTexture(video::ITexture *texture, virtual void makeColorKeyTexture(video::ITexture* texture,
video::SColor color) const = 0; video::SColor color) const =0;
//! Sets a boolean alpha channel on the texture based on the color at a position. //! Sets a boolean alpha channel on the texture based on the color at a position.
/** This makes the texture fully transparent at the texels where /** This makes the texture fully transparent at the texels where
@ -434,8 +437,8 @@ public:
\param colorKeyPixelPos Position of a pixel with the color key \param colorKeyPixelPos Position of a pixel with the color key
color. Every texel with this color will become fully transparent as color. Every texel with this color will become fully transparent as
described above. */ described above. */
virtual void makeColorKeyTexture(video::ITexture *texture, virtual void makeColorKeyTexture(video::ITexture* texture,
core::position2d<s32> colorKeyPixelPos) const = 0; core::position2d<s32> colorKeyPixelPos) const =0;
//! Set a render target. //! Set a render target.
/** This will only work if the driver supports the /** This will only work if the driver supports the
@ -453,7 +456,7 @@ public:
\param clearDepth The clear value for the depth buffer. \param clearDepth The clear value for the depth buffer.
\param clearStencil The clear value for the stencil buffer. \param clearStencil The clear value for the stencil buffer.
\return True if successful and false if not. */ \return True if successful and false if not. */
virtual bool setRenderTargetEx(IRenderTarget *target, u16 clearFlag, SColor clearColor = SColor(255, 0, 0, 0), virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0),
f32 clearDepth = 1.f, u8 clearStencil = 0) = 0; f32 clearDepth = 1.f, u8 clearStencil = 0) = 0;
//! Sets a new render target. //! Sets a new render target.
@ -484,13 +487,13 @@ public:
\param clearDepth The clear value for the depth buffer. \param clearDepth The clear value for the depth buffer.
\param clearStencil The clear value for the stencil buffer. \param clearStencil The clear value for the stencil buffer.
\return True if successful and false if not. */ \return True if successful and false if not. */
virtual bool setRenderTarget(ITexture *texture, u16 clearFlag = ECBF_COLOR | ECBF_DEPTH, SColor clearColor = SColor(255, 0, 0, 0), virtual bool setRenderTarget(ITexture* texture, u16 clearFlag=ECBF_COLOR|ECBF_DEPTH, SColor clearColor = SColor(255,0,0,0),
f32 clearDepth = 1.f, u8 clearStencil = 0) = 0; f32 clearDepth = 1.f, u8 clearStencil = 0) = 0;
//! Sets a new render target. //! Sets a new render target.
//! Prefer to use the setRenderTarget function taking flags as parameter as this one can't clear the stencil buffer. //! Prefer to use the setRenderTarget function taking flags as parameter as this one can't clear the stencil buffer.
//! It's still offered for backward compatibility. //! It's still offered for backward compatibility.
bool setRenderTarget(ITexture *texture, bool clearBackBuffer, bool clearZBuffer, SColor color = SColor(255, 0, 0, 0)) bool setRenderTarget(ITexture* texture, bool clearBackBuffer, bool clearZBuffer, SColor color = SColor(255,0,0,0))
{ {
u16 flag = 0; u16 flag = 0;
@ -507,11 +510,11 @@ public:
/** Every rendering operation is done into this new area. /** Every rendering operation is done into this new area.
\param area: Rectangle defining the new area of rendering \param area: Rectangle defining the new area of rendering
operations. */ operations. */
virtual void setViewPort(const core::rect<s32> &area) = 0; virtual void setViewPort(const core::rect<s32>& area) =0;
//! Gets the area of the current viewport. //! Gets the area of the current viewport.
/** \return Rectangle of the current viewport. */ /** \return Rectangle of the current viewport. */
virtual const core::rect<s32> &getViewPort() const = 0; virtual const core::rect<s32>& getViewPort() const =0;
//! Draws a vertex primitive list //! Draws a vertex primitive list
/** Note that, depending on the index type, some vertices might be not /** Note that, depending on the index type, some vertices might be not
@ -528,11 +531,11 @@ public:
\param vType Vertex type, e.g. video::EVT_STANDARD for S3DVertex. \param vType Vertex type, e.g. video::EVT_STANDARD for S3DVertex.
\param pType Primitive type, e.g. scene::EPT_TRIANGLE_FAN for a triangle fan. \param pType Primitive type, e.g. scene::EPT_TRIANGLE_FAN for a triangle fan.
\param iType Index type, e.g. video::EIT_16BIT for 16bit indices. */ \param iType Index type, e.g. video::EIT_16BIT for 16bit indices. */
virtual void drawVertexPrimitiveList(const void *vertices, u32 vertexCount, virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const void *indexList, u32 primCount, const void* indexList, u32 primCount,
E_VERTEX_TYPE vType = EVT_STANDARD, E_VERTEX_TYPE vType=EVT_STANDARD,
scene::E_PRIMITIVE_TYPE pType = scene::EPT_TRIANGLES, scene::E_PRIMITIVE_TYPE pType=scene::EPT_TRIANGLES,
E_INDEX_TYPE iType = EIT_16BIT) = 0; E_INDEX_TYPE iType=EIT_16BIT) =0;
//! Draws a vertex primitive list in 2d //! Draws a vertex primitive list in 2d
/** Compared to the general (3d) version of this method, this /** Compared to the general (3d) version of this method, this
@ -554,11 +557,11 @@ public:
\param vType Vertex type, e.g. video::EVT_STANDARD for S3DVertex. \param vType Vertex type, e.g. video::EVT_STANDARD for S3DVertex.
\param pType Primitive type, e.g. scene::EPT_TRIANGLE_FAN for a triangle fan. \param pType Primitive type, e.g. scene::EPT_TRIANGLE_FAN for a triangle fan.
\param iType Index type, e.g. video::EIT_16BIT for 16bit indices. */ \param iType Index type, e.g. video::EIT_16BIT for 16bit indices. */
virtual void draw2DVertexPrimitiveList(const void *vertices, u32 vertexCount, virtual void draw2DVertexPrimitiveList(const void* vertices, u32 vertexCount,
const void *indexList, u32 primCount, const void* indexList, u32 primCount,
E_VERTEX_TYPE vType = EVT_STANDARD, E_VERTEX_TYPE vType=EVT_STANDARD,
scene::E_PRIMITIVE_TYPE pType = scene::EPT_TRIANGLES, scene::E_PRIMITIVE_TYPE pType=scene::EPT_TRIANGLES,
E_INDEX_TYPE iType = EIT_16BIT) = 0; E_INDEX_TYPE iType=EIT_16BIT) =0;
//! Draws an indexed triangle list. //! Draws an indexed triangle list.
/** Note that there may be at maximum 65536 vertices, because /** Note that there may be at maximum 65536 vertices, because
@ -569,8 +572,8 @@ public:
\param vertexCount Amount of vertices in the array. \param vertexCount Amount of vertices in the array.
\param indexList Pointer to array of indices. \param indexList Pointer to array of indices.
\param triangleCount Amount of Triangles. Usually amount of indices / 3. */ \param triangleCount Amount of Triangles. Usually amount of indices / 3. */
void drawIndexedTriangleList(const S3DVertex *vertices, void drawIndexedTriangleList(const S3DVertex* vertices,
u32 vertexCount, const u16 *indexList, u32 triangleCount) u32 vertexCount, const u16* indexList, u32 triangleCount)
{ {
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_STANDARD, scene::EPT_TRIANGLES, EIT_16BIT); drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_STANDARD, scene::EPT_TRIANGLES, EIT_16BIT);
} }
@ -584,8 +587,8 @@ public:
\param vertexCount Amount of vertices in the array. \param vertexCount Amount of vertices in the array.
\param indexList Pointer to array of indices. \param indexList Pointer to array of indices.
\param triangleCount Amount of Triangles. Usually amount of indices / 3. */ \param triangleCount Amount of Triangles. Usually amount of indices / 3. */
void drawIndexedTriangleList(const S3DVertex2TCoords *vertices, void drawIndexedTriangleList(const S3DVertex2TCoords* vertices,
u32 vertexCount, const u16 *indexList, u32 triangleCount) u32 vertexCount, const u16* indexList, u32 triangleCount)
{ {
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_2TCOORDS, scene::EPT_TRIANGLES, EIT_16BIT); drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_2TCOORDS, scene::EPT_TRIANGLES, EIT_16BIT);
} }
@ -599,8 +602,8 @@ public:
\param vertexCount Amount of vertices in the array. \param vertexCount Amount of vertices in the array.
\param indexList Pointer to array of indices. \param indexList Pointer to array of indices.
\param triangleCount Amount of Triangles. Usually amount of indices / 3. */ \param triangleCount Amount of Triangles. Usually amount of indices / 3. */
void drawIndexedTriangleList(const S3DVertexTangents *vertices, void drawIndexedTriangleList(const S3DVertexTangents* vertices,
u32 vertexCount, const u16 *indexList, u32 triangleCount) u32 vertexCount, const u16* indexList, u32 triangleCount)
{ {
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_TANGENTS, scene::EPT_TRIANGLES, EIT_16BIT); drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_TANGENTS, scene::EPT_TRIANGLES, EIT_16BIT);
} }
@ -614,8 +617,8 @@ public:
\param vertexCount Amount of vertices in the array. \param vertexCount Amount of vertices in the array.
\param indexList Pointer to array of indices. \param indexList Pointer to array of indices.
\param triangleCount Amount of Triangles. Usually amount of indices - 2. */ \param triangleCount Amount of Triangles. Usually amount of indices - 2. */
void drawIndexedTriangleFan(const S3DVertex *vertices, void drawIndexedTriangleFan(const S3DVertex* vertices,
u32 vertexCount, const u16 *indexList, u32 triangleCount) u32 vertexCount, const u16* indexList, u32 triangleCount)
{ {
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_STANDARD, scene::EPT_TRIANGLE_FAN, EIT_16BIT); drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_STANDARD, scene::EPT_TRIANGLE_FAN, EIT_16BIT);
} }
@ -629,8 +632,8 @@ public:
\param vertexCount Amount of vertices in the array. \param vertexCount Amount of vertices in the array.
\param indexList Pointer to array of indices. \param indexList Pointer to array of indices.
\param triangleCount Amount of Triangles. Usually amount of indices - 2. */ \param triangleCount Amount of Triangles. Usually amount of indices - 2. */
void drawIndexedTriangleFan(const S3DVertex2TCoords *vertices, void drawIndexedTriangleFan(const S3DVertex2TCoords* vertices,
u32 vertexCount, const u16 *indexList, u32 triangleCount) u32 vertexCount, const u16* indexList, u32 triangleCount)
{ {
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_2TCOORDS, scene::EPT_TRIANGLE_FAN, EIT_16BIT); drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_2TCOORDS, scene::EPT_TRIANGLE_FAN, EIT_16BIT);
} }
@ -644,8 +647,8 @@ public:
\param vertexCount Amount of vertices in the array. \param vertexCount Amount of vertices in the array.
\param indexList Pointer to array of indices. \param indexList Pointer to array of indices.
\param triangleCount Amount of Triangles. Usually amount of indices - 2. */ \param triangleCount Amount of Triangles. Usually amount of indices - 2. */
void drawIndexedTriangleFan(const S3DVertexTangents *vertices, void drawIndexedTriangleFan(const S3DVertexTangents* vertices,
u32 vertexCount, const u16 *indexList, u32 triangleCount) u32 vertexCount, const u16* indexList, u32 triangleCount)
{ {
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_TANGENTS, scene::EPT_TRIANGLE_FAN, EIT_16BIT); drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_TANGENTS, scene::EPT_TRIANGLE_FAN, EIT_16BIT);
} }
@ -665,8 +668,8 @@ public:
\param start Start of the 3d line. \param start Start of the 3d line.
\param end End of the 3d line. \param end End of the 3d line.
\param color Color of the line. */ \param color Color of the line. */
virtual void draw3DLine(const core::vector3df &start, virtual void draw3DLine(const core::vector3df& start,
const core::vector3df &end, SColor color = SColor(255, 255, 255, 255)) = 0; const core::vector3df& end, SColor color = SColor(255,255,255,255)) =0;
//! Draws a 3d axis aligned box. //! Draws a 3d axis aligned box.
/** This method simply calls draw3DLine for the edges of the /** This method simply calls draw3DLine for the edges of the
@ -680,8 +683,8 @@ public:
for some properly set up material before drawing the box. for some properly set up material before drawing the box.
\param box The axis aligned box to draw \param box The axis aligned box to draw
\param color Color to use while drawing the box. */ \param color Color to use while drawing the box. */
virtual void draw3DBox(const core::aabbox3d<f32> &box, virtual void draw3DBox(const core::aabbox3d<f32>& box,
SColor color = SColor(255, 255, 255, 255)) = 0; SColor color = SColor(255,255,255,255)) =0;
//! Draws a 2d image without any special effects //! Draws a 2d image without any special effects
/** \param texture Pointer to texture to use. /** \param texture Pointer to texture to use.
@ -689,8 +692,8 @@ public:
image will be drawn. image will be drawn.
\param useAlphaChannelOfTexture: If true, the alpha channel of \param useAlphaChannelOfTexture: If true, the alpha channel of
the texture is used to draw the image.*/ the texture is used to draw the image.*/
virtual void draw2DImage(const video::ITexture *texture, virtual void draw2DImage(const video::ITexture* texture,
const core::position2d<s32> &destPos, bool useAlphaChannelOfTexture = false) = 0; const core::position2d<s32>& destPos, bool useAlphaChannelOfTexture=false) =0;
//! Draws a 2d image using a color //! Draws a 2d image using a color
/** (if color is other than /** (if color is other than
@ -708,9 +711,9 @@ public:
will be transparent. will be transparent.
\param useAlphaChannelOfTexture: If true, the alpha channel of \param useAlphaChannelOfTexture: If true, the alpha channel of
the texture is used to draw the image.*/ the texture is used to draw the image.*/
virtual void draw2DImage(const video::ITexture *texture, const core::position2d<s32> &destPos, virtual void draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,
const core::rect<s32> &sourceRect, const core::rect<s32> *clipRect = 0, const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect =0,
SColor color = SColor(255, 255, 255, 255), bool useAlphaChannelOfTexture = false) = 0; SColor color=SColor(255,255,255,255), bool useAlphaChannelOfTexture=false) =0;
//! Draws a set of 2d images, using a color and the alpha channel of the texture. //! Draws a set of 2d images, using a color and the alpha channel of the texture.
/** All drawings are clipped against clipRect (if != 0). /** All drawings are clipped against clipRect (if != 0).
@ -728,12 +731,12 @@ public:
255, the image will be transparent. 255, the image will be transparent.
\param useAlphaChannelOfTexture: If true, the alpha channel of \param useAlphaChannelOfTexture: If true, the alpha channel of
the texture is used to draw the image. */ the texture is used to draw the image. */
virtual void draw2DImageBatch(const video::ITexture *texture, virtual void draw2DImageBatch(const video::ITexture* texture,
const core::array<core::position2d<s32>> &positions, const core::array<core::position2d<s32> >& positions,
const core::array<core::rect<s32>> &sourceRects, const core::array<core::rect<s32> >& sourceRects,
const core::rect<s32> *clipRect = 0, const core::rect<s32>* clipRect=0,
SColor color = SColor(255, 255, 255, 255), SColor color=SColor(255,255,255,255),
bool useAlphaChannelOfTexture = false) = 0; bool useAlphaChannelOfTexture=false) =0;
//! Draws a part of the texture into the rectangle. Note that colors must be an array of 4 colors if used. //! Draws a part of the texture into the rectangle. Note that colors must be an array of 4 colors if used.
/** Suggested and first implemented by zola. /** Suggested and first implemented by zola.
@ -745,9 +748,9 @@ public:
the corners of the destRect the corners of the destRect
\param useAlphaChannelOfTexture True if alpha channel will be \param useAlphaChannelOfTexture True if alpha channel will be
blended. */ blended. */
virtual void draw2DImage(const video::ITexture *texture, const core::rect<s32> &destRect, virtual void draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect,
const core::rect<s32> &sourceRect, const core::rect<s32> *clipRect = 0, const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect =0,
const video::SColor *const colors = 0, bool useAlphaChannelOfTexture = false) = 0; const video::SColor * const colors=0, bool useAlphaChannelOfTexture=false) =0;
//! Draws a 2d rectangle. //! Draws a 2d rectangle.
/** \param color Color of the rectangle to draw. The alpha /** \param color Color of the rectangle to draw. The alpha
@ -757,8 +760,8 @@ public:
\param clip Pointer to rectangle against which the rectangle \param clip Pointer to rectangle against which the rectangle
will be clipped. If the pointer is null, no clipping will be will be clipped. If the pointer is null, no clipping will be
performed. */ performed. */
virtual void draw2DRectangle(SColor color, const core::rect<s32> &pos, virtual void draw2DRectangle(SColor color, const core::rect<s32>& pos,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip =0) =0;
//! Draws a 2d rectangle with a gradient. //! Draws a 2d rectangle with a gradient.
/** \param colorLeftUp Color of the upper left corner to draw. /** \param colorLeftUp Color of the upper left corner to draw.
@ -777,10 +780,10 @@ public:
\param clip Pointer to rectangle against which the rectangle \param clip Pointer to rectangle against which the rectangle
will be clipped. If the pointer is null, no clipping will be will be clipped. If the pointer is null, no clipping will be
performed. */ performed. */
virtual void draw2DRectangle(const core::rect<s32> &pos, virtual void draw2DRectangle(const core::rect<s32>& pos,
SColor colorLeftUp, SColor colorRightUp, SColor colorLeftUp, SColor colorRightUp,
SColor colorLeftDown, SColor colorRightDown, SColor colorLeftDown, SColor colorRightDown,
const core::rect<s32> *clip = 0) = 0; const core::rect<s32>* clip =0) =0;
//! Draws a 2d line. //! Draws a 2d line.
/** In theory both start and end will be included in coloring. /** In theory both start and end will be included in coloring.
@ -791,20 +794,20 @@ public:
\param end Screen coordinates of the start of the line in \param end Screen coordinates of the start of the line in
pixels. pixels.
\param color Color of the line to draw. */ \param color Color of the line to draw. */
virtual void draw2DLine(const core::position2d<s32> &start, virtual void draw2DLine(const core::position2d<s32>& start,
const core::position2d<s32> &end, const core::position2d<s32>& end,
SColor color = SColor(255, 255, 255, 255)) = 0; SColor color=SColor(255,255,255,255)) =0;
//! Draws a mesh buffer //! Draws a mesh buffer
/** \param mb Buffer to draw */ /** \param mb Buffer to draw */
virtual void drawMeshBuffer(const scene::IMeshBuffer *mb) = 0; virtual void drawMeshBuffer(const scene::IMeshBuffer* mb) =0;
//! Draws normals of a mesh buffer //! Draws normals of a mesh buffer
/** \param mb Buffer to draw the normals of /** \param mb Buffer to draw the normals of
\param length length scale factor of the normals \param length length scale factor of the normals
\param color Color the normals are rendered with \param color Color the normals are rendered with
*/ */
virtual void drawMeshBufferNormals(const scene::IMeshBuffer *mb, f32 length = 10.f, SColor color = 0xffffffff) = 0; virtual void drawMeshBufferNormals(const scene::IMeshBuffer* mb, f32 length=10.f, SColor color=0xffffffff) =0;
//! Sets the fog mode. //! Sets the fog mode.
/** These are global values attached to each 3d object rendered, /** These are global values attached to each 3d object rendered,
@ -823,30 +826,30 @@ public:
fog. The distance from the viewer is used to compute the fog, fog. The distance from the viewer is used to compute the fog,
not the z-coordinate. This is better, but slower. This might not not the z-coordinate. This is better, but slower. This might not
be available with all drivers and fog settings. */ be available with all drivers and fog settings. */
virtual void setFog(SColor color = SColor(0, 255, 255, 255), virtual void setFog(SColor color=SColor(0,255,255,255),
E_FOG_TYPE fogType = EFT_FOG_LINEAR, E_FOG_TYPE fogType=EFT_FOG_LINEAR,
f32 start = 50.0f, f32 end = 100.0f, f32 density = 0.01f, f32 start=50.0f, f32 end=100.0f, f32 density=0.01f,
bool pixelFog = false, bool rangeFog = false) = 0; bool pixelFog=false, bool rangeFog=false) =0;
//! Gets the fog mode. //! Gets the fog mode.
virtual void getFog(SColor &color, E_FOG_TYPE &fogType, virtual void getFog(SColor& color, E_FOG_TYPE& fogType,
f32 &start, f32 &end, f32 &density, f32& start, f32& end, f32& density,
bool &pixelFog, bool &rangeFog) = 0; bool& pixelFog, bool& rangeFog) = 0;
//! Get the current color format of the color buffer //! Get the current color format of the color buffer
/** \return Color format of the color buffer. */ /** \return Color format of the color buffer. */
virtual ECOLOR_FORMAT getColorFormat() const = 0; virtual ECOLOR_FORMAT getColorFormat() const =0;
//! Get the size of the screen or render window. //! Get the size of the screen or render window.
/** \return Size of screen or render window. */ /** \return Size of screen or render window. */
virtual const core::dimension2d<u32> &getScreenSize() const = 0; virtual const core::dimension2d<u32>& getScreenSize() const =0;
//! Get the size of the current render target //! Get the size of the current render target
/** This method will return the screen size if the driver /** This method will return the screen size if the driver
doesn't support render to texture, or if the current render doesn't support render to texture, or if the current render
target is the screen. target is the screen.
\return Size of render target or screen/window */ \return Size of render target or screen/window */
virtual const core::dimension2d<u32> &getCurrentRenderTargetSize() const = 0; virtual const core::dimension2d<u32>& getCurrentRenderTargetSize() const =0;
//! Returns current frames per second value. //! Returns current frames per second value.
/** This value is updated approximately every 1.5 seconds and /** This value is updated approximately every 1.5 seconds and
@ -854,19 +857,19 @@ public:
rate. It is not suitable for use in performing timing rate. It is not suitable for use in performing timing
calculations or framerate independent movement. calculations or framerate independent movement.
\return Approximate amount of frames per second drawn. */ \return Approximate amount of frames per second drawn. */
virtual s32 getFPS() const = 0; virtual s32 getFPS() const =0;
//! Returns amount of primitives (mostly triangles) which were drawn in the last frame. //! Returns amount of primitives (mostly triangles) which were drawn in the last frame.
/** Together with getFPS() very useful method for statistics. /** Together with getFPS() very useful method for statistics.
\param mode Defines if the primitives drawn are accumulated or \param mode Defines if the primitives drawn are accumulated or
counted per frame. counted per frame.
\return Amount of primitives drawn in the last frame. */ \return Amount of primitives drawn in the last frame. */
virtual u32 getPrimitiveCountDrawn(u32 mode = 0) const = 0; virtual u32 getPrimitiveCountDrawn( u32 mode =0 ) const =0;
//! Gets name of this video driver. //! Gets name of this video driver.
/** \return Returns the name of the video driver, e.g. in case /** \return Returns the name of the video driver, e.g. in case
of the Direct3D8 driver, it would return "Direct3D 8.1". */ of the Direct3D8 driver, it would return "Direct3D 8.1". */
virtual const char *getName() const = 0; virtual const wchar_t* getName() const =0;
//! Adds an external image loader to the engine. //! Adds an external image loader to the engine.
/** This is useful if the Irrlicht Engine should be able to load /** This is useful if the Irrlicht Engine should be able to load
@ -875,7 +878,7 @@ public:
format. A pointer to the implementation can be passed to the format. A pointer to the implementation can be passed to the
engine using this method. engine using this method.
\param loader Pointer to the external loader created. */ \param loader Pointer to the external loader created. */
virtual void addExternalImageLoader(IImageLoader *loader) = 0; virtual void addExternalImageLoader(IImageLoader* loader) =0;
//! Adds an external image writer to the engine. //! Adds an external image writer to the engine.
/** This is useful if the Irrlicht Engine should be able to /** This is useful if the Irrlicht Engine should be able to
@ -884,13 +887,13 @@ public:
writing this file format. A pointer to the implementation can writing this file format. A pointer to the implementation can
be passed to the engine using this method. be passed to the engine using this method.
\param writer: Pointer to the external writer created. */ \param writer: Pointer to the external writer created. */
virtual void addExternalImageWriter(IImageWriter *writer) = 0; virtual void addExternalImageWriter(IImageWriter* writer) =0;
//! Returns the maximum amount of primitives //! Returns the maximum amount of primitives
/** (mostly vertices) which the device is able to render with /** (mostly vertices) which the device is able to render with
one drawVertexPrimitiveList call. one drawVertexPrimitiveList call.
\return Maximum amount of primitives. */ \return Maximum amount of primitives. */
virtual u32 getMaximalPrimitiveCount() const = 0; virtual u32 getMaximalPrimitiveCount() const =0;
//! Enables or disables a texture creation flag. //! Enables or disables a texture creation flag.
/** These flags define how textures should be created. By /** These flags define how textures should be created. By
@ -902,13 +905,13 @@ public:
\param flag Texture creation flag. \param flag Texture creation flag.
\param enabled Specifies if the given flag should be enabled or \param enabled Specifies if the given flag should be enabled or
disabled. */ disabled. */
virtual void setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag, bool enabled = true) = 0; virtual void setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag, bool enabled=true) =0;
//! Returns if a texture creation flag is enabled or disabled. //! Returns if a texture creation flag is enabled or disabled.
/** You can change this value using setTextureCreationFlag(). /** You can change this value using setTextureCreationFlag().
\param flag Texture creation flag. \param flag Texture creation flag.
\return The current texture creation flag enabled mode. */ \return The current texture creation flag enabled mode. */
virtual bool getTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag) const = 0; virtual bool getTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag) const =0;
//! Creates a software image from a file. //! Creates a software image from a file.
/** No hardware texture will be created for this image. This /** No hardware texture will be created for this image. This
@ -919,7 +922,7 @@ public:
\return The created image. \return The created image.
If you no longer need the image, you should call IImage::drop(). If you no longer need the image, you should call IImage::drop().
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IImage *createImageFromFile(const io::path &filename) = 0; virtual IImage* createImageFromFile(const io::path& filename) = 0;
//! Creates a software image from a file. //! Creates a software image from a file.
/** No hardware texture will be created for this image. This /** No hardware texture will be created for this image. This
@ -929,7 +932,7 @@ public:
\return The created image. \return The created image.
If you no longer need the image, you should call IImage::drop(). If you no longer need the image, you should call IImage::drop().
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IImage *createImageFromFile(io::IReadFile *file) = 0; virtual IImage* createImageFromFile(io::IReadFile* file) = 0;
//! Writes the provided image to a file. //! Writes the provided image to a file.
/** Requires that there is a suitable image writer registered /** Requires that there is a suitable image writer registered
@ -939,7 +942,7 @@ public:
\param param Control parameter for the backend (e.g. compression \param param Control parameter for the backend (e.g. compression
level). level).
\return True on successful write. */ \return True on successful write. */
virtual bool writeImageToFile(IImage *image, const io::path &filename, u32 param = 0) = 0; virtual bool writeImageToFile(IImage* image, const io::path& filename, u32 param = 0) = 0;
//! Writes the provided image to a file. //! Writes the provided image to a file.
/** Requires that there is a suitable image writer registered /** Requires that there is a suitable image writer registered
@ -950,7 +953,7 @@ public:
\param param Control parameter for the backend (e.g. compression \param param Control parameter for the backend (e.g. compression
level). level).
\return True on successful write. */ \return True on successful write. */
virtual bool writeImageToFile(IImage *image, io::IWriteFile *file, u32 param = 0) = 0; virtual bool writeImageToFile(IImage* image, io::IWriteFile* file, u32 param =0) =0;
//! Creates a software image from a byte array. //! Creates a software image from a byte array.
/** No hardware texture will be created for this image. This /** No hardware texture will be created for this image. This
@ -970,8 +973,8 @@ public:
\return The created image. \return The created image.
If you no longer need the image, you should call IImage::drop(). If you no longer need the image, you should call IImage::drop().
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IImage *createImageFromData(ECOLOR_FORMAT format, virtual IImage* createImageFromData(ECOLOR_FORMAT format,
const core::dimension2d<u32> &size, void *data, bool ownForeignMemory = false, const core::dimension2d<u32>& size, void *data, bool ownForeignMemory = false,
bool deleteMemory = true) = 0; bool deleteMemory = true) = 0;
//! Creates an empty software image. //! Creates an empty software image.
@ -981,7 +984,7 @@ public:
\return The created image. \return The created image.
If you no longer need the image, you should call IImage::drop(). If you no longer need the image, you should call IImage::drop().
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IImage *createImage(ECOLOR_FORMAT format, const core::dimension2d<u32> &size) = 0; virtual IImage* createImage(ECOLOR_FORMAT format, const core::dimension2d<u32>& size) =0;
//! Creates a software image from a part of a texture. //! Creates a software image from a part of a texture.
/** /**
@ -991,14 +994,14 @@ public:
\return The created image. \return The created image.
If you no longer need the image, you should call IImage::drop(). If you no longer need the image, you should call IImage::drop().
See IReferenceCounted::drop() for more information. */ See IReferenceCounted::drop() for more information. */
virtual IImage *createImage(ITexture *texture, virtual IImage* createImage(ITexture* texture,
const core::position2d<s32> &pos, const core::position2d<s32>& pos,
const core::dimension2d<u32> &size) = 0; const core::dimension2d<u32>& size) =0;
//! Event handler for resize events. Only used by the engine internally. //! Event handler for resize events. Only used by the engine internally.
/** Used to notify the driver that the window was resized. /** Used to notify the driver that the window was resized.
Usually, there is no need to call this method. */ Usually, there is no need to call this method. */
virtual void OnResize(const core::dimension2d<u32> &size) = 0; virtual void OnResize(const core::dimension2d<u32>& size) =0;
//! Adds a new material renderer to the video device. //! Adds a new material renderer to the video device.
/** Use this method to extend the VideoDriver with new material /** Use this method to extend the VideoDriver with new material
@ -1021,18 +1024,18 @@ public:
an error occurred. For example if you tried to add an material an error occurred. For example if you tried to add an material
renderer to the software renderer or the null device, which do renderer to the software renderer or the null device, which do
not accept material renderers. */ not accept material renderers. */
virtual s32 addMaterialRenderer(IMaterialRenderer *renderer, const c8 *name = 0) = 0; virtual s32 addMaterialRenderer(IMaterialRenderer* renderer, const c8* name =0) =0;
//! Get access to a material renderer by index. //! Get access to a material renderer by index.
/** \param idx Id of the material renderer. Can be a value of /** \param idx Id of the material renderer. Can be a value of
the E_MATERIAL_TYPE enum or a value which was returned by the E_MATERIAL_TYPE enum or a value which was returned by
addMaterialRenderer(). addMaterialRenderer().
\return Pointer to material renderer or null if not existing. */ \return Pointer to material renderer or null if not existing. */
virtual IMaterialRenderer *getMaterialRenderer(u32 idx) const = 0; virtual IMaterialRenderer* getMaterialRenderer(u32 idx) const = 0;
//! Get amount of currently available material renderers. //! Get amount of currently available material renderers.
/** \return Amount of currently available material renderers. */ /** \return Amount of currently available material renderers. */
virtual u32 getMaterialRendererCount() const = 0; virtual u32 getMaterialRendererCount() const =0;
//! Get name of a material renderer //! Get name of a material renderer
/** This string can, e.g., be used to test if a specific /** This string can, e.g., be used to test if a specific
@ -1044,7 +1047,7 @@ public:
addMaterialRenderer(). addMaterialRenderer().
\return String with the name of the renderer, or 0 if not \return String with the name of the renderer, or 0 if not
existing */ existing */
virtual const c8 *getMaterialRendererName(u32 idx) const = 0; virtual const c8* getMaterialRendererName(u32 idx) const =0;
//! Sets the name of a material renderer. //! Sets the name of a material renderer.
/** Will have no effect on built-in material renderers. /** Will have no effect on built-in material renderers.
@ -1052,7 +1055,7 @@ public:
E_MATERIAL_TYPE enum or a value which was returned by E_MATERIAL_TYPE enum or a value which was returned by
addMaterialRenderer(). addMaterialRenderer().
\param name: New name of the material renderer. */ \param name: New name of the material renderer. */
virtual void setMaterialRendererName(u32 idx, const c8 *name) = 0; virtual void setMaterialRendererName(u32 idx, const c8* name) =0;
//! Swap the material renderers used for certain id's //! Swap the material renderers used for certain id's
/** Swap the IMaterialRenderers responsible for rendering specific /** Swap the IMaterialRenderers responsible for rendering specific
@ -1062,29 +1065,29 @@ public:
\param idx2 Second material index to swap. It must already exist or nothing happens. \param idx2 Second material index to swap. It must already exist or nothing happens.
\param swapNames When true the renderer names also swap \param swapNames When true the renderer names also swap
When false the names will stay at the original index */ When false the names will stay at the original index */
virtual void swapMaterialRenderers(u32 idx1, u32 idx2, bool swapNames = true) = 0; virtual void swapMaterialRenderers(u32 idx1, u32 idx2, bool swapNames=true) = 0;
//! Returns driver and operating system specific data about the IVideoDriver. //! Returns driver and operating system specific data about the IVideoDriver.
/** This method should only be used if the engine should be /** This method should only be used if the engine should be
extended without having to modify the source of the engine. extended without having to modify the source of the engine.
\return Collection of device dependent pointers. */ \return Collection of device dependent pointers. */
virtual const SExposedVideoData &getExposedVideoData() = 0; virtual const SExposedVideoData& getExposedVideoData() =0;
//! Get type of video driver //! Get type of video driver
/** \return Type of driver. */ /** \return Type of driver. */
virtual E_DRIVER_TYPE getDriverType() const = 0; virtual E_DRIVER_TYPE getDriverType() const =0;
//! Gets the IGPUProgrammingServices interface. //! Gets the IGPUProgrammingServices interface.
/** \return Pointer to the IGPUProgrammingServices. Returns 0 /** \return Pointer to the IGPUProgrammingServices. Returns 0
if the video driver does not support this. For example the if the video driver does not support this. For example the
Software driver and the Null driver will always return 0. */ Software driver and the Null driver will always return 0. */
virtual IGPUProgrammingServices *getGPUProgrammingServices() = 0; virtual IGPUProgrammingServices* getGPUProgrammingServices() =0;
//! Returns a pointer to the mesh manipulator. //! Returns a pointer to the mesh manipulator.
virtual scene::IMeshManipulator *getMeshManipulator() = 0; virtual scene::IMeshManipulator* getMeshManipulator() =0;
//! Clear the color, depth and/or stencil buffers. //! Clear the color, depth and/or stencil buffers.
virtual void clearBuffers(u16 flag, SColor color = SColor(255, 0, 0, 0), f32 depth = 1.f, u8 stencil = 0) = 0; virtual void clearBuffers(u16 flag, SColor color = SColor(255,0,0,0), f32 depth = 1.f, u8 stencil = 0) = 0;
//! Clears the ZBuffer. //! Clears the ZBuffer.
/** Note that you usually need not to call this method, as it /** Note that you usually need not to call this method, as it
@ -1095,19 +1098,19 @@ public:
*/ */
void clearZBuffer() void clearZBuffer()
{ {
clearBuffers(ECBF_DEPTH, SColor(255, 0, 0, 0), 1.f, 0); clearBuffers(ECBF_DEPTH, SColor(255,0,0,0), 1.f, 0);
} }
//! Make a screenshot of the last rendered frame. //! Make a screenshot of the last rendered frame.
/** \return An image created from the last rendered frame. */ /** \return An image created from the last rendered frame. */
virtual IImage *createScreenShot(video::ECOLOR_FORMAT format = video::ECF_UNKNOWN, video::E_RENDER_TARGET target = video::ERT_FRAME_BUFFER) = 0; virtual IImage* createScreenShot(video::ECOLOR_FORMAT format=video::ECF_UNKNOWN, video::E_RENDER_TARGET target=video::ERT_FRAME_BUFFER) =0;
//! Check if the image is already loaded. //! Check if the image is already loaded.
/** Works similar to getTexture(), but does not load the texture /** Works similar to getTexture(), but does not load the texture
if it is not currently loaded. if it is not currently loaded.
\param filename Name of the texture. \param filename Name of the texture.
\return Pointer to loaded texture, or 0 if not found. */ \return Pointer to loaded texture, or 0 if not found. */
virtual video::ITexture *findTexture(const io::path &filename) = 0; virtual video::ITexture* findTexture(const io::path& filename) = 0;
//! Set or unset a clipping plane. //! Set or unset a clipping plane.
/** There are at least 6 clipping planes available for the user /** There are at least 6 clipping planes available for the user
@ -1118,7 +1121,7 @@ public:
\param enable If true, enable the clipping plane else disable \param enable If true, enable the clipping plane else disable
it. it.
\return True if the clipping plane is usable. */ \return True if the clipping plane is usable. */
virtual bool setClipPlane(u32 index, const core::plane3df &plane, bool enable = false) = 0; virtual bool setClipPlane(u32 index, const core::plane3df& plane, bool enable=false) =0;
//! Enable or disable a clipping plane. //! Enable or disable a clipping plane.
/** There are at least 6 clipping planes available for the user /** There are at least 6 clipping planes available for the user
@ -1127,18 +1130,18 @@ public:
MaxUserClipPlanes. MaxUserClipPlanes.
\param enable If true, enable the clipping plane else disable \param enable If true, enable the clipping plane else disable
it. */ it. */
virtual void enableClipPlane(u32 index, bool enable) = 0; virtual void enableClipPlane(u32 index, bool enable) =0;
//! Set the minimum number of vertices for which a hw buffer will be created //! Set the minimum number of vertices for which a hw buffer will be created
/** \param count Number of vertices to set as minimum. */ /** \param count Number of vertices to set as minimum. */
virtual void setMinHardwareBufferVertexCount(u32 count) = 0; virtual void setMinHardwareBufferVertexCount(u32 count) =0;
//! Get the global Material, which might override local materials. //! Get the global Material, which might override local materials.
/** Depending on the enable flags, values from this Material /** Depending on the enable flags, values from this Material
are used to override those of local materials of some are used to override those of local materials of some
meshbuffer being rendered. meshbuffer being rendered.
\return Reference to the Override Material. */ \return Reference to the Override Material. */
virtual SOverrideMaterial &getOverrideMaterial() = 0; virtual SOverrideMaterial& getOverrideMaterial() =0;
//! Get the 2d override material for altering its values //! Get the 2d override material for altering its values
/** The 2d override material allows to alter certain render /** The 2d override material allows to alter certain render
@ -1154,33 +1157,33 @@ public:
\return Material reference which should be altered to reflect \return Material reference which should be altered to reflect
the new settings. the new settings.
*/ */
virtual SMaterial &getMaterial2D() = 0; virtual SMaterial& getMaterial2D() =0;
//! Enable the 2d override material //! Enable the 2d override material
/** \param enable Flag which tells whether the material shall be /** \param enable Flag which tells whether the material shall be
enabled or disabled. */ enabled or disabled. */
virtual void enableMaterial2D(bool enable = true) = 0; virtual void enableMaterial2D(bool enable=true) =0;
//! Get the graphics card vendor name. //! Get the graphics card vendor name.
virtual core::stringc getVendorInfo() = 0; virtual core::stringc getVendorInfo() =0;
//! Only used by the engine internally. //! Only used by the engine internally.
/** The ambient color is set in the scene manager, see /** The ambient color is set in the scene manager, see
scene::ISceneManager::setAmbientLight(). scene::ISceneManager::setAmbientLight().
\param color New color of the ambient light. */ \param color New color of the ambient light. */
virtual void setAmbientLight(const SColorf &color) = 0; virtual void setAmbientLight(const SColorf& color) =0;
//! Get the global ambient light currently used by the driver //! Get the global ambient light currently used by the driver
virtual const SColorf &getAmbientLight() const = 0; virtual const SColorf& getAmbientLight() const = 0;
//! Only used by the engine internally. //! Only used by the engine internally.
/** Passes the global material flag AllowZWriteOnTransparent. /** Passes the global material flag AllowZWriteOnTransparent.
Use the SceneManager attribute to set this value from your app. Use the SceneManager attribute to set this value from your app.
\param flag Default behavior is to disable ZWrite, i.e. false. */ \param flag Default behavior is to disable ZWrite, i.e. false. */
virtual void setAllowZWriteOnTransparent(bool flag) = 0; virtual void setAllowZWriteOnTransparent(bool flag) =0;
//! Get the maximum texture size supported. //! Get the maximum texture size supported.
virtual core::dimension2du getMaxTextureSize() const = 0; virtual core::dimension2du getMaxTextureSize() const =0;
//! Color conversion convenience function //! Color conversion convenience function
/** Convert an image (as array of pixels) from source to destination /** Convert an image (as array of pixels) from source to destination
@ -1192,16 +1195,18 @@ public:
\param dP Pointer to destination \param dP Pointer to destination
\param dF Color format of destination \param dF Color format of destination
*/ */
virtual void convertColor(const void *sP, ECOLOR_FORMAT sF, s32 sN, virtual void convertColor(const void* sP, ECOLOR_FORMAT sF, s32 sN,
void *dP, ECOLOR_FORMAT dF) const = 0; void* dP, ECOLOR_FORMAT dF) const =0;
//! Check if the driver supports creating textures with the given color format //! Check if the driver supports creating textures with the given color format
/** \return True if the format is available, false if not. */ /** \return True if the format is available, false if not. */
virtual bool queryTextureFormat(ECOLOR_FORMAT format) const = 0; virtual bool queryTextureFormat(ECOLOR_FORMAT format) const = 0;
//! Used by some SceneNodes to check if a material should be rendered in the transparent render pass //! Used by some SceneNodes to check if a material should be rendered in the transparent render pass
virtual bool needsTransparentRenderPass(const irr::video::SMaterial &material) const = 0; virtual bool needsTransparentRenderPass(const irr::video::SMaterial& material) const = 0;
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr

View File

@ -2,7 +2,8 @@
// 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_WRITE_FILE_H_INCLUDED__
#define __I_WRITE_FILE_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
#include "path.h" #include "path.h"
@ -12,15 +13,15 @@ namespace irr
namespace io namespace io
{ {
//! Interface providing write access to a file. //! Interface providing write access to a file.
class IWriteFile : public virtual IReferenceCounted class IWriteFile : public virtual IReferenceCounted
{ {
public: public:
//! Writes an amount of bytes to the file. //! Writes an amount of bytes to the file.
/** \param buffer Pointer to buffer of bytes to write. /** \param buffer Pointer to buffer of bytes to write.
\param sizeToWrite Amount of bytes to write to the file. \param sizeToWrite Amount of bytes to write to the file.
\return How much bytes were written. */ \return How much bytes were written. */
virtual size_t write(const void *buffer, size_t sizeToWrite) = 0; virtual size_t write(const void* buffer, size_t sizeToWrite) = 0;
//! Changes position in file //! Changes position in file
/** \param finalPos Destination position in the file. /** \param finalPos Destination position in the file.
@ -36,12 +37,15 @@ public:
//! Get name of file. //! Get name of file.
/** \return File name as zero terminated character string. */ /** \return File name as zero terminated character string. */
virtual const path &getFileName() const = 0; virtual const path& getFileName() const = 0;
//! Flush the content of the buffer in the file //! Flush the content of the buffer in the file
/** \return True if successful, otherwise false. */ /** \return True if successful, otherwise false. */
virtual bool flush() = 0; virtual bool flush() = 0;
}; };
} // end namespace io } // end namespace io
} // end namespace irr } // end namespace irr
#endif

View File

@ -5,8 +5,8 @@
#pragma once #pragma once
//! Identifies the IrrlichtMt fork customized for the Minetest engine //! Identifies the IrrlichtMt fork customized for the Minetest engine
#define IRRLICHT_VERSION_MT_REVISION 15 #define IRRLICHT_VERSION_MT_REVISION 14
#define IRRLICHT_VERSION_MT "mt15" #define IRRLICHT_VERSION_MT "mt14"
//! Irrlicht SDK Version //! Irrlicht SDK Version
#define IRRLICHT_VERSION_MAJOR 1 #define IRRLICHT_VERSION_MAJOR 1
@ -17,6 +17,8 @@
#define IRRLICHT_VERSION_SVN alpha #define IRRLICHT_VERSION_SVN alpha
#define IRRLICHT_SDK_VERSION "1.9.0" IRRLICHT_VERSION_MT #define IRRLICHT_SDK_VERSION "1.9.0" IRRLICHT_VERSION_MT
#include <stdio.h> // TODO: Although included elsewhere this is required at least for mingw
#ifdef _WIN32 #ifdef _WIN32
#define IRRCALLCONV __stdcall #define IRRCALLCONV __stdcall
#else #else

View File

@ -2,7 +2,8 @@
// 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_IRRLICHT_DEVICE_H_INCLUDED__
#define __I_IRRLICHT_DEVICE_H_INCLUDED__
#include "IReferenceCounted.h" #include "IReferenceCounted.h"
#include "dimension2d.h" #include "dimension2d.h"
@ -17,39 +18,36 @@
namespace irr namespace irr
{ {
class ILogger; class ILogger;
class IEventReceiver; class IEventReceiver;
namespace io namespace io {
{ class IFileSystem;
class IFileSystem; } // end namespace io
} // end namespace io
namespace gui namespace gui {
{ class IGUIEnvironment;
class IGUIEnvironment; } // end namespace gui
} // end namespace gui
namespace scene namespace scene {
{ class ISceneManager;
class ISceneManager; } // end namespace scene
} // end namespace scene
namespace video namespace video {
{ class IContextManager;
class IContextManager; extern "C" IRRLICHT_API bool IRRCALLCONV isDriverSupported(E_DRIVER_TYPE driver);
extern "C" IRRLICHT_API bool IRRCALLCONV isDriverSupported(E_DRIVER_TYPE driver); } // end namespace video
} // end namespace video
//! The Irrlicht device. You can create it with createDevice() or createDeviceEx().
/** This is the most important class of the Irrlicht Engine. You can
access everything in the engine if you have a pointer to an instance of
this class. There should be only one instance of this class at any
time.
*/
class IrrlichtDevice : public virtual IReferenceCounted
{
public:
//! The Irrlicht device. You can create it with createDevice() or createDeviceEx().
/** This is the most important class of the Irrlicht Engine. You can
access everything in the engine if you have a pointer to an instance of
this class. There should be only one instance of this class at any
time.
*/
class IrrlichtDevice : public virtual IReferenceCounted
{
public:
//! Runs the device. //! Runs the device.
/** Also increments the virtual timer by calling /** Also increments the virtual timer by calling
ITimer::tick();. You can prevent this ITimer::tick();. You can prevent this
@ -91,34 +89,34 @@ public:
On most Linux systems it's relatively exact, but also no guarantee. On most Linux systems it's relatively exact, but also no guarantee.
\param pauseTimer: If true, pauses the device timer while sleeping \param pauseTimer: If true, pauses the device timer while sleeping
*/ */
virtual void sleep(u32 timeMs, bool pauseTimer = false) = 0; virtual void sleep(u32 timeMs, bool pauseTimer=false) = 0;
//! Provides access to the video driver for drawing 3d and 2d geometry. //! Provides access to the video driver for drawing 3d and 2d geometry.
/** \return Pointer the video driver. */ /** \return Pointer the video driver. */
virtual video::IVideoDriver *getVideoDriver() = 0; virtual video::IVideoDriver* getVideoDriver() = 0;
//! Provides access to the virtual file system. //! Provides access to the virtual file system.
/** \return Pointer to the file system. */ /** \return Pointer to the file system. */
virtual io::IFileSystem *getFileSystem() = 0; virtual io::IFileSystem* getFileSystem() = 0;
//! Provides access to the 2d user interface environment. //! Provides access to the 2d user interface environment.
/** \return Pointer to the gui environment. */ /** \return Pointer to the gui environment. */
virtual gui::IGUIEnvironment *getGUIEnvironment() = 0; virtual gui::IGUIEnvironment* getGUIEnvironment() = 0;
//! Provides access to the scene manager. //! Provides access to the scene manager.
/** \return Pointer to the scene manager. */ /** \return Pointer to the scene manager. */
virtual scene::ISceneManager *getSceneManager() = 0; virtual scene::ISceneManager* getSceneManager() = 0;
//! Provides access to the cursor control. //! Provides access to the cursor control.
/** \return Pointer to the mouse cursor control interface. */ /** \return Pointer to the mouse cursor control interface. */
virtual gui::ICursorControl *getCursorControl() = 0; virtual gui::ICursorControl* getCursorControl() = 0;
//! Provides access to the message logger. //! Provides access to the message logger.
/** \return Pointer to the logger. */ /** \return Pointer to the logger. */
virtual ILogger *getLogger() = 0; virtual ILogger* getLogger() = 0;
//! Get context manager //! Get context manager
virtual video::IContextManager *getContextManager() = 0; virtual video::IContextManager* getContextManager() = 0;
//! Provides access to the operation system operator object. //! Provides access to the operation system operator object.
/** The OS operator provides methods for /** The OS operator provides methods for
@ -126,17 +124,17 @@ public:
specific operations, such as exchanging data with the clipboard specific operations, such as exchanging data with the clipboard
or reading the operation system version. or reading the operation system version.
\return Pointer to the OS operator. */ \return Pointer to the OS operator. */
virtual IOSOperator *getOSOperator() = 0; virtual IOSOperator* getOSOperator() = 0;
//! Provides access to the engine's timer. //! Provides access to the engine's timer.
/** The system time can be retrieved by it as /** The system time can be retrieved by it as
well as the virtual time, which also can be manipulated. well as the virtual time, which also can be manipulated.
\return Pointer to the ITimer object. */ \return Pointer to the ITimer object. */
virtual ITimer *getTimer() = 0; virtual ITimer* getTimer() = 0;
//! Sets the caption of the window. //! Sets the caption of the window.
/** \param text: New text of the window caption. */ /** \param text: New text of the window caption. */
virtual void setWindowCaption(const wchar_t *text) = 0; virtual void setWindowCaption(const wchar_t* text) = 0;
//! Sets the window icon. //! Sets the window icon.
/** \param img The icon texture. /** \param img The icon texture.
@ -180,10 +178,7 @@ public:
virtual bool isFullscreen() const = 0; virtual bool isFullscreen() const = 0;
//! Checks if the window could possibly be visible. //! Checks if the window could possibly be visible.
//! Currently, this only returns false when the activity is stopped on //! Currently, this only returns false when the app is paused on Android.
//! Android. Note that for Android activities, "stopped" means something
//! different than you might expect (and also something different than
//! "paused"). Read the Android lifecycle documentation.
virtual bool isWindowVisible() const { return true; }; virtual bool isWindowVisible() const { return true; };
//! Get the current color format of the window //! Get the current color format of the window
@ -198,18 +193,18 @@ public:
/** The returned string /** The returned string
will look like this: "1.2.3" or this: "1.2". will look like this: "1.2.3" or this: "1.2".
\return String which contains the version. */ \return String which contains the version. */
virtual const c8 *getVersion() const = 0; virtual const c8* getVersion() const = 0;
//! Sets a new user event receiver which will receive events from the engine. //! Sets a new user event receiver which will receive events from the engine.
/** Return true in IEventReceiver::OnEvent to prevent the event from continuing along /** Return true in IEventReceiver::OnEvent to prevent the event from continuing along
the chain of event receivers. The path that an event takes through the system depends the chain of event receivers. The path that an event takes through the system depends
on its type. See irr::EEVENT_TYPE for details. on its type. See irr::EEVENT_TYPE for details.
\param receiver New receiver to be used. */ \param receiver New receiver to be used. */
virtual void setEventReceiver(IEventReceiver *receiver) = 0; virtual void setEventReceiver(IEventReceiver* receiver) = 0;
//! Provides access to the current event receiver. //! Provides access to the current event receiver.
/** \return Pointer to the current event receiver. Returns 0 if there is none. */ /** \return Pointer to the current event receiver. Returns 0 if there is none. */
virtual IEventReceiver *getEventReceiver() = 0; virtual IEventReceiver* getEventReceiver() = 0;
//! Sends a user created event to the engine. //! Sends a user created event to the engine.
/** Is is usually not necessary to use this. However, if you /** Is is usually not necessary to use this. However, if you
@ -217,35 +212,35 @@ public:
input, you can use this to post key or mouse input events to input, you can use this to post key or mouse input events to
the engine. Internally, this method only delegates the events the engine. Internally, this method only delegates the events
further to the scene manager and the GUI environment. */ further to the scene manager and the GUI environment. */
virtual bool postEventFromUser(const SEvent &event) = 0; virtual bool postEventFromUser(const SEvent& event) = 0;
//! Sets the input receiving scene manager. //! Sets the input receiving scene manager.
/** If set to null, the main scene manager (returned by /** If set to null, the main scene manager (returned by
GetSceneManager()) will receive the input GetSceneManager()) will receive the input
\param sceneManager New scene manager to be used. */ \param sceneManager New scene manager to be used. */
virtual void setInputReceivingSceneManager(scene::ISceneManager *sceneManager) = 0; virtual void setInputReceivingSceneManager(scene::ISceneManager* sceneManager) = 0;
//! Sets if the window should be resizable in windowed mode. //! Sets if the window should be resizable in windowed mode.
/** The default is false. This method only works in windowed /** The default is false. This method only works in windowed
mode. mode.
\param resize Flag whether the window should be resizable. */ \param resize Flag whether the window should be resizable. */
virtual void setResizable(bool resize = false) = 0; virtual void setResizable(bool resize=false) = 0;
//! Resize the render window. //! Resize the render window.
/** This will only work in windowed mode and is not yet supported on all systems. /** This will only work in windowed mode and is not yet supported on all systems.
It does set the drawing/clientDC size of the window, the window decorations are added to that. It does set the drawing/clientDC size of the window, the window decorations are added to that.
You get the current window size with IVideoDriver::getScreenSize() (might be unified in future) You get the current window size with IVideoDriver::getScreenSize() (might be unified in future)
*/ */
virtual void setWindowSize(const irr::core::dimension2d<u32> &size) = 0; virtual void setWindowSize(const irr::core::dimension2d<u32>& size) = 0;
//! Minimizes the window if possible. //! Minimizes the window if possible.
virtual void minimizeWindow() = 0; virtual void minimizeWindow() =0;
//! Maximizes the window if possible. //! Maximizes the window if possible.
virtual void maximizeWindow() = 0; virtual void maximizeWindow() =0;
//! Restore the window to normal size if possible. //! Restore the window to normal size if possible.
virtual void restoreWindow() = 0; virtual void restoreWindow() =0;
//! Get the position of the frame on-screen //! Get the position of the frame on-screen
virtual core::position2di getWindowPosition() = 0; virtual core::position2di getWindowPosition() = 0;
@ -258,7 +253,7 @@ public:
\return true if joysticks are supported on this device, false if joysticks are not \return true if joysticks are supported on this device, false if joysticks are not
supported or support is compiled out. supported or support is compiled out.
*/ */
virtual bool activateJoysticks(core::array<SJoystickInfo> &joystickInfo) = 0; virtual bool activateJoysticks(core::array<SJoystickInfo>& joystickInfo) =0;
//! Activate accelerometer. //! Activate accelerometer.
virtual bool activateAccelerometer(float updateInterval = 0.016666f) = 0; virtual bool activateAccelerometer(float updateInterval = 0.016666f) = 0;
@ -300,13 +295,13 @@ public:
/** When set to 0 no double- and tripleclicks will be generated. /** When set to 0 no double- and tripleclicks will be generated.
\param timeMs maximal time in milliseconds for two consecutive clicks to be recognized as double click \param timeMs maximal time in milliseconds for two consecutive clicks to be recognized as double click
*/ */
virtual void setDoubleClickTime(u32 timeMs) = 0; virtual void setDoubleClickTime(u32 timeMs) =0;
//! Get the maximal elapsed time between 2 clicks to generate double- and tripleclicks for the mouse. //! Get the maximal elapsed time between 2 clicks to generate double- and tripleclicks for the mouse.
/** When return value is 0 no double- and tripleclicks will be generated. /** When return value is 0 no double- and tripleclicks will be generated.
\return maximal time in milliseconds for two consecutive clicks to be recognized as double click \return maximal time in milliseconds for two consecutive clicks to be recognized as double click
*/ */
virtual u32 getDoubleClickTime() const = 0; virtual u32 getDoubleClickTime() const =0;
//! Remove messages pending in the system message loop //! Remove messages pending in the system message loop
/** This function is usually used after messages have been buffered for a longer time, for example /** This function is usually used after messages have been buffered for a longer time, for example
@ -336,6 +331,9 @@ public:
{ {
return video::isDriverSupported(driver); return video::isDriverSupported(driver);
} }
}; };
} // end namespace irr } // end namespace irr
#endif

View File

@ -7,8 +7,8 @@
namespace irr namespace irr
{ {
enum EKEY_CODE enum EKEY_CODE
{ {
KEY_UNKNOWN = 0x0, KEY_UNKNOWN = 0x0,
KEY_LBUTTON = 0x01, // Left mouse button KEY_LBUTTON = 0x01, // Left mouse button
KEY_RBUTTON = 0x02, // Right mouse button KEY_RBUTTON = 0x02, // Right mouse button
@ -146,7 +146,7 @@ enum EKEY_CODE
KEY_BROWSER_REFRESH = 0xA8, // Browser Refresh key KEY_BROWSER_REFRESH = 0xA8, // Browser Refresh key
KEY_BROWSER_STOP = 0xA9, // Browser Stop key KEY_BROWSER_STOP = 0xA9, // Browser Stop key
KEY_BROWSER_SEARCH = 0xAA, // Browser Search key KEY_BROWSER_SEARCH = 0xAA, // Browser Search key
KEY_BROWSER_FAVORITES = 0xAB, // Browser Favorites key KEY_BROWSER_FAVORITES =0xAB, // Browser Favorites key
KEY_BROWSER_HOME = 0xAC, // Browser Start and Home key KEY_BROWSER_HOME = 0xAC, // Browser Start and Home key
KEY_VOLUME_MUTE = 0xAD, // Volume Mute key KEY_VOLUME_MUTE = 0xAD, // Volume Mute key
KEY_VOLUME_DOWN = 0xAE, // Volume Down key KEY_VOLUME_DOWN = 0xAE, // Volume Down key
@ -180,6 +180,8 @@ enum EKEY_CODE
KEY_NONE = 0xFF, // usually no key mapping, but some laptops use it for fn key KEY_NONE = 0xFF, // usually no key mapping, but some laptops use it for fn key
KEY_KEY_CODES_COUNT = 0x100 // this is not a key, but the amount of keycodes there are. KEY_KEY_CODES_COUNT = 0x100 // this is not a key, but the amount of keycodes there are.
}; };
} // end namespace irr } // end namespace irr

View File

@ -2,7 +2,8 @@
// 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 __S_3D_VERTEX_H_INCLUDED__
#define __S_3D_VERTEX_H_INCLUDED__
#include "vector3d.h" #include "vector3d.h"
#include "vector2d.h" #include "vector2d.h"
@ -31,29 +32,28 @@ enum E_VERTEX_TYPE
}; };
//! Array holding the built in vertex type names //! Array holding the built in vertex type names
const char *const sBuiltInVertexTypeNames[] = { const char* const sBuiltInVertexTypeNames[] =
{
"standard", "standard",
"2tcoords", "2tcoords",
"tangents", "tangents",
0, 0
}; };
//! standard vertex used by the Irrlicht engine. //! standard vertex used by the Irrlicht engine.
struct S3DVertex struct S3DVertex
{ {
//! default constructor //! default constructor
constexpr S3DVertex() : S3DVertex() : Color(0xffffffff) {}
Color(0xffffffff) {}
//! constructor //! constructor
constexpr S3DVertex(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv) : S3DVertex(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv)
Pos(x, y, z), Normal(nx, ny, nz), Color(c), TCoords(tu, tv) {} : Pos(x,y,z), Normal(nx,ny,nz), Color(c), TCoords(tu,tv) {}
//! constructor //! constructor
constexpr S3DVertex(const core::vector3df &pos, const core::vector3df &normal, S3DVertex(const core::vector3df& pos, const core::vector3df& normal,
SColor color, const core::vector2df &tcoords) : SColor color, const core::vector2d<f32>& tcoords)
Pos(pos), : Pos(pos), Normal(normal), Color(color), TCoords(tcoords) {}
Normal(normal), Color(color), TCoords(tcoords) {}
//! Position //! Position
core::vector3df Pos; core::vector3df Pos;
@ -65,21 +65,21 @@ struct S3DVertex
SColor Color; SColor Color;
//! Texture coordinates //! Texture coordinates
core::vector2df TCoords; core::vector2d<f32> TCoords;
constexpr bool operator==(const S3DVertex &other) const bool operator==(const S3DVertex& other) const
{ {
return ((Pos == other.Pos) && (Normal == other.Normal) && return ((Pos == other.Pos) && (Normal == other.Normal) &&
(Color == other.Color) && (TCoords == other.TCoords)); (Color == other.Color) && (TCoords == other.TCoords));
} }
constexpr bool operator!=(const S3DVertex &other) const bool operator!=(const S3DVertex& other) const
{ {
return ((Pos != other.Pos) || (Normal != other.Normal) || return ((Pos != other.Pos) || (Normal != other.Normal) ||
(Color != other.Color) || (TCoords != other.TCoords)); (Color != other.Color) || (TCoords != other.TCoords));
} }
constexpr bool operator<(const S3DVertex &other) const bool operator<(const S3DVertex& other) const
{ {
return ((Pos < other.Pos) || return ((Pos < other.Pos) ||
((Pos == other.Pos) && (Normal < other.Normal)) || ((Pos == other.Pos) && (Normal < other.Normal)) ||
@ -94,7 +94,7 @@ struct S3DVertex
} }
//\param d d=0 returns other, d=1 returns this, values between interpolate. //\param d d=0 returns other, d=1 returns this, values between interpolate.
S3DVertex getInterpolated(const S3DVertex &other, f32 d) S3DVertex getInterpolated(const S3DVertex& other, f32 d)
{ {
d = core::clamp(d, 0.0f, 1.0f); d = core::clamp(d, 0.0f, 1.0f);
return S3DVertex(Pos.getInterpolated(other.Pos, d), return S3DVertex(Pos.getInterpolated(other.Pos, d),
@ -104,6 +104,7 @@ struct S3DVertex
} }
}; };
//! Vertex with two texture coordinates. //! Vertex with two texture coordinates.
/** Usually used for geometry with lightmaps /** Usually used for geometry with lightmaps
or other special materials. or other special materials.
@ -111,68 +112,59 @@ or other special materials.
struct S3DVertex2TCoords : public S3DVertex struct S3DVertex2TCoords : public S3DVertex
{ {
//! default constructor //! default constructor
constexpr S3DVertex2TCoords() : S3DVertex2TCoords() : S3DVertex() {}
S3DVertex() {}
//! constructor with two different texture coords, but no normal //! constructor with two different texture coords, but no normal
constexpr S3DVertex2TCoords(f32 x, f32 y, f32 z, SColor c, f32 tu, f32 tv, f32 tu2, f32 tv2) : S3DVertex2TCoords(f32 x, f32 y, f32 z, SColor c, f32 tu, f32 tv, f32 tu2, f32 tv2)
S3DVertex(x, y, z, 0.0f, 0.0f, 0.0f, c, tu, tv), TCoords2(tu2, tv2) {} : S3DVertex(x,y,z, 0.0f, 0.0f, 0.0f, c, tu,tv), TCoords2(tu2,tv2) {}
//! constructor with two different texture coords, but no normal //! constructor with two different texture coords, but no normal
constexpr S3DVertex2TCoords(const core::vector3df &pos, SColor color, S3DVertex2TCoords(const core::vector3df& pos, SColor color,
const core::vector2df &tcoords, const core::vector2df &tcoords2) : const core::vector2d<f32>& tcoords, const core::vector2d<f32>& tcoords2)
S3DVertex(pos, core::vector3df(), color, tcoords), : S3DVertex(pos, core::vector3df(), color, tcoords), TCoords2(tcoords2) {}
TCoords2(tcoords2) {}
//! constructor with all values //! constructor with all values
constexpr S3DVertex2TCoords(const core::vector3df &pos, const core::vector3df &normal, const SColor &color, S3DVertex2TCoords(const core::vector3df& pos, const core::vector3df& normal, const SColor& color,
const core::vector2df &tcoords, const core::vector2df &tcoords2) : const core::vector2d<f32>& tcoords, const core::vector2d<f32>& tcoords2)
S3DVertex(pos, normal, color, tcoords), : S3DVertex(pos, normal, color, tcoords), TCoords2(tcoords2) {}
TCoords2(tcoords2) {}
//! constructor with all values //! constructor with all values
constexpr S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv, f32 tu2, f32 tv2)
SColor c, f32 tu, f32 tv, f32 tu2, f32 tv2) : : S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), TCoords2(tu2,tv2) {}
S3DVertex(x, y, z, nx, ny, nz, c, tu, tv),
TCoords2(tu2, tv2) {}
//! constructor with the same texture coords and normal //! constructor with the same texture coords and normal
constexpr S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv)
SColor c, f32 tu, f32 tv) : : S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), TCoords2(tu,tv) {}
S3DVertex(x, y, z, nx, ny, nz, c, tu, tv),
TCoords2(tu, tv) {}
//! constructor with the same texture coords and normal //! constructor with the same texture coords and normal
constexpr S3DVertex2TCoords(const core::vector3df &pos, const core::vector3df &normal, S3DVertex2TCoords(const core::vector3df& pos, const core::vector3df& normal,
SColor color, const core::vector2df &tcoords) : SColor color, const core::vector2d<f32>& tcoords)
S3DVertex(pos, normal, color, tcoords), : S3DVertex(pos, normal, color, tcoords), TCoords2(tcoords) {}
TCoords2(tcoords) {}
//! constructor from S3DVertex //! constructor from S3DVertex
constexpr S3DVertex2TCoords(const S3DVertex &o) : S3DVertex2TCoords(const S3DVertex& o) : S3DVertex(o) {}
S3DVertex(o) {}
//! Second set of texture coordinates //! Second set of texture coordinates
core::vector2df TCoords2; core::vector2d<f32> TCoords2;
//! Equality operator //! Equality operator
constexpr bool operator==(const S3DVertex2TCoords &other) const bool operator==(const S3DVertex2TCoords& other) const
{ {
return ((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex &>(other)) && return ((static_cast<S3DVertex>(*this)==static_cast<const S3DVertex&>(other)) &&
(TCoords2 == other.TCoords2)); (TCoords2 == other.TCoords2));
} }
//! Inequality operator //! Inequality operator
constexpr bool operator!=(const S3DVertex2TCoords &other) const bool operator!=(const S3DVertex2TCoords& other) const
{ {
return ((static_cast<S3DVertex>(*this) != static_cast<const S3DVertex &>(other)) || return ((static_cast<S3DVertex>(*this)!=static_cast<const S3DVertex&>(other)) ||
(TCoords2 != other.TCoords2)); (TCoords2 != other.TCoords2));
} }
constexpr bool operator<(const S3DVertex2TCoords &other) const bool operator<(const S3DVertex2TCoords& other) const
{ {
return ((static_cast<S3DVertex>(*this) < other) || return ((static_cast<S3DVertex>(*this) < other) ||
((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex &>(other)) && (TCoords2 < other.TCoords2))); ((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (TCoords2 < other.TCoords2)));
} }
static E_VERTEX_TYPE getType() static E_VERTEX_TYPE getType()
@ -181,7 +173,7 @@ struct S3DVertex2TCoords : public S3DVertex
} }
//\param d d=0 returns other, d=1 returns this, values between interpolate. //\param d d=0 returns other, d=1 returns this, values between interpolate.
S3DVertex2TCoords getInterpolated(const S3DVertex2TCoords &other, f32 d) S3DVertex2TCoords getInterpolated(const S3DVertex2TCoords& other, f32 d)
{ {
d = core::clamp(d, 0.0f, 1.0f); d = core::clamp(d, 0.0f, 1.0f);
return S3DVertex2TCoords(Pos.getInterpolated(other.Pos, d), return S3DVertex2TCoords(Pos.getInterpolated(other.Pos, d),
@ -192,6 +184,7 @@ struct S3DVertex2TCoords : public S3DVertex
} }
}; };
//! Vertex with a tangent and binormal vector. //! Vertex with a tangent and binormal vector.
/** Usually used for tangent space normal mapping. /** Usually used for tangent space normal mapping.
Usually tangent and binormal get send to shaders as texture coordinate sets 1 and 2. Usually tangent and binormal get send to shaders as texture coordinate sets 1 and 2.
@ -199,34 +192,30 @@ struct S3DVertex2TCoords : public S3DVertex
struct S3DVertexTangents : public S3DVertex struct S3DVertexTangents : public S3DVertex
{ {
//! default constructor //! default constructor
S3DVertexTangents() : S3DVertexTangents() : S3DVertex() { }
S3DVertex() {}
//! constructor //! constructor
constexpr S3DVertexTangents(f32 x, f32 y, f32 z, f32 nx = 0.0f, f32 ny = 0.0f, f32 nz = 0.0f, S3DVertexTangents(f32 x, f32 y, f32 z, f32 nx=0.0f, f32 ny=0.0f, f32 nz=0.0f,
SColor c = 0xFFFFFFFF, f32 tu = 0.0f, f32 tv = 0.0f, SColor c = 0xFFFFFFFF, f32 tu=0.0f, f32 tv=0.0f,
f32 tanx = 0.0f, f32 tany = 0.0f, f32 tanz = 0.0f, f32 tanx=0.0f, f32 tany=0.0f, f32 tanz=0.0f,
f32 bx = 0.0f, f32 by = 0.0f, f32 bz = 0.0f) : f32 bx=0.0f, f32 by=0.0f, f32 bz=0.0f)
S3DVertex(x, y, z, nx, ny, nz, c, tu, tv), : S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), Tangent(tanx,tany,tanz), Binormal(bx,by,bz) { }
Tangent(tanx, tany, tanz), Binormal(bx, by, bz) {}
//! constructor //! constructor
constexpr S3DVertexTangents(const core::vector3df &pos, SColor c, S3DVertexTangents(const core::vector3df& pos, SColor c,
const core::vector2df &tcoords) : const core::vector2df& tcoords)
S3DVertex(pos, core::vector3df(), c, tcoords) {} : S3DVertex(pos, core::vector3df(), c, tcoords) { }
//! constructor //! constructor
constexpr S3DVertexTangents(const core::vector3df &pos, S3DVertexTangents(const core::vector3df& pos,
const core::vector3df &normal, SColor c, const core::vector3df& normal, SColor c,
const core::vector2df &tcoords, const core::vector2df& tcoords,
const core::vector3df &tangent = core::vector3df(), const core::vector3df& tangent=core::vector3df(),
const core::vector3df &binormal = core::vector3df()) : const core::vector3df& binormal=core::vector3df())
S3DVertex(pos, normal, c, tcoords), : S3DVertex(pos, normal, c, tcoords), Tangent(tangent), Binormal(binormal) { }
Tangent(tangent), Binormal(binormal) {}
//! constructor from S3DVertex //! constructor from S3DVertex
constexpr S3DVertexTangents(const S3DVertex &o) : S3DVertexTangents(const S3DVertex& o) : S3DVertex(o) {}
S3DVertex(o) {}
//! Tangent vector along the x-axis of the texture //! Tangent vector along the x-axis of the texture
core::vector3df Tangent; core::vector3df Tangent;
@ -234,25 +223,25 @@ struct S3DVertexTangents : public S3DVertex
//! Binormal vector (tangent x normal) //! Binormal vector (tangent x normal)
core::vector3df Binormal; core::vector3df Binormal;
constexpr bool operator==(const S3DVertexTangents &other) const bool operator==(const S3DVertexTangents& other) const
{ {
return ((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex &>(other)) && return ((static_cast<S3DVertex>(*this)==static_cast<const S3DVertex&>(other)) &&
(Tangent == other.Tangent) && (Tangent == other.Tangent) &&
(Binormal == other.Binormal)); (Binormal == other.Binormal));
} }
constexpr bool operator!=(const S3DVertexTangents &other) const bool operator!=(const S3DVertexTangents& other) const
{ {
return ((static_cast<S3DVertex>(*this) != static_cast<const S3DVertex &>(other)) || return ((static_cast<S3DVertex>(*this)!=static_cast<const S3DVertex&>(other)) ||
(Tangent != other.Tangent) || (Tangent != other.Tangent) ||
(Binormal != other.Binormal)); (Binormal != other.Binormal));
} }
constexpr bool operator<(const S3DVertexTangents &other) const bool operator<(const S3DVertexTangents& other) const
{ {
return ((static_cast<S3DVertex>(*this) < other) || return ((static_cast<S3DVertex>(*this) < other) ||
((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex &>(other)) && (Tangent < other.Tangent)) || ((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (Tangent < other.Tangent)) ||
((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex &>(other)) && (Tangent == other.Tangent) && (Binormal < other.Binormal))); ((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (Tangent == other.Tangent) && (Binormal < other.Binormal)));
} }
static E_VERTEX_TYPE getType() static E_VERTEX_TYPE getType()
@ -260,7 +249,7 @@ struct S3DVertexTangents : public S3DVertex
return EVT_TANGENTS; return EVT_TANGENTS;
} }
S3DVertexTangents getInterpolated(const S3DVertexTangents &other, f32 d) S3DVertexTangents getInterpolated(const S3DVertexTangents& other, f32 d)
{ {
d = core::clamp(d, 0.0f, 1.0f); d = core::clamp(d, 0.0f, 1.0f);
return S3DVertexTangents(Pos.getInterpolated(other.Pos, d), return S3DVertexTangents(Pos.getInterpolated(other.Pos, d),
@ -272,9 +261,12 @@ struct S3DVertexTangents : public S3DVertex
} }
}; };
inline u32 getVertexPitchFromType(E_VERTEX_TYPE vertexType) inline u32 getVertexPitchFromType(E_VERTEX_TYPE vertexType)
{ {
switch (vertexType) { switch (vertexType)
{
case video::EVT_2TCOORDS: case video::EVT_2TCOORDS:
return sizeof(video::S3DVertex2TCoords); return sizeof(video::S3DVertex2TCoords);
case video::EVT_TANGENTS: case video::EVT_TANGENTS:
@ -284,5 +276,9 @@ inline u32 getVertexPitchFromType(E_VERTEX_TYPE vertexType)
} }
} }
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 __S_ANIMATED_MESH_H_INCLUDED__
#define __S_ANIMATED_MESH_H_INCLUDED__
#include "IAnimatedMesh.h" #include "IAnimatedMesh.h"
#include "IMesh.h" #include "IMesh.h"
@ -14,16 +15,15 @@ namespace irr
namespace scene namespace scene
{ {
//! Simple implementation of the IAnimatedMesh interface. //! Simple implementation of the IAnimatedMesh interface.
struct SAnimatedMesh : public IAnimatedMesh struct SAnimatedMesh : public IAnimatedMesh
{
//! constructor
SAnimatedMesh(scene::IMesh *mesh = 0, scene::E_ANIMATED_MESH_TYPE type = scene::EAMT_UNKNOWN) :
IAnimatedMesh(), FramesPerSecond(25.f), Type(type)
{ {
#ifdef _DEBUG //! constructor
SAnimatedMesh(scene::IMesh* mesh=0, scene::E_ANIMATED_MESH_TYPE type=scene::EAMT_UNKNOWN) : IAnimatedMesh(), FramesPerSecond(25.f), Type(type)
{
#ifdef _DEBUG
setDebugName("SAnimatedMesh"); setDebugName("SAnimatedMesh");
#endif #endif
addMesh(mesh); addMesh(mesh);
recalculateBoundingBox(); recalculateBoundingBox();
} }
@ -32,7 +32,7 @@ struct SAnimatedMesh : public IAnimatedMesh
virtual ~SAnimatedMesh() virtual ~SAnimatedMesh()
{ {
// drop meshes // drop meshes
for (u32 i = 0; i < Meshes.size(); ++i) for (u32 i=0; i<Meshes.size(); ++i)
Meshes[i]->drop(); Meshes[i]->drop();
} }
@ -55,7 +55,7 @@ struct SAnimatedMesh : public IAnimatedMesh
The actual speed is set in the scene node the mesh is instantiated in.*/ The actual speed is set in the scene node the mesh is instantiated in.*/
void setAnimationSpeed(f32 fps) override void setAnimationSpeed(f32 fps) override
{ {
FramesPerSecond = fps; FramesPerSecond=fps;
} }
//! Returns the IMesh interface for a frame. //! Returns the IMesh interface for a frame.
@ -66,7 +66,7 @@ struct SAnimatedMesh : public IAnimatedMesh
\param startFrameLoop: start frame \param startFrameLoop: start frame
\param endFrameLoop: end frame \param endFrameLoop: end frame
\return The animated mesh based on a detail level. */ \return The animated mesh based on a detail level. */
IMesh *getMesh(s32 frame, s32 detailLevel = 255, s32 startFrameLoop = -1, s32 endFrameLoop = -1) override IMesh* getMesh(s32 frame, s32 detailLevel=255, s32 startFrameLoop=-1, s32 endFrameLoop=-1) override
{ {
if (Meshes.empty()) if (Meshes.empty())
return 0; return 0;
@ -75,9 +75,10 @@ struct SAnimatedMesh : public IAnimatedMesh
} }
//! adds a Mesh //! adds a Mesh
void addMesh(IMesh *mesh) void addMesh(IMesh* mesh)
{
if (mesh)
{ {
if (mesh) {
mesh->grab(); mesh->grab();
Meshes.push_back(mesh); Meshes.push_back(mesh);
} }
@ -85,13 +86,13 @@ struct SAnimatedMesh : public IAnimatedMesh
//! Returns an axis aligned bounding box of the mesh. //! Returns an axis aligned bounding box of the mesh.
/** \return A bounding box of this mesh is returned. */ /** \return A bounding box of this mesh is returned. */
const core::aabbox3d<f32> &getBoundingBox() const override const core::aabbox3d<f32>& getBoundingBox() const override
{ {
return Box; return Box;
} }
//! set user axis aligned bounding box //! set user axis aligned bounding box
void setBoundingBox(const core::aabbox3df &box) override void setBoundingBox(const core::aabbox3df& box) override
{ {
Box = box; Box = box;
} }
@ -99,14 +100,14 @@ struct SAnimatedMesh : public IAnimatedMesh
//! Recalculates the bounding box. //! Recalculates the bounding box.
void recalculateBoundingBox() void recalculateBoundingBox()
{ {
Box.reset(0, 0, 0); Box.reset(0,0,0);
if (Meshes.empty()) if (Meshes.empty())
return; return;
Box = Meshes[0]->getBoundingBox(); Box = Meshes[0]->getBoundingBox();
for (u32 i = 1; i < Meshes.size(); ++i) for (u32 i=1; i<Meshes.size(); ++i)
Box.addInternalBox(Meshes[i]->getBoundingBox()); Box.addInternalBox(Meshes[i]->getBoundingBox());
} }
@ -126,7 +127,7 @@ struct SAnimatedMesh : public IAnimatedMesh
} }
//! returns pointer to a mesh buffer //! returns pointer to a mesh buffer
IMeshBuffer *getMeshBuffer(u32 nr) const override IMeshBuffer* getMeshBuffer(u32 nr) const override
{ {
if (Meshes.empty()) if (Meshes.empty())
return 0; return 0;
@ -138,7 +139,7 @@ struct SAnimatedMesh : public IAnimatedMesh
/** \param material: material to search for /** \param material: material to search for
\return Returns the pointer to the mesh buffer or \return Returns the pointer to the mesh buffer or
NULL if there is no such mesh buffer. */ NULL if there is no such mesh buffer. */
IMeshBuffer *getMeshBuffer(const video::SMaterial &material) const override IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const override
{ {
if (Meshes.empty()) if (Meshes.empty())
return 0; return 0;
@ -147,21 +148,21 @@ struct SAnimatedMesh : public IAnimatedMesh
} }
//! set the hardware mapping hint, for driver //! set the hardware mapping hint, for driver
void setHardwareMappingHint(E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) override void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) override
{ {
for (u32 i = 0; i < Meshes.size(); ++i) for (u32 i=0; i<Meshes.size(); ++i)
Meshes[i]->setHardwareMappingHint(newMappingHint, buffer); Meshes[i]->setHardwareMappingHint(newMappingHint, buffer);
} }
//! flags the meshbuffer as changed, reloads hardware buffers //! flags the meshbuffer as changed, reloads hardware buffers
void setDirty(E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) override void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) override
{ {
for (u32 i = 0; i < Meshes.size(); ++i) for (u32 i=0; i<Meshes.size(); ++i)
Meshes[i]->setDirty(buffer); Meshes[i]->setDirty(buffer);
} }
//! All meshes defining the animated mesh //! All meshes defining the animated mesh
core::array<IMesh *> Meshes; core::array<IMesh*> Meshes;
//! The bounding box of this mesh //! The bounding box of this mesh
core::aabbox3d<f32> Box; core::aabbox3d<f32> Box;
@ -171,7 +172,11 @@ struct SAnimatedMesh : public IAnimatedMesh
//! The type of the mesh. //! The type of the mesh.
E_ANIMATED_MESH_TYPE Type; E_ANIMATED_MESH_TYPE Type;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 __COLOR_H_INCLUDED__
#define __COLOR_H_INCLUDED__
#include "irrTypes.h" #include "irrTypes.h"
#include "irrMath.h" #include "irrMath.h"
@ -11,13 +12,13 @@ namespace irr
{ {
namespace video namespace video
{ {
//! An enum for the color format of textures used by the Irrlicht Engine. //! An enum for the color format of textures used by the Irrlicht Engine.
/** A color format specifies how color information is stored. /** A color format specifies how color information is stored.
NOTE: Byte order in memory is usually flipped (it's probably correct in bitmap files, but flipped on reading). NOTE: Byte order in memory is usually flipped (it's probably correct in bitmap files, but flipped on reading).
So for example ECF_A8R8G8B8 is BGRA in memory same as in DX9's D3DFMT_A8R8G8B8 format. So for example ECF_A8R8G8B8 is BGRA in memory same as in DX9's D3DFMT_A8R8G8B8 format.
*/ */
enum ECOLOR_FORMAT enum ECOLOR_FORMAT
{ {
//! 16 bit color format used by the software driver. //! 16 bit color format used by the software driver.
/** It is thus preferred by all other irrlicht engine video drivers. /** It is thus preferred by all other irrlicht engine video drivers.
There are 5 bits for every color component, and a single bit is left There are 5 bits for every color component, and a single bit is left
@ -85,10 +86,11 @@ enum ECOLOR_FORMAT
//! Unknown color format: //! Unknown color format:
ECF_UNKNOWN ECF_UNKNOWN
}; };
//! Names for ECOLOR_FORMAT types //! Names for ECOLOR_FORMAT types
const c8 *const ColorFormatNames[ECF_UNKNOWN + 2] = { const c8* const ColorFormatNames[ECF_UNKNOWN+2] =
{
"A1R5G5B5", "A1R5G5B5",
"R5G6B5", "R5G6B5",
"R8G8B8", "R8G8B8",
@ -107,164 +109,183 @@ const c8 *const ColorFormatNames[ECF_UNKNOWN + 2] = {
"D32", "D32",
"D24S8", "D24S8",
"UNKNOWN", "UNKNOWN",
0, 0
}; };
//! Creates a 16 bit A1R5G5B5 color
inline u16 RGBA16(u32 r, u32 g, u32 b, u32 a = 0xFF) //! Creates a 16 bit A1R5G5B5 color
{ inline u16 RGBA16(u32 r, u32 g, u32 b, u32 a=0xFF)
{
return (u16)((a & 0x80) << 8 | return (u16)((a & 0x80) << 8 |
(r & 0xF8) << 7 | (r & 0xF8) << 7 |
(g & 0xF8) << 2 | (g & 0xF8) << 2 |
(b & 0xF8) >> 3); (b & 0xF8) >> 3);
} }
//! Creates a 16 bit A1R5G5B5 color
inline u16 RGB16(u32 r, u32 g, u32 b)
{
return RGBA16(r, g, b);
}
//! Creates a 16bit A1R5G5B5 color, based on 16bit input values //! Creates a 16 bit A1R5G5B5 color
inline u16 RGB16from16(u16 r, u16 g, u16 b) inline u16 RGB16(u32 r, u32 g, u32 b)
{ {
return RGBA16(r,g,b);
}
//! Creates a 16bit A1R5G5B5 color, based on 16bit input values
inline u16 RGB16from16(u16 r, u16 g, u16 b)
{
return (0x8000 | return (0x8000 |
(r & 0x1F) << 10 | (r & 0x1F) << 10 |
(g & 0x1F) << 5 | (g & 0x1F) << 5 |
(b & 0x1F)); (b & 0x1F));
} }
//! Converts a 32bit (X8R8G8B8) color to a 16bit A1R5G5B5 color
inline u16 X8R8G8B8toA1R5G5B5(u32 color) //! Converts a 32bit (X8R8G8B8) color to a 16bit A1R5G5B5 color
{ inline u16 X8R8G8B8toA1R5G5B5(u32 color)
{
return (u16)(0x8000 | return (u16)(0x8000 |
(color & 0x00F80000) >> 9 | ( color & 0x00F80000) >> 9 |
(color & 0x0000F800) >> 6 | ( color & 0x0000F800) >> 6 |
(color & 0x000000F8) >> 3); ( color & 0x000000F8) >> 3);
} }
//! Converts a 32bit (A8R8G8B8) color to a 16bit A1R5G5B5 color
inline u16 A8R8G8B8toA1R5G5B5(u32 color)
{
return (u16)((color & 0x80000000) >> 16 |
(color & 0x00F80000) >> 9 |
(color & 0x0000F800) >> 6 |
(color & 0x000000F8) >> 3);
}
//! Converts a 32bit (A8R8G8B8) color to a 16bit R5G6B5 color //! Converts a 32bit (A8R8G8B8) color to a 16bit A1R5G5B5 color
inline u16 A8R8G8B8toR5G6B5(u32 color) inline u16 A8R8G8B8toA1R5G5B5(u32 color)
{ {
return (u16)((color & 0x00F80000) >> 8 | return (u16)(( color & 0x80000000) >> 16|
(color & 0x0000FC00) >> 5 | ( color & 0x00F80000) >> 9 |
(color & 0x000000F8) >> 3); ( color & 0x0000F800) >> 6 |
} ( color & 0x000000F8) >> 3);
}
//! Convert A8R8G8B8 Color from A1R5G5B5 color
/** build a nicer 32bit Color by extending dest lower bits with source high bits. */
inline u32 A1R5G5B5toA8R8G8B8(u16 color)
{
return (((-((s32)color & 0x00008000) >> (s32)31) & 0xFF000000) |
((color & 0x00007C00) << 9) | ((color & 0x00007000) << 4) |
((color & 0x000003E0) << 6) | ((color & 0x00000380) << 1) |
((color & 0x0000001F) << 3) | ((color & 0x0000001C) >> 2));
}
//! Returns A8R8G8B8 Color from R5G6B5 color //! Converts a 32bit (A8R8G8B8) color to a 16bit R5G6B5 color
inline u32 R5G6B5toA8R8G8B8(u16 color) inline u16 A8R8G8B8toR5G6B5(u32 color)
{ {
return (u16)(( color & 0x00F80000) >> 8 |
( color & 0x0000FC00) >> 5 |
( color & 0x000000F8) >> 3);
}
//! Convert A8R8G8B8 Color from A1R5G5B5 color
/** build a nicer 32bit Color by extending dest lower bits with source high bits. */
inline u32 A1R5G5B5toA8R8G8B8(u16 color)
{
return ( (( -( (s32) color & 0x00008000 ) >> (s32) 31 ) & 0xFF000000 ) |
(( color & 0x00007C00 ) << 9) | (( color & 0x00007000 ) << 4) |
(( color & 0x000003E0 ) << 6) | (( color & 0x00000380 ) << 1) |
(( color & 0x0000001F ) << 3) | (( color & 0x0000001C ) >> 2)
);
}
//! Returns A8R8G8B8 Color from R5G6B5 color
inline u32 R5G6B5toA8R8G8B8(u16 color)
{
return 0xFF000000 | return 0xFF000000 |
((color & 0xF800) << 8) | ((color & 0xF800) << 8)|
((color & 0x07E0) << 5) | ((color & 0x07E0) << 5)|
((color & 0x001F) << 3); ((color & 0x001F) << 3);
} }
//! Returns A1R5G5B5 Color from R5G6B5 color
inline u16 R5G6B5toA1R5G5B5(u16 color) //! Returns A1R5G5B5 Color from R5G6B5 color
{ inline u16 R5G6B5toA1R5G5B5(u16 color)
{
return 0x8000 | (((color & 0xFFC0) >> 1) | (color & 0x1F)); return 0x8000 | (((color & 0xFFC0) >> 1) | (color & 0x1F));
} }
//! Returns R5G6B5 Color from A1R5G5B5 color
inline u16 A1R5G5B5toR5G6B5(u16 color) //! Returns R5G6B5 Color from A1R5G5B5 color
{ inline u16 A1R5G5B5toR5G6B5(u16 color)
{
return (((color & 0x7FE0) << 1) | (color & 0x1F)); return (((color & 0x7FE0) << 1) | (color & 0x1F));
} }
//! Returns the alpha component from A1R5G5B5 color
/** In Irrlicht, alpha refers to opacity.
\return The alpha value of the color. 0 is transparent, 1 is opaque. */
inline u32 getAlpha(u16 color)
{
return ((color >> 15) & 0x1);
}
//! Returns the red component from A1R5G5B5 color.
/** Shift left by 3 to get 8 bit value. */
inline u32 getRed(u16 color)
{
return ((color >> 10) & 0x1F);
}
//! Returns the green component from A1R5G5B5 color //! Returns the alpha component from A1R5G5B5 color
/** Shift left by 3 to get 8 bit value. */ /** In Irrlicht, alpha refers to opacity.
inline u32 getGreen(u16 color) \return The alpha value of the color. 0 is transparent, 1 is opaque. */
{ inline u32 getAlpha(u16 color)
return ((color >> 5) & 0x1F); {
} return ((color >> 15)&0x1);
}
//! Returns the blue component from A1R5G5B5 color
/** Shift left by 3 to get 8 bit value. */ //! Returns the red component from A1R5G5B5 color.
inline u32 getBlue(u16 color) /** Shift left by 3 to get 8 bit value. */
{ inline u32 getRed(u16 color)
{
return ((color >> 10)&0x1F);
}
//! Returns the green component from A1R5G5B5 color
/** Shift left by 3 to get 8 bit value. */
inline u32 getGreen(u16 color)
{
return ((color >> 5)&0x1F);
}
//! Returns the blue component from A1R5G5B5 color
/** Shift left by 3 to get 8 bit value. */
inline u32 getBlue(u16 color)
{
return (color & 0x1F); return (color & 0x1F);
} }
//! Returns the average from a 16 bit A1R5G5B5 color
inline s32 getAverage(s16 color)
{
return ((getRed(color) << 3) + (getGreen(color) << 3) + (getBlue(color) << 3)) / 3;
}
//! Class representing a 32 bit ARGB color. //! Returns the average from a 16 bit A1R5G5B5 color
/** The color values for alpha, red, green, and blue are inline s32 getAverage(s16 color)
stored in a single u32. So all four values may be between 0 and 255. {
Alpha in Irrlicht is opacity, so 0 is fully transparent, 255 is fully opaque (solid). return ((getRed(color)<<3) + (getGreen(color)<<3) + (getBlue(color)<<3)) / 3;
This class is used by most parts of the Irrlicht Engine }
to specify a color. Another way is using the class SColorf, which
stores the color values in 4 floats.
This class must consist of only one u32 and must not use virtual functions. //! Class representing a 32 bit ARGB color.
*/ /** The color values for alpha, red, green, and blue are
class SColor stored in a single u32. So all four values may be between 0 and 255.
{ Alpha in Irrlicht is opacity, so 0 is fully transparent, 255 is fully opaque (solid).
public: This class is used by most parts of the Irrlicht Engine
to specify a color. Another way is using the class SColorf, which
stores the color values in 4 floats.
This class must consist of only one u32 and must not use virtual functions.
*/
class SColor
{
public:
//! Constructor of the Color. Does nothing. //! Constructor of the Color. Does nothing.
/** The color value is not initialized to save time. */ /** The color value is not initialized to save time. */
SColor() {} SColor() {}
//! Constructs the color from 4 values representing the alpha, red, green and blue component. //! Constructs the color from 4 values representing the alpha, red, green and blue component.
/** Must be values between 0 and 255. */ /** Must be values between 0 and 255. */
constexpr SColor(u32 a, u32 r, u32 g, u32 b) : SColor (u32 a, u32 r, u32 g, u32 b)
color(((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)) {} : color(((a & 0xff)<<24) | ((r & 0xff)<<16) | ((g & 0xff)<<8) | (b & 0xff)) {}
//! Constructs the color from a 32 bit value. Could be another color. //! Constructs the color from a 32 bit value. Could be another color.
constexpr SColor(u32 clr) : SColor(u32 clr)
color(clr) {} : color(clr) {}
//! Returns the alpha component of the color. //! Returns the alpha component of the color.
/** The alpha component defines how opaque a color is. /** The alpha component defines how opaque a color is.
\return The alpha value of the color. 0 is fully transparent, 255 is fully opaque. */ \return The alpha value of the color. 0 is fully transparent, 255 is fully opaque. */
u32 getAlpha() const { return color >> 24; } u32 getAlpha() const { return color>>24; }
//! Returns the red component of the color. //! Returns the red component of the color.
/** \return Value between 0 and 255, specifying how red the color is. /** \return Value between 0 and 255, specifying how red the color is.
0 means no red, 255 means full red. */ 0 means no red, 255 means full red. */
u32 getRed() const { return (color >> 16) & 0xff; } u32 getRed() const { return (color>>16) & 0xff; }
//! Returns the green component of the color. //! Returns the green component of the color.
/** \return Value between 0 and 255, specifying how green the color is. /** \return Value between 0 and 255, specifying how green the color is.
0 means no green, 255 means full green. */ 0 means no green, 255 means full green. */
u32 getGreen() const { return (color >> 8) & 0xff; } u32 getGreen() const { return (color>>8) & 0xff; }
//! Returns the blue component of the color. //! Returns the blue component of the color.
/** \return Value between 0 and 255, specifying how blue the color is. /** \return Value between 0 and 255, specifying how blue the color is.
@ -274,35 +295,35 @@ public:
//! Get lightness of the color in the range [0,255] //! Get lightness of the color in the range [0,255]
f32 getLightness() const f32 getLightness() const
{ {
return 0.5f * (core::max_(core::max_(getRed(), getGreen()), getBlue()) + core::min_(core::min_(getRed(), getGreen()), getBlue())); return 0.5f*(core::max_(core::max_(getRed(),getGreen()),getBlue())+core::min_(core::min_(getRed(),getGreen()),getBlue()));
} }
//! Get luminance of the color in the range [0,255]. //! Get luminance of the color in the range [0,255].
f32 getLuminance() const f32 getLuminance() const
{ {
return 0.3f * getRed() + 0.59f * getGreen() + 0.11f * getBlue(); return 0.3f*getRed() + 0.59f*getGreen() + 0.11f*getBlue();
} }
//! Get average intensity of the color in the range [0,255]. //! Get average intensity of the color in the range [0,255].
u32 getAverage() const u32 getAverage() const
{ {
return (getRed() + getGreen() + getBlue()) / 3; return ( getRed() + getGreen() + getBlue() ) / 3;
} }
//! Sets the alpha component of the Color. //! Sets the alpha component of the Color.
/** The alpha component defines how transparent a color should be. /** The alpha component defines how transparent a color should be.
\param a The alpha value of the color. 0 is fully transparent, 255 is fully opaque. */ \param a The alpha value of the color. 0 is fully transparent, 255 is fully opaque. */
void setAlpha(u32 a) { color = ((a & 0xff) << 24) | (color & 0x00ffffff); } void setAlpha(u32 a) { color = ((a & 0xff)<<24) | (color & 0x00ffffff); }
//! Sets the red component of the Color. //! Sets the red component of the Color.
/** \param r: Has to be a value between 0 and 255. /** \param r: Has to be a value between 0 and 255.
0 means no red, 255 means full red. */ 0 means no red, 255 means full red. */
void setRed(u32 r) { color = ((r & 0xff) << 16) | (color & 0xff00ffff); } void setRed(u32 r) { color = ((r & 0xff)<<16) | (color & 0xff00ffff); }
//! Sets the green component of the Color. //! Sets the green component of the Color.
/** \param g: Has to be a value between 0 and 255. /** \param g: Has to be a value between 0 and 255.
0 means no green, 255 means full green. */ 0 means no green, 255 means full green. */
void setGreen(u32 g) { color = ((g & 0xff) << 8) | (color & 0xffff00ff); } void setGreen(u32 g) { color = ((g & 0xff)<<8) | (color & 0xffff00ff); }
//! Sets the blue component of the Color. //! Sets the blue component of the Color.
/** \param b: Has to be a value between 0 and 255. /** \param b: Has to be a value between 0 and 255.
@ -317,7 +338,7 @@ public:
/** From ARGB to RGBA in 4 byte components for endian aware /** From ARGB to RGBA in 4 byte components for endian aware
passing to OpenGL passing to OpenGL
\param dest: address where the 4x8 bit OpenGL color is stored. */ \param dest: address where the 4x8 bit OpenGL color is stored. */
void toOpenGLColor(u8 *dest) const void toOpenGLColor(u8* dest) const
{ {
*dest = (u8)getRed(); *dest = (u8)getRed();
*++dest = (u8)getGreen(); *++dest = (u8)getGreen();
@ -342,26 +363,26 @@ public:
value between 0 and 255. 0 means no blue, 255 means full blue. */ value between 0 and 255. 0 means no blue, 255 means full blue. */
void set(u32 a, u32 r, u32 g, u32 b) void set(u32 a, u32 r, u32 g, u32 b)
{ {
color = (((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)); color = (((a & 0xff)<<24) | ((r & 0xff)<<16) | ((g & 0xff)<<8) | (b & 0xff));
} }
void set(u32 col) { color = col; } void set(u32 col) { color = col; }
//! Compares the color to another color. //! Compares the color to another color.
/** \return True if the colors are the same, and false if not. */ /** \return True if the colors are the same, and false if not. */
bool operator==(const SColor &other) const { return other.color == color; } bool operator==(const SColor& other) const { return other.color == color; }
//! Compares the color to another color. //! Compares the color to another color.
/** \return True if the colors are different, and false if they are the same. */ /** \return True if the colors are different, and false if they are the same. */
bool operator!=(const SColor &other) const { return other.color != color; } bool operator!=(const SColor& other) const { return other.color != color; }
//! comparison operator //! comparison operator
/** \return True if this color is smaller than the other one */ /** \return True if this color is smaller than the other one */
bool operator<(const SColor &other) const { return (color < other.color); } bool operator<(const SColor& other) const { return (color < other.color); }
//! Adds two colors, result is clamped to 0..255 values //! Adds two colors, result is clamped to 0..255 values
/** \param other Color to add to this color /** \param other Color to add to this color
\return Addition of the two colors, clamped to 0..255 values */ \return Addition of the two colors, clamped to 0..255 values */
SColor operator+(const SColor &other) const SColor operator+(const SColor& other) const
{ {
return SColor(core::min_(getAlpha() + other.getAlpha(), 255u), return SColor(core::min_(getAlpha() + other.getAlpha(), 255u),
core::min_(getRed() + other.getRed(), 255u), core::min_(getRed() + other.getRed(), 255u),
@ -377,17 +398,17 @@ public:
{ {
d = core::clamp(d, 0.f, 1.f); d = core::clamp(d, 0.f, 1.f);
const f32 inv = 1.0f - d; const f32 inv = 1.0f - d;
return SColor((u32)core::round32(other.getAlpha() * inv + getAlpha() * d), return SColor((u32)core::round32(other.getAlpha()*inv + getAlpha()*d),
(u32)core::round32(other.getRed() * inv + getRed() * d), (u32)core::round32(other.getRed()*inv + getRed()*d),
(u32)core::round32(other.getGreen() * inv + getGreen() * d), (u32)core::round32(other.getGreen()*inv + getGreen()*d),
(u32)core::round32(other.getBlue() * inv + getBlue() * d)); (u32)core::round32(other.getBlue()*inv + getBlue()*d));
} }
//! Returns interpolated color. ( quadratic ) //! Returns interpolated color. ( quadratic )
/** \param c1: first color to interpolate with /** \param c1: first color to interpolate with
\param c2: second color to interpolate with \param c2: second color to interpolate with
\param d: value between 0.0f and 1.0f. */ \param d: value between 0.0f and 1.0f. */
SColor getInterpolated_quadratic(const SColor &c1, const SColor &c2, f32 d) const SColor getInterpolated_quadratic(const SColor& c1, const SColor& c2, f32 d) const
{ {
// this*(1-d)*(1-d) + 2 * c1 * (1-d) + c2 * d * d; // this*(1-d)*(1-d) + 2 * c1 * (1-d) + c2 * d * d;
d = core::clamp(d, 0.f, 1.f); d = core::clamp(d, 0.f, 1.f);
@ -397,18 +418,14 @@ public:
const f32 mul2 = d * d; const f32 mul2 = d * d;
return SColor( return SColor(
core::clamp(core::floor32( core::clamp( core::floor32(
getAlpha() * mul0 + c1.getAlpha() * mul1 + c2.getAlpha() * mul2), getAlpha() * mul0 + c1.getAlpha() * mul1 + c2.getAlpha() * mul2 ), 0, 255 ),
0, 255), core::clamp( core::floor32(
core::clamp(core::floor32( getRed() * mul0 + c1.getRed() * mul1 + c2.getRed() * mul2 ), 0, 255 ),
getRed() * mul0 + c1.getRed() * mul1 + c2.getRed() * mul2), core::clamp ( core::floor32(
0, 255), getGreen() * mul0 + c1.getGreen() * mul1 + c2.getGreen() * mul2 ), 0, 255 ),
core::clamp(core::floor32( core::clamp ( core::floor32(
getGreen() * mul0 + c1.getGreen() * mul1 + c2.getGreen() * mul2), getBlue() * mul0 + c1.getBlue() * mul1 + c2.getBlue() * mul2 ), 0, 255 ));
0, 255),
core::clamp(core::floor32(
getBlue() * mul0 + c1.getBlue() * mul1 + c2.getBlue() * mul2),
0, 255));
} }
//! set the color by expecting data in the given format //! set the color by expecting data in the given format
@ -417,20 +434,23 @@ public:
*/ */
void setData(const void *data, ECOLOR_FORMAT format) void setData(const void *data, ECOLOR_FORMAT format)
{ {
switch (format) { switch (format)
{
case ECF_A1R5G5B5: case ECF_A1R5G5B5:
color = A1R5G5B5toA8R8G8B8(*(u16 *)data); color = A1R5G5B5toA8R8G8B8(*(u16*)data);
break; break;
case ECF_R5G6B5: case ECF_R5G6B5:
color = R5G6B5toA8R8G8B8(*(u16 *)data); color = R5G6B5toA8R8G8B8(*(u16*)data);
break; break;
case ECF_A8R8G8B8: case ECF_A8R8G8B8:
color = *(u32 *)data; color = *(u32*)data;
break;
case ECF_R8G8B8:
{
const u8* p = (u8*)data;
set(255, p[0],p[1],p[2]);
}
break; break;
case ECF_R8G8B8: {
const u8 *p = (u8 *)data;
set(255, p[0], p[1], p[2]);
} break;
default: default:
color = 0xffffffff; color = 0xffffffff;
break; break;
@ -443,28 +463,37 @@ public:
*/ */
void getData(void *data, ECOLOR_FORMAT format) const void getData(void *data, ECOLOR_FORMAT format) const
{ {
switch (format) { switch(format)
case ECF_A1R5G5B5: { {
u16 *dest = (u16 *)data; case ECF_A1R5G5B5:
*dest = video::A8R8G8B8toA1R5G5B5(color); {
} break; u16 * dest = (u16*)data;
*dest = video::A8R8G8B8toA1R5G5B5( color );
}
break;
case ECF_R5G6B5: { case ECF_R5G6B5:
u16 *dest = (u16 *)data; {
*dest = video::A8R8G8B8toR5G6B5(color); u16 * dest = (u16*)data;
} break; *dest = video::A8R8G8B8toR5G6B5( color );
}
break;
case ECF_R8G8B8: { case ECF_R8G8B8:
u8 *dest = (u8 *)data; {
u8* dest = (u8*)data;
dest[0] = (u8)getRed(); dest[0] = (u8)getRed();
dest[1] = (u8)getGreen(); dest[1] = (u8)getGreen();
dest[2] = (u8)getBlue(); dest[2] = (u8)getBlue();
} break; }
break;
case ECF_A8R8G8B8: { case ECF_A8R8G8B8:
u32 *dest = (u32 *)data; {
u32 * dest = (u32*)data;
*dest = color; *dest = color;
} break; }
break;
default: default:
break; break;
@ -473,22 +502,22 @@ public:
//! color in A8R8G8B8 Format //! color in A8R8G8B8 Format
u32 color; u32 color;
}; };
//! Class representing a color with four floats.
/** The color values for red, green, blue //! Class representing a color with four floats.
and alpha are each stored in a 32 bit floating point variable. /** The color values for red, green, blue
So all four values may be between 0.0f and 1.0f. and alpha are each stored in a 32 bit floating point variable.
Another, faster way to define colors is using the class SColor, which So all four values may be between 0.0f and 1.0f.
stores the color values in a single 32 bit integer. Another, faster way to define colors is using the class SColor, which
*/ stores the color values in a single 32 bit integer.
class SColorf */
{ class SColorf
public: {
public:
//! Default constructor for SColorf. //! Default constructor for SColorf.
/** Sets red, green and blue to 0.0f and alpha to 1.0f. */ /** Sets red, green and blue to 0.0f and alpha to 1.0f. */
SColorf() : SColorf() : r(0.0f), g(0.0f), b(0.0f), a(1.0f) {}
r(0.0f), g(0.0f), b(0.0f), a(1.0f) {}
//! Constructs a color from up to four color values: red, green, blue, and alpha. //! Constructs a color from up to four color values: red, green, blue, and alpha.
/** \param r: Red color component. Should be a value between /** \param r: Red color component. Should be a value between
@ -501,8 +530,7 @@ public:
component defines how transparent a color should be. Has to be component defines how transparent a color should be. Has to be
a value between 0.0f and 1.0f, 1.0f means not transparent a value between 0.0f and 1.0f, 1.0f means not transparent
(opaque), 0.0f means fully transparent. */ (opaque), 0.0f means fully transparent. */
SColorf(f32 r, f32 g, f32 b, f32 a = 1.0f) : SColorf(f32 r, f32 g, f32 b, f32 a = 1.0f) : r(r), g(g), b(b), a(a) {}
r(r), g(g), b(b), a(a) {}
//! Constructs a color from 32 bit Color. //! Constructs a color from 32 bit Color.
/** \param c: 32 bit color from which this SColorf class is /** \param c: 32 bit color from which this SColorf class is
@ -519,7 +547,7 @@ public:
//! Converts this color to a SColor without floats. //! Converts this color to a SColor without floats.
SColor toSColor() const SColor toSColor() const
{ {
return SColor((u32)core::round32(a * 255.0f), (u32)core::round32(r * 255.0f), (u32)core::round32(g * 255.0f), (u32)core::round32(b * 255.0f)); return SColor((u32)core::round32(a*255.0f), (u32)core::round32(r*255.0f), (u32)core::round32(g*255.0f), (u32)core::round32(b*255.0f));
} }
//! Sets three color components to new values at once. //! Sets three color components to new values at once.
@ -529,12 +557,7 @@ public:
no green (=black) and 1.0f, meaning full green. no green (=black) and 1.0f, meaning full green.
\param bb: Blue color component. Should be a value between 0.0f meaning \param bb: Blue color component. Should be a value between 0.0f meaning
no blue (=black) and 1.0f, meaning full blue. */ no blue (=black) and 1.0f, meaning full blue. */
void set(f32 rr, f32 gg, f32 bb) void set(f32 rr, f32 gg, f32 bb) {r = rr; g =gg; b = bb; }
{
r = rr;
g = gg;
b = bb;
}
//! Sets all four color components to new values at once. //! Sets all four color components to new values at once.
/** \param aa: Alpha component. Should be a value between 0.0f meaning /** \param aa: Alpha component. Should be a value between 0.0f meaning
@ -545,13 +568,7 @@ public:
no green and 1.0f, meaning full green. no green and 1.0f, meaning full green.
\param bb: Blue color component. Should be a value between 0.0f meaning \param bb: Blue color component. Should be a value between 0.0f meaning
no blue and 1.0f, meaning full blue. */ no blue and 1.0f, meaning full blue. */
void set(f32 aa, f32 rr, f32 gg, f32 bb) void set(f32 aa, f32 rr, f32 gg, f32 bb) {a = aa; r = rr; g =gg; b = bb; }
{
a = aa;
r = rr;
g = gg;
b = bb;
}
//! Interpolates the color with a f32 value to another color //! Interpolates the color with a f32 value to another color
/** \param other: Other color /** \param other: Other color
@ -561,15 +578,15 @@ public:
{ {
d = core::clamp(d, 0.f, 1.f); d = core::clamp(d, 0.f, 1.f);
const f32 inv = 1.0f - d; const f32 inv = 1.0f - d;
return SColorf(other.r * inv + r * d, return SColorf(other.r*inv + r*d,
other.g * inv + g * d, other.b * inv + b * d, other.a * inv + a * d); other.g*inv + g*d, other.b*inv + b*d, other.a*inv + a*d);
} }
//! Returns interpolated color. ( quadratic ) //! Returns interpolated color. ( quadratic )
/** \param c1: first color to interpolate with /** \param c1: first color to interpolate with
\param c2: second color to interpolate with \param c2: second color to interpolate with
\param d: value between 0.0f and 1.0f. */ \param d: value between 0.0f and 1.0f. */
inline SColorf getInterpolated_quadratic(const SColorf &c1, const SColorf &c2, inline SColorf getInterpolated_quadratic(const SColorf& c1, const SColorf& c2,
f32 d) const f32 d) const
{ {
d = core::clamp(d, 0.f, 1.f); d = core::clamp(d, 0.f, 1.f);
@ -579,28 +596,22 @@ public:
const f32 mul1 = 2.f * d * inv; const f32 mul1 = 2.f * d * inv;
const f32 mul2 = d * d; const f32 mul2 = d * d;
return SColorf(r * mul0 + c1.r * mul1 + c2.r * mul2, return SColorf (r * mul0 + c1.r * mul1 + c2.r * mul2,
g * mul0 + c1.g * mul1 + c2.g * mul2, g * mul0 + c1.g * mul1 + c2.g * mul2,
b * mul0 + c1.b * mul1 + c2.b * mul2, b * mul0 + c1.b * mul1 + c2.b * mul2,
a * mul0 + c1.a * mul1 + c2.a * mul2); a * mul0 + c1.a * mul1 + c2.a * mul2);
} }
//! Sets a color component by index. R=0, G=1, B=2, A=3 //! Sets a color component by index. R=0, G=1, B=2, A=3
void setColorComponentValue(s32 index, f32 value) void setColorComponentValue(s32 index, f32 value)
{ {
switch (index) { switch(index)
case 0: {
r = value; case 0: r = value; break;
break; case 1: g = value; break;
case 1: case 2: b = value; break;
g = value; case 3: a = value; break;
break;
case 2:
b = value;
break;
case 3:
a = value;
break;
} }
} }
@ -627,18 +638,19 @@ public:
//! alpha color component //! alpha color component
f32 a; f32 a;
}; };
//! Class representing a color in HSL format
/** The color values for hue, saturation, luminance //! Class representing a color in HSL format
are stored in 32bit floating point variables. Hue is in range [0,360], /** The color values for hue, saturation, luminance
Luminance and Saturation are in percent [0,100] are stored in 32bit floating point variables. Hue is in range [0,360],
*/ Luminance and Saturation are in percent [0,100]
class SColorHSL */
{ class SColorHSL
public: {
constexpr SColorHSL(f32 h = 0.f, f32 s = 0.f, f32 l = 0.f) : public:
Hue(h), Saturation(s), Luminance(l) {} SColorHSL ( f32 h = 0.f, f32 s = 0.f, f32 l = 0.f )
: Hue ( h ), Saturation ( s ), Luminance ( l ) {}
void fromRGB(const SColorf &color); void fromRGB(const SColorf &color);
void toRGB(SColorf &color) const; void toRGB(SColorf &color) const;
@ -647,82 +659,96 @@ public:
f32 Saturation; f32 Saturation;
f32 Luminance; f32 Luminance;
private: private:
inline f32 toRGB1(f32 rm1, f32 rm2, f32 rh) const; inline f32 toRGB1(f32 rm1, f32 rm2, f32 rh) const;
};
inline void SColorHSL::fromRGB(const SColorf &color) };
{
inline void SColorHSL::fromRGB(const SColorf &color)
{
const f32 maxVal = core::max_(color.getRed(), color.getGreen(), color.getBlue()); const f32 maxVal = core::max_(color.getRed(), color.getGreen(), color.getBlue());
const f32 minVal = (f32)core::min_(color.getRed(), color.getGreen(), color.getBlue()); const f32 minVal = (f32)core::min_(color.getRed(), color.getGreen(), color.getBlue());
Luminance = (maxVal + minVal) * 50; Luminance = (maxVal+minVal)*50;
if (core::equals(maxVal, minVal)) { if (core::equals(maxVal, minVal))
Hue = 0.f; {
Saturation = 0.f; Hue=0.f;
Saturation=0.f;
return; return;
} }
const f32 delta = maxVal - minVal; const f32 delta = maxVal-minVal;
if (Luminance <= 50) { if ( Luminance <= 50 )
Saturation = (delta) / (maxVal + minVal); {
} else { Saturation = (delta)/(maxVal+minVal);
Saturation = (delta) / (2 - maxVal - minVal); }
else
{
Saturation = (delta)/(2-maxVal-minVal);
} }
Saturation *= 100; Saturation *= 100;
if (core::equals(maxVal, color.getRed())) if (core::equals(maxVal, color.getRed()))
Hue = (color.getGreen() - color.getBlue()) / delta; Hue = (color.getGreen()-color.getBlue())/delta;
else if (core::equals(maxVal, color.getGreen())) else if (core::equals(maxVal, color.getGreen()))
Hue = 2 + ((color.getBlue() - color.getRed()) / delta); Hue = 2+((color.getBlue()-color.getRed())/delta);
else // blue is max else // blue is max
Hue = 4 + ((color.getRed() - color.getGreen()) / delta); Hue = 4+((color.getRed()-color.getGreen())/delta);
Hue *= 60.0f; Hue *= 60.0f;
while (Hue < 0.f) while ( Hue < 0.f )
Hue += 360; Hue += 360;
} }
inline void SColorHSL::toRGB(SColorf &color) const
{ inline void SColorHSL::toRGB(SColorf &color) const
const f32 l = Luminance / 100; {
if (core::iszero(Saturation)) { // grey const f32 l = Luminance/100;
if (core::iszero(Saturation)) // grey
{
color.set(l, l, l); color.set(l, l, l);
return; return;
} }
f32 rm2; f32 rm2;
if (Luminance <= 50) { if ( Luminance <= 50 )
rm2 = l + l * (Saturation / 100); {
} else { rm2 = l + l * (Saturation/100);
rm2 = l + (1 - l) * (Saturation / 100); }
else
{
rm2 = l + (1 - l) * (Saturation/100);
} }
const f32 rm1 = 2.0f * l - rm2; const f32 rm1 = 2.0f * l - rm2;
const f32 h = Hue / 360.0f; const f32 h = Hue / 360.0f;
color.set(toRGB1(rm1, rm2, h + 1.f / 3.f), color.set( toRGB1(rm1, rm2, h + 1.f/3.f),
toRGB1(rm1, rm2, h), toRGB1(rm1, rm2, h),
toRGB1(rm1, rm2, h - 1.f / 3.f)); toRGB1(rm1, rm2, h - 1.f/3.f)
} );
}
// algorithm from Foley/Van-Dam
inline f32 SColorHSL::toRGB1(f32 rm1, f32 rm2, f32 rh) const // algorithm from Foley/Van-Dam
{ inline f32 SColorHSL::toRGB1(f32 rm1, f32 rm2, f32 rh) const
if (rh < 0) {
if (rh<0)
rh += 1; rh += 1;
if (rh > 1) if (rh>1)
rh -= 1; rh -= 1;
if (rh < 1.f / 6.f) if (rh < 1.f/6.f)
rm1 = rm1 + (rm2 - rm1) * rh * 6.f; rm1 = rm1 + (rm2 - rm1) * rh*6.f;
else if (rh < 0.5f) else if (rh < 0.5f)
rm1 = rm2; rm1 = rm2;
else if (rh < 2.f / 3.f) else if (rh < 2.f/3.f)
rm1 = rm1 + (rm2 - rm1) * ((2.f / 3.f) - rh) * 6.f; rm1 = rm1 + (rm2 - rm1) * ((2.f/3.f)-rh)*6.f;
return rm1; return rm1;
} }
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 __S_EXPOSED_VIDEO_DATA_H_INCLUDED__
#define __S_EXPOSED_VIDEO_DATA_H_INCLUDED__
namespace irr namespace irr
{ {
@ -17,39 +18,29 @@ you are using the software or the null device.
*/ */
struct SExposedVideoData struct SExposedVideoData
{ {
SExposedVideoData() SExposedVideoData() {OpenGLWin32.HDc=0; OpenGLWin32.HRc=0; OpenGLWin32.HWnd=0;}
{ explicit SExposedVideoData(void* Window) {OpenGLWin32.HDc=0; OpenGLWin32.HRc=0; OpenGLWin32.HWnd=Window;}
OpenGLWin32.HDc = 0;
OpenGLWin32.HRc = 0;
OpenGLWin32.HWnd = 0;
}
explicit SExposedVideoData(void *Window)
{
OpenGLWin32.HDc = 0;
OpenGLWin32.HRc = 0;
OpenGLWin32.HWnd = Window;
}
struct SOpenGLWin32 struct SOpenGLWin32
{ {
//! Private GDI Device Context. //! Private GDI Device Context.
/** Get if for example with: HDC h = reinterpret_cast<HDC>(exposedData.OpenGLWin32.HDc) */ /** Get if for example with: HDC h = reinterpret_cast<HDC>(exposedData.OpenGLWin32.HDc) */
void *HDc; void* HDc;
//! Permanent Rendering Context. //! Permanent Rendering Context.
/** Get if for example with: HGLRC h = reinterpret_cast<HGLRC>(exposedData.OpenGLWin32.HRc) */ /** Get if for example with: HGLRC h = reinterpret_cast<HGLRC>(exposedData.OpenGLWin32.HRc) */
void *HRc; void* HRc;
//! Window handle. //! Window handle.
/** Get with for example with: HWND h = reinterpret_cast<HWND>(exposedData.OpenGLWin32.HWnd) */ /** Get with for example with: HWND h = reinterpret_cast<HWND>(exposedData.OpenGLWin32.HWnd) */
void *HWnd; void* HWnd;
}; };
struct SOpenGLLinux struct SOpenGLLinux
{ {
// XWindow handles // XWindow handles
void *X11Display; void* X11Display;
void *X11Context; void* X11Context;
unsigned long X11Window; unsigned long X11Window;
unsigned long GLXWindow; unsigned long GLXWindow;
}; };
@ -57,22 +48,22 @@ struct SExposedVideoData
struct SOpenGLOSX struct SOpenGLOSX
{ {
//! The NSOpenGLContext object. //! The NSOpenGLContext object.
void *Context; void* Context;
//! The NSWindow object. //! The NSWindow object.
void *Window; void* Window;
}; };
struct SOpenGLFB struct SOpenGLFB
{ {
//! The EGLNativeWindowType object. //! The EGLNativeWindowType object.
void *Window; void* Window;
}; };
struct SOGLESAndroid struct SOGLESAndroid
{ {
//! The ANativeWindow object. //! The ANativeWindow object.
void *Window; void* Window;
}; };
union union
@ -87,3 +78,7 @@ struct SExposedVideoData
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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_IRRLICHT_CREATION_PARAMETERS_H_INCLUDED__
#define __I_IRRLICHT_CREATION_PARAMETERS_H_INCLUDED__
#include "EDriverTypes.h" #include "EDriverTypes.h"
#include "EDeviceTypes.h" #include "EDeviceTypes.h"
@ -14,18 +15,18 @@
namespace irr namespace irr
{ {
class IEventReceiver; class IEventReceiver;
//! Structure for holding Irrlicht Device creation parameters. //! Structure for holding Irrlicht Device creation parameters.
/** This structure is used in the createDeviceEx() function. */ /** This structure is used in the createDeviceEx() function. */
struct SIrrlichtCreationParameters struct SIrrlichtCreationParameters
{ {
//! Constructs a SIrrlichtCreationParameters structure with default values. //! Constructs a SIrrlichtCreationParameters structure with default values.
SIrrlichtCreationParameters() : SIrrlichtCreationParameters() :
DeviceType(EIDT_BEST), DeviceType(EIDT_BEST),
DriverType(video::EDT_OPENGL), DriverType(video::EDT_OPENGL),
WindowSize(core::dimension2d<u32>(800, 600)), WindowSize(core::dimension2d<u32>(800, 600)),
WindowPosition(core::position2di(-1, -1)), WindowPosition(core::position2di(-1,-1)),
Bits(32), Bits(32),
ZBufferBits(24), ZBufferBits(24),
Fullscreen(false), Fullscreen(false),
@ -34,8 +35,10 @@ struct SIrrlichtCreationParameters
Stencilbuffer(true), Stencilbuffer(true),
Vsync(false), Vsync(false),
AntiAlias(0), AntiAlias(0),
HandleSRGB(false),
WithAlphaChannel(false), WithAlphaChannel(false),
Doublebuffer(true), Doublebuffer(true),
IgnoreInput(false),
Stereobuffer(false), Stereobuffer(false),
EventReceiver(0), EventReceiver(0),
WindowId(0), WindowId(0),
@ -54,13 +57,11 @@ struct SIrrlichtCreationParameters
{ {
} }
SIrrlichtCreationParameters(const SIrrlichtCreationParameters &other) : SIrrlichtCreationParameters(const SIrrlichtCreationParameters& other) :
SDK_version_do_not_use(IRRLICHT_SDK_VERSION) SDK_version_do_not_use(IRRLICHT_SDK_VERSION)
{ {*this = other;}
*this = other;
}
SIrrlichtCreationParameters &operator=(const SIrrlichtCreationParameters &other) SIrrlichtCreationParameters& operator=(const SIrrlichtCreationParameters& other)
{ {
DeviceType = other.DeviceType; DeviceType = other.DeviceType;
DriverType = other.DriverType; DriverType = other.DriverType;
@ -74,8 +75,10 @@ struct SIrrlichtCreationParameters
Stencilbuffer = other.Stencilbuffer; Stencilbuffer = other.Stencilbuffer;
Vsync = other.Vsync; Vsync = other.Vsync;
AntiAlias = other.AntiAlias; AntiAlias = other.AntiAlias;
HandleSRGB = other.HandleSRGB;
WithAlphaChannel = other.WithAlphaChannel; WithAlphaChannel = other.WithAlphaChannel;
Doublebuffer = other.Doublebuffer; Doublebuffer = other.Doublebuffer;
IgnoreInput = other.IgnoreInput;
Stereobuffer = other.Stereobuffer; Stereobuffer = other.Stereobuffer;
EventReceiver = other.EventReceiver; EventReceiver = other.EventReceiver;
WindowId = other.WindowId; WindowId = other.WindowId;
@ -156,6 +159,21 @@ struct SIrrlichtCreationParameters
Default value: 0 - disabled */ Default value: 0 - disabled */
u8 AntiAlias; u8 AntiAlias;
//! Flag to enable proper sRGB and linear color handling
/** In most situations, it is desirable to have the color handling in
non-linear sRGB color space, and only do the intermediate color
calculations in linear RGB space. If this flag is enabled, the device and
driver try to assure that all color input and output are color corrected
and only the internal color representation is linear. This means, that
the color output is properly gamma-adjusted to provide the brighter
colors for monitor display. And that blending and lighting give a more
natural look, due to proper conversion from non-linear colors into linear
color space for blend operations. If this flag is enabled, all texture colors
(which are usually in sRGB space) are correctly displayed. However vertex colors
and other explicitly set values have to be manually encoded in linear color space.
Default value: false. */
bool HandleSRGB;
//! Whether the main framebuffer uses an alpha channel. //! Whether the main framebuffer uses an alpha channel.
/** In some situations it might be desirable to get a color /** In some situations it might be desirable to get a color
buffer with an alpha channel, e.g. when rendering into a buffer with an alpha channel, e.g. when rendering into a
@ -175,6 +193,13 @@ struct SIrrlichtCreationParameters
single buffers. Default value: true */ single buffers. Default value: true */
bool Doublebuffer; bool Doublebuffer;
//! Specifies if the device should ignore input events
/** This is only relevant when using external I/O handlers.
External windows need to take care of this themselves.
Currently only supported by X11.
Default value: false */
bool IgnoreInput;
//! Specifies if the device should use stereo buffers //! Specifies if the device should use stereo buffers
/** Some high-end gfx cards support two framebuffers for direct /** Some high-end gfx cards support two framebuffers for direct
support of stereoscopic output devices. If this flag is set the support of stereoscopic output devices. If this flag is set the
@ -184,7 +209,7 @@ struct SIrrlichtCreationParameters
bool Stereobuffer; bool Stereobuffer;
//! A user created event receiver. //! A user created event receiver.
IEventReceiver *EventReceiver; IEventReceiver* EventReceiver;
//! Window Id. //! Window Id.
/** If this is set to a value other than 0, the Irrlicht Engine /** If this is set to a value other than 0, the Irrlicht Engine
@ -237,7 +262,7 @@ struct SIrrlichtCreationParameters
\endcode \endcode
However, there is no need to draw the picture this often. Just However, there is no need to draw the picture this often. Just
do it how you like. */ do it how you like. */
void *WindowId; void* WindowId;
//! Specifies the logging level used in the logging interface. //! Specifies the logging level used in the logging interface.
/** The default value is ELL_INFORMATION. You can access the ILogger interface /** The default value is ELL_INFORMATION. You can access the ILogger interface
@ -250,11 +275,11 @@ struct SIrrlichtCreationParameters
//! Don't use or change this parameter. //! Don't use or change this parameter.
/** Always set it to IRRLICHT_SDK_VERSION, which is done by default. /** Always set it to IRRLICHT_SDK_VERSION, which is done by default.
This is needed for sdk version checks. */ This is needed for sdk version checks. */
const c8 *const SDK_version_do_not_use; const c8* const SDK_version_do_not_use;
//! Define some private data storage. //! Define some private data storage.
/** Used when platform devices need access to OS specific data structures etc. /** Used when platform devices need access to OS specific data structures etc.
This is only used for Android at the moment in order to access the native This is only used for Android at th emoment in order to access the native
Java RE. */ Java RE. */
void *PrivateData; void *PrivateData;
@ -262,6 +287,10 @@ struct SIrrlichtCreationParameters
/** This is about the shaders which can be found in media/Shaders by default. It's only necessary /** This is about the shaders which can be found in media/Shaders by default. It's only necessary
to set when using OGL-ES 2.0 */ to set when using OGL-ES 2.0 */
irr::io::path OGLES2ShaderPath; irr::io::path OGLES2ShaderPath;
}; };
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 __S_MATERIAL_H_INCLUDED__
#define __S_MATERIAL_H_INCLUDED__
#include "SColor.h" #include "SColor.h"
#include "matrix4.h" #include "matrix4.h"
@ -17,12 +18,12 @@ namespace irr
{ {
namespace video namespace video
{ {
class ITexture; class ITexture;
//! Flag for MaterialTypeParam (in combination with EMT_ONETEXTURE_BLEND) or for BlendFactor //! Flag for MaterialTypeParam (in combination with EMT_ONETEXTURE_BLEND) or for BlendFactor
//! BlendFunc = source * sourceFactor + dest * destFactor //! BlendFunc = source * sourceFactor + dest * destFactor
enum E_BLEND_FACTOR enum E_BLEND_FACTOR
{ {
EBF_ZERO = 0, //!< src & dest (0, 0, 0, 0) EBF_ZERO = 0, //!< src & dest (0, 0, 0, 0)
EBF_ONE, //!< src & dest (1, 1, 1, 1) EBF_ONE, //!< src & dest (1, 1, 1, 1)
EBF_DST_COLOR, //!< src (destR, destG, destB, destA) EBF_DST_COLOR, //!< src (destR, destG, destB, destA)
@ -34,40 +35,40 @@ enum E_BLEND_FACTOR
EBF_DST_ALPHA, //!< src & dest (destA, destA, destA, destA) EBF_DST_ALPHA, //!< src & dest (destA, destA, destA, destA)
EBF_ONE_MINUS_DST_ALPHA, //!< src & dest (1-destA, 1-destA, 1-destA, 1-destA) EBF_ONE_MINUS_DST_ALPHA, //!< src & dest (1-destA, 1-destA, 1-destA, 1-destA)
EBF_SRC_ALPHA_SATURATE //!< src (min(srcA, 1-destA), idem, ...) EBF_SRC_ALPHA_SATURATE //!< src (min(srcA, 1-destA), idem, ...)
}; };
//! Values defining the blend operation //! Values defining the blend operation
enum E_BLEND_OPERATION enum E_BLEND_OPERATION
{ {
EBO_NONE = 0, //!< No blending happens EBO_NONE = 0, //!< No blending happens
EBO_ADD, //!< Default blending adds the color values EBO_ADD, //!< Default blending adds the color values
EBO_SUBTRACT, //!< This mode subtracts the color values EBO_SUBTRACT, //!< This mode subtracts the color values
EBO_REVSUBTRACT, //!< This modes subtracts destination from source EBO_REVSUBTRACT,//!< This modes subtracts destination from source
EBO_MIN, //!< Choose minimum value of each color channel EBO_MIN, //!< Choose minimum value of each color channel
EBO_MAX, //!< Choose maximum value of each color channel EBO_MAX, //!< Choose maximum value of each color channel
EBO_MIN_FACTOR, //!< Choose minimum value of each color channel after applying blend factors, not widely supported EBO_MIN_FACTOR, //!< Choose minimum value of each color channel after applying blend factors, not widely supported
EBO_MAX_FACTOR, //!< Choose maximum value of each color channel after applying blend factors, not widely supported EBO_MAX_FACTOR, //!< Choose maximum value of each color channel after applying blend factors, not widely supported
EBO_MIN_ALPHA, //!< Choose minimum value of each color channel based on alpha value, not widely supported EBO_MIN_ALPHA, //!< Choose minimum value of each color channel based on alpha value, not widely supported
EBO_MAX_ALPHA //!< Choose maximum value of each color channel based on alpha value, not widely supported EBO_MAX_ALPHA //!< Choose maximum value of each color channel based on alpha value, not widely supported
}; };
//! MaterialTypeParam: e.g. DirectX: D3DTOP_MODULATE, D3DTOP_MODULATE2X, D3DTOP_MODULATE4X //! MaterialTypeParam: e.g. DirectX: D3DTOP_MODULATE, D3DTOP_MODULATE2X, D3DTOP_MODULATE4X
enum E_MODULATE_FUNC enum E_MODULATE_FUNC
{ {
EMFN_MODULATE_1X = 1, EMFN_MODULATE_1X = 1,
EMFN_MODULATE_2X = 2, EMFN_MODULATE_2X = 2,
EMFN_MODULATE_4X = 4 EMFN_MODULATE_4X = 4
}; };
//! Comparison function, e.g. for depth buffer test //! Comparison function, e.g. for depth buffer test
enum E_COMPARISON_FUNC enum E_COMPARISON_FUNC
{ {
//! Depth test disabled (disable also write to depth buffer) //! Depth test disabled (disable also write to depth buffer)
ECFN_DISABLED = 0, ECFN_DISABLED=0,
//! <= test, default for e.g. depth test //! <= test, default for e.g. depth test
ECFN_LESSEQUAL = 1, ECFN_LESSEQUAL=1,
//! Exact equality //! Exact equality
ECFN_EQUAL = 2, ECFN_EQUAL=2,
//! exclusive less comparison, i.e. < //! exclusive less comparison, i.e. <
ECFN_LESS, ECFN_LESS,
//! Succeeds almost always, except for exact equality //! Succeeds almost always, except for exact equality
@ -80,90 +81,91 @@ enum E_COMPARISON_FUNC
ECFN_ALWAYS, ECFN_ALWAYS,
//! Test never succeeds //! Test never succeeds
ECFN_NEVER ECFN_NEVER
}; };
//! Enum values for enabling/disabling color planes for rendering //! Enum values for enabling/disabling color planes for rendering
enum E_COLOR_PLANE enum E_COLOR_PLANE
{ {
//! No color enabled //! No color enabled
ECP_NONE = 0, ECP_NONE=0,
//! Alpha enabled //! Alpha enabled
ECP_ALPHA = 1, ECP_ALPHA=1,
//! Red enabled //! Red enabled
ECP_RED = 2, ECP_RED=2,
//! Green enabled //! Green enabled
ECP_GREEN = 4, ECP_GREEN=4,
//! Blue enabled //! Blue enabled
ECP_BLUE = 8, ECP_BLUE=8,
//! All colors, no alpha //! All colors, no alpha
ECP_RGB = 14, ECP_RGB=14,
//! All planes enabled //! All planes enabled
ECP_ALL = 15 ECP_ALL=15
}; };
//! Source of the alpha value to take //! Source of the alpha value to take
/** This is currently only supported in EMT_ONETEXTURE_BLEND. You can use an /** This is currently only supported in EMT_ONETEXTURE_BLEND. You can use an
or'ed combination of values. Alpha values are modulated (multiplied). */ or'ed combination of values. Alpha values are modulated (multiplied). */
enum E_ALPHA_SOURCE enum E_ALPHA_SOURCE
{ {
//! Use no alpha, somewhat redundant with other settings //! Use no alpha, somewhat redundant with other settings
EAS_NONE = 0, EAS_NONE=0,
//! Use vertex color alpha //! Use vertex color alpha
EAS_VERTEX_COLOR, EAS_VERTEX_COLOR,
//! Use texture alpha channel //! Use texture alpha channel
EAS_TEXTURE EAS_TEXTURE
}; };
//! Pack srcFact, dstFact, Modulate and alpha source to MaterialTypeParam or BlendFactor //! Pack srcFact, dstFact, Modulate and alpha source to MaterialTypeParam or BlendFactor
/** alpha source can be an OR'ed combination of E_ALPHA_SOURCE values. */ /** alpha source can be an OR'ed combination of E_ALPHA_SOURCE values. */
inline f32 pack_textureBlendFunc(const E_BLEND_FACTOR srcFact, const E_BLEND_FACTOR dstFact, inline f32 pack_textureBlendFunc(const E_BLEND_FACTOR srcFact, const E_BLEND_FACTOR dstFact,
const E_MODULATE_FUNC modulate = EMFN_MODULATE_1X, const u32 alphaSource = EAS_TEXTURE) const E_MODULATE_FUNC modulate=EMFN_MODULATE_1X, const u32 alphaSource=EAS_TEXTURE)
{ {
const u32 tmp = (alphaSource << 20) | (modulate << 16) | (srcFact << 12) | (dstFact << 8) | (srcFact << 4) | dstFact; const u32 tmp = (alphaSource << 20) | (modulate << 16) | (srcFact << 12) | (dstFact << 8) | (srcFact << 4) | dstFact;
return FR(tmp); return FR(tmp);
} }
//! Pack srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, Modulate and alpha source to MaterialTypeParam or BlendFactor //! Pack srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, Modulate and alpha source to MaterialTypeParam or BlendFactor
/** alpha source can be an OR'ed combination of E_ALPHA_SOURCE values. */ /** alpha source can be an OR'ed combination of E_ALPHA_SOURCE values. */
inline f32 pack_textureBlendFuncSeparate(const E_BLEND_FACTOR srcRGBFact, const E_BLEND_FACTOR dstRGBFact, inline f32 pack_textureBlendFuncSeparate(const E_BLEND_FACTOR srcRGBFact, const E_BLEND_FACTOR dstRGBFact,
const E_BLEND_FACTOR srcAlphaFact, const E_BLEND_FACTOR dstAlphaFact, const E_BLEND_FACTOR srcAlphaFact, const E_BLEND_FACTOR dstAlphaFact,
const E_MODULATE_FUNC modulate = EMFN_MODULATE_1X, const u32 alphaSource = EAS_TEXTURE) const E_MODULATE_FUNC modulate=EMFN_MODULATE_1X, const u32 alphaSource=EAS_TEXTURE)
{ {
const u32 tmp = (alphaSource << 20) | (modulate << 16) | (srcAlphaFact << 12) | (dstAlphaFact << 8) | (srcRGBFact << 4) | dstRGBFact; const u32 tmp = (alphaSource << 20) | (modulate << 16) | (srcAlphaFact << 12) | (dstAlphaFact << 8) | (srcRGBFact << 4) | dstRGBFact;
return FR(tmp); return FR(tmp);
} }
//! Unpack srcFact, dstFact, modulo and alphaSource factors //! Unpack srcFact, dstFact, modulo and alphaSource factors
/** The fields don't use the full byte range, so we could pack even more... */ /** The fields don't use the full byte range, so we could pack even more... */
inline void unpack_textureBlendFunc(E_BLEND_FACTOR &srcFact, E_BLEND_FACTOR &dstFact, inline void unpack_textureBlendFunc(E_BLEND_FACTOR &srcFact, E_BLEND_FACTOR &dstFact,
E_MODULATE_FUNC &modulo, u32 &alphaSource, const f32 param) E_MODULATE_FUNC &modulo, u32& alphaSource, const f32 param)
{ {
const u32 state = IR(param); const u32 state = IR(param);
alphaSource = (state & 0x00F00000) >> 20; alphaSource = (state & 0x00F00000) >> 20;
modulo = E_MODULATE_FUNC((state & 0x000F0000) >> 16); modulo = E_MODULATE_FUNC( ( state & 0x000F0000 ) >> 16 );
srcFact = E_BLEND_FACTOR((state & 0x000000F0) >> 4); srcFact = E_BLEND_FACTOR ( ( state & 0x000000F0 ) >> 4 );
dstFact = E_BLEND_FACTOR((state & 0x0000000F)); dstFact = E_BLEND_FACTOR ( ( state & 0x0000000F ) );
} }
//! Unpack srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulo and alphaSource factors //! Unpack srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulo and alphaSource factors
/** The fields don't use the full byte range, so we could pack even more... */ /** The fields don't use the full byte range, so we could pack even more... */
inline void unpack_textureBlendFuncSeparate(E_BLEND_FACTOR &srcRGBFact, E_BLEND_FACTOR &dstRGBFact, inline void unpack_textureBlendFuncSeparate(E_BLEND_FACTOR &srcRGBFact, E_BLEND_FACTOR &dstRGBFact,
E_BLEND_FACTOR &srcAlphaFact, E_BLEND_FACTOR &dstAlphaFact, E_BLEND_FACTOR &srcAlphaFact, E_BLEND_FACTOR &dstAlphaFact,
E_MODULATE_FUNC &modulo, u32 &alphaSource, const f32 param) E_MODULATE_FUNC &modulo, u32& alphaSource, const f32 param)
{ {
const u32 state = IR(param); const u32 state = IR(param);
alphaSource = (state & 0x00F00000) >> 20; alphaSource = (state & 0x00F00000) >> 20;
modulo = E_MODULATE_FUNC((state & 0x000F0000) >> 16); modulo = E_MODULATE_FUNC( ( state & 0x000F0000 ) >> 16 );
srcAlphaFact = E_BLEND_FACTOR((state & 0x0000F000) >> 12); srcAlphaFact = E_BLEND_FACTOR ( ( state & 0x0000F000 ) >> 12 );
dstAlphaFact = E_BLEND_FACTOR((state & 0x00000F00) >> 8); dstAlphaFact = E_BLEND_FACTOR ( ( state & 0x00000F00 ) >> 8 );
srcRGBFact = E_BLEND_FACTOR((state & 0x000000F0) >> 4); srcRGBFact = E_BLEND_FACTOR ( ( state & 0x000000F0 ) >> 4 );
dstRGBFact = E_BLEND_FACTOR((state & 0x0000000F)); dstRGBFact = E_BLEND_FACTOR ( ( state & 0x0000000F ) );
} }
//! has blend factor alphablending //! has blend factor alphablending
inline bool textureBlendFunc_hasAlpha(const E_BLEND_FACTOR factor) inline bool textureBlendFunc_hasAlpha ( const E_BLEND_FACTOR factor )
{ {
switch (factor) { switch ( factor )
{
case EBF_SRC_ALPHA: case EBF_SRC_ALPHA:
case EBF_ONE_MINUS_SRC_ALPHA: case EBF_ONE_MINUS_SRC_ALPHA:
case EBF_DST_ALPHA: case EBF_DST_ALPHA:
@ -173,39 +175,47 @@ inline bool textureBlendFunc_hasAlpha(const E_BLEND_FACTOR factor)
default: default:
return false; return false;
} }
} }
//! These flags are used to specify the anti-aliasing and smoothing modes
/** Techniques supported are multisampling, geometry smoothing, and alpha //! These flags are used to specify the anti-aliasing and smoothing modes
to coverage. /** Techniques supported are multisampling, geometry smoothing, and alpha
Some drivers don't support a per-material setting of the anti-aliasing to coverage.
modes. In those cases, FSAA/multisampling is defined by the device mode Some drivers don't support a per-material setting of the anti-aliasing
chosen upon creation via irr::SIrrCreationParameters. modes. In those cases, FSAA/multisampling is defined by the device mode
*/ chosen upon creation via irr::SIrrCreationParameters.
enum E_ANTI_ALIASING_MODE */
{ enum E_ANTI_ALIASING_MODE
{
//! Use to turn off anti-aliasing for this material //! Use to turn off anti-aliasing for this material
EAAM_OFF = 0, EAAM_OFF=0,
//! Default anti-aliasing mode //! Default anti-aliasing mode
EAAM_SIMPLE = 1, EAAM_SIMPLE=1,
//! High-quality anti-aliasing, not always supported, automatically enables SIMPLE mode //! High-quality anti-aliasing, not always supported, automatically enables SIMPLE mode
EAAM_QUALITY = 3, EAAM_QUALITY=3,
//! Line smoothing
//! Careful, enabling this can lead to software emulation under OpenGL
EAAM_LINE_SMOOTH=4,
//! point smoothing, often in software and slow, only with OpenGL
EAAM_POINT_SMOOTH=8,
//! All typical anti-alias and smooth modes
EAAM_FULL_BASIC=15,
//! Enhanced anti-aliasing for transparent materials //! Enhanced anti-aliasing for transparent materials
/** Usually used with EMT_TRANSPARENT_ALPHA_CHANNEL_REF and multisampling. */ /** Usually used with EMT_TRANSPARENT_ALPHA_CHANNEL_REF and multisampling. */
EAAM_ALPHA_TO_COVERAGE = 4 EAAM_ALPHA_TO_COVERAGE=16
}; };
//! These flags allow to define the interpretation of vertex color when lighting is enabled //! These flags allow to define the interpretation of vertex color when lighting is enabled
/** Without lighting being enabled the vertex color is the only value defining the fragment color. /** Without lighting being enabled the vertex color is the only value defining the fragment color.
Once lighting is enabled, the four values for diffuse, ambient, emissive, and specular take over. Once lighting is enabled, the four values for diffuse, ambient, emissive, and specular take over.
With these flags it is possible to define which lighting factor shall be defined by the vertex color With these flags it is possible to define which lighting factor shall be defined by the vertex color
instead of the lighting factor which is the same for all faces of that material. instead of the lighting factor which is the same for all faces of that material.
The default is to use vertex color for the diffuse value, another pretty common value is to use The default is to use vertex color for the diffuse value, another pretty common value is to use
vertex color for both diffuse and ambient factor. */ vertex color for both diffuse and ambient factor. */
enum E_COLOR_MATERIAL enum E_COLOR_MATERIAL
{ {
//! Don't use vertex color for lighting //! Don't use vertex color for lighting
ECM_NONE = 0, ECM_NONE=0,
//! Use vertex color for diffuse light, this is default //! Use vertex color for diffuse light, this is default
ECM_DIFFUSE, ECM_DIFFUSE,
//! Use vertex color for ambient light //! Use vertex color for ambient light
@ -216,18 +226,19 @@ enum E_COLOR_MATERIAL
ECM_SPECULAR, ECM_SPECULAR,
//! Use vertex color for both diffuse and ambient light //! Use vertex color for both diffuse and ambient light
ECM_DIFFUSE_AND_AMBIENT ECM_DIFFUSE_AND_AMBIENT
};
//! Names for polygon offset direction
const c8 *const PolygonOffsetDirectionNames[] = {
"Back",
"Front",
0,
}; };
//! For SMaterial.ZWriteEnable //! Names for polygon offset direction
enum E_ZWRITE const c8* const PolygonOffsetDirectionNames[] =
{ {
"Back",
"Front",
0
};
//! For SMaterial.ZWriteEnable
enum E_ZWRITE
{
//! zwrite always disabled for this material //! zwrite always disabled for this material
EZW_OFF = 0, EZW_OFF = 0,
@ -240,27 +251,30 @@ enum E_ZWRITE
//! zwrite always enabled for this material //! zwrite always enabled for this material
EZW_ON EZW_ON
}; };
//! Names for E_ZWRITE //! Names for E_ZWRITE
const c8 *const ZWriteNames[] = { const c8* const ZWriteNames[] =
{
"Off", "Off",
"Auto", "Auto",
"On", "On",
0, 0
}; };
//! Maximum number of texture an SMaterial can have.
/** SMaterial might ignore some textures in most function, like assignment and comparison,
when SIrrlichtCreationParameters::MaxTextureUnits is set to a lower number.
*/
const u32 MATERIAL_MAX_TEXTURES = 4;
//! Struct for holding parameters for a material renderer
// Note for implementors: Serialization is in CNullDriver //! Maximum number of texture an SMaterial can have.
class SMaterial /** SMaterial might ignore some textures in most function, like assignment and comparison,
{ when SIrrlichtCreationParameters::MaxTextureUnits is set to a lower number.
public: */
const u32 MATERIAL_MAX_TEXTURES = 4;
//! Struct for holding parameters for a material renderer
// Note for implementors: Serialization is in CNullDriver
class SMaterial
{
public:
//! Default constructor. Creates a solid, lit material with white colors //! Default constructor. Creates a solid, lit material with white colors
SMaterial() : SMaterial() :
MaterialType(EMT_SOLID), AmbientColor(255, 255, 255, 255), MaterialType(EMT_SOLID), AmbientColor(255, 255, 255, 255),
@ -273,8 +287,7 @@ public:
GouraudShading(true), Lighting(true), ZWriteEnable(EZW_AUTO), GouraudShading(true), Lighting(true), ZWriteEnable(EZW_AUTO),
BackfaceCulling(true), FrontfaceCulling(false), FogEnable(false), BackfaceCulling(true), FrontfaceCulling(false), FogEnable(false),
NormalizeNormals(false), UseMipMaps(true) NormalizeNormals(false), UseMipMaps(true)
{ { }
}
//! Texture layer array. //! Texture layer array.
SMaterialLayer TextureLayers[MATERIAL_MAX_TEXTURES]; SMaterialLayer TextureLayers[MATERIAL_MAX_TEXTURES];
@ -343,7 +356,7 @@ public:
Only enabled color planes will be rendered to the current render Only enabled color planes will be rendered to the current render
target. Typical use is to disable all colors when rendering only to target. Typical use is to disable all colors when rendering only to
depth or stencil buffer, or using Red and Green for Stereo rendering. */ depth or stencil buffer, or using Red and Green for Stereo rendering. */
u8 ColorMask : 4; u8 ColorMask:4;
//! Defines the interpretation of vertex color in the lighting equation //! Defines the interpretation of vertex color in the lighting equation
/** Values should be chosen from E_COLOR_MATERIAL. /** Values should be chosen from E_COLOR_MATERIAL.
@ -351,11 +364,11 @@ public:
material values for light modulation. This allows to easily change e.g. the material values for light modulation. This allows to easily change e.g. the
diffuse light behavior of each face. The default, ECM_DIFFUSE, will result in diffuse light behavior of each face. The default, ECM_DIFFUSE, will result in
a very similar rendering as with lighting turned off, just with light shading. */ a very similar rendering as with lighting turned off, just with light shading. */
u8 ColorMaterial : 3; u8 ColorMaterial:3;
//! Store the blend operation of choice //! Store the blend operation of choice
/** Values to be chosen from E_BLEND_OPERATION. */ /** Values to be chosen from E_BLEND_OPERATION. */
E_BLEND_OPERATION BlendOperation : 4; E_BLEND_OPERATION BlendOperation:4;
//! Store the blend factors //! Store the blend factors
/** textureBlendFunc/textureBlendFuncSeparate functions should be used to write /** textureBlendFunc/textureBlendFuncSeparate functions should be used to write
@ -388,45 +401,44 @@ public:
f32 PolygonOffsetSlopeScale; f32 PolygonOffsetSlopeScale;
//! Draw as wireframe or filled triangles? Default: false //! Draw as wireframe or filled triangles? Default: false
bool Wireframe : 1; bool Wireframe:1;
//! Draw as point cloud or filled triangles? Default: false //! Draw as point cloud or filled triangles? Default: false
bool PointCloud : 1; bool PointCloud:1;
//! Flat or Gouraud shading? Default: true //! Flat or Gouraud shading? Default: true
bool GouraudShading : 1; bool GouraudShading:1;
//! Will this material be lighted? Default: true //! Will this material be lighted? Default: true
bool Lighting : 1; bool Lighting:1;
//! Is the zbuffer writable or is it read-only. Default: EZW_AUTO. //! Is the zbuffer writable or is it read-only. Default: EZW_AUTO.
/** If this parameter is not EZW_OFF, you probably also want to set ZBuffer /** If this parameter is not EZW_OFF, you probably also want to set ZBuffer
to values other than ECFN_DISABLED */ to values other than ECFN_DISABLED */
E_ZWRITE ZWriteEnable : 2; E_ZWRITE ZWriteEnable:2;
//! Is backface culling enabled? Default: true //! Is backface culling enabled? Default: true
bool BackfaceCulling : 1; bool BackfaceCulling:1;
//! Is frontface culling enabled? Default: false //! Is frontface culling enabled? Default: false
bool FrontfaceCulling : 1; bool FrontfaceCulling:1;
//! Is fog enabled? Default: false //! Is fog enabled? Default: false
bool FogEnable : 1; bool FogEnable:1;
//! Should normals be normalized? //! Should normals be normalized?
/** Always use this if the mesh lit and scaled. Default: false */ /** Always use this if the mesh lit and scaled. Default: false */
bool NormalizeNormals : 1; bool NormalizeNormals:1;
//! Shall mipmaps be used if available //! Shall mipmaps be used if available
/** Sometimes, disabling mipmap usage can be useful. Default: true */ /** Sometimes, disabling mipmap usage can be useful. Default: true */
bool UseMipMaps : 1; bool UseMipMaps:1;
//! Execute a function on all texture layers. //! Execute a function on all texture layers.
/** Useful for setting properties which are not per material, but per /** Useful for setting properties which are not per material, but per
texture layer, e.g. bilinear filtering. */ texture layer, e.g. bilinear filtering. */
template <typename F> template <typename F>
void forEachTexture(F &&fn) void forEachTexture(F &&fn) {
{
for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; i++) { for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; i++) {
fn(TextureLayers[i]); fn(TextureLayers[i]);
} }
@ -435,7 +447,7 @@ public:
//! Gets the texture transformation matrix for level i //! Gets the texture transformation matrix for level i
/** \param i The desired level. Must not be larger than MATERIAL_MAX_TEXTURES /** \param i The desired level. Must not be larger than MATERIAL_MAX_TEXTURES
\return Texture matrix for texture level i. */ \return Texture matrix for texture level i. */
core::matrix4 &getTextureMatrix(u32 i) core::matrix4& getTextureMatrix(u32 i)
{ {
return TextureLayers[i].getTextureMatrix(); return TextureLayers[i].getTextureMatrix();
} }
@ -443,9 +455,9 @@ public:
//! Gets the immutable texture transformation matrix for level i //! Gets the immutable texture transformation matrix for level i
/** \param i The desired level. /** \param i The desired level.
\return Texture matrix for texture level i, or identity matrix for levels larger than MATERIAL_MAX_TEXTURES. */ \return Texture matrix for texture level i, or identity matrix for levels larger than MATERIAL_MAX_TEXTURES. */
const core::matrix4 &getTextureMatrix(u32 i) const const core::matrix4& getTextureMatrix(u32 i) const
{ {
if (i < MATERIAL_MAX_TEXTURES) if (i<MATERIAL_MAX_TEXTURES)
return TextureLayers[i].getTextureMatrix(); return TextureLayers[i].getTextureMatrix();
else else
return core::IdentityMatrix; return core::IdentityMatrix;
@ -454,9 +466,9 @@ public:
//! Sets the i-th texture transformation matrix //! Sets the i-th texture transformation matrix
/** \param i The desired level. /** \param i The desired level.
\param mat Texture matrix for texture level i. */ \param mat Texture matrix for texture level i. */
void setTextureMatrix(u32 i, const core::matrix4 &mat) void setTextureMatrix(u32 i, const core::matrix4& mat)
{ {
if (i >= MATERIAL_MAX_TEXTURES) if (i>=MATERIAL_MAX_TEXTURES)
return; return;
TextureLayers[i].setTextureMatrix(mat); TextureLayers[i].setTextureMatrix(mat);
} }
@ -464,7 +476,7 @@ public:
//! Gets the i-th texture //! Gets the i-th texture
/** \param i The desired level. /** \param i The desired level.
\return Texture for texture level i, if defined, else 0. */ \return Texture for texture level i, if defined, else 0. */
ITexture *getTexture(u32 i) const ITexture* getTexture(u32 i) const
{ {
return i < MATERIAL_MAX_TEXTURES ? TextureLayers[i].Texture : 0; return i < MATERIAL_MAX_TEXTURES ? TextureLayers[i].Texture : 0;
} }
@ -473,9 +485,9 @@ public:
/** If i>=MATERIAL_MAX_TEXTURES this setting will be ignored. /** If i>=MATERIAL_MAX_TEXTURES this setting will be ignored.
\param i The desired level. \param i The desired level.
\param tex Texture for texture level i. */ \param tex Texture for texture level i. */
void setTexture(u32 i, ITexture *tex) void setTexture(u32 i, ITexture* tex)
{ {
if (i >= MATERIAL_MAX_TEXTURES) if (i>=MATERIAL_MAX_TEXTURES)
return; return;
TextureLayers[i].Texture = tex; TextureLayers[i].Texture = tex;
} }
@ -483,7 +495,7 @@ public:
//! Inequality operator //! Inequality operator
/** \param b Material to compare to. /** \param b Material to compare to.
\return True if the materials differ, else false. */ \return True if the materials differ, else false. */
inline bool operator!=(const SMaterial &b) const inline bool operator!=(const SMaterial& b) const
{ {
bool different = bool different =
MaterialType != b.MaterialType || MaterialType != b.MaterialType ||
@ -511,8 +523,10 @@ public:
BlendFactor != b.BlendFactor || BlendFactor != b.BlendFactor ||
PolygonOffsetDepthBias != b.PolygonOffsetDepthBias || PolygonOffsetDepthBias != b.PolygonOffsetDepthBias ||
PolygonOffsetSlopeScale != b.PolygonOffsetSlopeScale || PolygonOffsetSlopeScale != b.PolygonOffsetSlopeScale ||
UseMipMaps != b.UseMipMaps; UseMipMaps != b.UseMipMaps
for (u32 i = 0; (i < MATERIAL_MAX_TEXTURES) && !different; ++i) { ;
for (u32 i=0; (i<MATERIAL_MAX_TEXTURES) && !different; ++i)
{
different |= (TextureLayers[i] != b.TextureLayers[i]); different |= (TextureLayers[i] != b.TextureLayers[i]);
} }
return different; return different;
@ -521,15 +535,14 @@ public:
//! Equality operator //! Equality operator
/** \param b Material to compare to. /** \param b Material to compare to.
\return True if the materials are equal, else false. */ \return True if the materials are equal, else false. */
inline bool operator==(const SMaterial &b) const inline bool operator==(const SMaterial& b) const
{ { return !(b!=*this); }
return !(b != *this);
}
//! Check if material needs alpha blending //! Check if material needs alpha blending
bool isAlphaBlendOperation() const bool isAlphaBlendOperation() const
{ {
if (BlendOperation != EBO_NONE && BlendFactor != 0.f) { if (BlendOperation != EBO_NONE && BlendFactor != 0.f)
{
E_BLEND_FACTOR srcRGBFact = EBF_ZERO; E_BLEND_FACTOR srcRGBFact = EBF_ZERO;
E_BLEND_FACTOR dstRGBFact = EBF_ZERO; E_BLEND_FACTOR dstRGBFact = EBF_ZERO;
E_BLEND_FACTOR srcAlphaFact = EBF_ZERO; E_BLEND_FACTOR srcAlphaFact = EBF_ZERO;
@ -540,7 +553,8 @@ public:
unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulo, alphaSource, BlendFactor); unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulo, alphaSource, BlendFactor);
if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) || if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) ||
textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact)) { textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact))
{
return true; return true;
} }
} }
@ -552,15 +566,17 @@ public:
//! as it asks the material renders directly what they do with the material. //! as it asks the material renders directly what they do with the material.
bool isTransparent() const bool isTransparent() const
{ {
if (MaterialType == EMT_TRANSPARENT_ALPHA_CHANNEL || if ( MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL ||
MaterialType == EMT_TRANSPARENT_VERTEX_ALPHA) MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA )
return true; return true;
return false; return false;
} }
}; };
//! global const identity Material //! global const identity Material
IRRLICHT_API extern SMaterial IdentityMaterial; IRRLICHT_API extern SMaterial IdentityMaterial;
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// 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 __S_MATERIAL_LAYER_H_INCLUDED__
#define __S_MATERIAL_LAYER_H_INCLUDED__
#include "matrix4.h" #include "matrix4.h"
@ -10,11 +11,11 @@ namespace irr
{ {
namespace video namespace video
{ {
class ITexture; class ITexture;
//! Texture coord clamp mode outside [0.0, 1.0] //! Texture coord clamp mode outside [0.0, 1.0]
enum E_TEXTURE_CLAMP enum E_TEXTURE_CLAMP
{ {
//! Texture repeats //! Texture repeats
ETC_REPEAT = 0, ETC_REPEAT = 0,
//! Texture is clamped to the last pixel //! Texture is clamped to the last pixel
@ -31,8 +32,8 @@ enum E_TEXTURE_CLAMP
ETC_MIRROR_CLAMP_TO_EDGE, ETC_MIRROR_CLAMP_TO_EDGE,
//! Texture is mirrored once and then clamped to border //! Texture is mirrored once and then clamped to border
ETC_MIRROR_CLAMP_TO_BORDER ETC_MIRROR_CLAMP_TO_BORDER
}; };
static const char *const aTextureClampNames[] = { static const char* const aTextureClampNames[] = {
"texture_clamp_repeat", "texture_clamp_repeat",
"texture_clamp_clamp", "texture_clamp_clamp",
"texture_clamp_clamp_to_edge", "texture_clamp_clamp_to_edge",
@ -42,11 +43,11 @@ static const char *const aTextureClampNames[] = {
"texture_clamp_mirror_clamp_to_edge", "texture_clamp_mirror_clamp_to_edge",
"texture_clamp_mirror_clamp_to_border", 0}; "texture_clamp_mirror_clamp_to_border", 0};
//! Texture minification filter.
/** Used when scaling textures down. See the documentation on OpenGL's //! Texture minification filter.
`GL_TEXTURE_MIN_FILTER` for more information. */ /** Used when scaling textures down. See the documentation on OpenGL's
enum E_TEXTURE_MIN_FILTER `GL_TEXTURE_MIN_FILTER` for more information. */
{ enum E_TEXTURE_MIN_FILTER {
//! Aka nearest-neighbor. //! Aka nearest-neighbor.
ETMINF_NEAREST_MIPMAP_NEAREST = 0, ETMINF_NEAREST_MIPMAP_NEAREST = 0,
//! Aka bilinear. //! Aka bilinear.
@ -55,35 +56,33 @@ enum E_TEXTURE_MIN_FILTER
ETMINF_NEAREST_MIPMAP_LINEAR, ETMINF_NEAREST_MIPMAP_LINEAR,
//! Aka trilinear. //! Aka trilinear.
ETMINF_LINEAR_MIPMAP_LINEAR, ETMINF_LINEAR_MIPMAP_LINEAR,
}; };
//! Texture magnification filter. //! Texture magnification filter.
/** Used when scaling textures up. See the documentation on OpenGL's /** Used when scaling textures up. See the documentation on OpenGL's
`GL_TEXTURE_MAG_FILTER` for more information. `GL_TEXTURE_MAG_FILTER` for more information.
Note that mipmaps are only used for minification, not for magnification. */ Note that mipmaps are only used for minification, not for magnification. */
enum E_TEXTURE_MAG_FILTER enum E_TEXTURE_MAG_FILTER {
{
//! Aka nearest-neighbor. //! Aka nearest-neighbor.
ETMAGF_NEAREST = 0, ETMAGF_NEAREST = 0,
//! Aka bilinear. //! Aka bilinear.
ETMAGF_LINEAR, ETMAGF_LINEAR,
}; };
//! Struct for holding material parameters which exist per texture layer //! Struct for holding material parameters which exist per texture layer
// Note for implementors: Serialization is in CNullDriver // Note for implementors: Serialization is in CNullDriver
class SMaterialLayer class SMaterialLayer
{ {
public: public:
//! Default constructor //! Default constructor
SMaterialLayer() : SMaterialLayer() : Texture(0), TextureWrapU(ETC_REPEAT), TextureWrapV(ETC_REPEAT), TextureWrapW(ETC_REPEAT),
Texture(0), TextureWrapU(ETC_REPEAT), TextureWrapV(ETC_REPEAT), TextureWrapW(ETC_REPEAT),
MinFilter(ETMINF_LINEAR_MIPMAP_NEAREST), MagFilter(ETMAGF_LINEAR), AnisotropicFilter(0), LODBias(0), TextureMatrix(0) MinFilter(ETMINF_LINEAR_MIPMAP_NEAREST), MagFilter(ETMAGF_LINEAR), AnisotropicFilter(0), LODBias(0), TextureMatrix(0)
{ {
} }
//! Copy constructor //! Copy constructor
/** \param other Material layer to copy from. */ /** \param other Material layer to copy from. */
SMaterialLayer(const SMaterialLayer &other) SMaterialLayer(const SMaterialLayer& other)
{ {
// This pointer is checked during assignment // This pointer is checked during assignment
TextureMatrix = 0; TextureMatrix = 0;
@ -93,7 +92,8 @@ public:
//! Destructor //! Destructor
~SMaterialLayer() ~SMaterialLayer()
{ {
if (TextureMatrix) { if ( TextureMatrix )
{
delete TextureMatrix; delete TextureMatrix;
} }
} }
@ -101,24 +101,30 @@ public:
//! Assignment operator //! Assignment operator
/** \param other Material layer to copy from. /** \param other Material layer to copy from.
\return This material layer, updated. */ \return This material layer, updated. */
SMaterialLayer &operator=(const SMaterialLayer &other) SMaterialLayer& operator=(const SMaterialLayer& other)
{ {
// Check for self-assignment! // Check for self-assignment!
if (this == &other) if (this == &other)
return *this; return *this;
Texture = other.Texture; Texture = other.Texture;
if (TextureMatrix) { if (TextureMatrix)
{
if (other.TextureMatrix) if (other.TextureMatrix)
*TextureMatrix = *other.TextureMatrix; *TextureMatrix = *other.TextureMatrix;
else { else
{
delete TextureMatrix; delete TextureMatrix;
TextureMatrix = 0; TextureMatrix = 0;
} }
} else { }
if (other.TextureMatrix) { else
{
if (other.TextureMatrix)
{
TextureMatrix = new core::matrix4(*other.TextureMatrix); TextureMatrix = new core::matrix4(*other.TextureMatrix);
} else }
else
TextureMatrix = 0; TextureMatrix = 0;
} }
TextureWrapU = other.TextureWrapU; TextureWrapU = other.TextureWrapU;
@ -134,9 +140,10 @@ public:
//! Gets the texture transformation matrix //! Gets the texture transformation matrix
/** \return Texture matrix of this layer. */ /** \return Texture matrix of this layer. */
core::matrix4 &getTextureMatrix() core::matrix4& getTextureMatrix()
{
if (!TextureMatrix)
{ {
if (!TextureMatrix) {
TextureMatrix = new core::matrix4(); TextureMatrix = new core::matrix4();
} }
return *TextureMatrix; return *TextureMatrix;
@ -144,7 +151,7 @@ public:
//! Gets the immutable texture transformation matrix //! Gets the immutable texture transformation matrix
/** \return Texture matrix of this layer. */ /** \return Texture matrix of this layer. */
const core::matrix4 &getTextureMatrix() const const core::matrix4& getTextureMatrix() const
{ {
if (TextureMatrix) if (TextureMatrix)
return *TextureMatrix; return *TextureMatrix;
@ -156,18 +163,20 @@ public:
/** NOTE: Pipelines can ignore this matrix when the /** NOTE: Pipelines can ignore this matrix when the
texture is 0. texture is 0.
\param mat New texture matrix for this layer. */ \param mat New texture matrix for this layer. */
void setTextureMatrix(const core::matrix4 &mat) void setTextureMatrix(const core::matrix4& mat)
{
if (!TextureMatrix)
{ {
if (!TextureMatrix) {
TextureMatrix = new core::matrix4(mat); TextureMatrix = new core::matrix4(mat);
} else }
else
*TextureMatrix = mat; *TextureMatrix = mat;
} }
//! Inequality operator //! Inequality operator
/** \param b Layer to compare to. /** \param b Layer to compare to.
\return True if layers are different, else false. */ \return True if layers are different, else false. */
inline bool operator!=(const SMaterialLayer &b) const inline bool operator!=(const SMaterialLayer& b) const
{ {
bool different = bool different =
Texture != b.Texture || Texture != b.Texture ||
@ -189,19 +198,17 @@ public:
//! Equality operator //! Equality operator
/** \param b Layer to compare to. /** \param b Layer to compare to.
\return True if layers are equal, else false. */ \return True if layers are equal, else false. */
inline bool operator==(const SMaterialLayer &b) const inline bool operator==(const SMaterialLayer& b) const
{ { return !(b!=*this); }
return !(b != *this);
}
//! Texture //! Texture
ITexture *Texture; ITexture* Texture;
//! Texture Clamp Mode //! Texture Clamp Mode
/** Values are taken from E_TEXTURE_CLAMP. */ /** Values are taken from E_TEXTURE_CLAMP. */
u8 TextureWrapU : 4; u8 TextureWrapU:4;
u8 TextureWrapV : 4; u8 TextureWrapV:4;
u8 TextureWrapW : 4; u8 TextureWrapW:4;
//! Minification (downscaling) filter //! Minification (downscaling) filter
E_TEXTURE_MIN_FILTER MinFilter; E_TEXTURE_MIN_FILTER MinFilter;
@ -225,14 +232,16 @@ public:
if the value is positive. */ if the value is positive. */
s8 LODBias; s8 LODBias;
private: private:
friend class SMaterial; friend class SMaterial;
//! Texture Matrix //! Texture Matrix
/** Do not access this element directly as the internal /** Do not access this element directly as the internal
resource management has to cope with Null pointers etc. */ resource management has to cope with Null pointers etc. */
core::matrix4 *TextureMatrix; core::matrix4* TextureMatrix;
}; };
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
#endif // __S_MATERIAL_LAYER_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// 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 __S_MESH_H_INCLUDED__
#define __S_MESH_H_INCLUDED__
#include "IMesh.h" #include "IMesh.h"
#include "IMeshBuffer.h" #include "IMeshBuffer.h"
@ -13,34 +14,35 @@ namespace irr
{ {
namespace scene namespace scene
{ {
//! Simple implementation of the IMesh interface. //! Simple implementation of the IMesh interface.
struct SMesh : public IMesh struct SMesh : public IMesh
{ {
//! constructor //! constructor
SMesh() SMesh()
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("SMesh"); setDebugName("SMesh");
#endif #endif
} }
//! destructor //! destructor
virtual ~SMesh() virtual ~SMesh()
{ {
// drop buffers // drop buffers
for (u32 i = 0; i < MeshBuffers.size(); ++i) for (u32 i=0; i<MeshBuffers.size(); ++i)
MeshBuffers[i]->drop(); MeshBuffers[i]->drop();
} }
//! clean mesh //! clean mesh
virtual void clear() virtual void clear()
{ {
for (u32 i = 0; i < MeshBuffers.size(); ++i) for (u32 i=0; i<MeshBuffers.size(); ++i)
MeshBuffers[i]->drop(); MeshBuffers[i]->drop();
MeshBuffers.clear(); MeshBuffers.clear();
BoundingBox.reset(0.f, 0.f, 0.f); BoundingBox.reset ( 0.f, 0.f, 0.f );
} }
//! returns amount of mesh buffers. //! returns amount of mesh buffers.
u32 getMeshBufferCount() const override u32 getMeshBufferCount() const override
{ {
@ -48,17 +50,18 @@ struct SMesh : public IMesh
} }
//! returns pointer to a mesh buffer //! returns pointer to a mesh buffer
IMeshBuffer *getMeshBuffer(u32 nr) const override IMeshBuffer* getMeshBuffer(u32 nr) const override
{ {
return MeshBuffers[nr]; return MeshBuffers[nr];
} }
//! returns a meshbuffer which fits a material //! returns a meshbuffer which fits a material
/** reverse search */ /** reverse search */
IMeshBuffer *getMeshBuffer(const video::SMaterial &material) const override IMeshBuffer* getMeshBuffer( const video::SMaterial & material) const override
{ {
for (s32 i = (s32)MeshBuffers.size() - 1; i >= 0; --i) { for (s32 i = (s32)MeshBuffers.size()-1; i >= 0; --i)
if (material == MeshBuffers[i]->getMaterial()) {
if ( material == MeshBuffers[i]->getMaterial())
return MeshBuffers[i]; return MeshBuffers[i];
} }
@ -66,13 +69,13 @@ struct SMesh : public IMesh
} }
//! returns an axis aligned bounding box //! returns an axis aligned bounding box
const core::aabbox3d<f32> &getBoundingBox() const override const core::aabbox3d<f32>& getBoundingBox() const override
{ {
return BoundingBox; return BoundingBox;
} }
//! set user axis aligned bounding box //! set user axis aligned bounding box
void setBoundingBox(const core::aabbox3df &box) override void setBoundingBox( const core::aabbox3df& box) override
{ {
BoundingBox = box; BoundingBox = box;
} }
@ -81,52 +84,63 @@ struct SMesh : public IMesh
void recalculateBoundingBox() void recalculateBoundingBox()
{ {
bool hasMeshBufferBBox = false; bool hasMeshBufferBBox = false;
for (u32 i = 0; i < MeshBuffers.size(); ++i) { for (u32 i=0; i<MeshBuffers.size(); ++i)
const core::aabbox3df &bb = MeshBuffers[i]->getBoundingBox(); {
if (!bb.isEmpty()) { const core::aabbox3df& bb = MeshBuffers[i]->getBoundingBox();
if (!hasMeshBufferBBox) { if ( !bb.isEmpty() )
{
if ( !hasMeshBufferBBox )
{
hasMeshBufferBBox = true; hasMeshBufferBBox = true;
BoundingBox = bb; BoundingBox = bb;
} else { }
else
{
BoundingBox.addInternalBox(bb); BoundingBox.addInternalBox(bb);
} }
} }
} }
if (!hasMeshBufferBBox) if ( !hasMeshBufferBBox )
BoundingBox.reset(0.0f, 0.0f, 0.0f); BoundingBox.reset(0.0f, 0.0f, 0.0f);
} }
//! adds a MeshBuffer //! adds a MeshBuffer
/** The bounding box is not updated automatically. */ /** The bounding box is not updated automatically. */
void addMeshBuffer(IMeshBuffer *buf) void addMeshBuffer(IMeshBuffer* buf)
{
if (buf)
{ {
if (buf) {
buf->grab(); buf->grab();
MeshBuffers.push_back(buf); MeshBuffers.push_back(buf);
} }
} }
//! set the hardware mapping hint, for driver //! set the hardware mapping hint, for driver
void setHardwareMappingHint(E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) override void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) override
{ {
for (u32 i = 0; i < MeshBuffers.size(); ++i) for (u32 i=0; i<MeshBuffers.size(); ++i)
MeshBuffers[i]->setHardwareMappingHint(newMappingHint, buffer); MeshBuffers[i]->setHardwareMappingHint(newMappingHint, buffer);
} }
//! flags the meshbuffer as changed, reloads hardware buffers //! flags the meshbuffer as changed, reloads hardware buffers
void setDirty(E_BUFFER_TYPE buffer = EBT_VERTEX_AND_INDEX) override void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) override
{ {
for (u32 i = 0; i < MeshBuffers.size(); ++i) for (u32 i=0; i<MeshBuffers.size(); ++i)
MeshBuffers[i]->setDirty(buffer); MeshBuffers[i]->setDirty(buffer);
} }
//! The meshbuffers of this mesh //! The meshbuffers of this mesh
core::array<IMeshBuffer *> MeshBuffers; core::array<IMeshBuffer*> MeshBuffers;
//! The bounding box of this mesh //! The bounding box of this mesh
core::aabbox3d<f32> BoundingBox; core::aabbox3d<f32> BoundingBox;
}; };
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
#endif

View File

@ -4,3 +4,4 @@
// replaced by template // replaced by template
#include "CMeshBuffer.h" #include "CMeshBuffer.h"

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