Compare commits

...

361 Commits

Author SHA1 Message Date
celeron55 7173c2c629
Update README.md: Add notice about IrrlichtMt having been moved into the main repo 2024-05-13 15:29:27 +03:00
sfan5 124708784f Restore buildability with SDL 2.0.10 2024-03-21 22:48:22 +01:00
Desour bcb952c3ca Move source/Irrlicht/ to src/ 2024-03-21 22:08:26 +01:00
Desour 594e88bf3b Remove the tab removal script again 2024-03-21 22:08:26 +01:00
Desour dd1043c4c0 Replace non-leading tabs with spaces, using:
find -type f |  # list all regular files
  grep -E '\.(h|cpp|mm)$' |  # filter for source files
  grep -v '/mt_' |  # filter out generated files
  grep -v '/vendor/' | # and vendored GL
  xargs -n 1 -P $(nproc) ./replace_non_leading_tabs.lua  # reformat everything
2024-03-21 22:08:26 +01:00
Desour 72e303238e Add a small script for tab removal 2024-03-21 22:08:26 +01:00
Desour adc96072cd Fix ugly formatted arrays
Found via: `rg --multiline "=\n\t*\{\n"`
2024-03-21 22:08:26 +01:00
Desour 7cf801244c Reformat test/image_loader_test.cpp manually 2024-03-21 22:08:26 +01:00
numzero b01a3ea781 Fix ifs clang-format didn’t get 2024-03-21 22:08:26 +01:00
Desour e5b97d440a Remove .clang-format again 2024-03-21 22:08:26 +01:00
Desour f5c6d3e945 Reformat the code, using:
find -type f |  # list all regular files
  grep -E '\.(h|cpp|mm)$' |  # filter for source files
  grep -v '/mt_' |  # filter out generated files
  grep -v '/vendor/' | # and vendored GL
  grep -v '/test/image_loader_test.cpp' |  # and this file (has giant literals arrays)
  xargs -n 1 -P $(nproc) clang-format -i  # reformat everything

Co-authored-by: numzero <numzer0@yandex.ru>
2024-03-21 22:08:26 +01:00
numzero 9814510b1b Add clang-format file, based on that from Minetest 2024-03-21 22:08:26 +01:00
sfan5 05c8bc8314 Try to fix macOS CI 2024-03-20 20:37:22 +01:00
sfan5 a9c4683b18 Do not include core::string in matrix4.h 2024-03-17 23:25:45 +01:00
sfan5 26c4f4e63d Ensure enough alignment for IImages 2024-03-10 13:58:24 +01:00
sfan5 9d07f906a7 Delete mesh writing support entirely
CB3DMeshWriter.cpp was not even being compiled
2024-03-10 10:11:27 +01:00
sfan5 d26c0aeaaf Remove more dead code 2024-03-09 23:00:33 +01:00
sfan5 70b0b46d50 Delete deprecated video driver methods 2024-03-09 23:00:33 +01:00
sfan5 a7dd075dec Mark some common constructors and other stuff as constexpr 2024-03-09 22:05:06 +01:00
sfan5 1e89db1b80 Consistently include C headers by their C++ wrapper 2024-02-25 22:10:04 +01:00
sfan5 44a368ef0e Migrate public headers to `#pragma once` 2024-02-25 22:10:04 +01:00
sfan5 7ddf740f9b Remove unused includes in public headers 2024-02-25 22:10:04 +01:00
ROllerozxa 2bbfa178ea
Don't link against SDL2main (#265) 2024-02-23 22:44:16 +01:00
sfan5 61682104df COpenGLCoreTexture: fix abort when format not supported 2024-02-23 21:31:33 +01:00
sfan5 46542793d6 OpenGL: Fix BGRA format mapping 2024-02-23 21:31:33 +01:00
sfan5 9f2d13a2b6 OpenGL: Print more debug info at init time 2024-02-23 21:31:33 +01:00
sfan5 602a4050b5 Adjust CI vcpkg run package installation 2024-02-23 21:31:33 +01:00
sfan5 54de743641 Workaround for too old GL header on older SDL versions
Problem: Since the removal of !_IRR_OPENGL_USE_EXTPOINTER_ we require some quite recent
symbols to compile the legacy GL driver. (*) Since the previous commit we prefer including
them via SDL but those are sometimes too old.

(*) This was in fact always a problem since USE_EXTPOINTER is the default.
    I guess people just had recent enough headers usually.
2024-02-23 21:31:33 +01:00
sfan5 3e8d8440e3 Vendor GL headers again
primary reason:
The unified GLES2 driver requires OpenGL headers (really), which Android does not provide.
2024-02-23 21:31:33 +01:00
sfan5 8189b2338a Remove now unused legacy OGLES2 driver 2024-02-23 21:31:33 +01:00
sfan5 0a77ef5dc2 Enable unified driver with all devices 2024-02-23 21:31:33 +01:00
sfan5 19f0f707a6 Use ContextManager to resolve symbols in GL driver 2024-02-23 21:31:33 +01:00
sfan5 83998f7471 Reduce OGLES extension array to ones actually used 2024-02-23 21:31:33 +01:00
sfan5 b7bb4b5958 Remove all !_IRR_OGLES1_USE_EXTPOINTER_ code 2024-02-23 21:31:33 +01:00
sfan5 f28e442bfa Drop all !_IRR_OGLES2_USE_EXTPOINTER_ code 2024-02-23 21:31:33 +01:00
sfan5 4cd5c3489e Drop all !_IRR_OPENGL_USE_EXTPOINTER_ code 2024-02-23 21:31:33 +01:00
sfan5 52e4d72ae2 Migrate OpenGL cache and texture handler to GL pointers
this makes the OpenGL 3 driver free of GL symbol references!
2024-02-23 21:31:33 +01:00
sfan5 7241a49566 Compile at least one CI build as debug 2024-02-23 13:19:23 +01:00
Muhammad Rifqi Priyo Susanto 2db8c8728e Missing value_or() when printing std::optional 2024-02-23 13:17:41 +01:00
paradust7 270b2bec6e Ensure that std::abs is used and not integer abs 2024-02-21 23:25:52 +01:00
sfan5 c83f28431b Add API to delete shader materials 2024-02-21 21:53:38 +01:00
sfan5 e60921f0cb Drop old shader material functions
I'm not sure what these actually are, but the situation is the same as the last commit.
2024-02-21 21:53:38 +01:00
sfan5 92252f70d2 Drop low-level shader constant setters
These don't work on the modern drivers and are unused anyway.
2024-02-21 21:53:38 +01:00
sfan5 4e9d0db4be Delete a broken method
implementation commented out, lol?
2024-02-19 21:22:54 +01:00
SmallJoker 2bb2d3fe01
CFileSystem: Fix signed integer conversion on MinGW 2024-02-18 23:45:39 +01:00
sfan5 45ace61007 OpenGL: support scene::EHM_STREAM
the relevant enum value is defined in both gl3 and gles2
2024-02-18 22:43:25 +01:00
sfan5 89d0717779 Delete some dead code 2024-02-18 17:12:51 +01:00
sfan5 19819bd23a Reduce needless use of wchar / stringw 2024-02-18 17:12:51 +01:00
sfan5 2894d9ab03 Add debug output to GL shader loading 2024-02-18 17:12:51 +01:00
sfan5 e56605d7ce
Update README for new SDL status 2024-02-17 22:15:02 +01:00
HybridDog f91be59811 Remove support for GL_POINT_SMOOTH and GL_LINE_SMOOTH antialiasing
These antialiasing techniques have been removed in OpenGL 3.1, they were often executed by the CPU, and Minetest does not use them.
The OpenGL wiki recommends that we do not use this functionality in our program.
https://www.khronos.org/opengl/wiki/Multisampling#Smooth_antialiasing
2024-02-17 22:04:01 +01:00
wsor4035 0069837920
Upgrade CI actions (#290)
* update ci package versions to resolve warnings
* fix bug with duplicate package names under msvc
2024-02-17 21:07:25 +01:00
sfan5 ad96fabe4a Remove mistaken code block from OGLES1 driver
Version can never be 200 here, this was probably mistakenly copy-pasted from the OpenGL driver.
2024-02-17 21:01:15 +01:00
sfan5 6ba6118b8c Upgrade SDL CI to 22.04 everywhere
fed up with stuff not working for random reasons.
2024-02-16 22:42:49 +01:00
sfan5 7f11d2f950 Switch to llvm-mingw 2024-02-16 21:30:07 +01:00
sfan5 fe3e41e7ea Set minimum SDL version
It was determined that the touch/mouse hints only exist in this version.
Since it's from 2019 this should be a reasonable minimum.
2024-02-15 10:37:24 +01:00
sfan5 4478b1f1ec Remove old SDL Windows workaround
suggested by @waxtatect
2024-02-15 10:35:21 +01:00
sfan5 3992129735 Bind keypad enter on SDL
fixes https://github.com/minetest/minetest/issues/14170
2024-02-15 10:34:23 +01:00
Fatih Uzunoglu 0dab737d60 Do not use `core::max_()` with variable that can not be addressed
header struct is packed, and `core::max_()` takes the input as reference.
2024-02-12 16:31:10 +01:00
Fatih Uzunoglu 330150854b SDL: set default for ActiveIcon
getActiveIcon() may be called before ActiveIcon
is initialized, leading to undefined behavior.
2024-02-12 16:31:10 +01:00
y5nw 6779ac83f9
SDL: Improve handling of IMEs (#285)
* Set text input rectangle for IMEs
* Avoid unnecessarily "restarting" text input
2024-02-09 00:08:03 +01:00
Lars Müller f1504093d1
Ensure that absent bone names work (#284) 2024-02-06 20:22:44 +01:00
sfan5 8482cc3db8 Adjust package config dependency again
Predictably, this broke dynamic linking setups where
SDL is not available at build-time (it doesn't need to be).
2024-01-30 14:23:33 +01:00
sfan5 a4f94b7656 Add missing dependency find to package config
refer to <https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html#creating-a-package-configuration-file>
2024-01-28 01:06:17 +01:00
SmallJoker 4299ee21d8
CMake: Move generator conditional expressions (#281) 2024-01-22 09:50:29 +01:00
Vitaliy 5b81694b1d
CI: Android support (#197) 2024-01-21 15:51:11 +01:00
grorp 66786d0059
Make IrrlichtDevice::isWindowVisible do what it says on the tin (#279) 2024-01-19 18:17:26 +01:00
David Heidelberg 9df2f0b944 Undefine SDL2 DirectFB video driver
1. we don't need it
2. it's dropped in SDL 3
3. it breaks compilation on Alpine and postmarketOS with SDL2 enabled
   (and the bug never going to get fixed on SDL2 side)

Signed-off-by: David Heidelberg <david@ixit.cz>
2024-01-18 23:28:45 +01:00
sfan5 c3571261ca Fix build with OpenGL ES 1 2024-01-17 17:55:19 +01:00
sfan5 bdcd27ab5b Bump revision 2024-01-17 17:19:03 +01:00
savilli 345285786f Make vector comparison operators transitive 2024-01-17 17:09:46 +01:00
savilli dda9b23c3d Make equals method symmetric 2024-01-17 17:09:46 +01:00
sfan5 b349266855 Enable SDL to compile on macOS 2024-01-17 11:00:40 +01:00
sfan5 ee2467d622 Remove some dead code 2024-01-16 23:59:46 +01:00
sfan5 88ca26c418 Define extpointer for SDL + OGLES2 2024-01-16 20:23:23 +01:00
sfan5 8f44270e4a Rip out compressed color formats 2024-01-16 20:23:23 +01:00
jordan4ibanez edc678f995
Update minimum CMake version 2024-01-16 18:48:30 +01:00
Lars Müller 0faeea33c3
build.yml: Upgrade bionic/jammy -> focal (current oldest LTS) 2024-01-16 18:34:24 +01:00
sfan5 f86b9b93e8 Fix crash when SDL context fails to create 2024-01-16 18:24:02 +01:00
Lars Mueller a3ec3a88e8 Fix scene nodes not dropping meshes (memleak) 2024-01-13 18:13:04 +01:00
Gregor Parzefall 7df45b4cf3 SDL: Implement touchscreen support 2024-01-13 14:08:13 +01:00
sfan5 a2b6244f54 Fix build with older SDL2 2024-01-08 23:51:34 +01:00
Lars Müller 3983c29645
Optimize scene node child removal to constant time (#275) 2024-01-08 18:43:24 +01:00
David Heidelberg 73e62f8676 Keep RTTI for Minetest IPO/LTO
Minetest using RTTI, so we cannot apply the flag here
if we want to start using IPO/LTO.

If we keep `-fno-rtti` here, compiler loses part of informations and
cannot do efficient optimizations.

The benefit of using RTTI on Irrlicht disappears with IPO/LTO on whole binary.

Signed-off-by: David Heidelberg <david@ixit.cz>
2024-01-06 21:30:15 +01:00
HybridDog fb4ee6ac93 Fix mip map size calculation for non-square textures
The size of a mip map is `max{floor(width / 2 ^ level), 1} x max{floor(height / 2 ^ level), 1}`,
where `width x height` is the size of the full-resolution image,
`level` is the integer mip map level
and the smallest mip map has `1 x 1` resolution.
If `regenerateMipMapLevels` is called with custom mip map data,
the mip map sizes are calculated in this function and separately in `uploadTexture`.
`uploadTexture` calculates a size by `floor(width / 2 ^ level) x floor(height / 2 ^ level)`.

To support non-square textures, after this change,
`uploadTexture` sets the mip map width or height to `1` if it is `0`.
2024-01-05 14:09:50 +01:00
Muhammad Rifqi Priyo Susanto 91e4129615
Windows: Return early if the clipboard data is not Unicode text 2024-01-04 21:24:50 +01:00
grorp 54b82aad26
Add IrrlichtDevice::isWindowVisible for Android 2024-01-04 16:48:35 +01:00
sfan5 03dd8b0336 Update vendored khrplatform.h 2023-12-19 22:56:31 +01:00
sfan5 6e6b4a6f3c Fix some minor issues with GL loader
fixes #258
2023-12-19 22:56:31 +01:00
sfan5 0110826ce9 Resync mt_opengl_loader.cpp with BindingGenerator.lua
also add a warning that you can't edit it by hand
2023-12-19 22:56:31 +01:00
sfan5 4e52d547b2 MinGW toolchain refresh 2023-12-17 20:47:29 +01:00
Vitaliy 9a439a3646
Use SDL2 by default
Except on Android and macOS, for now
2023-12-17 18:46:08 +01:00
Josiah VanderZee 854e97f57c Add size_t to u32/s32 static_casts in irrArray
This fixes 5 narrowing cast warnings from Visual Studio 17 2022.
2023-12-17 17:02:22 +01:00
Josiah VanderZee 22f2c37322 Add size_t to u32 static_casts to irrString
The irrString implementation doesn't allow constructing a string with a
size that would exceed a u32, so it should be safe to narrow the size of
the underlying STL container back to a u32.

This fixes 5 narrowing cast warnings from Visual Studio 17 2022.
2023-12-17 17:02:22 +01:00
paradust7 94cb0cc19d
Use KHRONOS_APIENTRY to fix win32 crash 2023-12-17 17:00:41 +01:00
sfan5 9b52d6fb0d Hash-check windows CI dependencies 2023-12-13 12:17:54 +01:00
sfan5 16a99c2079 Add a file to gitignore 2023-12-13 12:17:04 +01:00
paradust7 bb7c06d32a Initialize X11 thread safety 2023-12-10 16:29:22 +01:00
Muhammad Rifqi Priyo Susanto a2884e4000
Android: Make ALooper_pollAll call always non-blocking (#255) 2023-11-30 15:52:04 +01:00
sfan5 b284ea076b Use newer vcpkg in Windows CI 2023-11-30 15:43:24 +01:00
numzero 85081d6fe0 Fix off-by-one error in the TGA RLE decompressor 2023-11-01 14:40:11 +01:00
numzero eafc282efd Add unit tests for image loaders 2023-11-01 14:40:11 +01:00
numzero 8c2ad025b1 Add CTest 2023-11-01 14:40:11 +01:00
numzero a07cfc0f7a Require C++17 at the top level 2023-11-01 14:40:11 +01:00
sfan5 f725b68c57 Remove irrUString.h
now unused
2023-10-31 10:10:31 +01:00
sfan5 99be15f40b Bump revision 2023-10-27 17:48:29 +02:00
sfan5 6fccc79270 Convert built-in font to PNG 2023-10-25 16:54:43 +02:00
Loic Blot 7cade6f27f cleanup: remove _IRR_COMPILE_ANDROID_ASSET_READER_ build flag
it's enabled inconditionally on android

also remove some _IRR_COMPILE_WITH_ANDROID_DEVICE_ which are useless because cmake is already properly configured
2023-10-22 12:19:14 +02:00
Loic Blot ae63f1bf02 build: drop _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
it's enabled inconditionally
2023-10-22 12:19:14 +02:00
Loic Blot dd14486d3f cleanup: replace remaining #ifndef #define with #pragma once 2023-10-22 12:19:14 +02:00
cutealien 4a7d3de89a Merging r6555 through r6560 from branch releases/1.8 to trunk
- Fixing buffer overflow in tga loader

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6561 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-21 17:27:11 +02:00
cutealien 631c0fa77b Add warning about rotateXZBy using right handed rotation
Rest of Irrlicht is using left-handed rotatations.
But 2d vector rotations all uses ccw which is kinda the same direction as this one if you consider those as rotations around Y, so I guess that was maybe the reason back then.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6536 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:54:48 +02:00
cutealien 9813b460e1 Fix number overflows in TGA loader causing crashes
Image size calculation could overflow s32 in one place (but not others where it was done correct), which first lead to wrong amount of memory getting allocated for image data and later crash in the CColorConverter.
Thanks @sfan5 for his fuzzing tests @https://github.com/minetest/irrlicht/issues/236
and @erlehmann for passing them on: https://irrlicht.sourceforge.io/forum/viewtopic.php?t=52925
Also updating changes.txt with TGA loader changes from this and previous commits.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6535 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:54:39 +02:00
cutealien 565f14677c Fix crash caused by memory overwriting in TGA loader caused by bad RLE data
From sfan5's fuzzing test reported in Minetest here: https://github.com/minetest/irrlicht/issues/236
Was missing test if it writes beyond allocated memory which can be triggered by TGA's which lie in their RLE data.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6534 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:54:24 +02:00
cutealien f53af0f2cf TGA images with palettes in 24 or 32 bit now create 32 bit images
Was creating 16-bit images for those before.
Could also support 24-bit images, but either we need another convert function or another palette for that (the 16 and 32 bit both work with 32 bit palettes, the 24 bit conversion function only with 24 bit palettes)

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6533 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:54:21 +02:00
cutealien 05ebc43222 Fix TGA's with bad palette colors reading from behind palette memory
TGA's can claim to use less palette colors than they later do.
We only support 8-bit palettes, so to make this safer lets just always allocate at least 256 bytes.
Thanks @erlehmann for report and testcase: https://irrlicht.sourceforge.io/forum/viewtopic.php?p=307191
Based on Minetest bug report: https://github.com/minetest/irrlicht/issues/236

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6532 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:54:16 +02:00
cutealien c01de80583 Merging r6511 through r6520 from branch releases/1.8 to trunk
Note: Due to OSX always failing merge OSX it's rather applying a second patch
from Ryan Schmidt from bugreport #462 to trunk
(Not sure why svn merging always fails for OSX. Probably related to MacOSX files getting moved in the past. Was that done without svn move commands? I guess that can't be fixed anymore now)

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6521 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:49:54 +02:00
cutealien fbdc4ee8d5 Optimization in quaternion::rotationFromTo from Robert Eisele
Turns out we can avoid a square root and a division.
Patch comes even with proof: https://raw.org/proof/quaternion-from-two-vectors
(I also tested it a while and indeed got same results)

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6511 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:47:43 +02:00
cutealien 2c086e5fdc Improve documentation
What Irrlicht calls ShaderConstants is called uniforms by everyone else. So let's mention this at least.
Also reworked setVertexShaderConstant interface had an example for the old interface in the header.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6497 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:45:50 +02:00
cutealien 627a3a5172 Spelling fixes
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6475 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:39:42 +02:00
cutealien 01e05f3c94 Fix recently broken scroll behaviour of listbox with moveOverSelect
This also fixes the combobox which users the listbox like that.
This got broken in [r6454] which had fixed the events send out by the listbox
Note: Still a bit strange behaviour when leaving the combobox at the bottom, but that was already that way in Irrlicht 1.8, so I've got to investigate that on it's own.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6463 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:38:24 +02:00
cutealien b673a4b2bb Tiny spelling fixes
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6462 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:38:06 +02:00
cutealien 5e01152f56 Avoid warning in VS 2022
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6460 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:37:30 +02:00
cutealien c2dd664fc6 CIrrDeviceWin32::yield() now uses Sleep(0) instead of Sleep(1).
We had changed that once before in the other direction in svn r421
Reason back then was "Sleep(0) doesn't allow any lower priority threads to execute"
But Microsoft changed the behaviour of Sleep(0) after Windows XP so that's no longer true.
And the costs of it is pretty high - due to this using a timer with a 15ms resolutions it meant not just giving up the thread but it also always waited for 15ms on Windows.
I also replaced a few sleep calls in examples for that reason with yield() calls.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6459 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:37:26 +02:00
cutealien 774d3d6d2b Spelling fixes
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6458 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:36:47 +02:00
cutealien e1f41edd29 Spelling fixes
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6456 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-10-15 13:36:22 +02:00
Gregor Parzefall c766c3a023 Fix character encoding conversion issues 2023-10-15 12:59:40 +02:00
Gregor Parzefall 93eebed8c9 Unify documentation between IOSOperator and COSOperator 2023-10-15 12:59:40 +02:00
numzero 645b51a34d OpenGL3: Use std::vector in VertexType instead of clever lifetime games 2023-10-13 11:36:52 +02:00
numzero bcc53e1e1a OpenGL3: Make sure mt_opengl is only included after GLAPI is defined 2023-10-13 11:36:52 +02:00
numzero d4735ebc76 OpenGL3: Replace direct calls into libGL with mt_opengl 2023-10-13 11:36:52 +02:00
numzero 063079b372 OpenGL3: Make VertexType reference and not store the attribute list 2023-10-13 11:36:52 +02:00
numzero 3b198bdfda OpenGL3: Fix noexcept mismatch 2023-10-13 11:36:52 +02:00
Gregor Parzefall 5b2f1927d0
Revert #225 (d98dc90b38)
Fixes that Windows+SDL builds use the Windows Irrlicht device instead of the SDL Irrlicht device.
2023-10-04 23:29:59 +02:00
Vitaliy 9954667c45
Cleanup line endings (#245)
The exact commands to make this commit were:

git reset --hard origin/master
find -type f |  # list all regular files
  grep -E '\.(h|cpp|fsh|vsh|mm)|LICENSE$' |  # filter for text files
  xargs -n 1 -P $(nproc) sed -i 's:\s*$::'  # for each file, trim trailing whitespace including the CR
git commit -a
2023-10-03 20:37:00 +02:00
Gregor Parzefall ea1b58387e
ComboBox API additions for minetest#13814
- Allow reliably detecting when the user opens a combobox.
- Allow preventing comboboxes from opening.
- Allow sending a combobox change event.
2023-09-30 16:46:30 +02:00
sfan5 d767d27ca8 CXMeshFileLoader: revise error checking
Even when an error was encountered ::load() would still attempt
to assemble the mesh, this was a pretty big problem.
2023-09-29 13:49:03 +02:00
sfan5 6f4f7c4d75 CXMeshFileLoader: fix buffer overreads with text format 2023-09-29 13:49:03 +02:00
sfan5 103ab16679 CB3DMeshFileLoader: fix string read primitive 2023-09-29 13:49:03 +02:00
sfan5 64688f4490 CB3DMeshFileLoader: add some bounds checks 2023-09-29 13:49:03 +02:00
sfan5 827710f74a COBJMeshFileLoader: properly check indices 2023-09-29 13:49:03 +02:00
sfan5 80e160935d COBJMeshFileLoader: fix buffer overruns 2023-09-29 13:49:03 +02:00
sfan5 4506d23dc3 CImageLoaderBMP: add bound checks to RLE decompression 2023-09-29 13:49:03 +02:00
sfan5 028cb8dbed CImageLoaderBMP: check bitmap data against required size 2023-09-29 13:49:03 +02:00
sfan5 a5c9945bb8 CImageLoaderBMP: fix palette overreads 2023-09-29 13:49:03 +02:00
numzero cfb73d07d7 Remove more obsolete files 2023-09-26 17:42:00 +02:00
numzero 87f7cf3438 Drop unused resource script 2023-09-26 17:42:00 +02:00
numzero ebe4fd0a59 Refer to the origins in README 2023-09-26 17:42:00 +02:00
numzero fc7e3f2dff Move license to the root 2023-09-26 17:42:00 +02:00
numzero b0a070d980 Drop Irrlicht icon 2023-09-26 17:42:00 +02:00
numzero d9216362ec Drop obsolete docs 2023-09-26 17:42:00 +02:00
numzero d8a21cb25f Drop unused CIndexBuffer 2023-09-20 20:43:33 +02:00
numzero 9c54d927b9 Drop unused CVertexBuffer 2023-09-20 20:43:33 +02:00
numzero b89455f385 Build OpenGL3 by default 2023-09-17 21:07:07 +02:00
numzero 6a5fceb8fd Hide OpenGL3 behind SDL2 (it won’t build otherwise anyway) 2023-09-17 21:07:07 +02:00
Gregor Parzefall 0b9ee5884f Fix Android build after #231 2023-09-17 20:34:43 +02:00
sfan5 679dfd3343 Fix CNullDriver::removeTexture() segfault
`Textures` is not an one-to-one mapping.
Minetest still crashes with this commit but that's because
it attempts to double-free a texture.
broken by 7298b46504
2023-09-13 15:16:57 +02:00
sfan5 f9d7a632f5 CI: Add MinGW builds with SDL 2023-09-13 13:26:01 +02:00
numzero dc43583a2c CI: Merge 32- and 64-bit MinGW builds 2023-09-13 13:26:01 +02:00
Desour 03fd4ff533 Remove unused IVideoDriver::getTextureByIndex and IVideoDriver::renameTexture
* getTextureByIndex is pretty useless (apart from iterating over all texture,
  which we don't do), as you can't get an id.
* renameTexture is broken anyway: The sort call does nothing because the array
  is still flagged as sorted.
2023-09-13 13:24:08 +02:00
Desour b7292226b4 Remove the unnecessary sort in CNullDriver::addTexture 2023-09-13 13:24:08 +02:00
sfan5 7298b46504 Use binary search in CNullDriver::removeTexture() 2023-09-13 12:33:50 +02:00
Caleb Butler af20d9ff86 Remove deprecated function transformBox 2023-09-05 17:21:35 +02:00
Caleb Butler 00dd1f8ef3 Remove deprecated functionality of SMaterial 2023-09-05 17:21:35 +02:00
Caleb Butler 364cb37698 Remove deprecated methods from IVideoDriver 2023-09-05 17:21:35 +02:00
Caleb Butler 7ce9169d8d Remove deprecated method getOperatingSystemVersion 2023-09-05 17:21:35 +02:00
Caleb Butler ebdb2e410b Remove deprecated member functions of IMeshCache 2023-09-05 17:21:35 +02:00
Caleb Butler a28b8f9e91 Remove deprecated member functions
Removes deprecated member functions of IMaterialRendererServices.
2023-09-05 17:21:35 +02:00
Caleb Butler 6cd27d5dca Remove deprecated IImage member functions 2023-09-05 17:21:35 +02:00
Caleb Butler 04ab99f218 Removes deprecated function getNumber
Removes deprecated function getNumber as well as makes all
line terminators the proper CR LN combo.
2023-09-05 17:21:35 +02:00
Caleb Butler d753c8b782 Remove deprecated functions related to FileSystem 2023-09-05 17:21:35 +02:00
Caleb Butler 6a3ed6428f Remove deprecated getBoneName method 2023-09-05 17:21:35 +02:00
Caleb Butler 3492fd0d2d Remove primitive types not supported in OpenGL 3+
I removed old primitive types that do not work with modern OpenGL.
2023-09-05 17:21:35 +02:00
Kai Giebeler c6b06533f3
Deduplicate KP_5 from KP_HOME 2023-09-01 15:54:55 +02:00
sfan5 e609f5f263 Remove leftovers from D3D 2023-09-01 12:45:56 +02:00
sfan5 ddecc0fae2 Inline a pointless function 2023-09-01 12:26:43 +02:00
sfan5 dd3a34d674 Remove unused (I)Timer methods 2023-09-01 12:22:27 +02:00
Desour 0735220f86 Suppress a -Wunused-but-set-variable warning 2023-08-29 17:33:25 +02:00
Desour 0740d055ac Fix uninitialized memory error in operator- for ustring16 iterators 2023-08-29 17:33:25 +02:00
Gregor Parzefall 1d4672bd92 Remove the now unused SMaterialLayer::setFiltersMinetest method 2023-08-24 17:20:54 +02:00
Jessica Clarke ef3bab610d CIrrDeviceLinux: Fix type for NET_WM_PID XChangeProperty
This uses format=32 which in X11's API means a C type of long (with
restricted range when > 32 bits). pid_t is of unknown type, though on
Linux and FreeBSD it's a 32-bit type, so does not have the same size as
long on 64-bit architectures, and thus XChangeProperty reads outside its
bounds. Fix this by casting to and passing a long.
2023-08-15 20:42:12 +02:00
Loïc Blot d98dc90b38
cleanup: only build some files on WIN32 and compile EGL only if needed 2023-08-01 20:53:25 +02:00
sfan5 c311d01c07 Bump revision 2023-07-20 20:14:50 +02:00
Loic Blot d7f75ae882 gitignore: add vscode cmake extension support 2023-07-20 16:29:09 +02:00
Loic Blot e0d4d7d8b4 cleanup: get rid of the legacy #ifndef #define craziness 2023-07-20 16:29:09 +02:00
Gregor Parzefall fb7a0e4298 2D rendering: Enable bilinear filter for downscaling textures
This looks much better and doesn't have any downsides (e.g. regarding pixel art).
2023-07-16 13:02:48 +02:00
Gregor Parzefall a994c31ccf Expose all OpenGL filtering modes, use OpenGL names for them
Because of a review comment by numberZero.
2023-07-16 13:02:48 +02:00
Gregor Parzefall c40045a40a Rename SMaterial::TextureLayer -> SMaterial::TextureLayers
It's not the "texture layer" of the material, but an array of texture layers.
2023-07-16 13:02:48 +02:00
Gregor Parzefall c0ef1092c0 Rename E_MATERIAL_FLAG -> E_MATERIAL_PROP
The enum values don't reference material flags, but material properties.
2023-07-16 13:02:47 +02:00
Gregor Parzefall 5ececc7d29 Split up texture filtering properties of SMaterialLayer into MinFilter and MagFilter
You can now set the filter used when scaling textures down and the filter used when scaling textures up separately.
2023-07-16 13:02:26 +02:00
Gregor Parzefall 9e0189019e Refactor the way you set material properties
Instead	of using SMaterial::setFlag, you now set them directly on SMaterial or SMaterialLayer.
2023-07-16 13:02:25 +02:00
ndren b249e4523d
Use precise y-direction scroll values in SDL 2023-07-03 22:46:08 +02:00
numzero 041377c24c CI: Add MSVC/SDL builds 2023-07-03 21:03:37 +02:00
Gregor Parzefall 83699a835d Remove content-less comments 2023-06-15 10:01:34 +02:00
Gregor Parzefall 98589d2fd2 Remove unused fixed function materials 2023-06-15 10:01:34 +02:00
Desour 8c856408f5 Remove use of std::iterator
(Deprecated in C++17.)
2023-06-14 09:45:16 +02:00
Desour cbc7aeb302 Bump C++ std to 17 2023-06-14 09:45:16 +02:00
Gregor Parzefall 09af5ac00d Actually fix Android build 2023-06-06 16:20:06 +02:00
sfan5 2c6efbdf06 Remove native_app_glue linkage
We don't provide android_main(), Minetest does. This also didn't even work correctly.
2023-06-04 19:56:30 +02:00
JosiahWI 510976f130
Prefer GLVND at CMake>=3.11
CMake 3.10 introduced GLVND support. CMake 3.11 introduced CMP0072,
which prefers GLVND when NEW behavior is set. I set default policies to
3.11 for CMake versions >=3.11 and did not bother with requesting GLVND
for CMake 3.10.
2023-05-14 20:54:03 +02:00
numzero b958fdc271 Fix casing for Android device name (`MATCHES` is case sensitive) 2023-05-11 22:34:08 +02:00
numzero 1387370260 OpenGL3: Sort out texture color format support 2023-04-29 13:07:57 +02:00
Desour 49b6ccde72 SDL: Implement getDisplayDensity() and setWindowIcon() 2023-04-29 13:06:35 +02:00
Desour acbc90a000 Add the platform-dependent stuff from renderingengine.cpp 2023-04-29 13:06:35 +02:00
Desour 6a2a569233 Add IImage::copyToNoScaling
(Useful for const-correctness.)
2023-04-29 13:06:35 +02:00
numzero 1f15fd0805 OpenGL3: Support min/max blend modes 2023-04-24 21:43:36 +02:00
numzero 81ad195aa3 OpenGL3: New extension listing system 2023-04-23 09:48:04 +02:00
Vitaliy 13680ef42d OpenGL3: Use DrawBuffer[s] from mt_opengl 2023-04-18 23:22:53 +02:00
numzero 44f7c22bbf OpenGL3: Version asserts 2023-04-18 23:22:53 +02:00
numzero 2e477a07d1 OpenGL3: Add version check helper 2023-04-18 23:22:53 +02:00
numzero 78d0819a2c Add missing include 2023-04-18 23:22:53 +02:00
numzero df07b3bf99 OpenGL3: Remove stencil buffer presence test 2023-04-18 23:22:53 +02:00
numzero 523590e16c OpenGL3: Refuse 3.0 and 3.1 2023-04-18 23:22:53 +02:00
numzero 8cf02ea27f OpenGL3: ExtensionHandler::initExtensionsNew: use GetInteger 2023-04-18 23:22:53 +02:00
numzero efb660e7ed OpenGL3: drop unused ExtensionHandler functions 2023-04-18 23:22:53 +02:00
numzero 5f88555ed3 OpenGL3: restore MRT support 2023-04-18 23:22:53 +02:00
numzero 4ee1ab261e OpenGL3: Add driver-dependent feature checks 2023-04-18 23:22:53 +02:00
numzero ab628e641c OpenGL3: Add two missing OpenGL extensions to COGLESCoreExtensionHandler 2023-04-18 23:22:53 +02:00
numzero 1d782702e1 OpenGL3: new version format 2023-04-18 23:22:53 +02:00
Ben Gardner c4ab49201b
Fix compile warning when appending UTF-8/ASCII strings to ustring16
String constants are (const char *), but UTF-8 strings must be treated as
an array of bytes when fiddling with the bits.

The following comparison fails without this change, as uchar8_t is a
signed char, which cannot be 0xC0:

   const uchar8_t* c2 = other;
   ...
   else if (c2[l] == 0xC0 || c2[l] == 0xC1)
   ...
2023-04-15 09:43:40 +02:00
rubenwardy 896c825b9e
Fix ComboBox changing on scroll when in a scroll container (#192) 2023-04-14 19:58:13 +01:00
nephele 7a3fc62ada
Haiku: build fix 2023-04-11 20:16:35 +02:00
sfan5 09043e3da7 Update MinGW dependencies 2023-04-11 18:19:36 +02:00
sfan5 2d81374b34 Revert "Fix: Listbox was sometimes sending EGET_LISTBOX_SELECTED_AGAIN instead of EGET_LISTBOX_CHANGED."
This broke scrolling in listboxes, as they would always reset to top position.
reverts commit 1967d71cfb
2023-04-11 14:36:44 +02:00
Vitaliy aa1696a7e6
Use a buffer for quads indices
also use glDrawRangeElements for quad drawing
2023-04-08 19:08:03 +02:00
numzero e01f285c8f Extract and use singular CNullDriver::checkImage 2023-04-08 19:07:16 +02:00
numzero 5eb607f86f Drop createImagesFromFile in favor of createImageFromFile 2023-04-08 19:07:16 +02:00
numzero fc0440ff89 Drop IImageLoader::loadImages as only IImageLoader::loadImage is usable 2023-04-08 19:07:16 +02:00
numzero 462657960d OpenGL3: Drop always-zero vSpecularColor from the shaders 2023-04-07 17:42:54 +02:00
numzero 6a152e8629 OpenGL3: Drop unused material property uniforms 2023-04-07 17:42:54 +02:00
numzero 718ba69e1b OpenGL3: Drop unused fixed-function emulation materials 2023-04-07 17:42:54 +02:00
sfan5 54314691ec
Fix mistake in a677f5a01a 2023-04-06 15:00:12 +02:00
sfan5 36a3a7f349 Don't compile unused driver sources 2023-04-06 12:38:25 +02:00
sfan5 ca5f005b74 Fix OpenGL3 driver to compile standalone
also test this configuration in CI
2023-04-06 12:38:25 +02:00
sfan5 e850bd102a Minor adjustments to configuration flow 2023-04-06 12:12:46 +02:00
sfan5 a677f5a01a Only try to link libraries when relevant feature is enabled
fixes #182
2023-04-06 11:56:04 +02:00
sfan5 f5d3448b17 Document new CMake options 2023-04-06 11:35:30 +02:00
sfan5 3a074e4124 Merge branch 'opengl3' of https://github.com/numberZero/irrlicht 2023-04-06 11:20:03 +02:00
numzero 70ee4b05aa Indicate chosen OpenGL ES 2 driver during configuration 2023-04-05 22:52:43 +03:00
Vitaliy 58a96b7d23 Mark the repo as root in the editorconfig
Necessary due to CR/LF mess, it shouldn’t inherit the LF setting from Minetest.
2023-04-02 21:50:56 +02:00
DS ba1cd19983
Use non-static member vars for SDL clipboard / primary selection buffers 2023-03-26 14:13:58 +02:00
sfan5 a67f3003de Revert "Avoid some broken calculations for IBoneSceneNode positions."
This was reported to cause broken models in some cases.
reverts commit edb381bd50
2023-03-26 14:09:40 +02:00
numzero 4dda28450f Provide sources as private to IRRVIDEOOBJ 2023-03-25 11:26:52 +03:00
numzero 219b7fd7d2 Fix line endings in the new driver 2023-03-25 11:11:09 +03:00
numzero 28d0e0644c Add shaders for COpenGL3DriverBase
Currently, they are identical to OGLES2 shaders, except of version specification.
2023-03-25 11:10:05 +03:00
numzero d97d1708d6 Resolve conflicts with master 2023-03-25 10:42:47 +03:00
Desour 799c8b936f SDL: Support primary selection
Requires SDL >= 2.25.0 (newest master).
2023-03-24 17:59:06 +01:00
Desour 8da1bcf58b SDL: Support clipboard 2023-03-24 17:59:06 +01:00
Desour d86abb40c1 CGUIEditBox: Use primary selection
This is essentially the same as the commit in the minetest repo for GUIEditBox.
2023-03-24 17:59:06 +01:00
Desour 53b9eaa831 Implement X11 primary selection 2023-03-24 17:59:06 +01:00
cutealien 1967d71cfb Fix: Listbox was sometimes sending EGET_LISTBOX_SELECTED_AGAIN instead of EGET_LISTBOX_CHANGED.
When pressed mouse was moved over an item before releasing the mouse button it was sending immediately EGET_LISTBOX_SELECTED_AGAIN instead of expected EGET_LISTBOX_CHANGED (mouse  move changes do not send any events).

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6454 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien c5373262ca Use qualifed id instead of virtual function calls in CVertexBuffer constructors
Another find by cppcheck tool

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6448 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 939b3f7bfb Avoid undefined arithmetic on nullptr in buffer_offset function
Not quite sure why it was done that way. Maybe to ensure we work with byte-pointers of correct size or something?
Anyway, this doesn't seem to be defined in c++, so let's try working with a cast instead.
Just something cppcheck tool complained about.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6447 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 9c2c91776e Fix spelling of enums in header comments
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6445 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 6f3435f349 Prevent potential 0 pointer access when release not acquired joystick.
Found by clang analyser. Not sure if it could really ever have happened, but won't hurt to fix

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6443 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 9f9d22ca33 Fix some problems with CMatrix4::getRotationDegrees
- Only the getRotationDegrees without parameter is allowed to try fixing scale.
  My fault when I added a new function which takes scale parameter, that one is
  not allowed to be changed.
  On the up-side - we know have for the first time an option which works in cases only
  scale and rotation had been used and the user still has the correct scale.
  Before any solution for that was broken
- getRotationDegrees fixes 2 places which caused wrong results due to floating point inaccuracies
  New test for that got added
- Document the current restrains and problems of getRotationDegrees and getScale some more.
- Improve docs for other matrix4 functions.
- Add some comments about further improvements (I'll try if I find time)

Note: Irrlicht still assumes in at least 2 places (getting bone animations and Collada loader) that matrix
decomposing works. Which it doesn't yet for matrices which switch handedness (or have further transformations like skewing axes)
The bone animation is mostly fine for now with recent workaround (but that might cause other problems as it may be used too often), haven't checked Collada yet in detail.

TL/DR: This improves things with getRotationDegrees, but does not yet fix all troubles.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6439 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien edb381bd50 Avoid some broken calculations for IBoneSceneNode positions.
This is based on bugreport #458 reported by viwrap who also made a nice test-case model.
Note: While solution seems to work and would even be faster, I'm not 100% sure yet if there are no downsides.
The other solution seems to regard last column in matrices - thought I don't think we ever set or use that.
And I also haven't found out yet _why_ the original solution goes wrong.
But animation system uses right-hand quaternions unlike rest of Irrlicht which is obviously a bit dangerous, will have to check the conversions some day.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6438 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 8ffa7eafea Fix warning
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6434 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 2bff147904 Fix: Make CBillboardSceneNode bounding-box large enough to fit the billboard inside.
It still won't work yet for scaled boundingboxes (or parents being scaled).
But at least it's now large enough for typical unscaled boundingboxes.
Before it was always too small - even for the simplest quadratic billboard case seen without rotation.
Now it's always a bit too large, but that's way less of a problem (collisions still work and culling simply happens a bit less often, but not too often which is way worse)

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6431 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 3cf75cdce4 Fix IGUIElements not getting a tab order because of invisible or disabled parents.
First problem was that IGUIElement::getNextElement wasn't passing includeInvisible and includeDisabled flags recursively, so anything deeper than one level could fail if an element was disabled/invisible in between while it was created.
Second problem was that setTabOrder(-1) did ignore disabled elements. So when any parent was disabled when elements were created they never got a tab order.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6428 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien a7f9afd289 Avoid ambigious conversions when compiling with c++20
Yay, more ugly casts needed.


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6427 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 98df6eae77 Unify & improve log messages
Lots of places where coders did not realize our Printer::log with hint adds a ": " string between message and hint
Which caused uglier messages in a few places (added documentation for that, maybe helps?)
Some added info in a few places
Some whitespace unification
Some spelling unification

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6414 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 3ce4b2b5dc Prevent crash when creating CCameraSceneNode while rendertarget has height 0
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6405 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 424eb85f4d Minor const changes.
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6402 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 6a9e0f109c Avoid potential number overflows.
Found by VS code analyser

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6393 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
engineer_apple 15e3f15b48 SpriteBank: error check on non existing textureNumber
seen in broken Fonts. unified getFrameNr

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6368 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 263f243523 S3DVertex initialize color always. It's derived classes now both accept const S3DVertex& constructor.
color intitialization has some cost, but we initialized all other values already (vectors are always set to 0).
Don't think it's a good idea to have one value around which is random.
S3DVertex2TCoords(S3DVertex& o) to S3DVertex2TCoords(const S3DVertex& o) simply because it makes more sense
S3DVertexTangents(const S3DVertex& o) added because I'll need it later (and no idea why only S3DVertex2TCoords got one of those before).

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6359 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien c5ee8c8397 CVertexBuffer no longer re-allocates stuff when type doesn't change
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6339 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien b0c03b6f3b Add documentation that sourceRect of draw2dImage is based on the OriginalSize
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6324 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 679d3a8ba7 Avoid some more warnings when working with CMatrix4<f64>
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6304 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien d1f441787a Avoid warnings when working with CMatrix4<f64>
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6303 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
cutealien 739a9eaf7c IVideoDriver::setMaterialRendererName now using u32 for index like other similar functions
Other functions like getMaterialRendererName got switched to u32 in the past. I can see no reason why this one was left out, so changing it to be same as the rest.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6300 dfc29bdd-3216-0410-991c-e03cc46cb475
2023-03-24 17:09:11 +01:00
sfan5 0acf0de2db Delete changes.txt
Gets in the way of cherry-picking and isn't up to date anyway.
2023-03-20 14:46:27 +01:00
numzero 52a0b9d8e5 Drop dependency on FileSystem from SceneManager 2023-03-19 19:47:43 +01:00
numzero 0160cdc51d Drop unused dependency of SceneManager on GUIEnvironment 2023-03-19 19:47:43 +01:00
numzero 5a1565072a Drop unused dependency on FileSystem in mesh loaders 2023-03-19 19:47:43 +01:00
numzero 25a7074c9a Remove all mentions of iOS 2023-03-14 17:54:08 +01:00
numzero df8881898d Remove CIrrDeviceiOS 2023-03-14 17:54:08 +01:00
numzero ba77d01c91 Error out early on unsupported SDL2+GLES1 combo 2023-03-13 19:16:06 +03:00
numzero f641500d01 Add xvfb (for tests) 2023-03-13 18:45:50 +03:00
numzero 02c6449f0d Add CI for the new GL ES 2 driver 2023-03-13 18:40:11 +03:00
numzero 2331083837 Add CI for the new OpenGL 3 driver 2023-03-13 18:40:06 +03:00
numzero d84dc18e13 Add OpenGL3 support to the autotests 2023-03-13 18:38:47 +03:00
numzero ea0ca7f917 Small Fixes 2023-03-13 18:33:58 +03:00
numzero 82d1feb933 Accommodate lack of ETS_TEXTURE_1 2023-03-13 18:17:47 +03:00
numzero d81db9dd6d Merge branch 'drop-irr-compile-config' into opengl3 2023-03-13 18:07:25 +03:00
numzero 6c68217426 Merge branch 'master' into drop-irr-compile-config 2023-03-13 18:05:36 +03:00
sfan5 21c61e9973 Bump revision early 2023-03-11 15:12:05 +01:00
Vitaliy 5a5a7d04b7
Drop IrrCompileConfig (#163) 2023-03-11 15:04:09 +01:00
numzero b279810437 Consolidate import/export attribute definitions 2023-03-06 17:32:03 +03:00
numzero e484698ba2 Restrict X11 options to X11 device 2023-03-06 14:22:48 +03:00
numzero 5f76be9380 Restore isDriverSupported, but in a cpp file 2023-03-06 14:22:48 +03:00
numzero 6de0afa8b3 Drop ETS_TEXTURE_1
The transformation state itself is still available via ETS_TEXTURE_0+1
2023-03-06 14:22:48 +03:00
sfan5 1d43ea17ca Bump revision 2023-03-05 21:45:09 +01:00
Vitaliy a6d062ebd9
Apply suggestions from code review
Co-authored-by: sfan5 <sfan5@live.de>
2023-03-04 22:27:43 +03:00
numzero 2e9ed529b1 Restore obsolete constants as they are still used in some code I don’t want to touch 2023-03-03 22:01:50 +03:00
numzero ceb53be9e3 Merge branch 'master' into opengl3 2023-03-03 22:01:30 +03:00
numzero df28a4cc46 Fix ifdefs around includes in CIrrDeviceSDL 2023-03-03 21:23:07 +03:00
numzero 8dd8652f5f Split new GL3/GLES2 drivers
The classes are tiny wrappers currently but should they be customized, they are there
2023-03-03 20:29:36 +03:00
numzero 2932065346 Report as OpenGL 3 2023-03-02 03:03:17 +03:00
numzero 1326dfbcb1 Error out on unsupported configurations 2023-03-02 02:44:52 +03:00
numzero 1bbe341daa Support both OpenGL3 and GLES2 on SDL2 2023-03-02 02:44:52 +03:00
numzero d6716ec31b Support GLES2 2023-03-02 02:41:58 +03:00
numzero 620f4869a1 Drop obsolete video drivers 2023-03-02 01:22:04 +03:00
numzero 05384fdc5e Unify drawing functions 2023-02-28 00:51:29 +03:00
numzero 48270029cd Drop obsolete stuff 2023-02-27 23:36:56 +03:00
numzero c5ce853148 Unify quad drawing 2023-02-27 23:36:47 +03:00
numzero 4fba496917 Unify plain image drawing 2023-02-27 21:27:23 +03:00
numzero 79fdab0551 Drop obsolete IVideoDriver features 2023-02-27 21:26:46 +03:00
numzero 608aa150ff Load extensions the OpenGL 3 way 2023-02-27 20:32:06 +03:00
numzero 1f750cd7b2 Add debug handler 2023-02-27 20:31:51 +03:00
numzero 8c521939b9 Enumerate extensions in the OpenGL 3 way 2023-02-27 17:41:03 +03:00
numzero cfa8dd7845 Request OpenGL 3.2 2023-02-27 17:39:28 +03:00
numzero 01295c9ce6 Add OpenGL3 renderer 2023-02-27 17:05:11 +03:00
numzero 5a95b40a0e Reduce IrrCompileConfig usage to files that actually need it 2023-02-22 21:11:12 +03:00
numzero 8efd4527f6 Drop _IRR_MATERIAL_MAX_TEXTURES_ 2023-02-22 21:11:12 +03:00
numzero a0e1e39ea7 Drop _IRR_SCENEMANAGER_DEBUG 2023-02-22 21:11:12 +03:00
numzero d8e09f14bd Drop _IRR_COMPILE_WITH_GUI_ 2023-02-22 21:11:12 +03:00
numzero 67f852be57 Drop obsolete configuration macros 2023-02-22 21:11:12 +03:00
numzero 5a2b807890 Move import/export macros into CMake 2023-02-22 21:11:12 +03:00
numzero 06db7b7ab7 Move platform detection to CMake 2023-02-22 21:11:12 +03:00
Desour 09e6eeb65b Remove irr::core::hash
Its use of std::unary_function was deprecated.
And it wasn't used anywhere.
2023-02-22 11:43:42 +01:00
Desour 839bdc1a65 Fix -Wignored-qualifiers warnings in irrUString.h 2023-02-22 11:43:42 +01:00
Desour ea297196b7 Resolve some -Wreorder warnings 2023-02-22 11:43:42 +01:00
numzero 38f18eec56 Drop unused stuff from IrrCompileConfig 2023-02-21 18:16:39 +03:00
DS 5527b9f373
SDL: Use SDL_WINDOW_FULLSCREEN_DESKTOP and allow to maximize+fullscreen at once (#156) 2023-02-20 13:22:28 +01:00
ndren cd3e784534
Refactor SDL input code to fix menu exit (#146) 2023-02-18 16:16:17 +01:00
DS 51dffc416a
Add WindowMaximized creation parameter and isWindowMaximized() (#142) 2023-02-06 15:05:44 +01:00
lhofhansl 8f13ae81e5
Merge pull request #154 from lhofhansl/skinned
Avoid reskinning joints for animated meshes twice for each frame.
2023-01-12 11:02:52 -08:00
Lars 3de3ff524a Avoid reskinning joints for animated meshes twice for each frame. 2023-01-07 16:59:02 -08:00
sfan5 7d3142b969 Remove leftover code from software rendering 2023-01-02 21:21:53 +01:00
sfan5 a9230e5f49 Delete profiler 2023-01-02 21:05:07 +01:00
sfan5 b5a6dc0a15 Delete leak hunter 2023-01-02 20:37:18 +01:00
sfan5 ce0d29df93 Update workflow to address deprecations 2022-12-31 12:30:10 +01:00
x2048 2ae816b5a6
Use swap_control from MESA and EXT before SGI (#151)
SGI extension does not support interval == 0 (disabling VSync)
2022-12-29 23:42:52 +01:00
x2048 61af99adfa Use swap_control from MESA and EXT before SGI
SGI does not support disabling vsync (interval == 0)
2022-12-29 22:48:36 +01:00
SmallJoker afbe41019c CGUITabControl: Center selected tab whenever possible
This greatly improves the navigation speed by clicking through the tabs
without losing track of the current scroll position.
2022-12-23 20:07:15 +01:00
sfan5 05a00a8d91 Completely remove irrAllocator 2022-12-23 19:56:21 +01:00
sfan5 07fd32da50 Replace core::string implementation with std::basic_string 2022-12-23 19:17:08 +01:00
sfan5 735af8eec6 Add missing string tests 2022-12-23 19:17:08 +01:00
Andrei E 29a448de4d Point to Irrlicht license in root 2022-11-26 19:32:03 +01:00
DS 1579ce2740
SDL: implement cursor icon API (#135) 2022-11-12 15:52:39 +01:00
sfan5 b9e0641203 Add unittests for irrString 2022-11-11 16:25:49 +01:00
sfan5 6f98515f34 Fix two irrString bugs
* append() missing null-termination
* eraseTrailingFloatZeros() was accidentally broken, comment it out for now
2022-11-11 16:24:27 +01:00
Andrei E a549d0bfed Add setRelativeMode for SDL driver (#123) 2022-10-24 21:19:11 +02:00
sfan5 a0af653c3d Bump revision early 2022-10-24 21:17:53 +02:00
sfan5 cac4e62852 Fix buffer overflow in COBJMeshFileLoader 2022-10-24 11:07:51 +02:00
Herman Semenov d6766fb8f4
Add Windows build steps to README (#129) 2022-10-20 22:02:37 +02:00
Lars Müller e46ab74859
Fix line drawing: Explicitly draw both first & last pixel (#110) 2022-10-16 23:47:51 +02:00
DS 57705d57cf
SDL: Always set X, Y, Shift and Control in mouse input events 2022-10-16 17:42:15 +02:00
sfan5 e9908ca545 Add build with SDL2 to CI 2022-10-15 11:13:20 +02:00
sfan5 2709c937d9 Fix SDL device to work with null driver 2022-10-15 11:13:20 +02:00
JosiahWI 59fc4401f1 Replace _IRR_OVERRIDE_ macro with override keyword
The commit also establishes a precedent of leaving off the `virtual`
keyword in overrides. Although not strictly necessary, I believe this is
good for readability because it makes it clear it is an override and not
a pure virtual function, and it helps keep line lengths shorter. We
should move towards eliminating the macro altogether, but the definition
has been left in with a note on deprecation so that in-progress work
will not suffer merge conflicts.
2022-10-15 01:09:09 +02:00
sfan5 f3a1f9f656 Move Ubuntu builds into docker to keep them working 2022-10-14 16:09:17 +02:00
Riceball LEE 1128d9deab
win32: use the unicode window instead of ansi window (#138) 2022-10-14 15:52:10 +02:00
sfan5 9b541f2948 Fix buffer size for wchar-multibyte conversion 2022-10-14 15:47:49 +02:00
Tobias Frost 1cf0f3bef0
Fix typo in CXMeshFileLoader.cpp (#133)
This patch was provided from J. Puydt to Debian.
Origin: https://salsa.debian.org/games-team/minetest/-/blob/master/debian/patches/fix-typos.patch
2022-09-21 10:47:19 +02:00
sfan5 3225007e8d Bump revision 2022-09-16 19:39:46 +02:00
sfan5 e9f205f952 Avoid using XIWarpPointer on certain setups where it's broken
fixes minetest/minetest#12697
2022-09-12 16:20:31 +02:00
Herman Semenov d733e03430
Fix glHint parameter, type size and add more null checks (#130) 2022-09-02 08:40:02 +02:00
savilli f0766c845f
Fix crash in COGLES1Driver (#128) 2022-08-22 19:12:40 +02:00
498 changed files with 103866 additions and 121379 deletions

View File

@ -1,3 +1,5 @@
root = true
[*] [*]
charset = utf-8 charset = utf-8

View File

@ -8,9 +8,9 @@ on:
jobs: jobs:
linux-gl: linux-gl:
runs-on: ubuntu-18.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update sudo apt-get update
@ -18,23 +18,28 @@ jobs:
- name: Build - name: Build
run: | run: |
cmake . cmake . -DUSE_SDL2=OFF
make VERBOSE=1 -j2 make VERBOSE=1 -j2
- name: Test
run: |
ctest --output-on-failure
- name: Package - name: Package
run: | run: |
make DESTDIR=$PWD/_install install make DESTDIR=$PWD/_install install
tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local . tar -c -I "gzip -9" -f irrlicht-linux.tar.gz -C ./_install/usr/local .
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v4
with: with:
name: irrlicht-linux name: irrlicht-linux
path: ./irrlicht-linux.tar.gz path: ./irrlicht-linux.tar.gz
linux-gles: linux-gles:
runs-on: ubuntu-18.04 # Xvfb test is broken on 20.04 for unknown reasons (not our bug)
runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update sudo apt-get update
@ -42,9 +47,7 @@ jobs:
- name: Build - name: Build
run: | run: |
sed '/#define _IRR_COMPILE_WITH_OGLES2_/ s|^//||g' -i include/IrrCompileConfig.h cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=OFF -DENABLE_OPENGL=OFF -DENABLE_GLES2=ON
sed '/#define _IRR_COMPILE_WITH_OPENGL_/ s|^|//|g' -i include/IrrCompileConfig.h
cmake . -DBUILD_EXAMPLES=1
make -j2 make -j2
- name: Test (headless) - name: Test (headless)
@ -55,60 +58,118 @@ jobs:
- name: Test (Xvfb) - name: Test (Xvfb)
run: | run: |
cd bin/Linux cd bin/Linux
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest ogles2
win32: linux-sdl:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Install compiler
run: |
sudo apt-get update && sudo apt-get install cmake -qyy
wget http://minetest.kitsunemimi.pw/mingw-w64-i686_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: i686-w64-mingw32-gcc
CXX: i686-w64-mingw32-g++
- uses: actions/upload-artifact@v2
with:
name: irrlicht-win32
path: ./irrlicht-win32.zip
win64:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Install compiler
run: |
sudo apt-get update && sudo apt-get install cmake -qyy
wget http://minetest.kitsunemimi.pw/mingw-w64-x86_64_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: x86_64-w64-mingw32-gcc
CXX: x86_64-w64-mingw32-g++
- uses: actions/upload-artifact@v2
with:
name: irrlicht-win64
path: ./irrlicht-win64.zip
macos:
runs-on: macos-10.15
steps:
- uses: actions/checkout@v2
- name: Install deps - name: Install deps
run: | run: |
brew update sudo apt-get update
sudo 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
make -j2
- name: Test (headless)
run: |
cd bin/Linux
./AutomatedTest null
linux-sdl-gl3:
# Xvfb test is broken on 20.04 for unknown reasons (not our bug)
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install deps
run: |
sudo apt-get update
sudo apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
- name: Build
run: |
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON -DENABLE_OPENGL=OFF -DENABLE_OPENGL3=ON
make -j2
- name: Test (headless)
run: |
cd bin/Linux
./AutomatedTest null
- name: Test (Xvfb)
run: |
cd bin/Linux
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest opengl3
linux-sdl-gles2:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Install deps
run: |
sudo apt-get update
sudo apt-get install g++ cmake libsdl2-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
- name: Build
run: |
cmake . -DBUILD_EXAMPLES=1 -DUSE_SDL2=ON -DENABLE_OPENGL=OFF -DENABLE_GLES2=ON
make -j2
- name: Test (headless)
run: |
cd bin/Linux
./AutomatedTest null
- name: Test (Xvfb)
run: |
cd bin/Linux
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest ogles2
mingw:
name: "MinGW ${{matrix.config.variant}}${{matrix.config.extras}}"
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
config:
- {variant: win32, arch: i686}
- {variant: win64, arch: x86_64}
- {variant: win32, arch: i686, extras: "-sdl"}
- {variant: win64, arch: x86_64, extras: "-sdl"}
steps:
- uses: actions/checkout@v4
- name: Install compiler
run: |
sudo apt-get update && sudo apt-get install cmake -qyy
./scripts/ci-get-mingw.sh
- name: Build
run: |
./scripts/ci-build-mingw.sh package
env:
CC: ${{matrix.config.arch}}-w64-mingw32-clang
CXX: ${{matrix.config.arch}}-w64-mingw32-clang++
extras: ${{matrix.config.extras}}
- uses: actions/upload-artifact@v4
with:
name: irrlicht-${{matrix.config.variant}}${{matrix.config.extras}}
path: ./irrlicht-${{matrix.config.variant}}${{matrix.config.extras}}.zip
macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install deps
run: |
brew update --auto-update
brew install cmake libpng jpeg brew install cmake libpng jpeg
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Build - name: Build
run: | run: |
@ -119,13 +180,30 @@ jobs:
run: | run: |
./bin/OSX/AutomatedTest null ./bin/OSX/AutomatedTest null
macos-sdl:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install deps
run: |
brew update --auto-update
brew install cmake libpng jpeg sdl2
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Build
run: |
cmake . -DCMAKE_FIND_FRAMEWORK=LAST -DBUILD_EXAMPLES=1 -DUSE_SDL2=1
make -j3
msvc: msvc:
name: VS 2019 ${{ matrix.config.arch }} name: VS 2019 ${{ matrix.config.arch }} ${{ matrix.sdl.label }}
runs-on: windows-2019 runs-on: windows-2019
env: env:
VCPKG_VERSION: 14e7bb4ae24616ec54ff6b2f6ef4e8659434ea44 VCPKG_VERSION: 8eb57355a4ffb410a2e94c07b4dca2dffbee8e50
# 2022.05.10 # 2023.10.19
vcpkg_packages: zlib libpng libjpeg-turbo opengl-registry vcpkg_packages: zlib libpng libjpeg-turbo
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@ -138,15 +216,24 @@ jobs:
arch: x64 arch: x64
generator: "-G'Visual Studio 16 2019' -A x64" generator: "-G'Visual Studio 16 2019' -A x64"
vcpkg_triplet: x64-windows vcpkg_triplet: x64-windows
sdl:
-
use: FALSE
label: '(no SDL)'
vcpkg_packages: opengl-registry
-
use: TRUE
label: '(with SDL)'
vcpkg_packages: sdl2
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Restore from cache and run vcpkg - name: Restore from cache and run vcpkg
uses: lukka/run-vcpkg@v7 uses: lukka/run-vcpkg@v7
with: with:
vcpkgArguments: ${{env.vcpkg_packages}} vcpkgArguments: ${{env.vcpkg_packages}} ${{matrix.sdl.vcpkg_packages}}
vcpkgDirectory: '${{ github.workspace }}\vcpkg' vcpkgDirectory: '${{ github.workspace }}\vcpkg'
appendedCacheKey: ${{ matrix.config.vcpkg_triplet }} appendedCacheKey: ${{ matrix.config.vcpkg_triplet }}
vcpkgGitCommitId: ${{ env.VCPKG_VERSION }} vcpkgGitCommitId: ${{ env.VCPKG_VERSION }}
@ -155,6 +242,7 @@ jobs:
- name: CMake - name: CMake
run: | run: |
cmake ${{matrix.config.generator}} ` cmake ${{matrix.config.generator}} `
-DUSE_SDL2=${{matrix.sdl.use}} `
-DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}\vcpkg\scripts\buildsystems\vcpkg.cmake" ` -DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}\vcpkg\scripts\buildsystems\vcpkg.cmake" `
-DCMAKE_BUILD_TYPE=Release . -DCMAKE_BUILD_TYPE=Release .
@ -173,7 +261,50 @@ jobs:
run: move include artifact/ run: move include artifact/
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: msvc-${{ matrix.config.arch }} name: msvc-${{ matrix.config.arch }}-${{matrix.sdl.use}}
path: artifact/ path: artifact/
android:
name: Android ${{ matrix.arch }}
runs-on: ubuntu-20.04
env:
ndk_version: "r25c"
ANDROID_NDK: ${{ github.workspace }}/android-ndk
strategy:
matrix:
arch: [armeabi-v7a, arm64-v8a, x86, x86_64]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install deps
run: |
sudo rm /var/lib/man-db/auto-update
sudo apt-get update
sudo apt-get install -qyy wget unzip zip gcc-multilib make cmake
- name: Cache NDK
id: cache-ndk
uses: actions/cache@v4
with:
key: android-ndk-${{ env.ndk_version }}-linux
path: ${{ env.ANDROID_NDK }}
- name: Install NDK
run: |
wget --progress=bar:force "http://dl.google.com/android/repository/android-ndk-${ndk_version}-linux.zip"
unzip -q "android-ndk-${ndk_version}-linux.zip"
rm "android-ndk-${ndk_version}-linux.zip"
mv "android-ndk-${ndk_version}" "${ANDROID_NDK}"
if: ${{ steps.cache-ndk.outputs.cache-hit != 'true' }}
- name: Build
run: ./scripts/ci-build-android.sh ${{ matrix.arch }}
#- name: Upload Artifact
# uses: actions/upload-artifact@v4
# with:
# name: irrlicht-android-${{ matrix.arch }}
# path: ${{ runner.temp }}/pkg/${{ matrix.arch }}

4
.gitignore vendored
View File

@ -5,6 +5,7 @@ install_manifest.txt
IrrlichtMtConfig.cmake IrrlichtMtConfig.cmake
IrrlichtMtConfigVersion.cmake IrrlichtMtConfigVersion.cmake
IrrlichtMtTargets.cmake IrrlichtMtTargets.cmake
CTestTestfile.cmake
Makefile Makefile
libs/* libs/*
*.so* *.so*
@ -19,3 +20,6 @@ scripts/glext.h
*.dir/ *.dir/
*.sln *.sln
*visualstudio/ *visualstudio/
# vscode cmake plugin
build/*

View File

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

View File

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

View File

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

View File

@ -1,9 +1,16 @@
IrrlichtMt version 1.9 IrrlichtMt version 1.9
====================== ======================
The Irrlicht Engine is an open source realtime 3D engine written in C++. Notice
------
This is a fork by the [Minetest](https://github.com/minetest) developers that was stripped-down and customized specifically for use in Minetest. 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. It is intentionally not compatible to upstream and is planned to be eventually absorbed into Minetest.
Build Build
@ -16,10 +23,16 @@ The following libraries are required to be installed:
* OpenGL * OpenGL
* or on mobile: OpenGL ES (can be optionally enabled on desktop too) * or on mobile: OpenGL ES (can be optionally enabled on desktop too)
* on Unix: X11 * on Unix: X11
* SDL2 (see below)
Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the following options are available: Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the following options are available:
* `BUILD_SHARED_LIBS` (default: `ON`) - Build IrrlichtMt as a shared library * `BUILD_SHARED_LIBS` (default: `ON`) - Build IrrlichtMt as a shared library
* `BUILD_EXAMPLES` (default: `OFF`) - Build example applications * `BUILD_EXAMPLES` (default: `OFF`) - Build example applications
* `ENABLE_OPENGL` - Enable OpenGL driver
* `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
e.g. on a Linux system you might want to build for local use like this: e.g. on a Linux system you might want to build for local use like this:
@ -30,6 +43,21 @@ e.g. on a Linux system you might want to build for local use like this:
This will put an IrrlichtMtTargets.cmake file into the cmake directory in the current build directory, and it can then be imported from another project by pointing `find_package()` to the build directory, or by setting the `CMAKE_PREFIX_PATH` variable to that same path. This will put an IrrlichtMtTargets.cmake file into the cmake directory in the current build directory, and it can then be imported from another project by pointing `find_package()` to the build directory, or by setting the `CMAKE_PREFIX_PATH` variable to that same path.
on Windows system:
It is highly recommended to use vcpkg as package manager.
After you successfully built vcpkg you can easily install the required libraries:
vcpkg install zlib libjpeg-turbo libpng sdl2 --triplet x64-windows
Run the following script in PowerShell:
git clone https://github.com/minetest/irrlicht
cd irrlicht
cmake -B build -G "Visual Studio 17 2022" -A "Win64" -DCMAKE_TOOLCHAIN_FILE=[vcpkg-root]/scripts/buildsystems/vcpkg.cmake -DBUILD_SHARED_LIBS=OFF
cmake --build build --config Release
Platforms Platforms
--------- ---------

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

@ -0,0 +1,205 @@
#include <irrString.h>
#include <cstring>
#include <clocale>
#include <vector>
#include "test_helper.h"
using namespace irr;
using namespace irr::core;
#define CMPSTR(a, b) (!strcmp(a, b))
#define UASSERTSTR(actual, expected) UASSERTCMP(CMPSTR, actual.c_str(), expected)
static void test_basics()
{
// ctor
stringc s;
UASSERTEQ(s.c_str()[0], '\0');
s = stringc(0.1234567);
UASSERTSTR(s, "0.123457");
s = stringc(0x1p+53);
UASSERTSTR(s, "9007199254740992.000000");
s = stringc(static_cast<int>(-102400));
UASSERTSTR(s, "-102400");
s = stringc(static_cast<unsigned int>(102400));
UASSERTSTR(s, "102400");
s = stringc(static_cast<long>(-1024000));
UASSERTSTR(s, "-1024000");
s = stringc(static_cast<unsigned long>(1024000));
UASSERTSTR(s, "1024000");
s = stringc("YESno", 3);
UASSERTSTR(s, "YES");
s = stringc(L"test", 4);
UASSERTSTR(s, "test");
s = stringc("Hello World!");
UASSERTSTR(s, "Hello World!");
// operator=
s = stringw(L"abcdef");
UASSERTSTR(s, "abcdef");
s = L"abcdef";
UASSERTSTR(s, "abcdef");
s = static_cast<const char *>(nullptr);
UASSERTSTR(s, "");
// operator+
s = s + stringc("foo");
UASSERTSTR(s, "foo");
s = s + L"bar";
UASSERTSTR(s, "foobar");
// the rest
s = "f";
UASSERTEQ(s[0], 'f');
const auto &sref = s;
UASSERTEQ(sref[0], 'f');
UASSERT(sref == "f");
UASSERT(sref == stringc("f"));
s = "a";
UASSERT(sref < stringc("aa"));
UASSERT(sref < stringc("b"));
UASSERT(stringc("Z") < sref);
UASSERT(!(sref < stringc("a")));
UASSERT(sref.lower_ignore_case("AA"));
UASSERT(sref.lower_ignore_case("B"));
UASSERT(!sref.lower_ignore_case("A"));
s = "dog";
UASSERT(sref != "cat");
UASSERT(sref != stringc("cat"));
}
static void test_methods()
{
stringc s;
const auto &sref = s;
s = "irrlicht";
UASSERTEQ(sref.size(), 8);
UASSERT(!sref.empty());
s.clear();
UASSERTEQ(sref.size(), 0);
UASSERT(sref.empty());
UASSERT(sref[0] == 0);
s = "\tAz#`";
s.make_lower();
UASSERTSTR(s, "\taz#`");
s.make_upper();
UASSERTSTR(s, "\tAZ#`");
UASSERT(sref.equals_ignore_case("\taz#`"));
UASSERT(sref.equals_substring_ignore_case("Z#`", 2));
s = "irrlicht";
UASSERT(sref.equalsn(stringc("irr"), 3));
UASSERT(sref.equalsn("irr", 3));
s = "fo";
s.append('o');
UASSERTSTR(s, "foo");
s.append("bar", 1);
UASSERTSTR(s, "foob");
s.append("ar", 999999);
UASSERTSTR(s, "foobar");
s = "nyan";
s.append(stringc("cat"));
UASSERTSTR(s, "nyancat");
s.append(stringc("sam"), 1);
UASSERTSTR(s, "nyancats");
s = "fbar";
s.insert(1, "ooXX", 2);
UASSERTSTR(s, "foobar");
UASSERTEQ(sref.findFirst('o'), 1);
UASSERTEQ(sref.findFirst('X'), -1);
UASSERTEQ(sref.findFirstChar("abff", 2), 3);
UASSERTEQ(sref.findFirstCharNotInList("fobb", 2), 3);
UASSERTEQ(sref.findLast('o'), 2);
UASSERTEQ(sref.findLast('X'), -1);
UASSERTEQ(sref.findLastChar("abrr", 2), 4);
UASSERTEQ(sref.findLastCharNotInList("rabb", 2), 3);
UASSERTEQ(sref.findNext('o', 2), 2);
UASSERTEQ(sref.findLast('o', 1), 1);
s = "ob-oob";
UASSERTEQ(sref.find("ob", 1), 4);
UASSERTEQ(sref.find("ob"), 0);
UASSERTEQ(sref.find("?"), -1);
s = "HOMEOWNER";
stringc s2 = sref.subString(2, 4);
UASSERTSTR(s2, "MEOW");
s2 = sref.subString(2, 4, true);
UASSERTSTR(s2, "meow");
s = "land";
s.replace('l', 's');
UASSERTSTR(s, "sand");
s = ">dog<";
s.replace("dog", "cat");
UASSERTSTR(s, ">cat<");
s.replace("cat", "horse");
UASSERTSTR(s, ">horse<");
s.replace("horse", "gnu");
UASSERTSTR(s, ">gnu<");
s = " h e l p ";
s.remove(' ');
UASSERTSTR(s, "help");
s.remove("el");
UASSERTSTR(s, "hp");
s = "irrlicht";
s.removeChars("it");
UASSERTSTR(s, "rrlch");
s = "\r\nfoo bar ";
s.trim();
UASSERTSTR(s, "foo bar");
s = "foxo";
s.erase(2);
UASSERTSTR(s, "foo");
s = "a";
s.append('\0');
s.append('b');
UASSERTEQ(s.size(), 3);
s.validate();
UASSERTEQ(s.size(), 1);
UASSERTEQ(s.lastChar(), 'a');
std::vector<stringc> res;
s = "a,,b,c";
s.split(res, ",aa", 1, true, false);
UASSERTEQ(res.size(), 3);
UASSERTSTR(res[0], "a");
UASSERTSTR(res[2], "c");
res.clear();
s.split(res, ",", 1, false, true);
UASSERTEQ(res.size(), 7);
UASSERTSTR(res[0], "a");
UASSERTSTR(res[2], "");
for (int i = 0; i < 3; i++)
UASSERTSTR(res[2 * i + 1], ",");
}
static void test_conv()
{
// locale-independent
stringw out;
utf8ToWString(out, "†††");
UASSERTEQ(out.size(), 3);
for (int i = 0; i < 3; i++)
UASSERTEQ(static_cast<u16>(out[i]), 0x2020);
stringc out2;
wStringToUTF8(out2, L"†††");
UASSERTEQ(out2.size(), 9);
for (int i = 0; i < 3; i++) {
UASSERTEQ(static_cast<u8>(out2[3 * i]), 0xe2);
UASSERTEQ(static_cast<u8>(out2[3 * i + 1]), 0x80);
UASSERTEQ(static_cast<u8>(out2[3 * i + 2]), 0xa0);
}
// locale-dependent
if (!setlocale(LC_CTYPE, "C.UTF-8"))
setlocale(LC_CTYPE, "UTF-8"); // macOS
stringw out3;
multibyteToWString(out3, "†††");
UASSERTEQ(out3.size(), 3);
for (int i = 0; i < 3; i++)
UASSERTEQ(static_cast<u16>(out3[i]), 0x2020);
}
void test_irr_string()
{
test_basics();
test_methods();
test_conv();
std::cout << " test_irr_string PASSED" << std::endl;
}

View File

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

View File

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

View File

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

View File

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

View File

@ -1,101 +1,32 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __E_ATTRIBUTES_H_INCLUDED__ #pragma once
#define __E_ATTRIBUTES_H_INCLUDED__
namespace irr
namespace irr {
{ namespace io
namespace io {
{
//! Types of attributes available for IAttributes
//! Types of attributes available for IAttributes enum E_ATTRIBUTE_TYPE
enum E_ATTRIBUTE_TYPE {
{ // integer attribute
// integer attribute EAT_INT = 0,
EAT_INT = 0,
// float attribute
// float attribute EAT_FLOAT,
EAT_FLOAT,
// boolean attribute
// string attribute EAT_BOOL,
EAT_STRING,
// known attribute type count
// boolean attribute EAT_COUNT,
EAT_BOOL,
// unknown attribute
// enumeration attribute EAT_UNKNOWN
EAT_ENUM, };
// color attribute } // end namespace io
EAT_COLOR, } // end namespace irr
// floating point color attribute
EAT_COLORF,
// 3d vector attribute
EAT_VECTOR3D,
// 2d position attribute
EAT_POSITION2D,
// vector 2d attribute
EAT_VECTOR2D,
// rectangle attribute
EAT_RECT,
// matrix attribute
EAT_MATRIX,
// quaternion attribute
EAT_QUATERNION,
// 3d bounding box
EAT_BBOX,
// plane
EAT_PLANE,
// 3d triangle
EAT_TRIANGLE3D,
// line 2d
EAT_LINE2D,
// line 3d
EAT_LINE3D,
// array of stringws attribute
EAT_STRINGWARRAY,
// array of float
EAT_FLOATARRAY,
// array of int
EAT_INTARRAY,
// binary data attribute
EAT_BINARY,
// texture reference attribute
EAT_TEXTURE,
// user pointer void*
EAT_USER_POINTER,
// dimension attribute
EAT_DIMENSION2D,
// known attribute type count
EAT_COUNT,
// unknown attribute
EAT_UNKNOWN
};
} // end namespace io
} // end namespace irr
#endif

View File

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

View File

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

View File

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

View File

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

View File

@ -1,101 +1,44 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __E_DRIVER_TYPES_H_INCLUDED__ #pragma once
#define __E_DRIVER_TYPES_H_INCLUDED__
#include "irrTypes.h"
#include "irrTypes.h"
namespace irr
namespace irr {
{ namespace video
namespace video {
{
//! An enum for all types of drivers the Irrlicht Engine supports.
//! An enum for all types of drivers the Irrlicht Engine supports. enum E_DRIVER_TYPE
enum E_DRIVER_TYPE {
{ //! Null driver, useful for applications to run the engine without visualization.
//! Null driver, useful for applications to run the engine without visualization. /** The null device is able to load textures, but does not
/** The null device is able to load textures, but does not render and display any graphics. */
render and display any graphics. */ EDT_NULL,
EDT_NULL,
//! OpenGL device, available on most platforms.
//! The Irrlicht Engine Software renderer. /** Performs hardware accelerated rendering of 3D and 2D
/** Runs on all platforms, with every hardware. It should only primitives. */
be used for 2d graphics, but it can also perform some primitive EDT_OPENGL,
3d functions. These 3d drawing functions are quite fast, but
very inaccurate, and don't even support clipping in 3D mode. */ //! OpenGL-ES 1.x driver, for embedded and mobile systems
EDT_SOFTWARE, EDT_OGLES1,
//! The Burning's Software Renderer, an alternative software renderer //! OpenGL-ES 2.x driver, for embedded and mobile systems
/** Basically it can be described as the Irrlicht Software /** Supports shaders etc. */
renderer on steroids. It rasterizes 3D geometry perfectly: It EDT_OGLES2,
is able to perform correct 3d clipping, perspective correct
texture mapping, perspective correct color mapping, and renders //! WebGL1 friendly subset of OpenGL-ES 2.x driver for Emscripten
sub pixel correct, sub texel correct primitives. In addition, EDT_WEBGL1,
it does bilinear texel filtering and supports more materials
than the EDT_SOFTWARE driver. This renderer has been written EDT_OPENGL3,
entirely by Thomas Alten, thanks a lot for this huge
contribution. */ //! No driver, just for counting the elements
EDT_BURNINGSVIDEO, EDT_COUNT
};
//! Direct3D8 device is longer supported in Irrlicht. You have to go back to Irrlicht 1.8 if you still need that.
DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS, // keep enum to avoid breaking enumeration order (might be used in ini-files, serialization, etc) } // end namespace video
} // end namespace irr
//! Direct3D 9 device, only available on Win32 platforms.
/** Performs hardware accelerated rendering of 3D and 2D
primitives. */
EDT_DIRECT3D9,
//! OpenGL device, available on most platforms.
/** Performs hardware accelerated rendering of 3D and 2D
primitives. */
EDT_OPENGL,
//! OpenGL-ES 1.x driver, for embedded and mobile systems
EDT_OGLES1,
//! OpenGL-ES 2.x driver, for embedded and mobile systems
/** Supports shaders etc. */
EDT_OGLES2,
//! WebGL1 friendly subset of OpenGL-ES 2.x driver for Emscripten
EDT_WEBGL1,
//! No driver, just for counting the elements
EDT_COUNT
};
const c8* const DRIVER_TYPE_NAMES[] =
{
"NullDriver",
"Software Renderer",
"Burning's Video",
"Direct3D 8.1",
"Direct3D 9.0c",
"OpenGL 1.x/2.x/3.x",
"OpenGL ES1",
"OpenGL ES2",
"WebGL 1",
0
};
const c8* const DRIVER_TYPE_NAMES_SHORT[] =
{
"null",
"software",
"burning",
"d3d8",
"d3d9",
"opengl",
"ogles1",
"ogles2",
"webgl1",
0
};
} // end namespace video
} // end namespace irr
#endif

View File

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

View File

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

View File

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

View File

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

View File

@ -1,101 +0,0 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __E_MATERIAL_FLAGS_H_INCLUDED__
#define __E_MATERIAL_FLAGS_H_INCLUDED__
namespace irr
{
namespace video
{
//! Material flags
enum E_MATERIAL_FLAG
{
//! Draw as wireframe or filled triangles? Default: false
EMF_WIREFRAME = 0x1,
//! Draw as point cloud or filled triangles? Default: false
EMF_POINTCLOUD = 0x2,
//! Flat or Gouraud shading? Default: true
EMF_GOURAUD_SHADING = 0x4,
//! Will this material be lighted? Default: true
EMF_LIGHTING = 0x8,
//! Is the ZBuffer enabled? Default: true
EMF_ZBUFFER = 0x10,
//! May be written to the zbuffer or is it readonly. Default: true
/** This flag is ignored, if the material type is a transparent type. */
EMF_ZWRITE_ENABLE = 0x20,
//! Is backface culling enabled? Default: true
EMF_BACK_FACE_CULLING = 0x40,
//! Is frontface culling enabled? Default: false
/** Overrides EMF_BACK_FACE_CULLING if both are enabled. */
EMF_FRONT_FACE_CULLING = 0x80,
//! Is bilinear filtering enabled? Default: true
EMF_BILINEAR_FILTER = 0x100,
//! Is trilinear filtering enabled? Default: false
/** If the trilinear filter flag is enabled,
the bilinear filtering flag is ignored. */
EMF_TRILINEAR_FILTER = 0x200,
//! Is anisotropic filtering? Default: false
/** In Irrlicht you can use anisotropic texture filtering in
conjunction with bilinear or trilinear texture filtering
to improve rendering results. Primitives will look less
blurry with this flag switched on. */
EMF_ANISOTROPIC_FILTER = 0x400,
//! Is fog enabled? Default: false
EMF_FOG_ENABLE = 0x800,
//! Normalizes normals. Default: false
/** You can enable this if you need to scale a dynamic lighted
model. Usually, its normals will get scaled too then and it
will get darker. If you enable the EMF_NORMALIZE_NORMALS flag,
the normals will be normalized again, and the model will look
as bright as it should. */
EMF_NORMALIZE_NORMALS = 0x1000,
//! Access to all layers texture wrap settings. Overwrites separate layer settings.
/** Note that if you want to change TextureWrapU, TextureWrapV, TextureWrapW
independently, then you can't work with this flag, but will have to set the variables
directly. */
EMF_TEXTURE_WRAP = 0x2000,
//! AntiAliasing mode
EMF_ANTI_ALIASING = 0x4000,
//! ColorMask bits, for enabling the color planes
EMF_COLOR_MASK = 0x8000,
//! ColorMaterial enum for vertex color interpretation
EMF_COLOR_MATERIAL = 0x10000,
//! Flag for enabling/disabling mipmap usage
EMF_USE_MIP_MAPS = 0x20000,
//! Flag for blend operation
EMF_BLEND_OPERATION = 0x40000,
//! Flag for polygon offset
EMF_POLYGON_OFFSET = 0x80000,
//! Flag for blend factor
EMF_BLEND_FACTOR = 0x160000
};
} // end namespace video
} // end namespace irr
#endif // __E_MATERIAL_FLAGS_H_INCLUDED__

82
include/EMaterialProps.h Normal file
View File

@ -0,0 +1,82 @@
// 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
namespace irr
{
namespace video
{
//! Material properties
enum E_MATERIAL_PROP
{
//! Corresponds to SMaterial::Wireframe.
EMP_WIREFRAME = 0x1,
//! Corresponds to SMaterial::PointCloud.
EMP_POINTCLOUD = 0x2,
//! Corresponds to SMaterial::GouraudShading.
EMP_GOURAUD_SHADING = 0x4,
//! Corresponds to SMaterial::Lighting.
EMP_LIGHTING = 0x8,
//! Corresponds to SMaterial::ZBuffer.
EMP_ZBUFFER = 0x10,
//! Corresponds to SMaterial::ZWriteEnable.
EMP_ZWRITE_ENABLE = 0x20,
//! Corresponds to SMaterial::BackfaceCulling.
EMP_BACK_FACE_CULLING = 0x40,
//! Corresponds to SMaterial::FrontfaceCulling.
EMP_FRONT_FACE_CULLING = 0x80,
//! Corresponds to SMaterialLayer::MinFilter.
EMP_MIN_FILTER = 0x100,
//! Corresponds to SMaterialLayer::MagFilter.
EMP_MAG_FILTER = 0x200,
//! Corresponds to SMaterialLayer::AnisotropicFilter.
EMP_ANISOTROPIC_FILTER = 0x400,
//! Corresponds to SMaterial::FogEnable.
EMP_FOG_ENABLE = 0x800,
//! Corresponds to SMaterial::NormalizeNormals.
EMP_NORMALIZE_NORMALS = 0x1000,
//! Corresponds to SMaterialLayer::TextureWrapU, TextureWrapV and
//! TextureWrapW.
EMP_TEXTURE_WRAP = 0x2000,
//! Corresponds to SMaterial::AntiAliasing.
EMP_ANTI_ALIASING = 0x4000,
//! Corresponds to SMaterial::ColorMask.
EMP_COLOR_MASK = 0x8000,
//! Corresponds to SMaterial::ColorMaterial.
EMP_COLOR_MATERIAL = 0x10000,
//! Corresponds to SMaterial::UseMipMaps.
EMP_USE_MIP_MAPS = 0x20000,
//! Corresponds to SMaterial::BlendOperation.
EMP_BLEND_OPERATION = 0x40000,
//! Corresponds to SMaterial::PolygonOffsetFactor, PolygonOffsetDirection,
//! PolygonOffsetDepthBias and PolygonOffsetSlopeScale.
EMP_POLYGON_OFFSET = 0x80000,
//! Corresponds to SMaterial::BlendFactor.
EMP_BLEND_FACTOR = 0x100000,
};
} // end namespace video
} // end namespace irr

View File

@ -1,163 +1,74 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __E_MATERIAL_TYPES_H_INCLUDED__ #pragma once
#define __E_MATERIAL_TYPES_H_INCLUDED__
#include "irrTypes.h"
namespace irr
{ namespace irr
namespace video {
{ namespace video
{
//! Abstracted and easy to use fixed function/programmable pipeline material modes.
enum E_MATERIAL_TYPE //! Abstracted and easy to use fixed function/programmable pipeline material modes.
{ enum E_MATERIAL_TYPE
//! Standard solid material. {
/** Only first texture is used, which is supposed to be the //! Standard solid material.
diffuse material. */ /** Only first texture is used, which is supposed to be the
EMT_SOLID = 0, diffuse material. */
EMT_SOLID = 0,
//! Solid material with 2 texture layers.
/** The second is blended onto the first using the alpha value //! Makes the material transparent based on the texture alpha channel.
of the vertex colors. This material is currently not implemented in OpenGL. /** The final color is blended together from the destination
*/ color and the texture color, using the alpha channel value as
EMT_SOLID_2_LAYER, blend factor. Only first texture is used. If you are using
this material with small textures, it is a good idea to load
//! Material type with standard lightmap technique the texture in 32 bit mode
/** There should be 2 textures: The first texture layer is a (video::IVideoDriver::setTextureCreationFlag()). Also, an alpha
diffuse map, the second is a light map. Dynamic light is ref is used, which can be manipulated using
ignored. */ SMaterial::MaterialTypeParam. This value controls how sharp the
EMT_LIGHTMAP, edges become when going from a transparent to a solid spot on
the texture. */
//! Material type with lightmap technique like EMT_LIGHTMAP. EMT_TRANSPARENT_ALPHA_CHANNEL,
/** But lightmap and diffuse texture are added instead of modulated. */
EMT_LIGHTMAP_ADD, //! Makes the material transparent based on the texture alpha channel.
/** If the alpha channel value is greater than 127, a
//! Material type with standard lightmap technique pixel is written to the target, otherwise not. This
/** There should be 2 textures: The first texture layer is a material does not use alpha blending and is a lot faster
diffuse map, the second is a light map. Dynamic light is than EMT_TRANSPARENT_ALPHA_CHANNEL. It is ideal for drawing
ignored. The texture colors are effectively multiplied by 2 stuff like leaves of plants, because the borders are not
for brightening. Like known in DirectX as D3DTOP_MODULATE2X. */ blurry but sharp. Only first texture is used. If you are
EMT_LIGHTMAP_M2, using this material with small textures and 3d object, it
is a good idea to load the texture in 32 bit mode
//! Material type with standard lightmap technique (video::IVideoDriver::setTextureCreationFlag()). */
/** There should be 2 textures: The first texture layer is a EMT_TRANSPARENT_ALPHA_CHANNEL_REF,
diffuse map, the second is a light map. Dynamic light is
ignored. The texture colors are effectively multiplied by 4 //! Makes the material transparent based on the vertex alpha value.
for brightening. Like known in DirectX as D3DTOP_MODULATE4X. */ EMT_TRANSPARENT_VERTEX_ALPHA,
EMT_LIGHTMAP_M4,
//! BlendFunc = source * sourceFactor + dest * destFactor ( E_BLEND_FUNC )
//! Like EMT_LIGHTMAP, but also supports dynamic lighting. /** Using only first texture. Generic blending method.
EMT_LIGHTMAP_LIGHTING, The blend function is set to SMaterial::MaterialTypeParam with
pack_textureBlendFunc (for 2D) or pack_textureBlendFuncSeparate (for 3D). */
//! Like EMT_LIGHTMAP_M2, but also supports dynamic lighting. EMT_ONETEXTURE_BLEND,
EMT_LIGHTMAP_LIGHTING_M2,
//! This value is not used. It only forces this enumeration to compile to 32 bit.
//! Like EMT_LIGHTMAP_M4, but also supports dynamic lighting. EMT_FORCE_32BIT = 0x7fffffff
EMT_LIGHTMAP_LIGHTING_M4, };
//! Detail mapped material. //! Array holding the built in material type names
/** The first texture is diffuse color map, the second is added const char *const sBuiltInMaterialTypeNames[] = {
to this and usually displayed with a bigger scale value so that "solid",
it adds more detail. The detail map is added to the diffuse map "trans_alphach",
using ADD_SIGNED, so that it is possible to add and subtract "trans_alphach_ref",
color from the diffuse map. For example a value of "trans_vertex_alpha",
(127,127,127) will not change the appearance of the diffuse map "onetexture_blend",
at all. Often used for terrain rendering. */ 0,
EMT_DETAIL_MAP, };
//! Look like a reflection of the environment around it. constexpr u32 numBuiltInMaterials =
/** To make this possible, a texture called 'sphere map' is sizeof(sBuiltInMaterialTypeNames) / sizeof(char *) - 1;
used, which must be set as the first texture. */
EMT_SPHERE_MAP, } // end namespace video
} // end namespace irr
//! A reflecting material with an optional non reflecting texture layer.
/** The reflection map should be set as first texture. */
EMT_REFLECTION_2_LAYER,
//! A transparent material.
/** Only the first texture is used. The new color is calculated
by simply adding the source color and the dest color. This
means if for example a billboard using a texture with black
background and a red circle on it is drawn with this material,
the result is that only the red circle will be drawn a little
bit transparent, and everything which was black is 100%
transparent and not visible. This material type is useful for
particle effects. */
EMT_TRANSPARENT_ADD_COLOR,
//! Makes the material transparent based on the texture alpha channel.
/** The final color is blended together from the destination
color and the texture color, using the alpha channel value as
blend factor. Only first texture is used. If you are using
this material with small textures, it is a good idea to load
the texture in 32 bit mode
(video::IVideoDriver::setTextureCreationFlag()). Also, an alpha
ref is used, which can be manipulated using
SMaterial::MaterialTypeParam. This value controls how sharp the
edges become when going from a transparent to a solid spot on
the texture. */
EMT_TRANSPARENT_ALPHA_CHANNEL,
//! Makes the material transparent based on the texture alpha channel.
/** If the alpha channel value is greater than 127, a
pixel is written to the target, otherwise not. This
material does not use alpha blending and is a lot faster
than EMT_TRANSPARENT_ALPHA_CHANNEL. It is ideal for drawing
stuff like leaves of plants, because the borders are not
blurry but sharp. Only first texture is used. If you are
using this material with small textures and 3d object, it
is a good idea to load the texture in 32 bit mode
(video::IVideoDriver::setTextureCreationFlag()). */
EMT_TRANSPARENT_ALPHA_CHANNEL_REF,
//! Makes the material transparent based on the vertex alpha value.
EMT_TRANSPARENT_VERTEX_ALPHA,
//! A transparent reflecting material with an optional additional non reflecting texture layer.
/** The reflection map should be set as first texture. The
transparency depends on the alpha value in the vertex colors. A
texture which will not reflect can be set as second texture.*/
EMT_TRANSPARENT_REFLECTION_2_LAYER,
//! BlendFunc = source * sourceFactor + dest * destFactor ( E_BLEND_FUNC )
/** Using only first texture. Generic blending method.
The blend function is set to SMaterial::MaterialTypeParam with
pack_textureBlendFunc (for 2D) or pack_textureBlendFuncSeparate (for 3D). */
EMT_ONETEXTURE_BLEND,
//! This value is not used. It only forces this enumeration to compile to 32 bit.
EMT_FORCE_32BIT = 0x7fffffff
};
//! Array holding the built in material type names
const char* const sBuiltInMaterialTypeNames[] =
{
"solid",
"solid_2layer",
"lightmap",
"lightmap_add",
"lightmap_m2",
"lightmap_m4",
"lightmap_light",
"lightmap_light_m2",
"lightmap_light_m4",
"detail_map",
"sphere_map",
"reflection_2layer",
"trans_add",
"trans_alphach",
"trans_alphach_ref",
"trans_vertex_alpha",
"trans_reflection_2layer",
"onetexture_blend",
0
};
} // end namespace video
} // end namespace irr
#endif // __E_MATERIAL_TYPES_H_INCLUDED__

View File

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

View File

@ -1,61 +1,43 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __E_PRIMITIVE_TYPES_H_INCLUDED__ #pragma once
#define __E_PRIMITIVE_TYPES_H_INCLUDED__
namespace irr
namespace irr {
{ namespace scene
namespace scene {
{
//! Enumeration for all primitive types there are.
//! Enumeration for all primitive types there are. enum E_PRIMITIVE_TYPE
enum E_PRIMITIVE_TYPE {
{ //! All vertices are non-connected points.
//! All vertices are non-connected points. EPT_POINTS = 0,
EPT_POINTS=0,
//! All vertices form a single connected line.
//! All vertices form a single connected line. EPT_LINE_STRIP,
EPT_LINE_STRIP,
//! Just as LINE_STRIP, but the last and the first vertex is also connected.
//! Just as LINE_STRIP, but the last and the first vertex is also connected. EPT_LINE_LOOP,
EPT_LINE_LOOP,
//! Every two vertices are connected creating n/2 lines.
//! Every two vertices are connected creating n/2 lines. EPT_LINES,
EPT_LINES,
//! After the first two vertices each vertex defines a new triangle.
//! After the first two vertices each vertex defines a new triangle. //! Always the two last and the new one form a new triangle.
//! Always the two last and the new one form a new triangle. EPT_TRIANGLE_STRIP,
EPT_TRIANGLE_STRIP,
//! After the first two vertices each vertex defines a new triangle.
//! After the first two vertices each vertex defines a new triangle. //! All around the common first vertex.
//! All around the common first vertex. EPT_TRIANGLE_FAN,
EPT_TRIANGLE_FAN,
//! Explicitly set all vertices for each triangle.
//! Explicitly set all vertices for each triangle. EPT_TRIANGLES,
EPT_TRIANGLES,
//! The single vertices are expanded to quad billboards on the GPU.
//! After the first two vertices each further two vertices create a quad with the preceding two. EPT_POINT_SPRITES
//! Not supported by Direct3D };
EPT_QUAD_STRIP,
} // end namespace scene
//! Every four vertices create a quad. } // end namespace irr
//! Not supported by Direct3D
//! Deprecated with newer OpenGL drivers
EPT_QUADS,
//! Just as LINE_LOOP, but filled.
//! Not supported by Direct3D
//! Deprecated with newer OpenGL drivers
EPT_POLYGON,
//! The single vertices are expanded to quad billboards on the GPU.
EPT_POINT_SPRITES
};
} // end namespace scene
} // end namespace irr
#endif

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,480 +0,0 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
// Written by Michael Zeilfelder
#ifndef __I_PROFILER_H_INCLUDED__
#define __I_PROFILER_H_INCLUDED__
#include "IrrCompileConfig.h"
#include "irrString.h"
#include "irrArray.h"
#include "ITimer.h"
#include <limits.h> // for INT_MAX (we should have a S32_MAX...)
namespace irr
{
class ITimer;
//! Used to store the profile data (and also used for profile group data).
struct SProfileData
{
friend class IProfiler;
SProfileData()
{
GroupIndex = 0;
reset();
}
bool operator<(const SProfileData& pd) const
{
return Id < pd.Id;
}
bool operator==(const SProfileData& pd) const
{
return Id == pd.Id;
}
u32 getGroupIndex() const
{
return GroupIndex;
}
const core::stringw& getName() const
{
return Name;
}
//! Each time profiling for this data is stopped it increases the counter by 1.
u32 getCallsCounter() const
{
return CountCalls;
}
//! Longest time a profile call for this id took from start until it was stopped again.
u32 getLongestTime() const
{
return LongestTime;
}
//! Time spend between start/stop
u32 getTimeSum() const
{
return TimeSum;
}
private:
// just to be used for searching as it does no initialization besides id
SProfileData(u32 id) : Id(id) {}
void reset()
{
CountCalls = 0;
LongestTime = 0;
TimeSum = 0;
LastTimeStarted = 0;
StartStopCounter = 0;
}
s32 Id;
u32 GroupIndex;
core::stringw Name;
s32 StartStopCounter; // 0 means stopped > 0 means it runs.
u32 CountCalls;
u32 LongestTime;
u32 TimeSum;
u32 LastTimeStarted;
};
//! Code-profiler. Please check the example in the Irrlicht examples folder about how to use it.
// Implementer notes:
// The design is all about allowing to use the central start/stop mechanism with minimal time overhead.
// This is why the class works without a virtual functions interface contrary to the usual Irrlicht design.
// And also why it works with id's instead of strings in the start/stop functions even if it makes using
// the class slightly harder.
// The class comes without reference-counting because the profiler instance is never released (TBD).
class IProfiler
{
public:
//! Constructor. You could use this to create a new profiler, but usually getProfiler() is used to access the global instance.
IProfiler() : Timer(0), NextAutoId(INT_MAX)
{}
virtual ~IProfiler()
{}
//! Add an id with given name and group which can be used for profiling with start/stop
/** After calling this once you can start/stop profiling for the given id.
\param id: Should be >= 0 as negative id's are reserved for Irrlicht. Also very large numbers (near INT_MAX) might
have been added automatically by the other add function.
\param name: Name for displaying profile data.
\param groupName: Each id belongs into a group - this helps on displaying profile data. */
inline void add(s32 id, const core::stringw &name, const core::stringw &groupName);
//! Add an automatically generated for the given name and group which can be used for profiling with start/stop.
/** After calling this once you can start/stop profiling with the returned id.
\param name: Name for displaying profile data.
\param groupName: Each id belongs into a group - this helps on displaying profile data.
\return Automatic id's start at INT_MAX and count down for each new id. If the name already has an id then that id will be returned. */
inline s32 add(const core::stringw &name, const core::stringw &groupName);
//! Return the number of profile data blocks. There is one for each id.
u32 getProfileDataCount() const
{
return ProfileDatas.size();
}
//! Search for the index of the profile data by name
/** \param result Receives the resulting data index when one was found.
\param name String with name to search for
\return true when found, false when not found */
inline bool findDataIndex(u32 & result, const core::stringw &name) const;
//! Get the profile data
/** \param index A value between 0 and getProfileDataCount()-1. Indices can change when new id's are added.*/
const SProfileData& getProfileDataByIndex(u32 index) const
{
return ProfileDatas[index];
}
//! Get the profile data
/** \param id Same value as used in ::add
\return Profile data for the given id or 0 when it does not exist. */
inline const SProfileData* getProfileDataById(u32 id);
//! Get the number of profile groups. Will be at least 1.
/** NOTE: The first groups is always L"overview" which is an overview for all existing groups */
inline u32 getGroupCount() const
{
return ProfileGroups.size();
}
//! Get profile data for a group.
/** NOTE: The first groups is always L"overview" which is an overview for all existing groups */
inline const SProfileData& getGroupData(u32 index) const
{
return ProfileGroups[index];
}
//! Find the group index by the group-name
/** \param result Receives the resulting group index when one was found.
\param name String with name to search for
\return true when found, false when not found */
inline bool findGroupIndex(u32 & result, const core::stringw &name) const;
//! Start profile-timing for the given id
/** This increases an internal run-counter for the given id. It will profile as long as that counter is > 0.
NOTE: you have to add the id first with one of the ::add functions
*/
inline void start(s32 id);
//! Stop profile-timing for the given id
/** This increases an internal run-counter for the given id. If it reaches 0 the time since start is recorded.
You should have the same amount of start and stop calls. If stop is called more often than start
then the additional stop calls will be ignored (counter never goes below 0)
*/
inline void stop(s32 id);
//! Reset profile data for the given id
inline void resetDataById(s32 id);
//! Reset profile data for the given index
inline void resetDataByIndex(u32 index);
//! Reset profile data for a whole group
inline void resetGroup(u32 index);
//! Reset all profile data
/** NOTE: This is not deleting id's or groups, just resetting all timers to 0. */
inline void resetAll();
//! Write all profile-data into a string
/** \param result Receives the result string.
\param includeOverview When true a group-overview is attached first
\param suppressUncalled When true elements which got never called are not printed */
virtual void printAll(core::stringw &result, bool includeOverview=false,bool suppressUncalled=true) const = 0;
//! Write the profile data of one group into a string
/** \param result Receives the result string.
\param groupIndex_ */
virtual void printGroup(core::stringw &result, u32 groupIndex, bool suppressUncalled) const = 0;
protected:
inline u32 addGroup(const core::stringw &name);
// I would prefer using os::Timer, but os.h is not in the public interface so far.
// Timer must be initialized by the implementation.
ITimer * Timer;
core::array<SProfileData> ProfileDatas;
core::array<SProfileData> ProfileGroups;
private:
s32 NextAutoId; // for giving out id's automatically
};
//! Access the Irrlicht profiler object.
/** Profiler is always accessible, except in destruction of global objects.
If you want to get internal profiling information about the engine itself
you will have to re-compile the engine with _IRR_COMPILE_WITH_PROFILING_ enabled.
But you can use the profiler for profiling your own projects without that. */
IRRLICHT_API IProfiler& IRRCALLCONV getProfiler();
//! Class where the objects profile their own life-time.
/** This is a comfort wrapper around the IProfiler start/stop mechanism which is easier to use
when you want to profile a scope. You only have to create an object and it will profile it's own lifetime
for the given id. */
class CProfileScope
{
public:
//! Construct with an known id.
/** This is the fastest scope constructor, but the id must have been added before.
\param id Any id which you did add to the profiler before. */
CProfileScope(s32 id)
: Id(id), Profiler(getProfiler())
{
Profiler.start(Id);
}
//! Object will create the given name, groupName combination for the id if it doesn't exist already
/** \param id: Should be >= 0 as negative id's are reserved for Irrlicht. Also very large numbers (near INT_MAX) might
have been created already by the automatic add function of ::IProfiler.
\param name: Name for displaying profile data.
\param groupName: Each id belongs into a group - this helps on displaying profile data. */
CProfileScope(s32 id, const core::stringw &name, const core::stringw &groupName)
: Id(id), Profiler(getProfiler())
{
Profiler.add(Id, name, groupName);
Profiler.start(Id);
}
//! Object will create an id for the given name, groupName combination if they don't exist already
/** Slowest scope constructor, but usually still fine unless speed is very critical.
\param name: Name for displaying profile data.
\param groupName: Each id belongs into a group - this helps on displaying profile data. */
CProfileScope(const core::stringw &name, const core::stringw &groupName)
: Profiler(getProfiler())
{
Id = Profiler.add(name, groupName);
Profiler.start(Id);
}
~CProfileScope()
{
Profiler.stop(Id);
}
protected:
s32 Id;
IProfiler& Profiler;
};
// IMPLEMENTATION for in-line stuff
void IProfiler::start(s32 id)
{
s32 idx = ProfileDatas.binary_search(SProfileData(id));
if ( idx >= 0 && Timer )
{
++ProfileDatas[idx].StartStopCounter;
if (ProfileDatas[idx].StartStopCounter == 1 )
ProfileDatas[idx].LastTimeStarted = Timer->getRealTime();
}
}
void IProfiler::stop(s32 id)
{
if ( Timer )
{
u32 timeNow = Timer->getRealTime();
s32 idx = ProfileDatas.binary_search(SProfileData(id));
if ( idx >= 0 )
{
SProfileData &data = ProfileDatas[idx];
--ProfileDatas[idx].StartStopCounter;
if ( data.LastTimeStarted != 0 && ProfileDatas[idx].StartStopCounter == 0)
{
// update data for this id
++data.CountCalls;
u32 diffTime = timeNow - data.LastTimeStarted;
data.TimeSum += diffTime;
if ( diffTime > data.LongestTime )
data.LongestTime = diffTime;
data.LastTimeStarted = 0;
// update data of it's group
SProfileData & group = ProfileGroups[data.GroupIndex];
++group.CountCalls;
group.TimeSum += diffTime;
if ( diffTime > group.LongestTime )
group.LongestTime = diffTime;
group.LastTimeStarted = 0;
}
else if ( ProfileDatas[idx].StartStopCounter < 0 )
{
// ignore additional stop calls
ProfileDatas[idx].StartStopCounter = 0;
}
}
}
}
s32 IProfiler::add(const core::stringw &name, const core::stringw &groupName)
{
u32 index;
if ( findDataIndex(index, name) )
{
add( ProfileDatas[index].Id, name, groupName );
return ProfileDatas[index].Id;
}
else
{
s32 id = NextAutoId;
--NextAutoId;
add( id, name, groupName );
return id;
}
}
void IProfiler::add(s32 id, const core::stringw &name, const core::stringw &groupName)
{
u32 groupIdx;
if ( !findGroupIndex(groupIdx, groupName) )
{
groupIdx = addGroup(groupName);
}
SProfileData data(id);
s32 idx = ProfileDatas.binary_search(data);
if ( idx < 0 )
{
data.reset();
data.GroupIndex = groupIdx;
data.Name = name;
ProfileDatas.push_back(data);
ProfileDatas.sort();
}
else
{
// only reset on group changes, otherwise we want to keep the data or coding CProfileScope would become tricky.
if ( groupIdx != ProfileDatas[idx].GroupIndex )
{
resetDataByIndex((u32)idx);
ProfileDatas[idx].GroupIndex = groupIdx;
}
ProfileDatas[idx].Name = name;
}
}
u32 IProfiler::addGroup(const core::stringw &name)
{
SProfileData group;
group.Id = -1; // Id for groups doesn't matter so far
group.Name = name;
ProfileGroups.push_back(group);
return ProfileGroups.size()-1;
}
bool IProfiler::findDataIndex(u32 & result, const core::stringw &name) const
{
for ( u32 i=0; i < ProfileDatas.size(); ++i )
{
if ( ProfileDatas[i].Name == name )
{
result = i;
return true;
}
}
return false;
}
const SProfileData* IProfiler::getProfileDataById(u32 id)
{
SProfileData data(id);
s32 idx = ProfileDatas.binary_search(data);
if ( idx >= 0 )
return &ProfileDatas[idx];
return NULL;
}
bool IProfiler::findGroupIndex(u32 & result, const core::stringw &name) const
{
for ( u32 i=0; i < ProfileGroups.size(); ++i )
{
if ( ProfileGroups[i].Name == name )
{
result = i;
return true;
}
}
return false;
}
void IProfiler::resetDataById(s32 id)
{
s32 idx = ProfileDatas.binary_search(SProfileData(id));
if ( idx >= 0 )
{
resetDataByIndex((u32)idx);
}
}
void IProfiler::resetDataByIndex(u32 index)
{
SProfileData &data = ProfileDatas[index];
SProfileData & group = ProfileGroups[data.GroupIndex];
group.CountCalls -= data.CountCalls;
group.TimeSum -= data.TimeSum;
data.reset();
}
//! Reset profile data for a whole group
void IProfiler::resetGroup(u32 index)
{
for ( u32 i=0; i<ProfileDatas.size(); ++i )
{
if ( ProfileDatas[i].GroupIndex == index )
ProfileDatas[i].reset();
}
if ( index < ProfileGroups.size() )
ProfileGroups[index].reset();
}
void IProfiler::resetAll()
{
for ( u32 i=0; i<ProfileDatas.size(); ++i )
{
ProfileDatas[i].reset();
}
for ( u32 i=0; i<ProfileGroups.size(); ++i )
{
ProfileGroups[i].reset();
}
}
//! For internal engine use:
//! Code inside IRR_PROFILE is only executed when _IRR_COMPILE_WITH_PROFILING_ is set
//! This allows disabling all profiler code completely by changing that define.
//! It's generally useful to wrap profiler-calls in application code with a similar macro.
#ifdef _IRR_COMPILE_WITH_PROFILING_
#define IRR_PROFILE(X) X
#else
#define IRR_PROFILE(X)
#endif // IRR_PROFILE
} // namespace irr
#endif // __I_PROFILER_H_INCLUDED__

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,85 +1,79 @@
// Copyright (C) 2002-2012 Nikolaus Gebhardt // Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine". // This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h // For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __I_SHADER_CONSTANT_SET_CALLBACT_H_INCLUDED__ #pragma once
#define __I_SHADER_CONSTANT_SET_CALLBACT_H_INCLUDED__
#include "IReferenceCounted.h"
#include "IReferenceCounted.h"
namespace irr
namespace irr {
{ namespace video
namespace video {
{ class IMaterialRendererServices;
class IMaterialRendererServices; class SMaterial;
class SMaterial;
//! Interface making it possible to set constants for gpu programs every frame.
//! Interface making it possible to set constants for gpu programs every frame. /** Implement this interface in an own class and pass a pointer to it to one of
/** Implement this interface in an own class and pass a pointer to it to one of the methods in IGPUProgrammingServices when creating a shader. The
the methods in IGPUProgrammingServices when creating a shader. The OnSetConstants method will be called every frame now. */
OnSetConstants method will be called every frame now. */ class IShaderConstantSetCallBack : public virtual IReferenceCounted
class IShaderConstantSetCallBack : public virtual IReferenceCounted {
{ public:
public: //! Called to let the callBack know the used material (optional method)
/**
//! Called to let the callBack know the used material (optional method) \code
/** class MyCallBack : public IShaderConstantSetCallBack
\code {
class MyCallBack : public IShaderConstantSetCallBack const video::SMaterial *UsedMaterial;
{
const video::SMaterial *UsedMaterial; OnSetMaterial(const video::SMaterial& material)
{
OnSetMaterial(const video::SMaterial& material) UsedMaterial=&material;
{ }
UsedMaterial=&material;
} OnSetConstants(IMaterialRendererServices* services, s32 userData)
{
OnSetConstants(IMaterialRendererServices* services, s32 userData) services->setVertexShaderConstant("myColor", reinterpret_cast<f32*>(&UsedMaterial->color), 4);
{ }
services->setVertexShaderConstant("myColor", reinterpret_cast<f32*>(&UsedMaterial->color), 4); }
} \endcode
} */
\endcode virtual void OnSetMaterial(const SMaterial &material) {}
*/
virtual void OnSetMaterial(const SMaterial& material) { } //! Called by the engine when the vertex and/or pixel shader constants for an material renderer should be set.
/**
//! Called by the engine when the vertex and/or pixel shader constants for an material renderer should be set. Implement the IShaderConstantSetCallBack in an own class and implement your own
/** OnSetConstants method using the given IMaterialRendererServices interface.
Implement the IShaderConstantSetCallBack in an own class and implement your own Pass a pointer to this class to one of the methods in IGPUProgrammingServices
OnSetConstants method using the given IMaterialRendererServices interface. when creating a shader. The OnSetConstants method will now be called every time
Pass a pointer to this class to one of the methods in IGPUProgrammingServices before geometry is being drawn using your shader material. A sample implementation
when creating a shader. The OnSetConstants method will now be called every time would look like this:
before geometry is being drawn using your shader material. A sample implementation \code
would look like this: virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
\code {
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData) video::IVideoDriver* driver = services->getVideoDriver();
{
video::IVideoDriver* driver = services->getVideoDriver(); // set clip matrix at register 4
core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION));
// set clip matrix at register 4 worldViewProj *= driver->getTransform(video::ETS_VIEW);
core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION)); worldViewProj *= driver->getTransform(video::ETS_WORLD);
worldViewProj *= driver->getTransform(video::ETS_VIEW); services->setVertexShaderConstant(&worldViewProj.M[0], 4, 4);
worldViewProj *= driver->getTransform(video::ETS_WORLD); // for high level shading languages, this would be another solution:
services->setVertexShaderConstant(&worldViewProj.M[0], 4, 4); //services->setVertexShaderConstant("mWorldViewProj", worldViewProj.M, 16);
// for high level shading languages, this would be another solution:
//services->setVertexShaderConstant("mWorldViewProj", worldViewProj.M, 16); // set some light color at register 9
video::SColorf col(0.0f,1.0f,1.0f,0.0f);
// set some light color at register 9 services->setVertexShaderConstant(reinterpret_cast<const f32*>(&col), 9, 1);
video::SColorf col(0.0f,1.0f,1.0f,0.0f); // for high level shading languages, this would be another solution:
services->setVertexShaderConstant(reinterpret_cast<const f32*>(&col), 9, 1); //services->setVertexShaderConstant("myColor", reinterpret_cast<f32*>(&col), 4);
// for high level shading languages, this would be another solution: }
//services->setVertexShaderConstant("myColor", reinterpret_cast<f32*>(&col), 4); \endcode
} \param services: Pointer to an interface providing methods to set the constants for the shader.
\endcode \param userData: Userdata int which can be specified when creating the shader.
\param services: Pointer to an interface providing methods to set the constants for the shader. */
\param userData: Userdata int which can be specified when creating the shader. virtual void OnSetConstants(IMaterialRendererServices *services, s32 userData) = 0;
*/ };
virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData) = 0;
}; } // end namespace video
} // end namespace irr
} // end namespace video
} // end namespace irr
#endif

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