Compare commits

..

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

448 changed files with 67835 additions and 62580 deletions

View File

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

1
.gitignore vendored
View File

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

View File

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

View File

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

View File

@ -1,14 +1,6 @@
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).
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.
@ -23,7 +15,6 @@ The following libraries are required to be installed:
* OpenGL
* or on mobile: OpenGL ES (can be optionally enabled on desktop too)
* on Unix: X11
* SDL2 (see below)
Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the following options are available:
* `BUILD_SHARED_LIBS` (default: `ON`) - Build IrrlichtMt as a shared library
@ -32,7 +23,7 @@ Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the
* `ENABLE_OPENGL3` (default: `OFF`) - Enable OpenGL 3+ driver
* `ENABLE_GLES1` - Enable OpenGL ES driver, legacy
* `ENABLE_GLES2` - Enable OpenGL ES 2+ driver
* `USE_SDL2` (default: platform-dependent, usually `ON`) - Use SDL2 instead of older native device code
* `USE_SDL2` (default: `OFF`) - Use SDL2 instead of native platform device
e.g. on a Linux system you might want to build for local use like this:
@ -49,7 +40,7 @@ It is highly recommended to use vcpkg as package manager.
After you successfully built vcpkg you can easily install the required libraries:
vcpkg install zlib libjpeg-turbo libpng sdl2 --triplet x64-windows
vcpkg install zlib libjpeg-turbo libpng opengl-registry --triplet x64-windows
Run the following script in PowerShell:

View File

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

View File

@ -4,8 +4,7 @@
using namespace irr;
using core::array;
static void test_basics()
{
static void test_basics() {
array<int> v;
v.push_back(1); // 1
v.push_front(2); // 2, 1
@ -58,8 +57,7 @@ static void test_basics()
UASSERTEQ(v.size(), 2);
}
static void test_linear_searches()
{
static void test_linear_searches() {
// Populate the array with 0, 1, 2, ..., 100, 100, 99, 98, 97, ..., 0
array<int> arr;
for (int i = 0; i <= 100; i++)
@ -77,8 +75,7 @@ static void test_linear_searches()
}
}
static void test_binary_searches()
{
static void test_binary_searches() {
const auto& values = { 3, 5, 1, 2, 5, 10, 19, 9, 7, 1, 2, 5, 8, 15 };
array<int> arr;
for (int value : values) {

View File

@ -3,13 +3,11 @@
#include <exception>
#include <iostream>
class TestFailedException : public std::exception
{
class TestFailedException : public std::exception {
};
// Asserts the comparison specified by CMP is true, or fails the current unit test
#define UASSERTCMP(CMP, actual, expected) \
do { \
#define UASSERTCMP(CMP, actual, expected) do { \
const auto &a = (actual); \
const auto &e = (expected); \
if (!CMP(a, e)) { \
@ -17,8 +15,7 @@ class TestFailedException : public std::exception
<< "Test assertion failed: " << #actual << " " << #CMP << " " \
<< #expected << std::endl \
<< " at " << __FILE__ << ":" << __LINE__ << std::endl \
<< " actual: " << a << std::endl \
<< " expected: " \
<< " actual: " << a << std::endl << " expected: " \
<< e << std::endl; \
throw TestFailedException(); \
} \

View File

@ -1,3 +1,6 @@
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(IRREXAMPLES
# removed
)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -57,3 +57,5 @@ public:
} // end namespace video
} // end namespace irr

View File

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

View File

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

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_EVENT_RECEIVER_H_INCLUDED__
#define __I_EVENT_RECEIVER_H_INCLUDED__
#include "ILogger.h"
#include "Keycodes.h"
@ -308,6 +309,7 @@ enum EGUI_EVENT_TYPE
};
} // end namespace gui
//! SEvents hold information about an event. See irr::IEventReceiver for details on event handling.
struct SEvent
{
@ -322,6 +324,7 @@ struct SEvent
//! Type of GUI Event
gui::EGUI_EVENT_TYPE EventType;
};
//! Any kind of mouse event.
@ -570,6 +573,7 @@ struct SEvent
struct SSystemEvent SystemEvent;
struct SApplicationEvent ApplicationEvent;
};
};
//! Interface of an object which can receive events.
@ -581,6 +585,7 @@ path it takes through the system. */
class IEventReceiver
{
public:
//! Destructor
virtual ~IEventReceiver() {}
@ -593,6 +598,7 @@ public:
virtual bool OnEvent(const SEvent& event) = 0;
};
//! Information on a joystick, returned from @ref irr::IrrlichtDevice::activateJoysticks()
struct SJoystickInfo
{
@ -629,4 +635,8 @@ struct SJoystickInfo
} PovHat;
}; // struct SJoystickInfo
} // end namespace irr
#endif

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_GUI_COMBO_BOX_H_INCLUDED__
#define __I_GUI_COMBO_BOX_H_INCLUDED__
#include "IGUIElement.h"
@ -18,9 +19,10 @@ namespace gui
class IGUIComboBox : public IGUIElement
{
public:
//! constructor
IGUIComboBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, core::rect<s32> rectangle) :
IGUIElement(EGUIET_COMBO_BOX, environment, parent, id, rectangle) {}
IGUIComboBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_COMBO_BOX, environment, parent, id, rectangle) {}
//! Returns amount of items in box
virtual u32 getItemCount() const = 0;
@ -68,5 +70,9 @@ public:
virtual u32 getMaxSelectionRows() const = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_MATERIAL_RENDERER_SERVICES_H_INCLUDED__
#define __I_MATERIAL_RENDERER_SERVICES_H_INCLUDED__
#include "SMaterial.h"
#include "S3DVertex.h"
@ -14,10 +15,12 @@ namespace video
class IVideoDriver;
//! Interface providing some methods for changing advanced, internal states of a IVideoDriver.
class IMaterialRendererServices
{
public:
//! Destructor
virtual ~IMaterialRendererServices() {}
@ -50,8 +53,19 @@ public:
virtual bool setVertexShaderConstant(s32 index, const s32* ints, int count) = 0;
//! Uint interface for the above.
/* NOTE: UINT only works with GLSL, not supported for other shaders.
Also GLES drivers in Irrlicht do not support it as this needs at least GLES 3.0.
*/
virtual bool setVertexShaderConstant(s32 index, const u32* ints, int count) = 0;
//! 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
virtual s32 getPixelShaderConstantID(const c8* name) = 0;
@ -69,8 +83,19 @@ public:
virtual bool setPixelShaderConstant(s32 index, const s32* ints, int count) = 0;
//! Uint interface for the above.
/* NOTE: UINT only works with GLSL, not supported for other shaders.
Also GLES drivers in Irrlicht do not support it as this needs at least GLES 3.0.
*/
virtual bool setPixelShaderConstant(s32 index, const u32* ints, int count) = 0;
//! Sets a pixel shader constant.
/** Can be used if you created a shader using pixel/vertex shader
assembler or ARB_fragment_program or ARB_vertex_program.
\param data Data to be set in the constants
\param startRegister First register to be set.
\param constantAmount Amount of registers to be set. One register consists of 4 floats. */
virtual void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) = 0;
//! Get pointer to the IVideoDriver interface
/** \return Pointer to the IVideoDriver interface */
virtual IVideoDriver* getVideoDriver() = 0;
@ -78,3 +103,6 @@ public:
} // end namespace video
} // end namespace irr
#endif

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_OS_OPERATOR_H_INCLUDED__
#define __I_OS_OPERATOR_H_INCLUDED__
#include "IReferenceCounted.h"
#include "irrString.h"
@ -40,6 +41,9 @@ public:
\param availableBytes: will contain the available memory in Kilobytes (1024 B)
\return True if successful, false if not */
virtual bool getSystemMemory(u32* totalBytes, u32* availableBytes) const = 0;
};
} // end namespace
#endif

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_SCENE_MANAGER_H_INCLUDED__
#define __I_SCENE_MANAGER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "irrArray.h"
@ -12,6 +13,7 @@
#include "dimension2d.h"
#include "SColor.h"
#include "ESceneNodeTypes.h"
#include "EMeshWriterEnums.h"
#include "SceneParameters.h"
#include "ISkinnedMesh.h"
@ -107,6 +109,7 @@ class ISceneCollisionManager;
class IMeshLoader;
class IMeshManipulator;
class IMeshSceneNode;
class IMeshWriter;
class ISceneNode;
class ISceneNodeFactory;
@ -126,6 +129,7 @@ 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.
/**
* If you want to remove a loaded mesh from the cache again, use removeMesh().
@ -599,6 +603,11 @@ public:
See IReferenceCounted::drop() for more information. */
virtual ISceneManager* createNewSceneManager(bool cloneContent=false) = 0;
//! Get a mesh writer implementation if available
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
for details. */
virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type) = 0;
//! Get a skinned mesh, which is not available as header-only code
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
for details. */
@ -628,5 +637,9 @@ public:
virtual bool isCulled(const ISceneNode* node) const =0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

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

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_SHADER_CONSTANT_SET_CALLBACT_H_INCLUDED__
#define __I_SHADER_CONSTANT_SET_CALLBACT_H_INCLUDED__
#include "IReferenceCounted.h"
@ -20,6 +21,7 @@ OnSetConstants method will be called every frame now. */
class IShaderConstantSetCallBack : public virtual IReferenceCounted
{
public:
//! Called to let the callBack know the used material (optional method)
/**
\code
@ -75,5 +77,9 @@ public:
virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData) = 0;
};
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,15 +2,14 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_SKINNED_MESH_H_INCLUDED__
#define __I_SKINNED_MESH_H_INCLUDED__
#include "irrArray.h"
#include "IBoneSceneNode.h"
#include "IAnimatedMesh.h"
#include "SSkinMeshBuffer.h"
#include <optional>
namespace irr
{
namespace scene
@ -28,10 +27,12 @@ enum E_INTERPOLATION_MODE
EIM_COUNT
};
//! Interface for using some special functions of Skinned meshes
class ISkinnedMesh : public IAnimatedMesh
{
public:
//! Gets joint count.
/** \return Amount of joints in the skeletal animated mesh. */
virtual u32 getJointCount() const = 0;
@ -40,12 +41,12 @@ public:
/** \param number: Zero based index of joint. The last joint
has the number getJointCount()-1;
\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
/** \param name: Name of the joint.
\return Number of the joint or std::nullopt if not found. */
virtual std::optional<u32> getJointNumber(const std::string &name) const = 0;
\return Number of the joint or -1 if not found. */
virtual s32 getJointNumber(const c8* name) const = 0;
//! Use animation from another mesh
/** The animation is linked (not copied) based on joint names
@ -104,6 +105,7 @@ public:
core::vector3df StaticNormal;
};
//! Animation keyframe which describes a new position
struct SPositionKey
{
@ -128,14 +130,13 @@ public:
//! Joints
struct SJoint
{
SJoint() :
UseAnimationFrom(0), GlobalSkinningSpace(false),
SJoint() : UseAnimationFrom(0), GlobalSkinningSpace(false),
positionHint(-1),scaleHint(-1),rotationHint(-1)
{
}
//! The name of this joint
std::optional<std::string> Name;
core::stringc Name;
//! Local matrix of this joint
core::matrix4 LocalMatrix;
@ -180,6 +181,7 @@ public:
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
@ -218,3 +220,6 @@ public:
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_TEXTURE_H_INCLUDED__
#define __I_TEXTURE_H_INCLUDED__
#include "IReferenceCounted.h"
#include "IImage.h"
@ -16,6 +17,7 @@ namespace irr
namespace video
{
//! Enumeration flags used to tell the video driver with setTextureCreationFlag in which format textures should be created.
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
{
public:
//! constructor
ITexture(const io::path &name, E_TEXTURE_TYPE type) :
NamedPath(name), DriverType(EDT_NULL), OriginalColorFormat(ECF_UNKNOWN),
ITexture(const io::path& name, E_TEXTURE_TYPE type) : NamedPath(name), DriverType(EDT_NULL), OriginalColorFormat(ECF_UNKNOWN),
ColorFormat(ECF_UNKNOWN), Pitch(0), HasMipMaps(false), IsRenderTarget(false), Source(ETS_UNKNOWN), Type(type)
{
}
@ -286,9 +288,15 @@ public:
{
bool status = false;
switch (ColorFormat) {
switch (ColorFormat)
{
case ECF_A8R8G8B8:
case ECF_A1R5G5B5:
case ECF_DXT1:
case ECF_DXT2:
case ECF_DXT3:
case ECF_DXT4:
case ECF_DXT5:
case ECF_A16B16G16R16F:
case ECF_A32B32G32R32F:
status = true;
@ -304,6 +312,7 @@ public:
E_TEXTURE_TYPE getType() const { return Type; }
protected:
//! Helper function, helps to get the desired texture creation format from the flags.
/** \return Either ETCF_ALWAYS_32_BIT, ETCF_ALWAYS_16_BIT,
ETCF_OPTIMIZED_FOR_QUALITY, or ETCF_OPTIMIZED_FOR_SPEED. */
@ -333,5 +342,9 @@ protected:
E_TEXTURE_TYPE Type;
};
} // end namespace video
} // end namespace irr
#endif

View File

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

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_VERTEX_BUFFER_H_INCLUDED__
#define __I_VERTEX_BUFFER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "irrArray.h"
@ -44,5 +45,9 @@ public:
virtual u32 getChangedID() const = 0;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -13,6 +13,7 @@
#include "dimension2d.h"
#include "position2d.h"
#include "IMeshBuffer.h"
#include "triangle3d.h"
#include "EDriverTypes.h"
#include "EDriverFeatures.h"
#include "SExposedVideoData.h"
@ -107,11 +108,12 @@ enum E_FOG_TYPE
EFT_FOG_EXP2
};
const c8 *const FogTypeNames[] = {
const c8* const FogTypeNames[] =
{
"FogExp",
"FogLinear",
"FogExp2",
0,
0
};
//! Interface to driver which is able to perform 2d and 3d graphics functions.
@ -125,6 +127,7 @@ and methods to make the programmer's life easier.
class IVideoDriver : public virtual IReferenceCounted
{
public:
//! Applications must call this method before performing any rendering.
/** This method can clear the back- and the z-buffer.
\param clearFlag A combination of the E_CLEAR_BUFFER_FLAG bit-flags.
@ -866,7 +869,7 @@ public:
//! Gets name of this video driver.
/** \return Returns the name of the video driver, e.g. in case
of the Direct3D8 driver, it would return "Direct3D 8.1". */
virtual const char *getName() const = 0;
virtual const wchar_t* getName() const =0;
//! Adds an external image loader to the engine.
/** This is useful if the Irrlicht Engine should be able to load
@ -1205,3 +1208,5 @@ public:
} // end namespace video
} // end namespace irr

View File

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

View File

@ -5,8 +5,8 @@
#pragma once
//! Identifies the IrrlichtMt fork customized for the Minetest engine
#define IRRLICHT_VERSION_MT_REVISION 15
#define IRRLICHT_VERSION_MT "mt15"
#define IRRLICHT_VERSION_MT_REVISION 13
#define IRRLICHT_VERSION_MT "mt13"
//! Irrlicht SDK Version
#define IRRLICHT_VERSION_MAJOR 1
@ -17,6 +17,8 @@
#define IRRLICHT_VERSION_SVN alpha
#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
#define IRRCALLCONV __stdcall
#else

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_IRRLICHT_DEVICE_H_INCLUDED__
#define __I_IRRLICHT_DEVICE_H_INCLUDED__
#include "IReferenceCounted.h"
#include "dimension2d.h"
@ -20,23 +21,19 @@ namespace irr
class ILogger;
class IEventReceiver;
namespace io
{
namespace io {
class IFileSystem;
} // end namespace io
namespace gui
{
namespace gui {
class IGUIEnvironment;
} // end namespace gui
namespace scene
{
namespace scene {
class ISceneManager;
} // end namespace scene
namespace video
{
namespace video {
class IContextManager;
extern "C" IRRLICHT_API bool IRRCALLCONV isDriverSupported(E_DRIVER_TYPE driver);
} // end namespace video
@ -50,6 +47,7 @@ time.
class IrrlichtDevice : public virtual IReferenceCounted
{
public:
//! Runs the device.
/** Also increments the virtual timer by calling
ITimer::tick();. You can prevent this
@ -179,13 +177,6 @@ public:
/** \return True if window is fullscreen. */
virtual bool isFullscreen() const = 0;
//! Checks if the window could possibly be visible.
//! Currently, this only returns false when the activity is stopped on
//! 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; };
//! Get the current color format of the window
/** \return Color format of the window. */
virtual video::ECOLOR_FORMAT getColorFormat() const = 0;
@ -339,3 +330,6 @@ public:
};
} // end namespace irr
#endif

View File

@ -183,3 +183,5 @@ enum EKEY_CODE
};
} // end namespace irr

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __S_3D_VERTEX_H_INCLUDED__
#define __S_3D_VERTEX_H_INCLUDED__
#include "vector3d.h"
#include "vector2d.h"
@ -31,29 +32,28 @@ enum E_VERTEX_TYPE
};
//! Array holding the built in vertex type names
const char *const sBuiltInVertexTypeNames[] = {
const char* const sBuiltInVertexTypeNames[] =
{
"standard",
"2tcoords",
"tangents",
0,
0
};
//! standard vertex used by the Irrlicht engine.
struct S3DVertex
{
//! default constructor
constexpr S3DVertex() :
Color(0xffffffff) {}
S3DVertex() : Color(0xffffffff) {}
//! constructor
constexpr 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) {}
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) {}
//! constructor
constexpr S3DVertex(const core::vector3df &pos, const core::vector3df &normal,
SColor color, const core::vector2df &tcoords) :
Pos(pos),
Normal(normal), Color(color), TCoords(tcoords) {}
S3DVertex(const core::vector3df& pos, const core::vector3df& normal,
SColor color, const core::vector2d<f32>& tcoords)
: Pos(pos), Normal(normal), Color(color), TCoords(tcoords) {}
//! Position
core::vector3df Pos;
@ -65,21 +65,21 @@ struct S3DVertex
SColor Color;
//! 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) &&
(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) ||
(Color != other.Color) || (TCoords != other.TCoords));
}
constexpr bool operator<(const S3DVertex &other) const
bool operator<(const S3DVertex& other) const
{
return ((Pos < other.Pos) ||
((Pos == other.Pos) && (Normal < other.Normal)) ||
@ -104,6 +104,7 @@ struct S3DVertex
}
};
//! Vertex with two texture coordinates.
/** Usually used for geometry with lightmaps
or other special materials.
@ -111,65 +112,56 @@ or other special materials.
struct S3DVertex2TCoords : public S3DVertex
{
//! default constructor
constexpr S3DVertex2TCoords() :
S3DVertex() {}
S3DVertex2TCoords() : S3DVertex() {}
//! 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) :
S3DVertex(x, y, z, 0.0f, 0.0f, 0.0f, c, tu, tv), TCoords2(tu2, 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) {}
//! constructor with two different texture coords, but no normal
constexpr S3DVertex2TCoords(const core::vector3df &pos, SColor color,
const core::vector2df &tcoords, const core::vector2df &tcoords2) :
S3DVertex(pos, core::vector3df(), color, tcoords),
TCoords2(tcoords2) {}
S3DVertex2TCoords(const core::vector3df& pos, SColor color,
const core::vector2d<f32>& tcoords, const core::vector2d<f32>& tcoords2)
: S3DVertex(pos, core::vector3df(), color, tcoords), TCoords2(tcoords2) {}
//! constructor with all values
constexpr S3DVertex2TCoords(const core::vector3df &pos, const core::vector3df &normal, const SColor &color,
const core::vector2df &tcoords, const core::vector2df &tcoords2) :
S3DVertex(pos, normal, color, tcoords),
TCoords2(tcoords2) {}
S3DVertex2TCoords(const core::vector3df& pos, const core::vector3df& normal, const SColor& color,
const core::vector2d<f32>& tcoords, const core::vector2d<f32>& tcoords2)
: S3DVertex(pos, normal, color, tcoords), TCoords2(tcoords2) {}
//! constructor with all values
constexpr S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz,
SColor c, f32 tu, f32 tv, f32 tu2, f32 tv2) :
S3DVertex(x, y, z, nx, ny, nz, c, tu, tv),
TCoords2(tu2, tv2) {}
S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv, f32 tu2, f32 tv2)
: S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), TCoords2(tu2,tv2) {}
//! constructor with the same texture coords and normal
constexpr S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz,
SColor c, f32 tu, f32 tv) :
S3DVertex(x, y, z, nx, ny, nz, c, tu, tv),
TCoords2(tu, tv) {}
S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv)
: S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), TCoords2(tu,tv) {}
//! constructor with the same texture coords and normal
constexpr S3DVertex2TCoords(const core::vector3df &pos, const core::vector3df &normal,
SColor color, const core::vector2df &tcoords) :
S3DVertex(pos, normal, color, tcoords),
TCoords2(tcoords) {}
S3DVertex2TCoords(const core::vector3df& pos, const core::vector3df& normal,
SColor color, const core::vector2d<f32>& tcoords)
: S3DVertex(pos, normal, color, tcoords), TCoords2(tcoords) {}
//! constructor from S3DVertex
constexpr S3DVertex2TCoords(const S3DVertex &o) :
S3DVertex(o) {}
S3DVertex2TCoords(const S3DVertex& o) : S3DVertex(o) {}
//! Second set of texture coordinates
core::vector2df TCoords2;
core::vector2d<f32> TCoords2;
//! 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)) &&
(TCoords2 == other.TCoords2));
}
//! 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)) ||
(TCoords2 != other.TCoords2));
}
constexpr bool operator<(const S3DVertex2TCoords &other) const
bool operator<(const S3DVertex2TCoords& other) const
{
return ((static_cast<S3DVertex>(*this) < other) ||
((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (TCoords2 < other.TCoords2)));
@ -192,6 +184,7 @@ struct S3DVertex2TCoords : public S3DVertex
}
};
//! Vertex with a tangent and binormal vector.
/** Usually used for tangent space normal mapping.
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
{
//! default constructor
S3DVertexTangents() :
S3DVertex() {}
S3DVertexTangents() : S3DVertex() { }
//! 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,
f32 tanx=0.0f, f32 tany=0.0f, f32 tanz=0.0f,
f32 bx = 0.0f, f32 by = 0.0f, f32 bz = 0.0f) :
S3DVertex(x, y, z, nx, ny, nz, c, tu, tv),
Tangent(tanx, tany, tanz), Binormal(bx, by, bz) {}
f32 bx=0.0f, f32 by=0.0f, f32 bz=0.0f)
: S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), Tangent(tanx,tany,tanz), Binormal(bx,by,bz) { }
//! constructor
constexpr S3DVertexTangents(const core::vector3df &pos, SColor c,
const core::vector2df &tcoords) :
S3DVertex(pos, core::vector3df(), c, tcoords) {}
S3DVertexTangents(const core::vector3df& pos, SColor c,
const core::vector2df& tcoords)
: S3DVertex(pos, core::vector3df(), c, tcoords) { }
//! constructor
constexpr S3DVertexTangents(const core::vector3df &pos,
S3DVertexTangents(const core::vector3df& pos,
const core::vector3df& normal, SColor c,
const core::vector2df& tcoords,
const core::vector3df& tangent=core::vector3df(),
const core::vector3df &binormal = core::vector3df()) :
S3DVertex(pos, normal, c, tcoords),
Tangent(tangent), Binormal(binormal) {}
const core::vector3df& binormal=core::vector3df())
: S3DVertex(pos, normal, c, tcoords), Tangent(tangent), Binormal(binormal) { }
//! constructor from S3DVertex
constexpr S3DVertexTangents(const S3DVertex &o) :
S3DVertex(o) {}
S3DVertexTangents(const S3DVertex& o) : S3DVertex(o) {}
//! Tangent vector along the x-axis of the texture
core::vector3df Tangent;
@ -234,21 +223,21 @@ struct S3DVertexTangents : public S3DVertex
//! Binormal vector (tangent x normal)
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)) &&
(Tangent == other.Tangent) &&
(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)) ||
(Tangent != other.Tangent) ||
(Binormal != other.Binormal));
}
constexpr bool operator<(const S3DVertexTangents &other) const
bool operator<(const S3DVertexTangents& other) const
{
return ((static_cast<S3DVertex>(*this) < other) ||
((static_cast<S3DVertex>(*this) == static_cast<const S3DVertex&>(other)) && (Tangent < other.Tangent)) ||
@ -272,9 +261,12 @@ struct S3DVertexTangents : public S3DVertex
}
};
inline u32 getVertexPitchFromType(E_VERTEX_TYPE vertexType)
{
switch (vertexType) {
switch (vertexType)
{
case video::EVT_2TCOORDS:
return sizeof(video::S3DVertex2TCoords);
case video::EVT_TANGENTS:
@ -284,5 +276,9 @@ inline u32 getVertexPitchFromType(E_VERTEX_TYPE vertexType)
}
}
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __S_ANIMATED_MESH_H_INCLUDED__
#define __S_ANIMATED_MESH_H_INCLUDED__
#include "IAnimatedMesh.h"
#include "IMesh.h"
@ -18,8 +19,7 @@ namespace scene
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)
SAnimatedMesh(scene::IMesh* mesh=0, scene::E_ANIMATED_MESH_TYPE type=scene::EAMT_UNKNOWN) : IAnimatedMesh(), FramesPerSecond(25.f), Type(type)
{
#ifdef _DEBUG
setDebugName("SAnimatedMesh");
@ -77,7 +77,8 @@ struct SAnimatedMesh : public IAnimatedMesh
//! adds a Mesh
void addMesh(IMesh* mesh)
{
if (mesh) {
if (mesh)
{
mesh->grab();
Meshes.push_back(mesh);
}
@ -173,5 +174,9 @@ struct SAnimatedMesh : public IAnimatedMesh
E_ANIMATED_MESH_TYPE Type;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __COLOR_H_INCLUDED__
#define __COLOR_H_INCLUDED__
#include "irrTypes.h"
#include "irrMath.h"
@ -36,6 +37,50 @@ enum ECOLOR_FORMAT
//! Warning: This tends to be BGRA in memory (it's ARGB on file, but with usual big-endian memory it's flipped)
ECF_A8R8G8B8,
/** Compressed image formats. **/
//! DXT1 color format.
ECF_DXT1,
//! DXT2 color format.
ECF_DXT2,
//! DXT3 color format.
ECF_DXT3,
//! DXT4 color format.
ECF_DXT4,
//! DXT5 color format.
ECF_DXT5,
//! PVRTC RGB 2bpp.
ECF_PVRTC_RGB2,
//! PVRTC ARGB 2bpp.
ECF_PVRTC_ARGB2,
//! PVRTC RGB 4bpp.
ECF_PVRTC_RGB4,
//! PVRTC ARGB 4bpp.
ECF_PVRTC_ARGB4,
//! PVRTC2 ARGB 2bpp.
ECF_PVRTC2_ARGB2,
//! PVRTC2 ARGB 4bpp.
ECF_PVRTC2_ARGB4,
//! ETC1 RGB.
ECF_ETC1,
//! ETC2 RGB.
ECF_ETC2_RGB,
//! ETC2 ARGB.
ECF_ETC2_ARGB,
/** The following formats may only be used for render target textures. */
/** Floating point formats. */
@ -88,11 +133,26 @@ enum ECOLOR_FORMAT
};
//! Names for ECOLOR_FORMAT types
const c8 *const ColorFormatNames[ECF_UNKNOWN + 2] = {
const c8* const ColorFormatNames[ECF_UNKNOWN+2] =
{
"A1R5G5B5",
"R5G6B5",
"R8G8B8",
"A8R8G8B8",
"DXT1",
"DXT2",
"DXT3",
"DXT4",
"DXT5",
"PVRTC_RGB2",
"PVRTC_ARGB2",
"PVRTC_RGB4",
"PVRTC_ARGB4",
"PVRTC2_ARGB2",
"PVRTC2_ARGB4",
"ETC1",
"ETC2_RGB",
"ETC2_ARGB",
"R16F",
"G16R16F",
"A16B16G16R16F",
@ -107,9 +167,10 @@ const c8 *const ColorFormatNames[ECF_UNKNOWN + 2] = {
"D32",
"D24S8",
"UNKNOWN",
0,
0
};
//! Creates a 16 bit A1R5G5B5 color
inline u16 RGBA16(u32 r, u32 g, u32 b, u32 a=0xFF)
{
@ -119,12 +180,14 @@ inline u16 RGBA16(u32 r, u32 g, u32 b, u32 a = 0xFF)
(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
inline u16 RGB16from16(u16 r, u16 g, u16 b)
{
@ -134,6 +197,7 @@ inline u16 RGB16from16(u16 r, u16 g, u16 b)
(b & 0x1F));
}
//! Converts a 32bit (X8R8G8B8) color to a 16bit A1R5G5B5 color
inline u16 X8R8G8B8toA1R5G5B5(u32 color)
{
@ -143,6 +207,7 @@ inline u16 X8R8G8B8toA1R5G5B5(u32 color)
( color & 0x000000F8) >> 3);
}
//! Converts a 32bit (A8R8G8B8) color to a 16bit A1R5G5B5 color
inline u16 A8R8G8B8toA1R5G5B5(u32 color)
{
@ -152,6 +217,7 @@ inline u16 A8R8G8B8toA1R5G5B5(u32 color)
( color & 0x000000F8) >> 3);
}
//! Converts a 32bit (A8R8G8B8) color to a 16bit R5G6B5 color
inline u16 A8R8G8B8toR5G6B5(u32 color)
{
@ -160,6 +226,7 @@ inline u16 A8R8G8B8toR5G6B5(u32 color)
( 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)
@ -167,9 +234,11 @@ 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));
(( color & 0x0000001F ) << 3) | (( color & 0x0000001C ) >> 2)
);
}
//! Returns A8R8G8B8 Color from R5G6B5 color
inline u32 R5G6B5toA8R8G8B8(u16 color)
{
@ -179,18 +248,22 @@ inline u32 R5G6B5toA8R8G8B8(u16 color)
((color & 0x001F) << 3);
}
//! Returns A1R5G5B5 Color from R5G6B5 color
inline u16 R5G6B5toA1R5G5B5(u16 color)
{
return 0x8000 | (((color & 0xFFC0) >> 1) | (color & 0x1F));
}
//! Returns R5G6B5 Color from A1R5G5B5 color
inline u16 A1R5G5B5toR5G6B5(u16 color)
{
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. */
@ -199,6 +272,7 @@ 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)
@ -206,6 +280,7 @@ 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)
@ -213,6 +288,7 @@ 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)
@ -220,12 +296,14 @@ inline u32 getBlue(u16 color)
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.
/** The color values for alpha, red, green, and blue are
stored in a single u32. So all four values may be between 0 and 255.
@ -238,18 +316,19 @@ This class must consist of only one u32 and must not use virtual functions.
class SColor
{
public:
//! Constructor of the Color. Does nothing.
/** The color value is not initialized to save time. */
SColor() {}
//! Constructs the color from 4 values representing the alpha, red, green and blue component.
/** Must be values between 0 and 255. */
constexpr SColor(u32 a, u32 r, u32 g, u32 b) :
color(((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)) {}
SColor (u32 a, u32 r, u32 g, u32 b)
: color(((a & 0xff)<<24) | ((r & 0xff)<<16) | ((g & 0xff)<<8) | (b & 0xff)) {}
//! Constructs the color from a 32 bit value. Could be another color.
constexpr SColor(u32 clr) :
color(clr) {}
SColor(u32 clr)
: color(clr) {}
//! Returns the alpha component of the color.
/** The alpha component defines how opaque a color is.
@ -398,17 +477,13 @@ public:
return SColor(
core::clamp( core::floor32(
getAlpha() * mul0 + c1.getAlpha() * mul1 + c2.getAlpha() * mul2),
0, 255),
getAlpha() * mul0 + c1.getAlpha() * mul1 + c2.getAlpha() * mul2 ), 0, 255 ),
core::clamp( core::floor32(
getRed() * mul0 + c1.getRed() * mul1 + c2.getRed() * mul2),
0, 255),
getRed() * mul0 + c1.getRed() * mul1 + c2.getRed() * mul2 ), 0, 255 ),
core::clamp ( core::floor32(
getGreen() * mul0 + c1.getGreen() * mul1 + c2.getGreen() * mul2),
0, 255),
getGreen() * mul0 + c1.getGreen() * mul1 + c2.getGreen() * mul2 ), 0, 255 ),
core::clamp ( core::floor32(
getBlue() * mul0 + c1.getBlue() * mul1 + c2.getBlue() * mul2),
0, 255));
getBlue() * mul0 + c1.getBlue() * mul1 + c2.getBlue() * mul2 ), 0, 255 ));
}
//! set the color by expecting data in the given format
@ -417,7 +492,8 @@ public:
*/
void setData(const void *data, ECOLOR_FORMAT format)
{
switch (format) {
switch (format)
{
case ECF_A1R5G5B5:
color = A1R5G5B5toA8R8G8B8(*(u16*)data);
break;
@ -427,10 +503,12 @@ public:
case ECF_A8R8G8B8:
color = *(u32*)data;
break;
case ECF_R8G8B8: {
case ECF_R8G8B8:
{
const u8* p = (u8*)data;
set(255, p[0],p[1],p[2]);
} break;
}
break;
default:
color = 0xffffffff;
break;
@ -443,28 +521,37 @@ public:
*/
void getData(void *data, ECOLOR_FORMAT format) const
{
switch (format) {
case ECF_A1R5G5B5: {
switch(format)
{
case ECF_A1R5G5B5:
{
u16 * dest = (u16*)data;
*dest = video::A8R8G8B8toA1R5G5B5( color );
} break;
}
break;
case ECF_R5G6B5: {
case ECF_R5G6B5:
{
u16 * dest = (u16*)data;
*dest = video::A8R8G8B8toR5G6B5( color );
} break;
}
break;
case ECF_R8G8B8: {
case ECF_R8G8B8:
{
u8* dest = (u8*)data;
dest[0] = (u8)getRed();
dest[1] = (u8)getGreen();
dest[2] = (u8)getBlue();
} break;
}
break;
case ECF_A8R8G8B8: {
case ECF_A8R8G8B8:
{
u32 * dest = (u32*)data;
*dest = color;
} break;
}
break;
default:
break;
@ -475,6 +562,7 @@ public:
u32 color;
};
//! Class representing a color with four floats.
/** The color values for red, green, blue
and alpha are each stored in a 32 bit floating point variable.
@ -487,8 +575,7 @@ class SColorf
public:
//! Default constructor for SColorf.
/** Sets red, green and blue to 0.0f and alpha to 1.0f. */
SColorf() :
r(0.0f), g(0.0f), b(0.0f), a(1.0f) {}
SColorf() : 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.
/** \param r: Red color component. Should be a value between
@ -501,8 +588,7 @@ public:
component defines how transparent a color should be. Has to be
a value between 0.0f and 1.0f, 1.0f means not transparent
(opaque), 0.0f means fully transparent. */
SColorf(f32 r, f32 g, f32 b, f32 a = 1.0f) :
r(r), g(g), b(b), a(a) {}
SColorf(f32 r, f32 g, f32 b, f32 a = 1.0f) : r(r), g(g), b(b), a(a) {}
//! Constructs a color from 32 bit Color.
/** \param c: 32 bit color from which this SColorf class is
@ -529,12 +615,7 @@ public:
no green (=black) and 1.0f, meaning full green.
\param bb: Blue color component. Should be a value between 0.0f meaning
no blue (=black) and 1.0f, meaning full blue. */
void set(f32 rr, f32 gg, f32 bb)
{
r = rr;
g = gg;
b = bb;
}
void set(f32 rr, f32 gg, f32 bb) {r = rr; g =gg; b = bb; }
//! Sets all four color components to new values at once.
/** \param aa: Alpha component. Should be a value between 0.0f meaning
@ -545,13 +626,7 @@ public:
no green and 1.0f, meaning full green.
\param bb: Blue color component. Should be a value between 0.0f meaning
no blue and 1.0f, meaning full blue. */
void set(f32 aa, f32 rr, f32 gg, f32 bb)
{
a = aa;
r = rr;
g = gg;
b = bb;
}
void set(f32 aa, f32 rr, f32 gg, f32 bb) {a = aa; r = rr; g =gg; b = bb; }
//! Interpolates the color with a f32 value to another color
/** \param other: Other color
@ -585,22 +660,16 @@ public:
a * mul0 + c1.a * mul1 + c2.a * mul2);
}
//! Sets a color component by index. R=0, G=1, B=2, A=3
void setColorComponentValue(s32 index, f32 value)
{
switch (index) {
case 0:
r = value;
break;
case 1:
g = value;
break;
case 2:
b = value;
break;
case 3:
a = value;
break;
switch(index)
{
case 0: r = value; break;
case 1: g = value; break;
case 2: b = value; break;
case 3: a = value; break;
}
}
@ -629,6 +698,7 @@ public:
f32 a;
};
//! Class representing a color in HSL format
/** The color values for hue, saturation, luminance
are stored in 32bit floating point variables. Hue is in range [0,360],
@ -637,8 +707,8 @@ Luminance and Saturation are in percent [0,100]
class SColorHSL
{
public:
constexpr SColorHSL(f32 h = 0.f, f32 s = 0.f, f32 l = 0.f) :
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 toRGB(SColorf &color) const;
@ -649,6 +719,7 @@ public:
private:
inline f32 toRGB1(f32 rm1, f32 rm2, f32 rh) const;
};
inline void SColorHSL::fromRGB(const SColorf &color)
@ -656,16 +727,20 @@ inline void SColorHSL::fromRGB(const SColorf &color)
const f32 maxVal = core::max_(color.getRed(), color.getGreen(), color.getBlue());
const f32 minVal = (f32)core::min_(color.getRed(), color.getGreen(), color.getBlue());
Luminance = (maxVal+minVal)*50;
if (core::equals(maxVal, minVal)) {
if (core::equals(maxVal, minVal))
{
Hue=0.f;
Saturation=0.f;
return;
}
const f32 delta = maxVal-minVal;
if (Luminance <= 50) {
if ( Luminance <= 50 )
{
Saturation = (delta)/(maxVal+minVal);
} else {
}
else
{
Saturation = (delta)/(2-maxVal-minVal);
}
Saturation *= 100;
@ -682,19 +757,24 @@ inline void SColorHSL::fromRGB(const SColorf &color)
Hue += 360;
}
inline void SColorHSL::toRGB(SColorf &color) const
{
const f32 l = Luminance/100;
if (core::iszero(Saturation)) { // grey
if (core::iszero(Saturation)) // grey
{
color.set(l, l, l);
return;
}
f32 rm2;
if (Luminance <= 50) {
if ( Luminance <= 50 )
{
rm2 = l + l * (Saturation/100);
} else {
}
else
{
rm2 = l + (1 - l) * (Saturation/100);
}
@ -703,9 +783,11 @@ inline void SColorHSL::toRGB(SColorf &color) const
const f32 h = Hue / 360.0f;
color.set( toRGB1(rm1, rm2, h + 1.f/3.f),
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
{
@ -726,3 +808,5 @@ inline f32 SColorHSL::toRGB1(f32 rm1, f32 rm2, f32 rh) const
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __S_EXPOSED_VIDEO_DATA_H_INCLUDED__
#define __S_EXPOSED_VIDEO_DATA_H_INCLUDED__
namespace irr
{
@ -17,18 +18,8 @@ you are using the software or the null device.
*/
struct SExposedVideoData
{
SExposedVideoData()
{
OpenGLWin32.HDc = 0;
OpenGLWin32.HRc = 0;
OpenGLWin32.HWnd = 0;
}
explicit SExposedVideoData(void *Window)
{
OpenGLWin32.HDc = 0;
OpenGLWin32.HRc = 0;
OpenGLWin32.HWnd = Window;
}
SExposedVideoData() {OpenGLWin32.HDc=0; OpenGLWin32.HRc=0; OpenGLWin32.HWnd=0;}
explicit SExposedVideoData(void* Window) {OpenGLWin32.HDc=0; OpenGLWin32.HRc=0; OpenGLWin32.HWnd=Window;}
struct SOpenGLWin32
{
@ -87,3 +78,7 @@ struct SExposedVideoData
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __I_IRRLICHT_CREATION_PARAMETERS_H_INCLUDED__
#define __I_IRRLICHT_CREATION_PARAMETERS_H_INCLUDED__
#include "EDriverTypes.h"
#include "EDeviceTypes.h"
@ -34,8 +35,10 @@ struct SIrrlichtCreationParameters
Stencilbuffer(true),
Vsync(false),
AntiAlias(0),
HandleSRGB(false),
WithAlphaChannel(false),
Doublebuffer(true),
IgnoreInput(false),
Stereobuffer(false),
EventReceiver(0),
WindowId(0),
@ -56,9 +59,7 @@ struct SIrrlichtCreationParameters
SIrrlichtCreationParameters(const SIrrlichtCreationParameters& other) :
SDK_version_do_not_use(IRRLICHT_SDK_VERSION)
{
*this = other;
}
{*this = other;}
SIrrlichtCreationParameters& operator=(const SIrrlichtCreationParameters& other)
{
@ -74,8 +75,10 @@ struct SIrrlichtCreationParameters
Stencilbuffer = other.Stencilbuffer;
Vsync = other.Vsync;
AntiAlias = other.AntiAlias;
HandleSRGB = other.HandleSRGB;
WithAlphaChannel = other.WithAlphaChannel;
Doublebuffer = other.Doublebuffer;
IgnoreInput = other.IgnoreInput;
Stereobuffer = other.Stereobuffer;
EventReceiver = other.EventReceiver;
WindowId = other.WindowId;
@ -156,6 +159,21 @@ struct SIrrlichtCreationParameters
Default value: 0 - disabled */
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.
/** In some situations it might be desirable to get a color
buffer with an alpha channel, e.g. when rendering into a
@ -175,6 +193,13 @@ struct SIrrlichtCreationParameters
single buffers. Default value: true */
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
/** Some high-end gfx cards support two framebuffers for direct
support of stereoscopic output devices. If this flag is set the
@ -264,4 +289,8 @@ struct SIrrlichtCreationParameters
irr::io::path OGLES2ShaderPath;
};
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __S_MATERIAL_H_INCLUDED__
#define __S_MATERIAL_H_INCLUDED__
#include "SColor.h"
#include "matrix4.h"
@ -163,7 +164,8 @@ inline void unpack_textureBlendFuncSeparate(E_BLEND_FACTOR &srcRGBFact, E_BLEND_
//! has blend factor alphablending
inline bool textureBlendFunc_hasAlpha ( const E_BLEND_FACTOR factor )
{
switch (factor) {
switch ( factor )
{
case EBF_SRC_ALPHA:
case EBF_ONE_MINUS_SRC_ALPHA:
case EBF_DST_ALPHA:
@ -175,6 +177,7 @@ inline bool textureBlendFunc_hasAlpha(const E_BLEND_FACTOR factor)
}
}
//! These flags are used to specify the anti-aliasing and smoothing modes
/** Techniques supported are multisampling, geometry smoothing, and alpha
to coverage.
@ -190,9 +193,16 @@ enum E_ANTI_ALIASING_MODE
EAAM_SIMPLE=1,
//! High-quality anti-aliasing, not always supported, automatically enables SIMPLE mode
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
/** 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
@ -219,10 +229,11 @@ enum E_COLOR_MATERIAL
};
//! Names for polygon offset direction
const c8 *const PolygonOffsetDirectionNames[] = {
const c8* const PolygonOffsetDirectionNames[] =
{
"Back",
"Front",
0,
0
};
//! For SMaterial.ZWriteEnable
@ -243,13 +254,16 @@ enum E_ZWRITE
};
//! Names for E_ZWRITE
const c8 *const ZWriteNames[] = {
const c8* const ZWriteNames[] =
{
"Off",
"Auto",
"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.
@ -273,8 +287,7 @@ public:
GouraudShading(true), Lighting(true), ZWriteEnable(EZW_AUTO),
BackfaceCulling(true), FrontfaceCulling(false), FogEnable(false),
NormalizeNormals(false), UseMipMaps(true)
{
}
{ }
//! Texture layer array.
SMaterialLayer TextureLayers[MATERIAL_MAX_TEXTURES];
@ -425,8 +438,7 @@ public:
/** Useful for setting properties which are not per material, but per
texture layer, e.g. bilinear filtering. */
template <typename F>
void forEachTexture(F &&fn)
{
void forEachTexture(F &&fn) {
for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; i++) {
fn(TextureLayers[i]);
}
@ -511,8 +523,10 @@ public:
BlendFactor != b.BlendFactor ||
PolygonOffsetDepthBias != b.PolygonOffsetDepthBias ||
PolygonOffsetSlopeScale != b.PolygonOffsetSlopeScale ||
UseMipMaps != b.UseMipMaps;
for (u32 i = 0; (i < MATERIAL_MAX_TEXTURES) && !different; ++i) {
UseMipMaps != b.UseMipMaps
;
for (u32 i=0; (i<MATERIAL_MAX_TEXTURES) && !different; ++i)
{
different |= (TextureLayers[i] != b.TextureLayers[i]);
}
return different;
@ -522,14 +536,13 @@ public:
/** \param b Material to compare to.
\return True if the materials are equal, else false. */
inline bool operator==(const SMaterial& b) const
{
return !(b != *this);
}
{ return !(b!=*this); }
//! Check if material needs alpha blending
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 dstRGBFact = EBF_ZERO;
E_BLEND_FACTOR srcAlphaFact = EBF_ZERO;
@ -540,7 +553,8 @@ public:
unpack_textureBlendFuncSeparate(srcRGBFact, dstRGBFact, srcAlphaFact, dstAlphaFact, modulo, alphaSource, BlendFactor);
if (textureBlendFunc_hasAlpha(srcRGBFact) || textureBlendFunc_hasAlpha(dstRGBFact) ||
textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact)) {
textureBlendFunc_hasAlpha(srcAlphaFact) || textureBlendFunc_hasAlpha(dstAlphaFact))
{
return true;
}
}
@ -564,3 +578,5 @@ public:
IRRLICHT_API extern SMaterial IdentityMaterial;
} // end namespace video
} // end namespace irr
#endif

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __S_MATERIAL_LAYER_H_INCLUDED__
#define __S_MATERIAL_LAYER_H_INCLUDED__
#include "matrix4.h"
@ -42,11 +43,11 @@ static const char *const aTextureClampNames[] = {
"texture_clamp_mirror_clamp_to_edge",
"texture_clamp_mirror_clamp_to_border", 0};
//! Texture minification filter.
/** Used when scaling textures down. See the documentation on OpenGL's
`GL_TEXTURE_MIN_FILTER` for more information. */
enum E_TEXTURE_MIN_FILTER
{
enum E_TEXTURE_MIN_FILTER {
//! Aka nearest-neighbor.
ETMINF_NEAREST_MIPMAP_NEAREST = 0,
//! Aka bilinear.
@ -61,8 +62,7 @@ enum E_TEXTURE_MIN_FILTER
/** Used when scaling textures up. See the documentation on OpenGL's
`GL_TEXTURE_MAG_FILTER` for more information.
Note that mipmaps are only used for minification, not for magnification. */
enum E_TEXTURE_MAG_FILTER
{
enum E_TEXTURE_MAG_FILTER {
//! Aka nearest-neighbor.
ETMAGF_NEAREST = 0,
//! Aka bilinear.
@ -75,8 +75,7 @@ class SMaterialLayer
{
public:
//! Default constructor
SMaterialLayer() :
Texture(0), TextureWrapU(ETC_REPEAT), TextureWrapV(ETC_REPEAT), TextureWrapW(ETC_REPEAT),
SMaterialLayer() : 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)
{
}
@ -93,7 +92,8 @@ public:
//! Destructor
~SMaterialLayer()
{
if (TextureMatrix) {
if ( TextureMatrix )
{
delete TextureMatrix;
}
}
@ -108,17 +108,23 @@ public:
return *this;
Texture = other.Texture;
if (TextureMatrix) {
if (TextureMatrix)
{
if (other.TextureMatrix)
*TextureMatrix = *other.TextureMatrix;
else {
else
{
delete TextureMatrix;
TextureMatrix = 0;
}
} else {
if (other.TextureMatrix) {
}
else
{
if (other.TextureMatrix)
{
TextureMatrix = new core::matrix4(*other.TextureMatrix);
} else
}
else
TextureMatrix = 0;
}
TextureWrapU = other.TextureWrapU;
@ -136,7 +142,8 @@ public:
/** \return Texture matrix of this layer. */
core::matrix4& getTextureMatrix()
{
if (!TextureMatrix) {
if (!TextureMatrix)
{
TextureMatrix = new core::matrix4();
}
return *TextureMatrix;
@ -158,9 +165,11 @@ public:
\param mat New texture matrix for this layer. */
void setTextureMatrix(const core::matrix4& mat)
{
if (!TextureMatrix) {
if (!TextureMatrix)
{
TextureMatrix = new core::matrix4(mat);
} else
}
else
*TextureMatrix = mat;
}
@ -190,9 +199,7 @@ public:
/** \param b Layer to compare to.
\return True if layers are equal, else false. */
inline bool operator==(const SMaterialLayer& b) const
{
return !(b != *this);
}
{ return !(b!=*this); }
//! Texture
ITexture* Texture;
@ -236,3 +243,5 @@ private:
} // end namespace video
} // end namespace irr
#endif // __S_MATERIAL_LAYER_H_INCLUDED__

View File

@ -2,7 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#pragma once
#ifndef __S_MESH_H_INCLUDED__
#define __S_MESH_H_INCLUDED__
#include "IMesh.h"
#include "IMeshBuffer.h"
@ -41,6 +42,7 @@ struct SMesh : public IMesh
BoundingBox.reset ( 0.f, 0.f, 0.f );
}
//! returns amount of mesh buffers.
u32 getMeshBufferCount() const override
{
@ -57,7 +59,8 @@ struct SMesh : public IMesh
/** reverse search */
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())
return MeshBuffers[i];
}
@ -81,15 +84,21 @@ struct SMesh : public IMesh
void recalculateBoundingBox()
{
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()) {
if (!hasMeshBufferBBox) {
if ( !bb.isEmpty() )
{
if ( !hasMeshBufferBBox )
{
hasMeshBufferBBox = true;
BoundingBox = bb;
} else {
}
else
{
BoundingBox.addInternalBox(bb);
}
}
}
@ -101,7 +110,8 @@ struct SMesh : public IMesh
/** The bounding box is not updated automatically. */
void addMeshBuffer(IMeshBuffer* buf)
{
if (buf) {
if (buf)
{
buf->grab();
MeshBuffers.push_back(buf);
}
@ -128,5 +138,9 @@ struct SMesh : public IMesh
core::aabbox3d<f32> BoundingBox;
};
} // end namespace scene
} // end namespace irr
#endif

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