mirror of
https://github.com/minetest/irrlicht.git
synced 2025-07-04 17:20:25 +02:00
Compare commits
51 Commits
Author | SHA1 | Date | |
---|---|---|---|
99be15f40b | |||
6fccc79270 | |||
7cade6f27f | |||
ae63f1bf02 | |||
dd14486d3f | |||
4a7d3de89a | |||
631c0fa77b | |||
9813b460e1 | |||
565f14677c | |||
f53af0f2cf | |||
05ebc43222 | |||
c01de80583 | |||
fbdc4ee8d5 | |||
2c086e5fdc | |||
627a3a5172 | |||
01e05f3c94 | |||
b673a4b2bb | |||
5e01152f56 | |||
c2dd664fc6 | |||
774d3d6d2b | |||
e1f41edd29 | |||
c766c3a023 | |||
93eebed8c9 | |||
645b51a34d | |||
bcc53e1e1a | |||
d4735ebc76 | |||
063079b372 | |||
3b198bdfda | |||
5b2f1927d0 | |||
9954667c45 | |||
ea1b58387e | |||
d767d27ca8 | |||
6f4f7c4d75 | |||
103ab16679 | |||
64688f4490 | |||
827710f74a | |||
80e160935d | |||
4506d23dc3 | |||
028cb8dbed | |||
a5c9945bb8 | |||
cfb73d07d7 | |||
87f7cf3438 | |||
ebe4fd0a59 | |||
fc7e3f2dff | |||
b0a070d980 | |||
d9216362ec | |||
d8a21cb25f | |||
9c54d927b9 | |||
b89455f385 | |||
6a5fceb8fd | |||
0b9ee5884f |
@ -7,7 +7,7 @@ else()
|
|||||||
cmake_policy(VERSION 3.11)
|
cmake_policy(VERSION 3.11)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(IRRLICHTMT_REVISION 12)
|
set(IRRLICHTMT_REVISION 13)
|
||||||
|
|
||||||
project(Irrlicht
|
project(Irrlicht
|
||||||
VERSION 1.9.0.${IRRLICHTMT_REVISION}
|
VERSION 1.9.0.${IRRLICHTMT_REVISION}
|
||||||
|
26
LICENSE
Normal file
26
LICENSE
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
Please note that the Irrlicht Engine is based in part on the work of the
|
||||||
|
Independent JPEG Group, the zlib, libPng and aesGladman. This means that if you use
|
||||||
|
the Irrlicht Engine in your product, you must acknowledge somewhere in your
|
||||||
|
documentation that you've used the IJPG code. It would also be nice to mention
|
||||||
|
that you use the Irrlicht Engine, the zlib, libPng and aesGladman. See the
|
||||||
|
corresponding license files for further informations. It is also possible to disable
|
||||||
|
usage of those additional libraries by defines in the IrrCompileConfig.h header and
|
||||||
|
recompiling the engine.
|
@ -1,9 +1,8 @@
|
|||||||
IrrlichtMt version 1.9
|
IrrlichtMt version 1.9
|
||||||
======================
|
======================
|
||||||
|
|
||||||
The Irrlicht Engine is an open source realtime 3D engine written in C++.
|
IrrlichtMt is the 3D engine of [Minetest](https://github.com/minetest).
|
||||||
|
It is based on the [Irrlicht Engine](https://irrlicht.sourceforge.io/) but is now developed independently.
|
||||||
This is a fork by the [Minetest](https://github.com/minetest) developers that was stripped-down and customized specifically for use in Minetest.
|
|
||||||
It is intentionally not compatible to upstream and is planned to be eventually absorbed into Minetest.
|
It is intentionally not compatible to upstream and is planned to be eventually absorbed into Minetest.
|
||||||
|
|
||||||
Build
|
Build
|
||||||
|
@ -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.
|
|
@ -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 |
@ -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 |
@ -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.
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
If you wish to compile Irrlicht for emscripten please check the documenation in examples/01.HelloWorld_emscripten.
|
|
@ -1,26 +0,0 @@
|
|||||||
Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
Please note that the Irrlicht Engine is based in part on the work of the
|
|
||||||
Independent JPEG Group, the zlib, libPng and aesGladman. This means that if you use
|
|
||||||
the Irrlicht Engine in your product, you must acknowledge somewhere in your
|
|
||||||
documentation that you've used the IJPG code. It would also be nice to mention
|
|
||||||
that you use the Irrlicht Engine, the zlib, libPng and aesGladman. See the
|
|
||||||
corresponding license files for further informations. It is also possible to disable
|
|
||||||
usage of those additional libraries by defines in the IrrCompileConfig.h header and
|
|
||||||
recompiling the engine.
|
|
@ -1,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
@ -168,22 +168,32 @@ static void test_methods()
|
|||||||
|
|
||||||
static void test_conv()
|
static void test_conv()
|
||||||
{
|
{
|
||||||
// assumes Unicode and UTF-8 locale
|
// locale-independent
|
||||||
setlocale(LC_CTYPE, "");
|
|
||||||
|
|
||||||
stringw out;
|
stringw out;
|
||||||
multibyteToWString(out, "†††");
|
utf8ToWString(out, "†††");
|
||||||
UASSERTEQ(out.size(), 3);
|
UASSERTEQ(out.size(), 3);
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
UASSERTEQ(static_cast<u16>(out[i]), 0x2020);
|
UASSERTEQ(static_cast<u16>(out[i]), 0x2020);
|
||||||
|
|
||||||
stringc out2;
|
stringc out2;
|
||||||
wStringToMultibyte(out2, L"†††");
|
wStringToUTF8(out2, L"†††");
|
||||||
UASSERTEQ(out2.size(), 9);
|
UASSERTEQ(out2.size(), 9);
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
UASSERTEQ(static_cast<u8>(out2[3*i]), 0xe2);
|
UASSERTEQ(static_cast<u8>(out2[3*i]), 0xe2);
|
||||||
UASSERTEQ(static_cast<u8>(out2[3*i+1]), 0x80);
|
UASSERTEQ(static_cast<u8>(out2[3*i+1]), 0x80);
|
||||||
UASSERTEQ(static_cast<u8>(out2[3*i+2]), 0xa0);
|
UASSERTEQ(static_cast<u8>(out2[3*i+2]), 0xa0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// locale-dependent
|
||||||
|
if (!setlocale(LC_CTYPE, "C.UTF-8"))
|
||||||
|
setlocale(LC_CTYPE, "UTF-8"); // macOS
|
||||||
|
|
||||||
|
stringw out3;
|
||||||
|
multibyteToWString(out3, "†††");
|
||||||
|
UASSERTEQ(out3.size(), 3);
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
UASSERTEQ(static_cast<u16>(out3[i]), 0x2020);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_irr_string()
|
void test_irr_string()
|
||||||
|
@ -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;
|
|
||||||
|
|
||||||
u32 stride() const override {return sizeof(T);}
|
|
||||||
|
|
||||||
u32 size() const override {return Indices.size();}
|
|
||||||
|
|
||||||
void push_back(const u32 &element) override
|
|
||||||
{
|
|
||||||
// push const ref due to compiler problem with gcc 4.6, big endian
|
|
||||||
Indices.push_back((const T&)element);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 operator [](u32 index) const override
|
|
||||||
{
|
|
||||||
return (u32)(Indices[index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 getLast() override {return (u32)Indices.getLast();}
|
|
||||||
|
|
||||||
void setValue(u32 index, u32 value) override
|
|
||||||
{
|
|
||||||
Indices[index]=(T)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_used(u32 usedNow) override
|
|
||||||
{
|
|
||||||
Indices.set_used(usedNow);
|
|
||||||
}
|
|
||||||
|
|
||||||
void reallocate(u32 new_size) override
|
|
||||||
{
|
|
||||||
Indices.reallocate(new_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 allocated_size() const override
|
|
||||||
{
|
|
||||||
return Indices.allocated_size();
|
|
||||||
}
|
|
||||||
|
|
||||||
void* pointer() override {return Indices.pointer();}
|
|
||||||
|
|
||||||
video::E_INDEX_TYPE getType() const override
|
|
||||||
{
|
|
||||||
if (sizeof(T)==sizeof(u16))
|
|
||||||
return video::EIT_16BIT;
|
|
||||||
else
|
|
||||||
return video::EIT_32BIT;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
IIndexList *Indices;
|
|
||||||
|
|
||||||
CIndexBuffer(video::E_INDEX_TYPE IndexType) :Indices(0), MappingHint(EHM_NEVER), ChangedID(1)
|
|
||||||
{
|
|
||||||
setType(IndexType);
|
|
||||||
}
|
|
||||||
|
|
||||||
CIndexBuffer(const IIndexBuffer &IndexBufferCopy) :Indices(0), MappingHint(EHM_NEVER), ChangedID(1)
|
|
||||||
{
|
|
||||||
setType(IndexBufferCopy.getType());
|
|
||||||
reallocate(IndexBufferCopy.size());
|
|
||||||
|
|
||||||
for (u32 n=0;n<IndexBufferCopy.size();++n)
|
|
||||||
push_back(IndexBufferCopy[n]);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~CIndexBuffer()
|
|
||||||
{
|
|
||||||
delete Indices;
|
|
||||||
}
|
|
||||||
|
|
||||||
//virtual void setType(video::E_INDEX_TYPE IndexType);
|
|
||||||
void setType(video::E_INDEX_TYPE IndexType) override
|
|
||||||
{
|
|
||||||
IIndexList *NewIndices=0;
|
|
||||||
|
|
||||||
switch (IndexType)
|
|
||||||
{
|
|
||||||
case video::EIT_16BIT:
|
|
||||||
{
|
|
||||||
NewIndices=new CSpecificIndexList<u16>;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case video::EIT_32BIT:
|
|
||||||
{
|
|
||||||
NewIndices=new CSpecificIndexList<u32>;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Indices)
|
|
||||||
{
|
|
||||||
NewIndices->reallocate( Indices->size() );
|
|
||||||
|
|
||||||
for(u32 n=0;n<Indices->size();++n)
|
|
||||||
NewIndices->push_back((*Indices)[n]);
|
|
||||||
|
|
||||||
delete Indices;
|
|
||||||
}
|
|
||||||
|
|
||||||
Indices=NewIndices;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* getData() override {return Indices->pointer();}
|
|
||||||
|
|
||||||
video::E_INDEX_TYPE getType() const override {return Indices->getType();}
|
|
||||||
|
|
||||||
u32 stride() const override {return Indices->stride();}
|
|
||||||
|
|
||||||
u32 size() const override
|
|
||||||
{
|
|
||||||
return Indices->size();
|
|
||||||
}
|
|
||||||
|
|
||||||
void push_back(const u32 &element) override
|
|
||||||
{
|
|
||||||
Indices->push_back(element);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 operator [](u32 index) const override
|
|
||||||
{
|
|
||||||
return (*Indices)[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 getLast() override
|
|
||||||
{
|
|
||||||
return Indices->getLast();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setValue(u32 index, u32 value) override
|
|
||||||
{
|
|
||||||
Indices->setValue(index, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_used(u32 usedNow) override
|
|
||||||
{
|
|
||||||
Indices->set_used(usedNow);
|
|
||||||
}
|
|
||||||
|
|
||||||
void reallocate(u32 new_size) override
|
|
||||||
{
|
|
||||||
Indices->reallocate(new_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 allocated_size() const override
|
|
||||||
{
|
|
||||||
return Indices->allocated_size();
|
|
||||||
}
|
|
||||||
|
|
||||||
void* pointer() override
|
|
||||||
{
|
|
||||||
return Indices->pointer();
|
|
||||||
}
|
|
||||||
|
|
||||||
//! get the current hardware mapping hint
|
|
||||||
E_HARDWARE_MAPPING getHardwareMappingHint() const override
|
|
||||||
{
|
|
||||||
return MappingHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! set the hardware mapping hint, for driver
|
|
||||||
void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) override
|
|
||||||
{
|
|
||||||
MappingHint=NewMappingHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! flags the mesh as changed, reloads hardware buffers
|
|
||||||
void setDirty() override
|
|
||||||
{
|
|
||||||
++ChangedID;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Get the currently used ID for identification of changes.
|
|
||||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
|
||||||
u32 getChangedID() const override {return ChangedID;}
|
|
||||||
|
|
||||||
E_HARDWARE_MAPPING MappingHint;
|
|
||||||
u32 ChangedID;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace scene
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,213 +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;
|
|
||||||
|
|
||||||
u32 stride() const override {return sizeof(T);}
|
|
||||||
|
|
||||||
u32 size() const override {return Vertices.size();}
|
|
||||||
|
|
||||||
void push_back (const video::S3DVertex &element) override
|
|
||||||
{Vertices.push_back((T&)element);}
|
|
||||||
|
|
||||||
video::S3DVertex& operator [](const u32 index) const override
|
|
||||||
{return (video::S3DVertex&)Vertices[index];}
|
|
||||||
|
|
||||||
video::S3DVertex& getLast() override
|
|
||||||
{return (video::S3DVertex&)Vertices.getLast();}
|
|
||||||
|
|
||||||
void set_used(u32 usedNow) override
|
|
||||||
{Vertices.set_used(usedNow);}
|
|
||||||
|
|
||||||
void reallocate(u32 new_size) override
|
|
||||||
{Vertices.reallocate(new_size);}
|
|
||||||
|
|
||||||
u32 allocated_size() const override
|
|
||||||
{
|
|
||||||
return Vertices.allocated_size();
|
|
||||||
}
|
|
||||||
|
|
||||||
video::S3DVertex* pointer() override {return Vertices.pointer();}
|
|
||||||
|
|
||||||
video::E_VERTEX_TYPE getType() const override {return T::getType();}
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
IVertexList *Vertices;
|
|
||||||
|
|
||||||
CVertexBuffer(video::E_VERTEX_TYPE vertexType) : Vertices(0),
|
|
||||||
MappingHint(EHM_NEVER), ChangedID(1)
|
|
||||||
{
|
|
||||||
CVertexBuffer::setType(vertexType);
|
|
||||||
}
|
|
||||||
|
|
||||||
CVertexBuffer(const IVertexBuffer &VertexBufferCopy) :
|
|
||||||
Vertices(0), MappingHint(EHM_NEVER),
|
|
||||||
ChangedID(1)
|
|
||||||
{
|
|
||||||
CVertexBuffer::setType(VertexBufferCopy.getType());
|
|
||||||
CVertexBuffer::reallocate(VertexBufferCopy.size());
|
|
||||||
|
|
||||||
for (u32 n=0;n<VertexBufferCopy.size();++n)
|
|
||||||
CVertexBuffer::push_back(VertexBufferCopy[n]);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~CVertexBuffer()
|
|
||||||
{
|
|
||||||
delete Vertices;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void setType(video::E_VERTEX_TYPE vertexType) override
|
|
||||||
{
|
|
||||||
if ( Vertices && Vertices->getType() == vertexType )
|
|
||||||
return;
|
|
||||||
|
|
||||||
IVertexList *NewVertices=0;
|
|
||||||
|
|
||||||
switch (vertexType)
|
|
||||||
{
|
|
||||||
case video::EVT_STANDARD:
|
|
||||||
{
|
|
||||||
NewVertices=new CSpecificVertexList<video::S3DVertex>;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case video::EVT_2TCOORDS:
|
|
||||||
{
|
|
||||||
NewVertices=new CSpecificVertexList<video::S3DVertex2TCoords>;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case video::EVT_TANGENTS:
|
|
||||||
{
|
|
||||||
NewVertices=new CSpecificVertexList<video::S3DVertexTangents>;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Vertices)
|
|
||||||
{
|
|
||||||
NewVertices->reallocate( Vertices->size() );
|
|
||||||
|
|
||||||
for(u32 n=0;n<Vertices->size();++n)
|
|
||||||
NewVertices->push_back((*Vertices)[n]);
|
|
||||||
|
|
||||||
delete Vertices;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vertices=NewVertices;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* getData() override {return Vertices->pointer();}
|
|
||||||
|
|
||||||
video::E_VERTEX_TYPE getType() const override {return Vertices->getType();}
|
|
||||||
|
|
||||||
u32 stride() const override {return Vertices->stride();}
|
|
||||||
|
|
||||||
u32 size() const override
|
|
||||||
{
|
|
||||||
return Vertices->size();
|
|
||||||
}
|
|
||||||
|
|
||||||
void push_back (const video::S3DVertex &element) override
|
|
||||||
{
|
|
||||||
Vertices->push_back(element);
|
|
||||||
}
|
|
||||||
|
|
||||||
video::S3DVertex& operator [](const u32 index) const override
|
|
||||||
{
|
|
||||||
return (*Vertices)[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
video::S3DVertex& getLast() override
|
|
||||||
{
|
|
||||||
return Vertices->getLast();
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_used(u32 usedNow) override
|
|
||||||
{
|
|
||||||
Vertices->set_used(usedNow);
|
|
||||||
}
|
|
||||||
|
|
||||||
void reallocate(u32 new_size) override
|
|
||||||
{
|
|
||||||
Vertices->reallocate(new_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 allocated_size() const override
|
|
||||||
{
|
|
||||||
return Vertices->allocated_size();
|
|
||||||
}
|
|
||||||
|
|
||||||
video::S3DVertex* pointer() override
|
|
||||||
{
|
|
||||||
return Vertices->pointer();
|
|
||||||
}
|
|
||||||
|
|
||||||
//! get the current hardware mapping hint
|
|
||||||
E_HARDWARE_MAPPING getHardwareMappingHint() const override
|
|
||||||
{
|
|
||||||
return MappingHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! set the hardware mapping hint, for driver
|
|
||||||
void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) override
|
|
||||||
{
|
|
||||||
MappingHint=NewMappingHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! flags the mesh as changed, reloads hardware buffers
|
|
||||||
void setDirty() override
|
|
||||||
{
|
|
||||||
++ChangedID;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Get the currently used ID for identification of changes.
|
|
||||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
|
||||||
u32 getChangedID() const override {return ChangedID;}
|
|
||||||
|
|
||||||
E_HARDWARE_MAPPING MappingHint;
|
|
||||||
u32 ChangedID;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace scene
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -2,8 +2,7 @@
|
|||||||
// 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"
|
||||||
@ -60,4 +59,3 @@ namespace video
|
|||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -26,7 +26,7 @@ namespace gui
|
|||||||
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, // hourclass
|
ECI_WAIT, // hourglass
|
||||||
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
|
||||||
|
@ -263,6 +263,10 @@ namespace irr
|
|||||||
//! A checkbox has changed its check state.
|
//! A checkbox has changed its check state.
|
||||||
EGET_CHECKBOX_CHANGED,
|
EGET_CHECKBOX_CHANGED,
|
||||||
|
|
||||||
|
//! A listbox would like to open.
|
||||||
|
/** You can prevent the listbox from opening by absorbing the event. */
|
||||||
|
EGET_LISTBOX_OPENED,
|
||||||
|
|
||||||
//! A new item in a listbox was selected.
|
//! A new item in a listbox was selected.
|
||||||
/** NOTE: You also get this event currently when the same item was clicked again after more than 500 ms. */
|
/** NOTE: You also get this event currently when the same item was clicked again after more than 500 ms. */
|
||||||
EGET_LISTBOX_CHANGED,
|
EGET_LISTBOX_CHANGED,
|
||||||
|
@ -52,6 +52,10 @@ namespace gui
|
|||||||
//! Sets the selected item. Set this to -1 if no item should be selected
|
//! Sets the selected item. Set this to -1 if no item should be selected
|
||||||
virtual void setSelected(s32 idx) = 0;
|
virtual void setSelected(s32 idx) = 0;
|
||||||
|
|
||||||
|
//! Sets the selected item and emits a change event.
|
||||||
|
/** Set this to -1 if no item should be selected */
|
||||||
|
virtual void setAndSendSelected(s32 idx) = 0;
|
||||||
|
|
||||||
//! Sets text justification of the text area
|
//! Sets text justification of the text area
|
||||||
/** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
|
/** \param horizontal: EGUIA_UPPERLEFT for left justified (default),
|
||||||
EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text.
|
EGUIA_LOWERRIGHT for right justified, or EGUIA_CENTER for centered text.
|
||||||
|
@ -19,7 +19,7 @@ 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 infos or something started/stopped.
|
//! Useful information to print. For example hardware info 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
|
||||||
|
@ -38,30 +38,11 @@ public:
|
|||||||
const SMaterial& lastMaterial,
|
const SMaterial& lastMaterial,
|
||||||
bool resetAllRenderstates) = 0;
|
bool resetAllRenderstates) = 0;
|
||||||
|
|
||||||
//! Return an index constant for the vertex shader based on a name.
|
//! Return an index constant for the vertex shader based on a uniform variable name.
|
||||||
virtual s32 getVertexShaderConstantID(const c8* name) = 0;
|
virtual s32 getVertexShaderConstantID(const c8* name) = 0;
|
||||||
|
|
||||||
//! Sets a constant for the vertex shader based on a name.
|
//! Sets a value for a vertex shader uniform variable.
|
||||||
/** This can be used if you used a high level shader language like GLSL
|
/** \param index Index of the variable (as received from getVertexShaderConstantID)
|
||||||
or HLSL to create a shader. Example: If you created a shader which has
|
|
||||||
variables named 'mWorldViewProj' (containing the WorldViewProjection
|
|
||||||
matrix) and another one named 'fTime' containing one float, you can set
|
|
||||||
them in your IShaderConstantSetCallBack derived class like this:
|
|
||||||
\code
|
|
||||||
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
|
|
||||||
{
|
|
||||||
video::IVideoDriver* driver = services->getVideoDriver();
|
|
||||||
|
|
||||||
f32 time = (f32)os::Timer::getTime()/100000.0f;
|
|
||||||
services->setVertexShaderConstant("fTime", &time, 1);
|
|
||||||
|
|
||||||
core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION));
|
|
||||||
worldViewProj *= driver->getTransform(video::ETS_VIEW);
|
|
||||||
worldViewProj *= driver->getTransform(video::ETS_WORLD);
|
|
||||||
services->setVertexShaderConstant("mWorldViewProj", worldViewProj.M, 16);
|
|
||||||
}
|
|
||||||
\endcode
|
|
||||||
\param index Index of the variable
|
|
||||||
\param floats Pointer to array of floats
|
\param floats Pointer to array of floats
|
||||||
\param count Amount of floats in array.
|
\param count Amount of floats in array.
|
||||||
\return True if successful.
|
\return True if successful.
|
||||||
@ -85,14 +66,14 @@ public:
|
|||||||
\param constantAmount: Amount of registers to be set. One register consists of 4 floats. */
|
\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;
|
virtual void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) = 0;
|
||||||
|
|
||||||
//! Return an index constant for the pixel shader based on a name.
|
//! Return an index constant for the pixel shader for the given uniform variable name
|
||||||
virtual s32 getPixelShaderConstantID(const c8* name) = 0;
|
virtual s32 getPixelShaderConstantID(const c8* name) = 0;
|
||||||
|
|
||||||
//! Sets a constant for the pixel shader based on a name.
|
//! Sets a value for the given pixel shader uniform variable
|
||||||
/** This can be used if you used a high level shader language like GLSL
|
/** This can be used if you used a high level shader language like GLSL
|
||||||
or HLSL to create a shader. See setVertexShaderConstant() for an
|
or HLSL to create a shader. See setVertexShaderConstant() for an
|
||||||
example on how to use this.
|
example on how to use this.
|
||||||
\param index Index of the variable
|
\param index Index of the variable (as received from getPixelShaderConstantID)
|
||||||
\param floats Pointer to array of floats
|
\param floats Pointer to array of floats
|
||||||
\param count Amount of floats in array.
|
\param count Amount of floats in array.
|
||||||
\return True if successful. */
|
\return True if successful. */
|
||||||
|
@ -2,9 +2,7 @@
|
|||||||
// 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_MESH_WRITER_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_I_MESH_WRITER_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "IReferenceCounted.h"
|
#include "IReferenceCounted.h"
|
||||||
#include "EMeshWriterEnums.h"
|
#include "EMeshWriterEnums.h"
|
||||||
|
|
||||||
@ -54,5 +52,4 @@ namespace scene
|
|||||||
} // end namespace
|
} // end namespace
|
||||||
} // end namespace
|
} // end namespace
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -11,11 +11,11 @@
|
|||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
|
|
||||||
//! The Operating system operator provides operation system specific methods and information.
|
//! The OSOperator provides OS-specific methods and information.
|
||||||
class IOSOperator : public virtual IReferenceCounted
|
class IOSOperator : public virtual IReferenceCounted
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//! Get the current operation system version as string.
|
//! Get the current OS version as string.
|
||||||
virtual const core::stringc& getOperatingSystemVersion() const = 0;
|
virtual const core::stringc& getOperatingSystemVersion() const = 0;
|
||||||
|
|
||||||
//! Copies text to the clipboard
|
//! Copies text to the clipboard
|
||||||
|
@ -130,7 +130,7 @@ namespace scene
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! Get pointer to an animateable mesh. Loads the file if not loaded already.
|
//! Get pointer to an animatable mesh. Loads the file if not loaded already.
|
||||||
/**
|
/**
|
||||||
* If you want to remove a loaded mesh from the cache again, use removeMesh().
|
* If you want to remove a loaded mesh from the cache again, use removeMesh().
|
||||||
* Currently there are the following mesh formats supported:
|
* Currently there are the following mesh formats supported:
|
||||||
@ -509,7 +509,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Clear all nodes which are currently registered for rendering
|
//! Clear all nodes which are currently registered for rendering
|
||||||
/** Usually you don't have to care about this as drawAll will clear nodes
|
/** Usually you don't have to care about this as drawAll will clear nodes
|
||||||
after rendering them. But sometimes you might have to manully reset this.
|
after rendering them. But sometimes you might have to manually reset this.
|
||||||
For example when you deleted nodes between registering and rendering. */
|
For example when you deleted nodes between registering and rendering. */
|
||||||
virtual void clearAllRegisteredNodesForRendering() = 0;
|
virtual void clearAllRegisteredNodesForRendering() = 0;
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ namespace scene
|
|||||||
|
|
||||||
//! This method is called just before the rendering process of the whole scene.
|
//! This method is called just before the rendering process of the whole scene.
|
||||||
/** Nodes may register themselves in the render pipeline during this call,
|
/** Nodes may register themselves in the render pipeline during this call,
|
||||||
precalculate the geometry which should be renderered, and prevent their
|
precalculate the geometry which should be rendered, and prevent their
|
||||||
children from being able to register themselves if they are clipped by simply
|
children from being able to register themselves if they are clipped by simply
|
||||||
not calling their OnRegisterSceneNode method.
|
not calling their OnRegisterSceneNode method.
|
||||||
If you are implementing your own scene node, you should overwrite this method
|
If you are implementing your own scene node, you should overwrite this method
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_VIDEO_DRIVER_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_I_VIDEO_DRIVER_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "rect.h"
|
#include "rect.h"
|
||||||
#include "SColor.h"
|
#include "SColor.h"
|
||||||
@ -1047,7 +1046,7 @@ namespace video
|
|||||||
E_MATERIAL_TYPE enum or a value which was returned by
|
E_MATERIAL_TYPE enum or a value which was returned by
|
||||||
addMaterialRenderer().
|
addMaterialRenderer().
|
||||||
\return String with the name of the renderer, or 0 if not
|
\return String with the name of the renderer, or 0 if not
|
||||||
exisiting */
|
existing */
|
||||||
virtual const c8* getMaterialRendererName(u32 idx) const =0;
|
virtual const c8* getMaterialRendererName(u32 idx) const =0;
|
||||||
|
|
||||||
//! Sets the name of a material renderer.
|
//! Sets the name of a material renderer.
|
||||||
@ -1211,4 +1210,3 @@ namespace video
|
|||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -2,12 +2,11 @@
|
|||||||
// 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_COMPILE_CONFIG_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_COMPILE_CONFIG_H_INCLUDED__
|
|
||||||
|
|
||||||
//! Identifies the IrrlichtMt fork customized for the Minetest engine
|
//! Identifies the IrrlichtMt fork customized for the Minetest engine
|
||||||
#define IRRLICHT_VERSION_MT_REVISION 12
|
#define IRRLICHT_VERSION_MT_REVISION 13
|
||||||
#define IRRLICHT_VERSION_MT "mt12"
|
#define IRRLICHT_VERSION_MT "mt13"
|
||||||
|
|
||||||
//! Irrlicht SDK Version
|
//! Irrlicht SDK Version
|
||||||
#define IRRLICHT_VERSION_MAJOR 1
|
#define IRRLICHT_VERSION_MAJOR 1
|
||||||
@ -29,5 +28,3 @@
|
|||||||
#ifndef IRRLICHT_API
|
#ifndef IRRLICHT_API
|
||||||
#define IRRLICHT_API
|
#define IRRLICHT_API
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __IRR_COMPILE_CONFIG_H_INCLUDED__
|
|
||||||
|
@ -76,13 +76,17 @@ namespace irr
|
|||||||
virtual bool run() = 0;
|
virtual bool run() = 0;
|
||||||
|
|
||||||
//! Cause the device to temporarily pause execution and let other processes run.
|
//! Cause the device to temporarily pause execution and let other processes run.
|
||||||
/** This should bring down processor usage without major
|
/** This should bring down processor usage without major performance loss for Irrlicht.
|
||||||
performance loss for Irrlicht */
|
But this is system dependent, so there's a chance your thread won't get control back quickly.
|
||||||
|
*/
|
||||||
virtual void yield() = 0;
|
virtual void yield() = 0;
|
||||||
|
|
||||||
//! Pause execution and let other processes to run for a specified amount of time.
|
//! Pause execution and let other processes to run for a specified amount of time.
|
||||||
/** It may not wait the full given time, as sleep may be interrupted
|
/** It may not wait the full given time, as sleep may be interrupted and also may wait longer on some OS.
|
||||||
\param timeMs: Time to sleep for in milliseconds.
|
\param timeMs: Time to sleep for in milliseconds. Note that the OS can round up this number.
|
||||||
|
On Windows you usually get at least 15ms sleep time minium for any value > 0.
|
||||||
|
So if you call this in your main loop you can't get more than 65 FPS anymore in your game.
|
||||||
|
On most Linux systems it's relatively exact, but also no guarantee.
|
||||||
\param pauseTimer: If true, pauses the device timer while sleeping
|
\param pauseTimer: If true, pauses the device timer while sleeping
|
||||||
*/
|
*/
|
||||||
virtual void sleep(u32 timeMs, bool pauseTimer=false) = 0;
|
virtual void sleep(u32 timeMs, bool pauseTimer=false) = 0;
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_KEY_CODES_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_KEY_CODES_H_INCLUDED__
|
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
@ -90,7 +89,7 @@ namespace irr
|
|||||||
KEY_KEY_X = 0x58, // X key
|
KEY_KEY_X = 0x58, // X key
|
||||||
KEY_KEY_Y = 0x59, // Y key
|
KEY_KEY_Y = 0x59, // Y key
|
||||||
KEY_KEY_Z = 0x5A, // Z key
|
KEY_KEY_Z = 0x5A, // Z key
|
||||||
KEY_LWIN = 0x5B, // Left Windows key (Microsoft<EFBFBD> Natural<EFBFBD> keyboard)
|
KEY_LWIN = 0x5B, // Left Windows key (Microsoft Natural keyboard)
|
||||||
KEY_RWIN = 0x5C, // Right Windows key (Natural keyboard)
|
KEY_RWIN = 0x5C, // Right Windows key (Natural keyboard)
|
||||||
KEY_APPS = 0x5D, // Applications key (Natural keyboard)
|
KEY_APPS = 0x5D, // Applications key (Natural keyboard)
|
||||||
KEY_SLEEP = 0x5F, // Computer Sleep key
|
KEY_SLEEP = 0x5F, // Computer Sleep key
|
||||||
@ -185,5 +184,4 @@ namespace irr
|
|||||||
|
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_AABBOX_3D_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_AABBOX_3D_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
#include "plane3d.h"
|
#include "plane3d.h"
|
||||||
@ -364,6 +363,3 @@ class aabbox3d
|
|||||||
|
|
||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_CORE_UTIL_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_CORE_UTIL_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
@ -202,4 +201,3 @@ inline bool isupper(s32 c) { return c >= 'A' && c <= 'Z'; }
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_DIMENSION2D_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_DIMENSION2D_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
#include "irrMath.h" // for irr::core::equals()
|
#include "irrMath.h" // for irr::core::equals()
|
||||||
@ -220,5 +219,4 @@ namespace core
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,9 +2,7 @@
|
|||||||
// This file is part of the "Irrlicht Engine" and the "irrXML" project.
|
// This file is part of the "Irrlicht Engine" and the "irrXML" project.
|
||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h
|
// For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h
|
||||||
|
|
||||||
#ifndef __IRR_ARRAY_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_ARRAY_H_INCLUDED__
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -438,5 +436,4 @@ private:
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_MATH_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_MATH_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@ -479,4 +478,3 @@ namespace core
|
|||||||
using irr::core::IR;
|
using irr::core::IR;
|
||||||
using irr::core::FR;
|
using irr::core::FR;
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// This file is part of the "Irrlicht Engine" and the "irrXML" project.
|
// This file is part of the "Irrlicht Engine" and the "irrXML" project.
|
||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h
|
// For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h
|
||||||
|
|
||||||
#ifndef __IRR_STRING_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_STRING_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -11,6 +10,8 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cwchar>
|
#include <cwchar>
|
||||||
|
#include <codecvt>
|
||||||
|
#include <locale>
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
@ -35,8 +36,13 @@ outside the string class for explicit use.
|
|||||||
// forward declarations
|
// forward declarations
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class string;
|
class string;
|
||||||
static size_t multibyteToWString(string<wchar_t>& destination, const char* source, u32 sourceSize);
|
|
||||||
static size_t wStringToMultibyte(string<c8>& destination, const wchar_t* source, u32 sourceSize);
|
//! Typedef for character strings
|
||||||
|
typedef string<c8> stringc;
|
||||||
|
|
||||||
|
//! Typedef for wide character strings
|
||||||
|
typedef string<wchar_t> stringw;
|
||||||
|
|
||||||
|
|
||||||
//! Returns a character converted to lower case
|
//! Returns a character converted to lower case
|
||||||
static inline u32 locale_lower ( u32 x )
|
static inline u32 locale_lower ( u32 x )
|
||||||
@ -859,8 +865,11 @@ public:
|
|||||||
return ret.size()-oldSize;
|
return ret.size()-oldSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
friend size_t multibyteToWString(string<wchar_t>& destination, const char* source, u32 sourceSize);
|
// This function should not be used and is only kept for "CGUIFileOpenDialog::pathToStringW".
|
||||||
friend size_t wStringToMultibyte(string<c8>& destination, const wchar_t* source, u32 sourceSize);
|
friend size_t multibyteToWString(stringw& destination, const stringc &source);
|
||||||
|
|
||||||
|
friend size_t utf8ToWString(stringw &destination, const char *source);
|
||||||
|
friend size_t wStringToUTF8(stringc &destination, const wchar_t *source);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -913,38 +922,18 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//! Typedef for character strings
|
|
||||||
typedef string<c8> stringc;
|
|
||||||
|
|
||||||
//! Typedef for wide character strings
|
|
||||||
typedef string<wchar_t> stringw;
|
|
||||||
|
|
||||||
//! Convert multibyte string to wide-character string
|
//! Convert multibyte string to wide-character string
|
||||||
/** Wrapper around mbstowcs from standard library, but directly using Irrlicht string class.
|
/** Wrapper around mbstowcs from standard library, but directly using Irrlicht string class.
|
||||||
What the function does exactly depends on the LC_CTYPE of the current c locale.
|
What the function does exactly depends on the LC_CTYPE of the current c locale.
|
||||||
\param destination Wide-character string receiving the converted source
|
\param destination Wide-character string receiving the converted source
|
||||||
\param source multibyte string
|
\param source multibyte string
|
||||||
\return The number of wide characters written to destination, not including the eventual terminating null character or -1 when conversion failed */
|
\return The number of wide characters written to destination, not including the eventual terminating null character or -1 when conversion failed
|
||||||
static inline size_t multibyteToWString(string<wchar_t>& destination, const core::string<c8>& source)
|
|
||||||
{
|
|
||||||
return multibyteToWString(destination, source.c_str(), (u32)source.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Convert multibyte string to wide-character string
|
This function should not be used and is only kept for "CGUIFileOpenDialog::pathToStringW". */
|
||||||
/** Wrapper around mbstowcs from standard library, but directly writing to Irrlicht string class.
|
inline size_t multibyteToWString(stringw& destination, const core::stringc& source)
|
||||||
What the function does exactly depends on the LC_CTYPE of the current c locale.
|
|
||||||
\param destination Wide-character string receiving the converted source
|
|
||||||
\param source multibyte string
|
|
||||||
\return The number of wide characters written to destination, not including the eventual terminating null character or -1 when conversion failed. */
|
|
||||||
static inline size_t multibyteToWString(string<wchar_t>& destination, const char* source)
|
|
||||||
{
|
{
|
||||||
const u32 s = source ? (u32)strlen(source) : 0;
|
u32 sourceSize = source.size();
|
||||||
return multibyteToWString(destination, source, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Internally used by the other multibyteToWString functions
|
|
||||||
static size_t multibyteToWString(string<wchar_t>& destination, const char* source, u32 sourceSize)
|
|
||||||
{
|
|
||||||
if ( sourceSize )
|
if ( sourceSize )
|
||||||
{
|
{
|
||||||
destination.str.resize(sourceSize+1);
|
destination.str.resize(sourceSize+1);
|
||||||
@ -952,7 +941,7 @@ static size_t multibyteToWString(string<wchar_t>& destination, const char* sourc
|
|||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
#pragma warning(disable: 4996) // 'mbstowcs': This function or variable may be unsafe. Consider using mbstowcs_s instead.
|
#pragma warning(disable: 4996) // 'mbstowcs': This function or variable may be unsafe. Consider using mbstowcs_s instead.
|
||||||
#endif
|
#endif
|
||||||
const size_t written = mbstowcs(&destination[0], source, (size_t)sourceSize);
|
const size_t written = mbstowcs(&destination[0], source.c_str(), (size_t)sourceSize);
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
@ -975,55 +964,33 @@ static size_t multibyteToWString(string<wchar_t>& destination, const char* sourc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Same as multibyteToWString, but the other way around
|
|
||||||
static inline size_t wStringToMultibyte(string<c8>& destination, const core::string<wchar_t>& source)
|
inline size_t utf8ToWString(stringw &destination, const char *source)
|
||||||
{
|
{
|
||||||
return wStringToMultibyte(destination, source.c_str(), (u32)source.size());
|
std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
|
||||||
|
destination = conv.from_bytes(source);
|
||||||
|
return destination.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Same as multibyteToWString, but the other way around
|
inline size_t utf8ToWString(stringw &destination, const stringc &source)
|
||||||
static inline size_t wStringToMultibyte(string<c8>& destination, const wchar_t* source)
|
|
||||||
{
|
{
|
||||||
const u32 s = source ? (u32)wcslen(source) : 0;
|
return utf8ToWString(destination, source.c_str());
|
||||||
return wStringToMultibyte(destination, source, s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Same as multibyteToWString, but the other way around
|
inline size_t wStringToUTF8(stringc &destination, const wchar_t *source)
|
||||||
static size_t wStringToMultibyte(string<c8>& destination, const wchar_t* source, u32 sourceSize)
|
|
||||||
{
|
{
|
||||||
if ( sourceSize )
|
std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
|
||||||
{
|
destination = conv.to_bytes(source);
|
||||||
destination.str.resize(sizeof(wchar_t)*sourceSize+1);
|
return destination.size();
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma warning(push)
|
|
||||||
#pragma warning(disable: 4996) // 'wcstombs': This function or variable may be unsafe. Consider using wcstombs_s instead.
|
|
||||||
#endif
|
|
||||||
const size_t written = wcstombs(&destination[0], source, destination.size());
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma warning(pop)
|
|
||||||
#endif
|
|
||||||
if ( written != (size_t)-1 )
|
|
||||||
{
|
|
||||||
destination.str.resize(written);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
inline size_t wStringToUTF8(stringc &destination, const stringw &source)
|
||||||
{
|
{
|
||||||
// Likely character which got converted until the invalid character was encountered are in destination now.
|
return wStringToUTF8(destination, source.c_str());
|
||||||
// And it seems even 0-terminated, but I found no documentation anywhere that this (the 0-termination) is guaranteed :-(
|
|
||||||
destination.clear();
|
|
||||||
}
|
|
||||||
return written;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
destination.clear();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_TYPES_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_TYPES_H_INCLUDED__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@ -120,4 +119,3 @@ code like 'code', but some generate warnings so we use this macro here */
|
|||||||
((irr::u32)(irr::u8)(c0) | ((irr::u32)(irr::u8)(c1) << 8) | \
|
((irr::u32)(irr::u8)(c0) | ((irr::u32)(irr::u8)(c1) << 8) | \
|
||||||
((irr::u32)(irr::u8)(c2) << 16) | ((irr::u32)(irr::u8)(c3) << 24 ))
|
((irr::u32)(irr::u8)(c2) << 16) | ((irr::u32)(irr::u8)(c3) << 24 ))
|
||||||
|
|
||||||
#endif // __IRR_TYPES_H_INCLUDED__
|
|
||||||
|
@ -30,10 +30,8 @@
|
|||||||
#define __IRRLICHT_H_INCLUDED__
|
#define __IRRLICHT_H_INCLUDED__
|
||||||
|
|
||||||
#include "aabbox3d.h"
|
#include "aabbox3d.h"
|
||||||
#include "CIndexBuffer.h"
|
|
||||||
#include "CMeshBuffer.h"
|
#include "CMeshBuffer.h"
|
||||||
#include "coreutil.h"
|
#include "coreutil.h"
|
||||||
#include "CVertexBuffer.h"
|
|
||||||
#include "dimension2d.h"
|
#include "dimension2d.h"
|
||||||
#include "ECullingTypes.h"
|
#include "ECullingTypes.h"
|
||||||
#include "EDebugSceneTypes.h"
|
#include "EDebugSceneTypes.h"
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_LINE_2D_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_LINE_2D_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
#include "vector2d.h"
|
#include "vector2d.h"
|
||||||
@ -66,7 +65,7 @@ class line2d
|
|||||||
vector2d<T> getVector() const { return vector2d<T>( end.X - start.X, end.Y - start.Y); }
|
vector2d<T> getVector() const { return vector2d<T>( end.X - start.X, end.Y - start.Y); }
|
||||||
|
|
||||||
/*! Check if this segment intersects another segment,
|
/*! Check if this segment intersects another segment,
|
||||||
or if segments are coincindent (colinear). */
|
or if segments are coincident (colinear). */
|
||||||
bool intersectAsSegments( const line2d<T>& other) const
|
bool intersectAsSegments( const line2d<T>& other) const
|
||||||
{
|
{
|
||||||
// Taken from:
|
// Taken from:
|
||||||
@ -83,7 +82,7 @@ class line2d
|
|||||||
if (o1 != o2 && o3 != o4)
|
if (o1 != o2 && o3 != o4)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Special Cases to check if segments are coolinear
|
// Special Cases to check if segments are colinear
|
||||||
if (o1 == 0 && other.start.isBetweenPoints( start, end)) return true;
|
if (o1 == 0 && other.start.isBetweenPoints( start, end)) return true;
|
||||||
if (o2 == 0 && other.end.isBetweenPoints( start, end)) return true;
|
if (o2 == 0 && other.end.isBetweenPoints( start, end)) return true;
|
||||||
if (o3 == 0 && start.isBetweenPoints( other.start, other.end)) return true;
|
if (o3 == 0 && start.isBetweenPoints( other.start, other.end)) return true;
|
||||||
@ -355,5 +354,4 @@ class line2d
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_LINE_3D_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_LINE_3D_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
#include "vector3d.h"
|
#include "vector3d.h"
|
||||||
@ -140,5 +139,4 @@ class line3d
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_MATRIX_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_MATRIX_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
#include "vector3d.h"
|
#include "vector3d.h"
|
||||||
@ -2057,7 +2056,7 @@ namespace core
|
|||||||
core::vector3df v(vs);
|
core::vector3df v(vs);
|
||||||
v.normalize();
|
v.normalize();
|
||||||
|
|
||||||
// cosinus angle
|
// cosine angle
|
||||||
T ca = f.dotProduct(t);
|
T ca = f.dotProduct(t);
|
||||||
|
|
||||||
core::vector3df vt(v * (1 - ca));
|
core::vector3df vt(v * (1 - ca));
|
||||||
@ -2118,7 +2117,7 @@ namespace core
|
|||||||
// axis multiplication by sin
|
// axis multiplication by sin
|
||||||
const core::vector3df vs = look.crossProduct(from);
|
const core::vector3df vs = look.crossProduct(from);
|
||||||
|
|
||||||
// cosinus angle
|
// cosine angle
|
||||||
const f32 ca = from.dotProduct(look);
|
const f32 ca = from.dotProduct(look);
|
||||||
|
|
||||||
core::vector3df vt(up * (1.f - ca));
|
core::vector3df vt(up * (1.f - ca));
|
||||||
@ -2363,5 +2362,4 @@ namespace core
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// This file is part of the "Irrlicht Engine" and the "irrXML" project.
|
// This file is part of the "Irrlicht Engine" and the "irrXML" project.
|
||||||
// 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_PATH_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_PATH_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
|
|
||||||
@ -87,4 +86,3 @@ private:
|
|||||||
} // io
|
} // io
|
||||||
} // irr
|
} // irr
|
||||||
|
|
||||||
#endif // __IRR_PATH_H_INCLUDED__
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_PLANE_3D_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_PLANE_3D_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
#include "vector3d.h"
|
#include "vector3d.h"
|
||||||
@ -241,5 +240,4 @@ typedef plane3d<s32> plane3di;
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -5,8 +5,7 @@
|
|||||||
//! As of Irrlicht 1.6, position2d is a synonym for vector2d.
|
//! As of Irrlicht 1.6, position2d is a synonym for vector2d.
|
||||||
/** You should consider position2d to be deprecated, and use vector2d by preference. */
|
/** You should consider position2d to be deprecated, and use vector2d by preference. */
|
||||||
|
|
||||||
#ifndef __IRR_POSITION_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_POSITION_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "vector2d.h"
|
#include "vector2d.h"
|
||||||
|
|
||||||
@ -28,5 +27,4 @@ typedef vector2d<s32> position2di;
|
|||||||
// ...and use a #define to catch the rest, for (e.g.) position2d<f64>
|
// ...and use a #define to catch the rest, for (e.g.) position2d<f64>
|
||||||
#define position2d vector2d
|
#define position2d vector2d
|
||||||
|
|
||||||
#endif // __IRR_POSITION_H_INCLUDED__
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_QUATERNION_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_QUATERNION_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
@ -720,6 +719,8 @@ inline core::quaternion& quaternion::makeIdentity()
|
|||||||
inline core::quaternion& quaternion::rotationFromTo(const vector3df& from, const vector3df& to)
|
inline core::quaternion& quaternion::rotationFromTo(const vector3df& from, const vector3df& to)
|
||||||
{
|
{
|
||||||
// Based on Stan Melax's article in Game Programming Gems
|
// Based on Stan Melax's article in Game Programming Gems
|
||||||
|
// Optimized by Robert Eisele: https://raw.org/proof/quaternion-from-two-vectors
|
||||||
|
|
||||||
// Copy, since cannot modify local
|
// Copy, since cannot modify local
|
||||||
vector3df v0 = from;
|
vector3df v0 = from;
|
||||||
vector3df v1 = to;
|
vector3df v1 = to;
|
||||||
@ -744,15 +745,12 @@ inline core::quaternion& quaternion::rotationFromTo(const vector3df& from, const
|
|||||||
return set(axis.X, axis.Y, axis.Z, 0).normalize();
|
return set(axis.X, axis.Y, axis.Z, 0).normalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
const f32 s = sqrtf( (1+d)*2 ); // optimize inv_sqrt
|
const vector3df c = v0.crossProduct(v1);
|
||||||
const f32 invs = 1.f / s;
|
return set(c.X, c.Y, c.Z, 1 + d).normalize();
|
||||||
const vector3df c = v0.crossProduct(v1)*invs;
|
|
||||||
return set(c.X, c.Y, c.Z, s * 0.5f).normalize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_RECT_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_RECT_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrTypes.h"
|
#include "irrTypes.h"
|
||||||
#include "dimension2d.h"
|
#include "dimension2d.h"
|
||||||
@ -284,5 +283,4 @@ namespace core
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_TRIANGLE_3D_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_TRIANGLE_3D_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "vector3d.h"
|
#include "vector3d.h"
|
||||||
#include "line3d.h"
|
#include "line3d.h"
|
||||||
@ -274,5 +273,4 @@ namespace core
|
|||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_POINT_2D_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_POINT_2D_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
#include "dimension2d.h"
|
#include "dimension2d.h"
|
||||||
@ -143,7 +142,7 @@ public:
|
|||||||
bool nearlyParallel( const vector2d<T> & other, const T factor = relativeErrorFactor<T>()) const
|
bool nearlyParallel( const vector2d<T> & other, const T factor = relativeErrorFactor<T>()) const
|
||||||
{
|
{
|
||||||
// https://eagergames.wordpress.com/2017/04/01/fast-parallel-lines-and-vectors-test/
|
// https://eagergames.wordpress.com/2017/04/01/fast-parallel-lines-and-vectors-test/
|
||||||
// if a || b then a.x/a.y = b.x/b.y (similiar triangles)
|
// if a || b then a.x/a.y = b.x/b.y (similar triangles)
|
||||||
// if a || b then either both x are 0 or both y are 0.
|
// if a || b then either both x are 0 or both y are 0.
|
||||||
|
|
||||||
return equalsRelative( X*other.Y, other.X* Y, factor)
|
return equalsRelative( X*other.Y, other.X* Y, factor)
|
||||||
@ -432,5 +431,4 @@ struct hash<irr::core::vector2d<T> >
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
// 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_POINT_3D_H_INCLUDED__
|
#pragma once
|
||||||
#define __IRR_POINT_3D_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
|
|
||||||
@ -207,7 +206,10 @@ namespace core
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Rotates the vector by a specified number of degrees around the Y axis and the specified center.
|
//! Rotates the vector by a specified number of degrees around the Y axis and the specified center.
|
||||||
/** \param degrees Number of degrees to rotate around the Y axis.
|
/** CAREFUL: For historical reasons rotateXZBy uses a right-handed rotation
|
||||||
|
(maybe to make it more similar to the 2D vector rotations which are counterclockwise).
|
||||||
|
To have this work the same way as rest of Irrlicht (nodes, matrices, other rotateBy functions) pass -1*degrees in here.
|
||||||
|
\param degrees Number of degrees to rotate around the Y axis.
|
||||||
\param center The center of the rotation. */
|
\param center The center of the rotation. */
|
||||||
void rotateXZBy(f64 degrees, const vector3d<T>& center=vector3d<T>())
|
void rotateXZBy(f64 degrees, const vector3d<T>& center=vector3d<T>())
|
||||||
{
|
{
|
||||||
@ -485,5 +487,4 @@ struct hash<irr::core::vector3d<T> >
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
235
irr-readme.txt
235
irr-readme.txt
@ -1,235 +0,0 @@
|
|||||||
==========================================================================
|
|
||||||
The Irrlicht Engine SDK version 1.9
|
|
||||||
==========================================================================
|
|
||||||
|
|
||||||
Welcome to the Irrlicht Engine SDK.
|
|
||||||
|
|
||||||
Content of this file:
|
|
||||||
|
|
||||||
1. Directory Structure Overview
|
|
||||||
2. How To Start
|
|
||||||
3. Requirements
|
|
||||||
4. Release Notes
|
|
||||||
5. License
|
|
||||||
6. Contact
|
|
||||||
|
|
||||||
|
|
||||||
==========================================================================
|
|
||||||
1. Directory Structure Overview
|
|
||||||
==========================================================================
|
|
||||||
|
|
||||||
You will find some directories after uncompressing the archive of the
|
|
||||||
SDK. These are:
|
|
||||||
|
|
||||||
\bin The compiled library Irrlicht.DLL and some compiled demo
|
|
||||||
and example applications, just start them to see the
|
|
||||||
Irrlicht Engine in action. Windows only.
|
|
||||||
\doc Documentation of the Irrlicht Engine.
|
|
||||||
\examples Examples and tutorials showing how to use the engine with
|
|
||||||
C++.
|
|
||||||
\include Header files to include when programming with the engine.
|
|
||||||
\lib Libs to link with your programs when using the engine.
|
|
||||||
\media Graphics and sound resources for the demo applications and
|
|
||||||
examples.
|
|
||||||
\source The source code of the Irrlicht Engine. This code is
|
|
||||||
not needed to develop applications with the engine,
|
|
||||||
but it is included to enable recompilation and
|
|
||||||
debugging, if necessary.
|
|
||||||
\tools Useful tools (with sourcecode) for the engine.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
==========================================================================
|
|
||||||
2. How to start
|
|
||||||
==========================================================================
|
|
||||||
|
|
||||||
To see the engine in action in Windows, just go to the \bin\Win32-VisualStudio
|
|
||||||
directory, and start some applications. There should also be an
|
|
||||||
application named Demo.exe which should show the most
|
|
||||||
interesting features of Irrlicht.
|
|
||||||
|
|
||||||
To start developing own applications and games with the engine take
|
|
||||||
a look at the 01.HelloWorld example in the \examples directory.
|
|
||||||
There is also a .html file with a tutorial which should be
|
|
||||||
easily comprehensible.
|
|
||||||
|
|
||||||
The Irrlicht Engine is a static lib under linux. A precompiled version can be
|
|
||||||
generated from the sources using the Makefile in source/Irrlicht. Run 'make' in
|
|
||||||
that subfolder. After this you should be able to 'make' all
|
|
||||||
example applications in /examples by calling the buildAllExamples script. You
|
|
||||||
can run the examples then from the bin folder.
|
|
||||||
|
|
||||||
It is also possible to use Irrlicht as shared object
|
|
||||||
(libIrrlicht.so.versionNumber). Use the proper makefile target for this by
|
|
||||||
running 'make sharedlib' in the source folder. See the Makefile for details.
|
|
||||||
|
|
||||||
For OSX you can find an XCode project file in source/Irrlicht/MacOSX. This will
|
|
||||||
build the libIrrlicht.a library necessary to create the apps.
|
|
||||||
|
|
||||||
==========================================================================
|
|
||||||
3. Requirements
|
|
||||||
==========================================================================
|
|
||||||
|
|
||||||
You can use one of the following compilers/IDEs to develop applications
|
|
||||||
with Irrlicht or recompile the engine. However, other compilers/IDEs may
|
|
||||||
work as well, we simply didn't test them.
|
|
||||||
|
|
||||||
* gcc 4.x
|
|
||||||
* Visual Studio 2010(10.0)-2013(12.0)
|
|
||||||
* Code::Blocks (& gcc or visual studio toolkit)
|
|
||||||
|
|
||||||
If you ever want to (re)compile the engine yourself (which means you don't
|
|
||||||
want to use the precompiled version) you need the following:
|
|
||||||
|
|
||||||
* Windows:
|
|
||||||
* Needed: PlatformSDK (which usually comes with all IDEs, download
|
|
||||||
it separately for MSVC Express 2005)
|
|
||||||
* Optional: DirectX SDK, for D3D9 support
|
|
||||||
* Optional: DirectX SDK prior to May 2006, for D3D8 support
|
|
||||||
|
|
||||||
* Linux:
|
|
||||||
* Needed: XServer with include files
|
|
||||||
* Optional: OpenGL headers and libraries (libGL.so) for OpenGL support
|
|
||||||
GLX +
|
|
||||||
XF86VidMode [package x11proto-xf86vidmode-dev] or XRandr
|
|
||||||
(X11 support libraries, the latter two for fullscreen mode)
|
|
||||||
|
|
||||||
* OSX:
|
|
||||||
* Needed: XCode and Cocoa framework
|
|
||||||
* Needed: OpenGL headers and libraries
|
|
||||||
|
|
||||||
==========================================================================
|
|
||||||
4. Release Notes
|
|
||||||
==========================================================================
|
|
||||||
|
|
||||||
Informations about changes in this new version of the engine can be
|
|
||||||
found in changes.txt.
|
|
||||||
|
|
||||||
Please note that the textures, 3D models and levels are copyright
|
|
||||||
by their authors and not covered by the Irrlicht engine license.
|
|
||||||
|
|
||||||
==========================================================================
|
|
||||||
5. License
|
|
||||||
==========================================================================
|
|
||||||
|
|
||||||
The license of the Irrlicht Engine is based on the zlib/libpng license.
|
|
||||||
Even though this license does not require you to mention that you are
|
|
||||||
using the Irrlicht Engine in your product, an acknowledgement
|
|
||||||
would be highly appreciated.
|
|
||||||
|
|
||||||
Please note that the Irrlicht Engine is based in part on the work of
|
|
||||||
the Independent JPEG Group, the zlib, and libpng. This means that if you use
|
|
||||||
the Irrlicht Engine in your product, you must acknowledge somewhere
|
|
||||||
in your documentation that you've used the IJG code and libpng. It would
|
|
||||||
also be nice to mention that you use the Irrlicht Engine and the zlib.
|
|
||||||
See the README files in the jpeglib and the zlib for
|
|
||||||
further informations.
|
|
||||||
|
|
||||||
|
|
||||||
The Irrlicht Engine License
|
|
||||||
===========================
|
|
||||||
|
|
||||||
Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgement in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
2. Altered source versions must be clearly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
|
|
||||||
==========================================================================
|
|
||||||
6. Contact
|
|
||||||
==========================================================================
|
|
||||||
|
|
||||||
If you have problems, questions or suggestions, please visit the
|
|
||||||
official homepage of the Irrlicht Engine:
|
|
||||||
|
|
||||||
http://irrlicht.sourceforge.net
|
|
||||||
|
|
||||||
You will find forums, bugtrackers, patches, tutorials, and other stuff
|
|
||||||
which will help you out.
|
|
||||||
|
|
||||||
If want to contact the team of the engine, please send an email to
|
|
||||||
Nikolaus Gebhardt:
|
|
||||||
|
|
||||||
irrlicht@users.sourceforge.net
|
|
||||||
|
|
||||||
Please also not that parts of the engine have been written or contributed
|
|
||||||
by other people. Especially: (There are probably more people, sorry if I forgot one.
|
|
||||||
See http://irrlicht.sourceforge.net/author.html for more informations)
|
|
||||||
|
|
||||||
Christian Stehno (hybrid) Contribution Coordinator/Developer
|
|
||||||
Michael Zeilfelder (cutealien) Developer
|
|
||||||
Patryk Nadrowski (Nadro) Developer
|
|
||||||
Yoran Bosman (Yoran) Webserver administrator
|
|
||||||
Gareth Davidson (bitplane) Developer/ Forum admin
|
|
||||||
Thomas Alten (burningwater) Wrote the burningsvideo software rasterizer
|
|
||||||
Luke P. Hoschke (luke) Wrote the b3d loader, the new animation system, VBOs and other things
|
|
||||||
Colin MacDonald (rogerborg) All hands person
|
|
||||||
Ahmed Hilali (blindside) The shader and advanced effects man
|
|
||||||
Dean Wadsworth (varmint) OSX port maintainer and game developer
|
|
||||||
Alvaro F. Celis (afecelis) Lots of work in the community, for example video tutorials about Irrlicht, forum admin
|
|
||||||
John Goewert (Saigumi) Wrote some tutorials for the Irrlicht Engine and doing admin stuff
|
|
||||||
Jam Takes care of moderating the forums and keeps them clean from those evil spammers.
|
|
||||||
|
|
||||||
Many others (this list hasn't been updated in a while, but they are often mentioned in changes.txt)
|
|
||||||
Etienne Petitjean wrote the MacPort of the engine
|
|
||||||
Mark Jeacocke Wrote lots of helpful comments and ideas in the forums and per email.
|
|
||||||
Julio Gorg<72> Created the 'Unofficial DirectX 9.0 Driver for the Irrlicht Engine'
|
|
||||||
Andy Spurgeon Wrote the Dev-Cpp tutorial.
|
|
||||||
Andr<64> Simon Wrote the Codewarrior tutorial.
|
|
||||||
KnightToFlight Created the unoffical terrain renderer addon for the Irrlicht Engine.
|
|
||||||
Jon Pry Wrote the code to load compressed TGA files.
|
|
||||||
Matthew Couch Wrote the tokamak integration tutorial.
|
|
||||||
Max Winkel Wrote the splitscreen tutorial.
|
|
||||||
Gorgon Zola Wrote the ODE integration tutorial.
|
|
||||||
Dean P. Macri Sent in code for curved surfaces and PCX Loading.
|
|
||||||
Sirshane Made several bug fixes, sent in code for making the mouse cursor invisible in Linux.
|
|
||||||
Matthias Gall Sent in code for a spline scene node animator and reported lots of bugs.
|
|
||||||
Mario Gruber Suggested triangle fan drawing and sent in code for this.
|
|
||||||
Ariaci Spotted out a bug in the ATI driver.
|
|
||||||
Dr Andros C Bragianos Improved texture mapping in cube scene node.
|
|
||||||
Philipp Dortmann Sent in code for stencil buffer support for OpenGL.
|
|
||||||
Jerome Nichols Created the Irrlicht/Ruby interface located at irr.rubyforge.org
|
|
||||||
Vash TheStampede Sent code for missing Draw2DLine() implementations
|
|
||||||
MattyBoy XBOX support suggestions
|
|
||||||
Oliver Klems createImageFromData() method suggestion/implementation
|
|
||||||
Jox really, really a lot of bug fixes, and the LMTS file loader
|
|
||||||
Zola Quaternion method additions
|
|
||||||
Tomasz Nowakowski various bug fixes
|
|
||||||
Nicholas Bray stencil shadow bug fixes with OpenGL
|
|
||||||
REAPER mouswheel events for scrollbar
|
|
||||||
Calimero various bug fixes like vector2d operators
|
|
||||||
Haddock bugfix in the linked list
|
|
||||||
G.o.D XML parser fix
|
|
||||||
Erik Zilli Translated some of the tutorials from my stuttering english into real english. :)
|
|
||||||
Martin Piskernig Linux bugfixing and testing
|
|
||||||
Soconne Wrote the original terrain renderer were Irrlichts terrain renderer of Irrlicht is based on it.
|
|
||||||
Spintz GeoMipMap scene node, terrain renderer of Irrlicht is based on it.
|
|
||||||
Murphy McCauley OCT file loader, MIM tools
|
|
||||||
Saurav Mohapatra IrrCSM, and lots of addons, suggestions and bug reports
|
|
||||||
Zhuck Dimitry My3D Tools
|
|
||||||
Terry Welsh Allowed me to use the textures of his 'Parallax Mapping with Offset Limiting' paper for the parallax demo of Irrlicht
|
|
||||||
rt Wrote the original .png loader for Irrlicht
|
|
||||||
Salvatore Russo Wrote the original .dmf loader for Irrlicht
|
|
||||||
Vox Various bug reports and fixes
|
|
||||||
atomice Contributed code for a ms3d loader enhancement
|
|
||||||
William Finlayson OpenGL RTT, GLSL support and the reflection 2 layer material for OpenGL.
|
|
||||||
Delight Various code contributions for Irrlicht.NET (particle system, basic shader support and more)
|
|
||||||
Michael Zoech Improved GLSL support
|
|
||||||
Jean-loup Gailly, Mark Adler Created the zlib and libpng
|
|
||||||
Guy Eric Schalnat, Andreas Dilger, Glenn Randers-Pehrson and others Created libpng
|
|
||||||
The Independent JPEG Group Created JPEG lib
|
|
||||||
Dr Brian Gladman AES Created aesGladman
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
|||||||
You might have to recompile the engine to get library files in here.
|
|
||||||
Check the readme.txt in the corresponding bin folders for more information.
|
|
@ -1,2 +0,0 @@
|
|||||||
You might have to recompile the engine to get library files in here.
|
|
||||||
Check the readme.txt in the corresponding bin folders for more information.
|
|
@ -1,2 +0,0 @@
|
|||||||
You might have to recompile the engine to get library files in here.
|
|
||||||
Check the readme.txt in the corresponding bin folders for more information.
|
|
@ -1,2 +0,0 @@
|
|||||||
You might have to recompile the engine to get library files in here.
|
|
||||||
Check the readme.txt in the corresponding bin folders for more information.
|
|
@ -1,6 +0,0 @@
|
|||||||
This branch is used for development of the OpenGL-ES drivers for Irrlicht.
|
|
||||||
There will be drivers for ogl-es 1.x and 2.x at some time, but we'll start
|
|
||||||
with 1.x first. Both drivers will be separate drivers, loosely based on the
|
|
||||||
OpenGL driver.
|
|
||||||
The branch is based on SVN/trunk and will be updated only very slowly. It's
|
|
||||||
not intended for regular use besides when working with ogl-es development.
|
|
@ -3,7 +3,6 @@
|
|||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||||
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_ANDROID_ASSET_READER_
|
|
||||||
|
|
||||||
#include "CAndroidAssetReader.h"
|
#include "CAndroidAssetReader.h"
|
||||||
|
|
||||||
@ -106,4 +105,3 @@ void CAndroidAssetFileArchive::addDirectoryToFileList(const io::path &dirname_)
|
|||||||
} // end namespace io
|
} // end namespace io
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_ANDROID_ASSET_READER_
|
|
||||||
|
@ -4,9 +4,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_ANDROID_ASSET_READER_
|
|
||||||
|
|
||||||
|
|
||||||
#include "IReadFile.h"
|
#include "IReadFile.h"
|
||||||
#include "IFileArchive.h"
|
#include "IFileArchive.h"
|
||||||
#include "CFileList.h"
|
#include "CFileList.h"
|
||||||
@ -61,4 +58,3 @@ namespace io
|
|||||||
} // end namespace io
|
} // end namespace io
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_ANDROID_ASSET_READER_
|
|
||||||
|
@ -2,9 +2,6 @@
|
|||||||
// 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
|
||||||
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_ANDROID_ASSET_READER_
|
|
||||||
|
|
||||||
#include "CAndroidAssetReader.h"
|
#include "CAndroidAssetReader.h"
|
||||||
|
|
||||||
#include "CReadFile.h"
|
#include "CReadFile.h"
|
||||||
@ -69,4 +66,3 @@ const io::path& CAndroidAssetReader::getFileName() const
|
|||||||
} // end namespace io
|
} // end namespace io
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_ANDROID_ASSET_READER_
|
|
||||||
|
@ -4,9 +4,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_ANDROID_ASSET_READER_
|
|
||||||
|
|
||||||
|
|
||||||
#include "IReadFile.h"
|
#include "IReadFile.h"
|
||||||
|
|
||||||
struct AAssetManager;
|
struct AAssetManager;
|
||||||
@ -66,4 +63,3 @@ namespace io
|
|||||||
} // end namespace io
|
} // end namespace io
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_ANDROID_ASSET_READER_
|
|
||||||
|
@ -5,8 +5,6 @@
|
|||||||
|
|
||||||
#include "CIrrDeviceAndroid.h"
|
#include "CIrrDeviceAndroid.h"
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "CFileSystem.h"
|
#include "CFileSystem.h"
|
||||||
#include "CAndroidAssetReader.h"
|
#include "CAndroidAssetReader.h"
|
||||||
@ -858,5 +856,3 @@ bool CIrrDeviceAndroid::isGyroscopeAvailable()
|
|||||||
}
|
}
|
||||||
|
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
|
||||||
|
|
||||||
#include "CIrrDeviceStub.h"
|
#include "CIrrDeviceStub.h"
|
||||||
#include "IrrlichtDevice.h"
|
#include "IrrlichtDevice.h"
|
||||||
@ -98,4 +97,3 @@ namespace irr
|
|||||||
|
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
|
|
||||||
#include "CKeyEventWrapper.h"
|
#include "CKeyEventWrapper.h"
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
@ -58,6 +56,3 @@ int CKeyEventWrapper::getUnicodeChar(int metaState)
|
|||||||
|
|
||||||
} // namespace jni
|
} // namespace jni
|
||||||
} // namespace irr
|
} // namespace irr
|
||||||
|
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
|
||||||
struct android_app;
|
struct android_app;
|
||||||
@ -35,5 +33,3 @@ private:
|
|||||||
|
|
||||||
} // namespace jni
|
} // namespace jni
|
||||||
} // namespace irr
|
} // namespace irr
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_WITH_ANDROID_DEVICE_
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -7,9 +7,7 @@
|
|||||||
#include "ISceneManager.h"
|
#include "ISceneManager.h"
|
||||||
#include "S3DVertex.h"
|
#include "S3DVertex.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#ifdef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
|
||||||
#include "CSkinnedMesh.h"
|
#include "CSkinnedMesh.h"
|
||||||
#endif
|
|
||||||
#include "IDummyTransformationSceneNode.h"
|
#include "IDummyTransformationSceneNode.h"
|
||||||
#include "IBoneSceneNode.h"
|
#include "IBoneSceneNode.h"
|
||||||
#include "IMaterialRenderer.h"
|
#include "IMaterialRenderer.h"
|
||||||
@ -187,10 +185,6 @@ IMesh * CAnimatedMeshSceneNode::getMeshForCurrentFrame()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifndef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
|
|
||||||
// As multiple scene nodes may be sharing the same skinned mesh, we have to
|
// As multiple scene nodes may be sharing the same skinned mesh, we have to
|
||||||
// re-animate it every frame to ensure that this node gets the mesh that it needs.
|
// re-animate it every frame to ensure that this node gets the mesh that it needs.
|
||||||
|
|
||||||
@ -223,7 +217,6 @@ IMesh * CAnimatedMeshSceneNode::getMeshForCurrentFrame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
return skinnedMesh;
|
return skinnedMesh;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -466,11 +459,6 @@ u32 CAnimatedMeshSceneNode::getMaterialCount() const
|
|||||||
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
||||||
IBoneSceneNode* CAnimatedMeshSceneNode::getJointNode(const c8* jointName)
|
IBoneSceneNode* CAnimatedMeshSceneNode::getJointNode(const c8* jointName)
|
||||||
{
|
{
|
||||||
#ifndef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
|
||||||
os::Printer::log("Compiled without _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_", ELL_WARNING);
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
|
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
||||||
{
|
{
|
||||||
os::Printer::log("No mesh, or mesh not of skinned mesh type", ELL_WARNING);
|
os::Printer::log("No mesh, or mesh not of skinned mesh type", ELL_WARNING);
|
||||||
@ -496,7 +484,6 @@ IBoneSceneNode* CAnimatedMeshSceneNode::getJointNode(const c8* jointName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return JointChildSceneNodes[number];
|
return JointChildSceneNodes[number];
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -505,11 +492,6 @@ IBoneSceneNode* CAnimatedMeshSceneNode::getJointNode(const c8* jointName)
|
|||||||
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
||||||
IBoneSceneNode* CAnimatedMeshSceneNode::getJointNode(u32 jointID)
|
IBoneSceneNode* CAnimatedMeshSceneNode::getJointNode(u32 jointID)
|
||||||
{
|
{
|
||||||
#ifndef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
|
||||||
os::Printer::log("Compiled without _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_", ELL_WARNING);
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
|
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
||||||
{
|
{
|
||||||
os::Printer::log("No mesh, or mesh not of skinned mesh type", ELL_WARNING);
|
os::Printer::log("No mesh, or mesh not of skinned mesh type", ELL_WARNING);
|
||||||
@ -525,23 +507,17 @@ IBoneSceneNode* CAnimatedMeshSceneNode::getJointNode(u32 jointID)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return JointChildSceneNodes[jointID];
|
return JointChildSceneNodes[jointID];
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Gets joint count.
|
//! Gets joint count.
|
||||||
u32 CAnimatedMeshSceneNode::getJointCount() const
|
u32 CAnimatedMeshSceneNode::getJointCount() const
|
||||||
{
|
{
|
||||||
#ifndef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
|
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ISkinnedMesh *skinnedMesh=(ISkinnedMesh*)Mesh;
|
ISkinnedMesh *skinnedMesh=(ISkinnedMesh*)Mesh;
|
||||||
|
|
||||||
return skinnedMesh->getJointCount();
|
return skinnedMesh->getJointCount();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -702,9 +678,6 @@ void CAnimatedMeshSceneNode::setRenderFromIdentity(bool enable)
|
|||||||
//! updates the joint positions of this mesh
|
//! updates the joint positions of this mesh
|
||||||
void CAnimatedMeshSceneNode::animateJoints(bool CalculateAbsolutePositions)
|
void CAnimatedMeshSceneNode::animateJoints(bool CalculateAbsolutePositions)
|
||||||
{
|
{
|
||||||
#ifndef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
|
||||||
return;
|
|
||||||
#else
|
|
||||||
if (Mesh && Mesh->getMeshType() == EAMT_SKINNED )
|
if (Mesh && Mesh->getMeshType() == EAMT_SKINNED )
|
||||||
{
|
{
|
||||||
checkJoints();
|
checkJoints();
|
||||||
@ -776,17 +749,12 @@ void CAnimatedMeshSceneNode::animateJoints(bool CalculateAbsolutePositions)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
*/
|
*/
|
||||||
void CAnimatedMeshSceneNode::checkJoints()
|
void CAnimatedMeshSceneNode::checkJoints()
|
||||||
{
|
{
|
||||||
#ifndef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
|
||||||
return;
|
|
||||||
#else
|
|
||||||
|
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -803,7 +771,6 @@ void CAnimatedMeshSceneNode::checkJoints()
|
|||||||
JointsUsed=true;
|
JointsUsed=true;
|
||||||
JointMode=EJUOR_READ;
|
JointMode=EJUOR_READ;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -274,7 +274,14 @@ bool CB3DMeshFileLoader::readChunkMESH(CSkinnedMesh::SJoint *inJoint)
|
|||||||
{
|
{
|
||||||
scene::SSkinMeshBuffer *meshBuffer = AnimatedMesh->addMeshBuffer();
|
scene::SSkinMeshBuffer *meshBuffer = AnimatedMesh->addMeshBuffer();
|
||||||
|
|
||||||
if (brushID!=-1)
|
if (brushID == -1)
|
||||||
|
{ /* ok */ }
|
||||||
|
else if (brushID < 0 || (u32)brushID >= Materials.size())
|
||||||
|
{
|
||||||
|
os::Printer::log("Illegal brush ID found", B3DFile->getFileName(), ELL_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
meshBuffer->Material=Materials[brushID].Material;
|
meshBuffer->Material=Materials[brushID].Material;
|
||||||
}
|
}
|
||||||
@ -354,7 +361,8 @@ bool CB3DMeshFileLoader::readChunkVRTS(CSkinnedMesh::SJoint *inJoint)
|
|||||||
tex_coord_set_size = os::Byteswap::byteswap(tex_coord_set_size);
|
tex_coord_set_size = os::Byteswap::byteswap(tex_coord_set_size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (tex_coord_sets >= max_tex_coords || tex_coord_set_size >= 4) // Something is wrong
|
if (tex_coord_sets < 0 || tex_coord_set_size < 0 ||
|
||||||
|
tex_coord_sets >= max_tex_coords || tex_coord_set_size >= 4) // Something is wrong
|
||||||
{
|
{
|
||||||
os::Printer::log("tex_coord_sets or tex_coord_set_size too big", B3DFile->getFileName(), ELL_ERROR);
|
os::Printer::log("tex_coord_sets or tex_coord_set_size too big", B3DFile->getFileName(), ELL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
@ -458,13 +466,18 @@ bool CB3DMeshFileLoader::readChunkTRIS(scene::SSkinMeshBuffer *meshBuffer, u32 m
|
|||||||
|
|
||||||
SB3dMaterial *B3dMaterial;
|
SB3dMaterial *B3dMaterial;
|
||||||
|
|
||||||
if (triangle_brush_id != -1)
|
if (triangle_brush_id == -1)
|
||||||
|
B3dMaterial = 0;
|
||||||
|
else if (triangle_brush_id < 0 || (u32)triangle_brush_id >= Materials.size())
|
||||||
|
{
|
||||||
|
os::Printer::log("Illegal material index found", B3DFile->getFileName(), ELL_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
B3dMaterial = &Materials[triangle_brush_id];
|
B3dMaterial = &Materials[triangle_brush_id];
|
||||||
meshBuffer->Material = B3dMaterial->Material;
|
meshBuffer->Material = B3dMaterial->Material;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
B3dMaterial = 0;
|
|
||||||
|
|
||||||
const s32 memoryNeeded = B3dStack.getLast().length / sizeof(s32);
|
const s32 memoryNeeded = B3dStack.getLast().length / sizeof(s32);
|
||||||
meshBuffer->Indices.reallocate(memoryNeeded + meshBuffer->Indices.size() + 1);
|
meshBuffer->Indices.reallocate(memoryNeeded + meshBuffer->Indices.size() + 1);
|
||||||
@ -583,6 +596,12 @@ bool CB3DMeshFileLoader::readChunkBONE(CSkinnedMesh::SJoint *inJoint)
|
|||||||
#endif
|
#endif
|
||||||
globalVertexID += VerticesStart;
|
globalVertexID += VerticesStart;
|
||||||
|
|
||||||
|
if (globalVertexID >= AnimatedVertices_VertexID.size())
|
||||||
|
{
|
||||||
|
os::Printer::log("Illegal vertex index found", B3DFile->getFileName(), ELL_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (AnimatedVertices_VertexID[globalVertexID]==-1)
|
if (AnimatedVertices_VertexID[globalVertexID]==-1)
|
||||||
{
|
{
|
||||||
os::Printer::log("B3dMeshLoader: Weight has bad vertex id (no link to meshbuffer index found)");
|
os::Printer::log("B3dMeshLoader: Weight has bad vertex id (no link to meshbuffer index found)");
|
||||||
@ -1015,10 +1034,11 @@ bool CB3DMeshFileLoader::readChunkBRUS()
|
|||||||
void CB3DMeshFileLoader::readString(core::stringc& newstring)
|
void CB3DMeshFileLoader::readString(core::stringc& newstring)
|
||||||
{
|
{
|
||||||
newstring="";
|
newstring="";
|
||||||
while (B3DFile->getPos() <= B3DFile->getSize())
|
while (true)
|
||||||
{
|
{
|
||||||
c8 character;
|
c8 character;
|
||||||
B3DFile->read(&character, sizeof(character));
|
if (B3DFile->read(&character, sizeof(character)) == 0)
|
||||||
|
return; // eof
|
||||||
if (character==0)
|
if (character==0)
|
||||||
return;
|
return;
|
||||||
newstring.append(character);
|
newstring.append(character);
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#include "CEGLManager.h"
|
#include "CEGLManager.h"
|
||||||
|
|
||||||
|
#ifdef _IRR_COMPILE_WITH_EGL_MANAGER_
|
||||||
|
|
||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
#include "irrArray.h"
|
#include "irrArray.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
@ -42,7 +44,7 @@ bool CEGLManager::initialize(const SIrrlichtCreationParameters& params, const SE
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Window is depend on platform.
|
// Window is depend on platform.
|
||||||
#if defined(_IRR_WINDOWS_API_)
|
#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)
|
||||||
EglWindow = (NativeWindowType)Data.OpenGLWin32.HWnd;
|
EglWindow = (NativeWindowType)Data.OpenGLWin32.HWnd;
|
||||||
Data.OpenGLWin32.HDc = GetDC((HWND)EglWindow);
|
Data.OpenGLWin32.HDc = GetDC((HWND)EglWindow);
|
||||||
EglDisplay = eglGetDisplay((NativeDisplayType)Data.OpenGLWin32.HDc);
|
EglDisplay = eglGetDisplay((NativeDisplayType)Data.OpenGLWin32.HDc);
|
||||||
@ -97,7 +99,7 @@ void CEGLManager::terminate()
|
|||||||
EglDisplay = EGL_NO_DISPLAY;
|
EglDisplay = EGL_NO_DISPLAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_IRR_WINDOWS_API_)
|
#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)
|
||||||
if (Data.OpenGLWin32.HDc)
|
if (Data.OpenGLWin32.HDc)
|
||||||
{
|
{
|
||||||
ReleaseDC((HWND)EglWindow, (HDC)Data.OpenGLWin32.HDc);
|
ReleaseDC((HWND)EglWindow, (HDC)Data.OpenGLWin32.HDc);
|
||||||
@ -662,3 +664,4 @@ bool CEGLManager::testEGLError()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef _IRR_COMPILE_WITH_EGL_MANAGER_
|
||||||
|
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
|
|
||||||
#include "SIrrCreationParameters.h"
|
#include "SIrrCreationParameters.h"
|
||||||
@ -109,3 +111,4 @@ namespace video
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@ -22,9 +22,9 @@ namespace gui
|
|||||||
CGUIComboBox::CGUIComboBox(IGUIEnvironment* environment, IGUIElement* parent,
|
CGUIComboBox::CGUIComboBox(IGUIEnvironment* environment, IGUIElement* parent,
|
||||||
s32 id, core::rect<s32> rectangle)
|
s32 id, core::rect<s32> rectangle)
|
||||||
: IGUIComboBox(environment, parent, id, rectangle),
|
: IGUIComboBox(environment, parent, id, rectangle),
|
||||||
ListButton(0), SelectedText(0), ListBox(0), LastFocus(0),
|
ListButton(nullptr), SelectedText(nullptr), ListBox(nullptr), LastFocus(nullptr),
|
||||||
Selected(-1), HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_CENTER), MaxSelectionRows(5), HasFocus(false),
|
Selected(-1), HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_CENTER), MaxSelectionRows(5), HasFocus(false),
|
||||||
ActiveFont(0)
|
ActiveFont(nullptr)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
setDebugName("CGUIComboBox");
|
setDebugName("CGUIComboBox");
|
||||||
@ -185,6 +185,15 @@ void CGUIComboBox::setSelected(s32 idx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! Sets the selected item and emits a change event.
|
||||||
|
/** Set this to -1 if no item should be selected */
|
||||||
|
void CGUIComboBox::setAndSendSelected(s32 idx)
|
||||||
|
{
|
||||||
|
setSelected(idx);
|
||||||
|
sendSelectionChangedEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//! called if an event happened.
|
//! called if an event happened.
|
||||||
bool CGUIComboBox::OnEvent(const SEvent& event)
|
bool CGUIComboBox::OnEvent(const SEvent& event)
|
||||||
{
|
{
|
||||||
@ -208,7 +217,7 @@ bool CGUIComboBox::OnEvent(const SEvent& event)
|
|||||||
openCloseMenu();
|
openCloseMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
ListButton->setPressed(ListBox == 0);
|
ListButton->setPressed(ListBox == nullptr);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -361,7 +370,7 @@ void CGUIComboBox::sendSelectionChangedEvent()
|
|||||||
|
|
||||||
event.EventType = EET_GUI_EVENT;
|
event.EventType = EET_GUI_EVENT;
|
||||||
event.GUIEvent.Caller = this;
|
event.GUIEvent.Caller = this;
|
||||||
event.GUIEvent.Element = 0;
|
event.GUIEvent.Element = nullptr;
|
||||||
event.GUIEvent.EventType = EGET_COMBO_BOX_CHANGED;
|
event.GUIEvent.EventType = EGET_COMBO_BOX_CHANGED;
|
||||||
Parent->OnEvent(event);
|
Parent->OnEvent(event);
|
||||||
}
|
}
|
||||||
@ -447,12 +456,23 @@ void CGUIComboBox::openCloseMenu()
|
|||||||
// close list box
|
// close list box
|
||||||
Environment->setFocus(this);
|
Environment->setFocus(this);
|
||||||
ListBox->remove();
|
ListBox->remove();
|
||||||
ListBox = 0;
|
ListBox = nullptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Parent)
|
if (Parent) {
|
||||||
|
SEvent event;
|
||||||
|
event.EventType = EET_GUI_EVENT;
|
||||||
|
event.GUIEvent.Caller = this;
|
||||||
|
event.GUIEvent.Element = nullptr;
|
||||||
|
event.GUIEvent.EventType = EGET_LISTBOX_OPENED;
|
||||||
|
|
||||||
|
// Allow to prevent the listbox from opening.
|
||||||
|
if (Parent->OnEvent(event))
|
||||||
|
return;
|
||||||
|
|
||||||
Parent->bringToFront(this);
|
Parent->bringToFront(this);
|
||||||
|
}
|
||||||
|
|
||||||
IGUISkin* skin = Environment->getSkin();
|
IGUISkin* skin = Environment->getSkin();
|
||||||
u32 h = Items.size();
|
u32 h = Items.size();
|
||||||
|
@ -55,6 +55,10 @@ namespace gui
|
|||||||
//! sets the selected item. Set this to -1 if no item should be selected
|
//! sets the selected item. Set this to -1 if no item should be selected
|
||||||
void setSelected(s32 idx) override;
|
void setSelected(s32 idx) override;
|
||||||
|
|
||||||
|
//! Sets the selected item and emits a change event.
|
||||||
|
/** Set this to -1 if no item should be selected */
|
||||||
|
void setAndSendSelected(s32 idx) override;
|
||||||
|
|
||||||
//! sets the text alignment of the text part
|
//! sets the text alignment of the text part
|
||||||
void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) override;
|
void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) override;
|
||||||
|
|
||||||
|
@ -299,7 +299,7 @@ bool CGUIEditBox::processKey(const SEvent& event)
|
|||||||
const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
|
const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
|
||||||
|
|
||||||
core::stringc s;
|
core::stringc s;
|
||||||
wStringToMultibyte(s, Text.subString(realmbgn, realmend - realmbgn));
|
wStringToUTF8(s, Text.subString(realmbgn, realmend - realmbgn));
|
||||||
Operator->copyToClipboard(s.c_str());
|
Operator->copyToClipboard(s.c_str());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -312,7 +312,7 @@ bool CGUIEditBox::processKey(const SEvent& event)
|
|||||||
|
|
||||||
// copy
|
// copy
|
||||||
core::stringc sc;
|
core::stringc sc;
|
||||||
wStringToMultibyte(sc, Text.subString(realmbgn, realmend - realmbgn));
|
wStringToUTF8(sc, Text.subString(realmbgn, realmend - realmbgn));
|
||||||
Operator->copyToClipboard(sc.c_str());
|
Operator->copyToClipboard(sc.c_str());
|
||||||
|
|
||||||
if (isEnabled())
|
if (isEnabled())
|
||||||
@ -345,7 +345,7 @@ bool CGUIEditBox::processKey(const SEvent& event)
|
|||||||
if (p)
|
if (p)
|
||||||
{
|
{
|
||||||
irr::core::stringw widep;
|
irr::core::stringw widep;
|
||||||
core::multibyteToWString(widep, p);
|
core::utf8ToWString(widep, p);
|
||||||
|
|
||||||
if (MarkBegin == MarkEnd)
|
if (MarkBegin == MarkEnd)
|
||||||
{
|
{
|
||||||
@ -1157,7 +1157,7 @@ bool CGUIEditBox::processMouse(const SEvent& event)
|
|||||||
const c8 *inserted_text_utf8 = Operator->getTextFromPrimarySelection();
|
const c8 *inserted_text_utf8 = Operator->getTextFromPrimarySelection();
|
||||||
if (!inserted_text_utf8)
|
if (!inserted_text_utf8)
|
||||||
return inserted_text;
|
return inserted_text;
|
||||||
core::multibyteToWString(inserted_text, inserted_text_utf8);
|
core::utf8ToWString(inserted_text, inserted_text_utf8);
|
||||||
return inserted_text;
|
return inserted_text;
|
||||||
}());
|
}());
|
||||||
|
|
||||||
@ -1659,7 +1659,7 @@ void CGUIEditBox::setTextMarkers(s32 begin, s32 end)
|
|||||||
const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
|
const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
|
||||||
|
|
||||||
core::stringc s;
|
core::stringc s;
|
||||||
wStringToMultibyte(s, Text.subString(realmbgn, realmend - realmbgn));
|
wStringToUTF8(s, Text.subString(realmbgn, realmend - realmbgn));
|
||||||
Operator->copyToPrimarySelection(s.c_str());
|
Operator->copyToPrimarySelection(s.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ void CGUIEnvironment::loadBuiltInFont()
|
|||||||
CGUIFont* font = new CGUIFont(this, DefaultFontName );
|
CGUIFont* font = new CGUIFont(this, DefaultFontName );
|
||||||
if (!font->load(file))
|
if (!font->load(file))
|
||||||
{
|
{
|
||||||
os::Printer::log("Error: Could not load built-in Font. Did you compile without the BMP loader?", ELL_ERROR);
|
os::Printer::log("Error: Could not load built-in Font.", ELL_ERROR);
|
||||||
font->drop();
|
font->drop();
|
||||||
file->drop();
|
file->drop();
|
||||||
return;
|
return;
|
||||||
|
@ -623,7 +623,7 @@ void CGUIListBox::recalculateScrollPos()
|
|||||||
if (!AutoScroll)
|
if (!AutoScroll)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const s32 selPos = (Selected == -1 ? TotalItemHeight : Selected * ItemHeight) - ScrollBar->getPos();
|
const s32 selPos = (getSelected() == -1 ? TotalItemHeight : getSelected() * ItemHeight) - ScrollBar->getPos();
|
||||||
|
|
||||||
if (selPos < 0)
|
if (selPos < 0)
|
||||||
{
|
{
|
||||||
|
@ -45,20 +45,32 @@ bool CImageLoaderBMP::isALoadableFileFormat(io::IReadFile* file) const
|
|||||||
return headerID == 0x4d42;
|
return headerID == 0x4d42;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UB-safe overflow check
|
||||||
|
static inline bool overflowCheck(const void *base, size_t offset, const void *end)
|
||||||
|
{
|
||||||
|
auto baseI = reinterpret_cast<uintptr_t>(base),
|
||||||
|
endI = reinterpret_cast<uintptr_t>(end);
|
||||||
|
return baseI > endI || offset >= (endI - baseI);
|
||||||
|
}
|
||||||
|
// check whether &p[0] to &p[_off - 1] can be accessed
|
||||||
|
#define CHECKP(_off) if ((_off) < 0 || overflowCheck(p, _off, pEnd)) goto exit
|
||||||
|
// same for d
|
||||||
|
#define CHECKD(_off) if ((_off) < 0 || overflowCheck(d, _off, destEnd)) goto exit
|
||||||
|
|
||||||
void CImageLoaderBMP::decompress8BitRLE(u8*& bmpData, s32 size, s32 width, s32 height, s32 pitch) const
|
void CImageLoaderBMP::decompress8BitRLE(u8*& bmpData, s32 size, s32 width, s32 height, s32 pitch) const
|
||||||
{
|
{
|
||||||
u8* p = bmpData;
|
u8* p = bmpData;
|
||||||
|
const u8* pEnd = bmpData + size;
|
||||||
u8* newBmp = new u8[(width+pitch)*height];
|
u8* newBmp = new u8[(width+pitch)*height];
|
||||||
u8* d = newBmp;
|
u8* d = newBmp;
|
||||||
u8* destEnd = newBmp + (width+pitch)*height;
|
const u8* destEnd = newBmp + (width+pitch)*height;
|
||||||
s32 line = 0;
|
s32 line = 0;
|
||||||
|
|
||||||
while (bmpData - p < size && d < destEnd)
|
while (p < pEnd && d < destEnd)
|
||||||
{
|
{
|
||||||
if (*p == 0)
|
if (*p == 0)
|
||||||
{
|
{
|
||||||
++p;
|
++p; CHECKP(1);
|
||||||
|
|
||||||
switch(*p)
|
switch(*p)
|
||||||
{
|
{
|
||||||
@ -68,29 +80,28 @@ void CImageLoaderBMP::decompress8BitRLE(u8*& bmpData, s32 size, s32 width, s32 h
|
|||||||
d = newBmp + (line*(width+pitch));
|
d = newBmp + (line*(width+pitch));
|
||||||
break;
|
break;
|
||||||
case 1: // end of bmp
|
case 1: // end of bmp
|
||||||
delete [] bmpData;
|
goto exit;
|
||||||
bmpData = newBmp;
|
|
||||||
return;
|
|
||||||
case 2:
|
case 2:
|
||||||
++p; d +=(u8)*p; // delta
|
++p; CHECKP(2);
|
||||||
++p; d += ((u8)*p)*(width+pitch);
|
d += (u8)*p; ++p; // delta
|
||||||
++p;
|
d += ((u8)*p)*(width+pitch); ++p;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
// absolute mode
|
// absolute mode
|
||||||
s32 count = (u8)*p; ++p;
|
s32 count = (u8)*p; ++p;
|
||||||
s32 readAdditional = ((2-(count%2))%2);
|
s32 readAdditional = ((2-(count%2))%2);
|
||||||
s32 i;
|
|
||||||
|
|
||||||
for (i=0; i<count; ++i)
|
CHECKP(count); CHECKD(count);
|
||||||
|
for (s32 i=0; i<count; ++i)
|
||||||
{
|
{
|
||||||
*d = *p;
|
*d = *p;
|
||||||
++p;
|
++p;
|
||||||
++d;
|
++d;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<readAdditional; ++i)
|
CHECKP(readAdditional);
|
||||||
|
for (s32 i=0; i<readAdditional; ++i)
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -98,7 +109,9 @@ void CImageLoaderBMP::decompress8BitRLE(u8*& bmpData, s32 size, s32 width, s32 h
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
s32 count = (u8)*p; ++p;
|
s32 count = (u8)*p; ++p;
|
||||||
|
CHECKP(1);
|
||||||
u8 color = *p; ++p;
|
u8 color = *p; ++p;
|
||||||
|
CHECKD(count);
|
||||||
for (s32 i=0; i<count; ++i)
|
for (s32 i=0; i<count; ++i)
|
||||||
{
|
{
|
||||||
*d = color;
|
*d = color;
|
||||||
@ -107,26 +120,37 @@ void CImageLoaderBMP::decompress8BitRLE(u8*& bmpData, s32 size, s32 width, s32 h
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
delete [] bmpData;
|
delete [] bmpData;
|
||||||
bmpData = newBmp;
|
bmpData = newBmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// how many bytes will be touched given the current state of decompress4BitRLE
|
||||||
|
static inline u32 shiftedCount(s32 count, s32 shift)
|
||||||
|
{
|
||||||
|
_IRR_DEBUG_BREAK_IF(count < 0)
|
||||||
|
u32 ret = count / 2;
|
||||||
|
if (shift == 0 || count % 2 == 1)
|
||||||
|
++ret;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void CImageLoaderBMP::decompress4BitRLE(u8*& bmpData, s32 size, s32 width, s32 height, s32 pitch) const
|
void CImageLoaderBMP::decompress4BitRLE(u8*& bmpData, s32 size, s32 width, s32 height, s32 pitch) const
|
||||||
{
|
{
|
||||||
s32 lineWidth = (width+1)/2+pitch;
|
const s32 lineWidth = (width+1)/2+pitch;
|
||||||
u8* p = bmpData;
|
u8* p = bmpData;
|
||||||
|
const u8* pEnd = bmpData + size;
|
||||||
u8* newBmp = new u8[lineWidth*height];
|
u8* newBmp = new u8[lineWidth*height];
|
||||||
u8* d = newBmp;
|
u8* d = newBmp;
|
||||||
u8* destEnd = newBmp + lineWidth*height;
|
const u8* destEnd = newBmp + lineWidth*height;
|
||||||
s32 line = 0;
|
s32 line = 0;
|
||||||
s32 shift = 4;
|
s32 shift = 4;
|
||||||
|
|
||||||
while (bmpData - p < size && d < destEnd)
|
while (p < pEnd && d < destEnd)
|
||||||
{
|
{
|
||||||
if (*p == 0)
|
if (*p == 0)
|
||||||
{
|
{
|
||||||
++p;
|
++p; CHECKP(1);
|
||||||
|
|
||||||
switch(*p)
|
switch(*p)
|
||||||
{
|
{
|
||||||
@ -137,12 +161,10 @@ void CImageLoaderBMP::decompress4BitRLE(u8*& bmpData, s32 size, s32 width, s32 h
|
|||||||
shift = 4;
|
shift = 4;
|
||||||
break;
|
break;
|
||||||
case 1: // end of bmp
|
case 1: // end of bmp
|
||||||
delete [] bmpData;
|
goto exit;
|
||||||
bmpData = newBmp;
|
|
||||||
return;
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
++p;
|
++p; CHECKP(2);
|
||||||
s32 x = (u8)*p; ++p;
|
s32 x = (u8)*p; ++p;
|
||||||
s32 y = (u8)*p; ++p;
|
s32 y = (u8)*p; ++p;
|
||||||
d += x/2 + y*lineWidth;
|
d += x/2 + y*lineWidth;
|
||||||
@ -155,15 +177,16 @@ void CImageLoaderBMP::decompress4BitRLE(u8*& bmpData, s32 size, s32 width, s32 h
|
|||||||
s32 count = (u8)*p; ++p;
|
s32 count = (u8)*p; ++p;
|
||||||
s32 readAdditional = ((2-((count)%2))%2);
|
s32 readAdditional = ((2-((count)%2))%2);
|
||||||
s32 readShift = 4;
|
s32 readShift = 4;
|
||||||
s32 i;
|
|
||||||
|
|
||||||
for (i=0; i<count; ++i)
|
CHECKP(shiftedCount(count, readShift));
|
||||||
|
CHECKD(shiftedCount(count, shift));
|
||||||
|
for (s32 i=0; i<count; ++i)
|
||||||
{
|
{
|
||||||
s32 color = (((u8)*p) >> readShift) & 0x0f;
|
s32 color = (((u8)*p) >> readShift) & 0x0f;
|
||||||
readShift -= 4;
|
readShift -= 4;
|
||||||
if (readShift < 0)
|
if (readShift < 0)
|
||||||
{
|
{
|
||||||
++*p;
|
++*p; // <- bug?
|
||||||
readShift = 4;
|
readShift = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,7 +202,8 @@ void CImageLoaderBMP::decompress4BitRLE(u8*& bmpData, s32 size, s32 width, s32 h
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<readAdditional; ++i)
|
CHECKP(readAdditional);
|
||||||
|
for (s32 i=0; i<readAdditional; ++i)
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -187,10 +211,12 @@ void CImageLoaderBMP::decompress4BitRLE(u8*& bmpData, s32 size, s32 width, s32 h
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
s32 count = (u8)*p; ++p;
|
s32 count = (u8)*p; ++p;
|
||||||
|
CHECKP(1);
|
||||||
s32 color1 = (u8)*p; color1 = color1 & 0x0f;
|
s32 color1 = (u8)*p; color1 = color1 & 0x0f;
|
||||||
s32 color2 = (u8)*p; color2 = (color2 >> 4) & 0x0f;
|
s32 color2 = (u8)*p; color2 = (color2 >> 4) & 0x0f;
|
||||||
++p;
|
++p;
|
||||||
|
|
||||||
|
CHECKD(shiftedCount(count, shift));
|
||||||
for (s32 i=0; i<count; ++i)
|
for (s32 i=0; i<count; ++i)
|
||||||
{
|
{
|
||||||
u8 mask = 0x0f << shift;
|
u8 mask = 0x0f << shift;
|
||||||
@ -207,11 +233,14 @@ void CImageLoaderBMP::decompress4BitRLE(u8*& bmpData, s32 size, s32 width, s32 h
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
delete [] bmpData;
|
delete [] bmpData;
|
||||||
bmpData = newBmp;
|
bmpData = newBmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef CHECKOFF
|
||||||
|
#undef CHECKP
|
||||||
|
#undef CHECKD
|
||||||
|
|
||||||
//! creates a surface from the file
|
//! creates a surface from the file
|
||||||
IImage* CImageLoaderBMP::loadImage(io::IReadFile* file) const
|
IImage* CImageLoaderBMP::loadImage(io::IReadFile* file) const
|
||||||
@ -262,12 +291,16 @@ IImage* CImageLoaderBMP::loadImage(io::IReadFile* file) const
|
|||||||
// read palette
|
// read palette
|
||||||
|
|
||||||
long pos = file->getPos();
|
long pos = file->getPos();
|
||||||
|
constexpr s32 paletteAllocSize = 256;
|
||||||
s32 paletteSize = (header.BitmapDataOffset - pos) / 4;
|
s32 paletteSize = (header.BitmapDataOffset - pos) / 4;
|
||||||
|
paletteSize = core::clamp(paletteSize, 0, paletteAllocSize);
|
||||||
|
|
||||||
s32* paletteData = 0;
|
s32* paletteData = 0;
|
||||||
if (paletteSize)
|
if (paletteSize)
|
||||||
{
|
{
|
||||||
paletteData = new s32[paletteSize];
|
// always allocate an 8-bit palette to ensure enough space
|
||||||
|
paletteData = new s32[paletteAllocSize];
|
||||||
|
memset(paletteData, 0, paletteAllocSize * sizeof(s32));
|
||||||
file->read(paletteData, paletteSize * sizeof(s32));
|
file->read(paletteData, paletteSize * sizeof(s32));
|
||||||
#ifdef __BIG_ENDIAN__
|
#ifdef __BIG_ENDIAN__
|
||||||
for (s32 i=0; i<paletteSize; ++i)
|
for (s32 i=0; i<paletteSize; ++i)
|
||||||
@ -286,14 +319,17 @@ IImage* CImageLoaderBMP::loadImage(io::IReadFile* file) const
|
|||||||
|
|
||||||
file->seek(header.BitmapDataOffset);
|
file->seek(header.BitmapDataOffset);
|
||||||
|
|
||||||
|
s32 widthInBytes;
|
||||||
|
{
|
||||||
f32 t = (header.Width) * (header.BPP / 8.0f);
|
f32 t = (header.Width) * (header.BPP / 8.0f);
|
||||||
s32 widthInBytes = (s32)t;
|
widthInBytes = (s32)t;
|
||||||
t -= widthInBytes;
|
t -= widthInBytes;
|
||||||
if (t!=0.0f)
|
if (t!=0.0f)
|
||||||
++widthInBytes;
|
++widthInBytes;
|
||||||
|
}
|
||||||
|
|
||||||
s32 lineData = widthInBytes + ((4-(widthInBytes%4)))%4;
|
const s32 lineSize = widthInBytes + ((4-(widthInBytes%4)))%4;
|
||||||
pitch = lineData - widthInBytes;
|
pitch = lineSize - widthInBytes;
|
||||||
|
|
||||||
u8* bmpData = new u8[header.BitmapDataSize];
|
u8* bmpData = new u8[header.BitmapDataSize];
|
||||||
file->read(bmpData, header.BitmapDataSize);
|
file->read(bmpData, header.BitmapDataSize);
|
||||||
@ -303,15 +339,24 @@ IImage* CImageLoaderBMP::loadImage(io::IReadFile* file) const
|
|||||||
{
|
{
|
||||||
case 1: // 8 bit rle
|
case 1: // 8 bit rle
|
||||||
decompress8BitRLE(bmpData, header.BitmapDataSize, header.Width, header.Height, pitch);
|
decompress8BitRLE(bmpData, header.BitmapDataSize, header.Width, header.Height, pitch);
|
||||||
|
header.BitmapDataSize = (header.Width + pitch) * header.Height;
|
||||||
break;
|
break;
|
||||||
case 2: // 4 bit rle
|
case 2: // 4 bit rle
|
||||||
decompress4BitRLE(bmpData, header.BitmapDataSize, header.Width, header.Height, pitch);
|
decompress4BitRLE(bmpData, header.BitmapDataSize, header.Width, header.Height, pitch);
|
||||||
|
header.BitmapDataSize = ((header.Width+1)/2 + pitch) * header.Height;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create surface
|
if (header.BitmapDataSize < lineSize * header.Height)
|
||||||
|
{
|
||||||
|
os::Printer::log("Bitmap data is cut off.", ELL_ERROR);
|
||||||
|
|
||||||
// no default constructor from packed area! ARM problem!
|
delete [] paletteData;
|
||||||
|
delete [] bmpData;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create surface
|
||||||
core::dimension2d<u32> dim;
|
core::dimension2d<u32> dim;
|
||||||
dim.Width = header.Width;
|
dim.Width = header.Width;
|
||||||
dim.Height = header.Height;
|
dim.Height = header.Height;
|
||||||
|
@ -31,10 +31,10 @@ u8 *CImageLoaderTGA::loadCompressedImage(io::IReadFile *file, const STGAHeader&
|
|||||||
// This was written and sent in by Jon Pry, thank you very much!
|
// This was written and sent in by Jon Pry, thank you very much!
|
||||||
// I only changed the formatting a little bit.
|
// I only changed the formatting a little bit.
|
||||||
|
|
||||||
s32 bytesPerPixel = header.PixelDepth/8;
|
const u32 bytesPerPixel = header.PixelDepth/8;
|
||||||
s32 imageSize = header.ImageHeight * header.ImageWidth * bytesPerPixel;
|
const u32 imageSize = header.ImageHeight * header.ImageWidth * bytesPerPixel;
|
||||||
u8* data = new u8[imageSize];
|
u8* data = new u8[imageSize];
|
||||||
s32 currentByte = 0;
|
u32 currentByte = 0;
|
||||||
|
|
||||||
while(currentByte < imageSize)
|
while(currentByte < imageSize)
|
||||||
{
|
{
|
||||||
@ -45,8 +45,17 @@ u8 *CImageLoaderTGA::loadCompressedImage(io::IReadFile *file, const STGAHeader&
|
|||||||
{
|
{
|
||||||
chunkheader++; // Add 1 To The Value To Get Total Number Of Raw Pixels
|
chunkheader++; // Add 1 To The Value To Get Total Number Of Raw Pixels
|
||||||
|
|
||||||
file->read(&data[currentByte], bytesPerPixel * chunkheader);
|
const u32 bytesToRead = bytesPerPixel * chunkheader;
|
||||||
currentByte += bytesPerPixel * chunkheader;
|
if ( currentByte+bytesToRead < imageSize )
|
||||||
|
{
|
||||||
|
file->read(&data[currentByte], bytesToRead);
|
||||||
|
currentByte += bytesToRead;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os::Printer::log("Compressed TGA file RAW chunk tries writing beyond buffer", file->getFileName(), ELL_WARNING);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -55,15 +64,27 @@ u8 *CImageLoaderTGA::loadCompressedImage(io::IReadFile *file, const STGAHeader&
|
|||||||
// If It's An RLE Header
|
// If It's An RLE Header
|
||||||
chunkheader -= 127; // Subtract 127 To Get Rid Of The ID Bit
|
chunkheader -= 127; // Subtract 127 To Get Rid Of The ID Bit
|
||||||
|
|
||||||
s32 dataOffset = currentByte;
|
u32 dataOffset = currentByte;
|
||||||
file->read(&data[dataOffset], bytesPerPixel);
|
if ( dataOffset+bytesPerPixel < imageSize )
|
||||||
|
{
|
||||||
currentByte += bytesPerPixel;
|
file->read(&data[dataOffset], bytesPerPixel);
|
||||||
|
currentByte += bytesPerPixel;
|
||||||
for(s32 counter = 1; counter < chunkheader; counter++)
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os::Printer::log("Compressed TGA file RLE headertries writing beyond buffer", file->getFileName(), ELL_WARNING);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(u32 counter = 1; counter < chunkheader; counter++)
|
||||||
|
{
|
||||||
|
if ( currentByte + bytesPerPixel <= imageSize )
|
||||||
|
{
|
||||||
|
for(u32 elementCounter=0; elementCounter < bytesPerPixel; elementCounter++)
|
||||||
{
|
{
|
||||||
for(s32 elementCounter=0; elementCounter < bytesPerPixel; elementCounter++)
|
|
||||||
data[currentByte + elementCounter] = data[dataOffset + elementCounter];
|
data[currentByte + elementCounter] = data[dataOffset + elementCounter];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
currentByte += bytesPerPixel;
|
currentByte += bytesPerPixel;
|
||||||
}
|
}
|
||||||
@ -116,8 +137,17 @@ IImage* CImageLoaderTGA::loadImage(io::IReadFile* file) const
|
|||||||
|
|
||||||
if (header.ColorMapType)
|
if (header.ColorMapType)
|
||||||
{
|
{
|
||||||
// create 32 bit palette
|
// Create 32 bit palette
|
||||||
palette = new u32[ header.ColorMapLength];
|
const irr::u16 paletteSize = core::max_((u16)256, header.ColorMapLength); // ColorMapLength can lie, but so far we only use palette for 8-bit, so ensure it has 256 entries
|
||||||
|
palette = new u32[paletteSize];
|
||||||
|
|
||||||
|
if( paletteSize > header.ColorMapLength )
|
||||||
|
{
|
||||||
|
// To catch images using palette colors with invalid indices
|
||||||
|
const irr::u32 errorCol = irr::video::SColor(255,255, 0, 205).color; // bright magenta
|
||||||
|
for ( irr::u16 i = header.ColorMapLength; i< paletteSize; ++i )
|
||||||
|
palette[i] = errorCol;
|
||||||
|
}
|
||||||
|
|
||||||
// read color map
|
// read color map
|
||||||
u8 * colorMap = new u8[header.ColorMapEntrySize/8 * header.ColorMapLength];
|
u8 * colorMap = new u8[header.ColorMapEntrySize/8 * header.ColorMapLength];
|
||||||
@ -148,7 +178,7 @@ IImage* CImageLoaderTGA::loadImage(io::IReadFile* file) const
|
|||||||
header.ImageType == 3 // Uncompressed, black and white images
|
header.ImageType == 3 // Uncompressed, black and white images
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const s32 imageSize = header.ImageHeight * header.ImageWidth * header.PixelDepth/8;
|
const s32 imageSize = header.ImageHeight * header.ImageWidth * (header.PixelDepth/8);
|
||||||
data = new u8[imageSize];
|
data = new u8[imageSize];
|
||||||
file->read(data, imageSize);
|
file->read(data, imageSize);
|
||||||
}
|
}
|
||||||
@ -183,14 +213,28 @@ IImage* CImageLoaderTGA::loadImage(io::IReadFile* file) const
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
image = new CImage(ECF_A1R5G5B5,
|
switch ( header.ColorMapEntrySize )
|
||||||
core::dimension2d<u32>(header.ImageWidth, header.ImageHeight));
|
{
|
||||||
|
case 16:
|
||||||
|
image = new CImage(ECF_A1R5G5B5, core::dimension2d<u32>(header.ImageWidth, header.ImageHeight));
|
||||||
if ( image )
|
if ( image )
|
||||||
CColorConverter::convert8BitTo16Bit((u8*)data,
|
CColorConverter::convert8BitTo16Bit((u8*)data,
|
||||||
(s16*)image->getData(),
|
(s16*)image->getData(),
|
||||||
header.ImageWidth,header.ImageHeight,
|
header.ImageWidth,header.ImageHeight,
|
||||||
(s32*) palette, 0,
|
(s32*) palette, 0,
|
||||||
(header.ImageDescriptor&0x20)==0);
|
(header.ImageDescriptor&0x20)==0);
|
||||||
|
break;
|
||||||
|
// Note: 24 bit with palette would need a 24 bit palette, too lazy doing that now (textures will prefer 32-bit later anyway)
|
||||||
|
default:
|
||||||
|
image = new CImage(ECF_A8R8G8B8, core::dimension2d<u32>(header.ImageWidth, header.ImageHeight));
|
||||||
|
if ( image )
|
||||||
|
CColorConverter::convert8BitTo32Bit((u8*)data,
|
||||||
|
(u8*)image->getData(),
|
||||||
|
header.ImageWidth,header.ImageHeight,
|
||||||
|
(u8*) palette, 0,
|
||||||
|
(header.ImageDescriptor&0x20)==0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -982,7 +982,7 @@ bool CIrrDeviceLinux::run()
|
|||||||
os::Printer::log("XLookupNone", ELL_INFORMATION);
|
os::Printer::log("XLookupNone", ELL_INFORMATION);
|
||||||
else if ( status == XLookupKeySym )
|
else if ( status == XLookupKeySym )
|
||||||
// Getting this also when user did not set setlocale(LC_ALL, ""); and using an unknown locale
|
// Getting this also when user did not set setlocale(LC_ALL, ""); and using an unknown locale
|
||||||
// XSupportsLocale doesn't seeem to catch that unfortunately - any other ideas to catch it are welcome.
|
// XSupportsLocale doesn't seem to catch that unfortunately - any other ideas to catch it are welcome.
|
||||||
os::Printer::log("XLookupKeySym", ELL_INFORMATION);
|
os::Printer::log("XLookupKeySym", ELL_INFORMATION);
|
||||||
else if ( status == XBufferOverflow )
|
else if ( status == XBufferOverflow )
|
||||||
os::Printer::log("XBufferOverflow", ELL_INFORMATION);
|
os::Printer::log("XBufferOverflow", ELL_INFORMATION);
|
||||||
@ -2058,7 +2058,7 @@ Cursor CIrrDeviceLinux::TextureToMonochromeCursor(irr::video::ITexture * tex, co
|
|||||||
ZPixmap, // XYBitmap (depth=1), ZPixmap(depth=x)
|
ZPixmap, // XYBitmap (depth=1), ZPixmap(depth=x)
|
||||||
0, 0, sourceRect.getWidth(), sourceRect.getHeight(),
|
0, 0, sourceRect.getWidth(), sourceRect.getHeight(),
|
||||||
32, // bitmap_pad,
|
32, // bitmap_pad,
|
||||||
0// bytes_per_line (0 means continuos in memory)
|
0// bytes_per_line (0 means continuous in memory)
|
||||||
);
|
);
|
||||||
sourceImage->data = new char[sourceImage->height * sourceImage->bytes_per_line];
|
sourceImage->data = new char[sourceImage->height * sourceImage->bytes_per_line];
|
||||||
XImage * maskImage = XCreateImage(XDisplay, VisualInfo->visual,
|
XImage * maskImage = XCreateImage(XDisplay, VisualInfo->visual,
|
||||||
@ -2251,7 +2251,7 @@ CIrrDeviceLinux::CCursorControl::CCursorControl(CIrrDeviceLinux* dev, bool null)
|
|||||||
CIrrDeviceLinux::CCursorControl::~CCursorControl()
|
CIrrDeviceLinux::CCursorControl::~CCursorControl()
|
||||||
{
|
{
|
||||||
// Do not clearCursors here as the display is already closed
|
// Do not clearCursors here as the display is already closed
|
||||||
// TODO (cutealien): droping cursorcontrol earlier might work, not sure about reason why that's done in stub currently.
|
// TODO (cutealien): dropping cursorcontrol earlier might work, not sure about reason why that's done in stub currently.
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_X11_
|
#ifdef _IRR_COMPILE_WITH_X11_
|
||||||
|
@ -22,7 +22,7 @@ namespace irr
|
|||||||
class CIrrDeviceMacOSX;
|
class CIrrDeviceMacOSX;
|
||||||
}
|
}
|
||||||
|
|
||||||
@interface CIrrDelegateOSX : NSObject
|
@interface CIrrDelegateOSX : NSObject <NSApplicationDelegate, NSWindowDelegate>
|
||||||
|
|
||||||
- (id)initWithDevice:(irr::CIrrDeviceMacOSX*)device;
|
- (id)initWithDevice:(irr::CIrrDeviceMacOSX*)device;
|
||||||
- (void)terminate:(id)sender;
|
- (void)terminate:(id)sender;
|
||||||
|
@ -564,7 +564,7 @@ CIrrDeviceMacOSX::CIrrDeviceMacOSX(const SIrrlichtCreationParameters& param)
|
|||||||
{
|
{
|
||||||
[[NSAutoreleasePool alloc] init];
|
[[NSAutoreleasePool alloc] init];
|
||||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||||
[NSApp setDelegate:(id<NSApplicationDelegate>)[[[CIrrDelegateOSX alloc] initWithDevice:this] autorelease]];
|
[[NSApplication sharedApplication] setDelegate:[[[CIrrDelegateOSX alloc] initWithDevice:this] autorelease]];
|
||||||
|
|
||||||
// Create menu
|
// Create menu
|
||||||
|
|
||||||
@ -685,7 +685,7 @@ bool CIrrDeviceMacOSX::createWindow()
|
|||||||
{
|
{
|
||||||
if (Window)
|
if (Window)
|
||||||
{
|
{
|
||||||
[Window setDelegate:(id<NSWindowDelegate>)[NSApp delegate]];
|
[Window setDelegate:(CIrrDelegateOSX *)[NSApp delegate]];
|
||||||
[Window setAcceptsMouseMovedEvents:TRUE];
|
[Window setAcceptsMouseMovedEvents:TRUE];
|
||||||
[Window setIsVisible:TRUE];
|
[Window setIsVisible:TRUE];
|
||||||
[Window makeKeyAndOrderFront:nil];
|
[Window makeKeyAndOrderFront:nil];
|
||||||
|
@ -673,7 +673,7 @@ bool CIrrDeviceSDL::run()
|
|||||||
{
|
{
|
||||||
irrevent.EventType = irr::EET_STRING_INPUT_EVENT;
|
irrevent.EventType = irr::EET_STRING_INPUT_EVENT;
|
||||||
irrevent.StringInput.Str = new core::stringw();
|
irrevent.StringInput.Str = new core::stringw();
|
||||||
irr::core::multibyteToWString(*irrevent.StringInput.Str, SDL_event.text.text);
|
irr::core::utf8ToWString(*irrevent.StringInput.Str, SDL_event.text.text);
|
||||||
postEventFromUser(irrevent);
|
postEventFromUser(irrevent);
|
||||||
delete irrevent.StringInput.Str;
|
delete irrevent.StringInput.Str;
|
||||||
irrevent.StringInput.Str = NULL;
|
irrevent.StringInput.Str = NULL;
|
||||||
@ -928,7 +928,7 @@ void CIrrDeviceSDL::sleep(u32 timeMs, bool pauseTimer)
|
|||||||
void CIrrDeviceSDL::setWindowCaption(const wchar_t* text)
|
void CIrrDeviceSDL::setWindowCaption(const wchar_t* text)
|
||||||
{
|
{
|
||||||
core::stringc textc;
|
core::stringc textc;
|
||||||
core::wStringToMultibyte(textc, text);
|
core::wStringToUTF8(textc, text);
|
||||||
SDL_SetWindowTitle(Window, textc.c_str());
|
SDL_SetWindowTitle(Window, textc.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||||
|
|
||||||
#if defined (__STRICT_ANSI__)
|
#if defined (__STRICT_ANSI__)
|
||||||
#error Compiling with __STRICT_ANSI__ not supported. g++ does set this when compiling with -std=c++11 or -std=c++0x. Use instead -std=gnu++11 or -std=gnu++0x. Or use -U__STRICT_ANSI__ to disable strict ansi.
|
#error Compiling with __STRICT_ANSI__ not supported. g++ does set this when compiling with -std=c++11 or -std=c++0x. Use instead -std=gnu++11 or -std=gnu++0x. Or use -U__STRICT_ANSI__ to disable strict ansi.
|
||||||
@ -814,9 +815,6 @@ CIrrDeviceWin32::CIrrDeviceWin32(const SIrrlichtCreationParameters& params)
|
|||||||
wcex.lpszClassName = ClassName;
|
wcex.lpszClassName = ClassName;
|
||||||
wcex.hIconSm = 0;
|
wcex.hIconSm = 0;
|
||||||
|
|
||||||
// if there is an icon, load it
|
|
||||||
wcex.hIcon = (HICON)LoadImageW(hInstance, L"irrlicht.ico", IMAGE_ICON, 0,0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
|
|
||||||
|
|
||||||
RegisterClassExW(&wcex);
|
RegisterClassExW(&wcex);
|
||||||
|
|
||||||
// calculate client size
|
// calculate client size
|
||||||
@ -1026,7 +1024,7 @@ bool CIrrDeviceWin32::run()
|
|||||||
//! Pause the current process for the minimum time allowed only to allow other processes to execute
|
//! Pause the current process for the minimum time allowed only to allow other processes to execute
|
||||||
void CIrrDeviceWin32::yield()
|
void CIrrDeviceWin32::yield()
|
||||||
{
|
{
|
||||||
Sleep(1);
|
Sleep(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Pause execution and let other processes to run for a specified amount of time.
|
//! Pause execution and let other processes to run for a specified amount of time.
|
||||||
@ -1597,3 +1595,4 @@ core::dimension2di CIrrDeviceWin32::CCursorControl::getSupportedIconSize() const
|
|||||||
|
|
||||||
} // end namespace
|
} // end namespace
|
||||||
|
|
||||||
|
#endif // _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||||
|
|
||||||
#include "CIrrDeviceStub.h"
|
#include "CIrrDeviceStub.h"
|
||||||
#include "IrrlichtDevice.h"
|
#include "IrrlichtDevice.h"
|
||||||
|
|
||||||
@ -423,3 +425,5 @@ namespace irr
|
|||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
|
#endif // _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||||
|
@ -50,6 +50,8 @@ elseif(MSVC)
|
|||||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
add_compile_options(/arch:SSE)
|
add_compile_options(/arch:SSE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_compile_options(/D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Sanity-check version
|
# Sanity-check version
|
||||||
@ -69,7 +71,6 @@ endif()
|
|||||||
# Platform-independent configuration (hard-coded currently)
|
# Platform-independent configuration (hard-coded currently)
|
||||||
add_definitions(
|
add_definitions(
|
||||||
-DIRR_ENABLE_BUILTIN_FONT
|
-DIRR_ENABLE_BUILTIN_FONT
|
||||||
-D_IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Platform-specific configuration
|
# Platform-specific configuration
|
||||||
@ -78,10 +79,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
|
|||||||
set(SOLARIS TRUE)
|
set(SOLARIS TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# EGL
|
|
||||||
|
|
||||||
set(ENABLE_EGL OFF)
|
|
||||||
|
|
||||||
# Device
|
# Device
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
@ -91,16 +88,13 @@ elseif(APPLE)
|
|||||||
add_definitions(-D_IRR_OSX_PLATFORM_)
|
add_definitions(-D_IRR_OSX_PLATFORM_)
|
||||||
set(DEVICE "OSX")
|
set(DEVICE "OSX")
|
||||||
elseif(ANDROID)
|
elseif(ANDROID)
|
||||||
add_definitions(-D_IRR_ANDROID_PLATFORM_ -D_IRR_COMPILE_ANDROID_ASSET_READER_)
|
add_definitions(-D_IRR_ANDROID_PLATFORM_)
|
||||||
if(USE_SDL2)
|
if(USE_SDL2)
|
||||||
message(FATAL_ERROR "SDL2 device is not (yet) supported on Android")
|
message(FATAL_ERROR "SDL2 device is not (yet) supported on Android")
|
||||||
endif()
|
endif()
|
||||||
set(DEVICE "ANDROID")
|
set(DEVICE "ANDROID")
|
||||||
# EGL is required for Android
|
|
||||||
set(ENABLE_EGL ON)
|
|
||||||
elseif(EMSCRIPTEN)
|
elseif(EMSCRIPTEN)
|
||||||
add_definitions(-D_IRR_EMSCRIPTEN_PLATFORM_)
|
add_definitions(-D_IRR_EMSCRIPTEN_PLATFORM_ -D_IRR_COMPILE_WITH_EGL_MANAGER_)
|
||||||
set(ENABLE_EGL ON)
|
|
||||||
set(LINUX_PLATFORM TRUE)
|
set(LINUX_PLATFORM TRUE)
|
||||||
set(DEVICE "SDL")
|
set(DEVICE "SDL")
|
||||||
elseif(SOLARIS)
|
elseif(SOLARIS)
|
||||||
@ -148,7 +142,11 @@ endif()
|
|||||||
|
|
||||||
# OpenGL
|
# OpenGL
|
||||||
|
|
||||||
option(ENABLE_OPENGL3 "Enable OpenGL 3+" FALSE)
|
if(USE_SDL2)
|
||||||
|
option(ENABLE_OPENGL3 "Enable OpenGL 3+" TRUE)
|
||||||
|
else()
|
||||||
|
set(ENABLE_OPENGL3 FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(ANDROID OR EMSCRIPTEN)
|
if(ANDROID OR EMSCRIPTEN)
|
||||||
set(ENABLE_OPENGL FALSE)
|
set(ENABLE_OPENGL FALSE)
|
||||||
@ -185,7 +183,7 @@ endif()
|
|||||||
if(ENABLE_OPENGL)
|
if(ENABLE_OPENGL)
|
||||||
add_definitions(-D_IRR_COMPILE_WITH_OPENGL_)
|
add_definitions(-D_IRR_COMPILE_WITH_OPENGL_)
|
||||||
if(DEVICE STREQUAL "WINDOWS")
|
if(DEVICE STREQUAL "WINDOWS")
|
||||||
add_definitions(-D_IRR_OPENGL_USE_EXTPOINTER_)
|
add_definitions(-D_IRR_COMPILE_WITH_WGL_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
|
||||||
elseif(DEVICE STREQUAL "X11")
|
elseif(DEVICE STREQUAL "X11")
|
||||||
add_definitions(-D_IRR_COMPILE_WITH_GLX_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
|
add_definitions(-D_IRR_COMPILE_WITH_GLX_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
|
||||||
elseif(DEVICE STREQUAL "OSX")
|
elseif(DEVICE STREQUAL "OSX")
|
||||||
@ -209,22 +207,18 @@ if(ENABLE_GLES1)
|
|||||||
endif()
|
endif()
|
||||||
add_definitions(-D_IRR_COMPILE_WITH_OGLES1_)
|
add_definitions(-D_IRR_COMPILE_WITH_OGLES1_)
|
||||||
if(DEVICE MATCHES "^(WINDOWS|X11|ANDROID)$")
|
if(DEVICE MATCHES "^(WINDOWS|X11|ANDROID)$")
|
||||||
add_definitions(-D_IRR_OGLES1_USE_EXTPOINTER_)
|
add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES1_USE_EXTPOINTER_)
|
||||||
endif()
|
endif()
|
||||||
# We need EGL for GLES1
|
|
||||||
set(ENABLE_EGL ON)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_GLES2)
|
if(ENABLE_GLES2)
|
||||||
add_definitions(-D_IRR_COMPILE_WITH_OGLES2_)
|
add_definitions(-D_IRR_COMPILE_WITH_OGLES2_)
|
||||||
if(DEVICE MATCHES "^(WINDOWS|X11|ANDROID)$" OR EMSCRIPTEN)
|
if(DEVICE MATCHES "^(WINDOWS|X11|ANDROID)$" OR EMSCRIPTEN)
|
||||||
add_definitions(-D_IRR_OGLES2_USE_EXTPOINTER_)
|
add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES2_USE_EXTPOINTER_)
|
||||||
elseif(DEVICE STREQUAL "SDL")
|
elseif(DEVICE STREQUAL "SDL")
|
||||||
set(USE_SDLGL ON)
|
set(USE_SDLGL ON)
|
||||||
set(USE_SDLGLES2 ON)
|
set(USE_SDLGLES2 ON)
|
||||||
endif()
|
endif()
|
||||||
# We need EGL for GLES2
|
|
||||||
set(ENABLE_EGL ON)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_WEBGL1)
|
if(ENABLE_WEBGL1)
|
||||||
@ -252,7 +246,6 @@ elseif (ENABLE_GLES2)
|
|||||||
else()
|
else()
|
||||||
message(STATUS "OpenGL ES 2: OFF")
|
message(STATUS "OpenGL ES 2: OFF")
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "EGL: ${ENABLE_EGL}")
|
|
||||||
message(STATUS "WebGL: ${ENABLE_WEBGL1}")
|
message(STATUS "WebGL: ${ENABLE_WEBGL1}")
|
||||||
|
|
||||||
# Required libs
|
# Required libs
|
||||||
@ -364,21 +357,12 @@ add_library(IRROBJ OBJECT
|
|||||||
set(IRRDRVROBJ
|
set(IRRDRVROBJ
|
||||||
CNullDriver.cpp
|
CNullDriver.cpp
|
||||||
CGLXManager.cpp
|
CGLXManager.cpp
|
||||||
|
CWGLManager.cpp
|
||||||
|
CEGLManager.cpp
|
||||||
CSDLManager.cpp
|
CSDLManager.cpp
|
||||||
mt_opengl_loader.cpp
|
mt_opengl_loader.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
set(IRRDRVROBJ ${IRRDRVROBJ}
|
|
||||||
CIrrDeviceWin32.cpp
|
|
||||||
)
|
|
||||||
if(ENABLE_OPENGL)
|
|
||||||
set(IRRDRVROBJ ${IRRDRVROBJ}
|
|
||||||
CWGLManager.cpp
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_OPENGL)
|
if(ENABLE_OPENGL)
|
||||||
set(IRRDRVROBJ
|
set(IRRDRVROBJ
|
||||||
${IRRDRVROBJ}
|
${IRRDRVROBJ}
|
||||||
@ -398,14 +382,6 @@ if(ENABLE_GLES1)
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(ENABLE_EGL)
|
|
||||||
set(IRRDRVROBJ
|
|
||||||
${IRRDRVROBJ}
|
|
||||||
CEGLManager.cpp
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(IRRIMAGEOBJ
|
set(IRRIMAGEOBJ
|
||||||
CColorConverter.cpp
|
CColorConverter.cpp
|
||||||
CImage.cpp
|
CImage.cpp
|
||||||
@ -469,6 +445,7 @@ add_library(IRROTHEROBJ OBJECT
|
|||||||
CIrrDeviceSDL.cpp
|
CIrrDeviceSDL.cpp
|
||||||
CIrrDeviceLinux.cpp
|
CIrrDeviceLinux.cpp
|
||||||
CIrrDeviceStub.cpp
|
CIrrDeviceStub.cpp
|
||||||
|
CIrrDeviceWin32.cpp
|
||||||
CLogger.cpp
|
CLogger.cpp
|
||||||
COSOperator.cpp
|
COSOperator.cpp
|
||||||
Irrlicht.cpp
|
Irrlicht.cpp
|
||||||
|
@ -72,8 +72,8 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file)
|
|||||||
|
|
||||||
const io::path fullName = file->getFileName();
|
const io::path fullName = file->getFileName();
|
||||||
|
|
||||||
c8* buf = new c8[filesize];
|
c8* buf = new c8[filesize+1]; // plus null-terminator
|
||||||
memset(buf, 0, filesize);
|
memset(buf, 0, filesize+1);
|
||||||
file->read((void*)buf, filesize);
|
file->read((void*)buf, filesize);
|
||||||
const c8* const bufEnd = buf+filesize;
|
const c8* const bufEnd = buf+filesize;
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file)
|
|||||||
c8 name[WORD_BUFFER_LENGTH];
|
c8 name[WORD_BUFFER_LENGTH];
|
||||||
bufPtr = goAndCopyNextWord(name, bufPtr, WORD_BUFFER_LENGTH, bufEnd);
|
bufPtr = goAndCopyNextWord(name, bufPtr, WORD_BUFFER_LENGTH, bufEnd);
|
||||||
#ifdef _IRR_DEBUG_OBJ_LOADER_
|
#ifdef _IRR_DEBUG_OBJ_LOADER_
|
||||||
os::Printer::log("Reading material file",name);
|
os::Printer::log("Ignoring material file",name);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -220,19 +220,20 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file)
|
|||||||
u32 wlength = copyWord(vertexWord, linePtr, WORD_BUFFER_LENGTH, endPtr);
|
u32 wlength = copyWord(vertexWord, linePtr, WORD_BUFFER_LENGTH, endPtr);
|
||||||
// this function will also convert obj's 1-based index to c++'s 0-based index
|
// this function will also convert obj's 1-based index to c++'s 0-based index
|
||||||
retrieveVertexIndices(vertexWord, Idx, vertexWord+wlength+1, vertexBuffer.size(), textureCoordBuffer.size(), normalsBuffer.size());
|
retrieveVertexIndices(vertexWord, Idx, vertexWord+wlength+1, vertexBuffer.size(), textureCoordBuffer.size(), normalsBuffer.size());
|
||||||
if ( -1 != Idx[0] && Idx[0] < (irr::s32)vertexBuffer.size() )
|
if ( Idx[0] >= 0 && Idx[0] < (irr::s32)vertexBuffer.size() )
|
||||||
v.Pos = vertexBuffer[Idx[0]];
|
v.Pos = vertexBuffer[Idx[0]];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
os::Printer::log("Invalid vertex index in this line", wordBuffer.c_str(), ELL_ERROR);
|
os::Printer::log("Invalid vertex index in this line", wordBuffer.c_str(), ELL_ERROR);
|
||||||
delete [] buf;
|
delete [] buf;
|
||||||
|
cleanUp();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ( -1 != Idx[1] && Idx[1] < (irr::s32)textureCoordBuffer.size() )
|
if ( Idx[1] >= 0 && Idx[1] < (irr::s32)textureCoordBuffer.size() )
|
||||||
v.TCoords = textureCoordBuffer[Idx[1]];
|
v.TCoords = textureCoordBuffer[Idx[1]];
|
||||||
else
|
else
|
||||||
v.TCoords.set(0.0f,0.0f);
|
v.TCoords.set(0.0f,0.0f);
|
||||||
if ( -1 != Idx[2] && Idx[2] < (irr::s32)normalsBuffer.size() )
|
if ( Idx[2] >= 0 && Idx[2] < (irr::s32)normalsBuffer.size() )
|
||||||
v.Normal = normalsBuffer[Idx[2]];
|
v.Normal = normalsBuffer[Idx[2]];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -259,6 +260,14 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file)
|
|||||||
linePtr = goNextWord(linePtr, endPtr);
|
linePtr = goNextWord(linePtr, endPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (faceCorners.size() < 3)
|
||||||
|
{
|
||||||
|
os::Printer::log("Too few vertices in this line", wordBuffer.c_str(), ELL_ERROR);
|
||||||
|
delete [] buf;
|
||||||
|
cleanUp();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// triangulate the face
|
// triangulate the face
|
||||||
const int c = faceCorners[0];
|
const int c = faceCorners[0];
|
||||||
for ( u32 i = 1; i < faceCorners.size() - 1; ++i )
|
for ( u32 i = 1; i < faceCorners.size() - 1; ++i )
|
||||||
@ -411,7 +420,7 @@ COBJMeshFileLoader::SObjMtl* COBJMeshFileLoader::findMtl(const core::stringc& mt
|
|||||||
Materials.getLast()->Group = grpName;
|
Materials.getLast()->Group = grpName;
|
||||||
return Materials.getLast();
|
return Materials.getLast();
|
||||||
}
|
}
|
||||||
// we found a new group for a non-existant material
|
// we found a new group for a non-existent material
|
||||||
else if (grpName.size())
|
else if (grpName.size())
|
||||||
{
|
{
|
||||||
Materials.push_back(new SObjMtl(*Materials[0]));
|
Materials.push_back(new SObjMtl(*Materials[0]));
|
||||||
|
@ -775,10 +775,6 @@ void COGLES1Driver::drawVertexPrimitiveList2d3d(const void* vertices, u32 vertex
|
|||||||
case scene::EPT_TRIANGLES:
|
case scene::EPT_TRIANGLES:
|
||||||
glDrawElements((LastMaterial.Wireframe)?GL_LINES:(LastMaterial.PointCloud)?GL_POINTS:GL_TRIANGLES, primitiveCount*3, indexSize, indexList);
|
glDrawElements((LastMaterial.Wireframe)?GL_LINES:(LastMaterial.PointCloud)?GL_POINTS:GL_TRIANGLES, primitiveCount*3, indexSize, indexList);
|
||||||
break;
|
break;
|
||||||
case scene::EPT_QUAD_STRIP:
|
|
||||||
case scene::EPT_QUADS:
|
|
||||||
case scene::EPT_POLYGON:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Feature.MaxTextureUnits > 0)
|
if (Feature.MaxTextureUnits > 0)
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
|
|
||||||
#if defined(_IRR_OGLES1_USE_EXTPOINTER_)
|
#if defined(_IRR_OGLES1_USE_EXTPOINTER_)
|
||||||
#if defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_) || defined(_IRR_WINDOWS_API_)
|
#if defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_) || defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
#else
|
#else
|
||||||
#include <GLES/egl.h>
|
#include <GLES/egl.h>
|
||||||
|
@ -94,7 +94,7 @@ void COSOperator::copyToClipboard(const c8 *text) const
|
|||||||
EmptyClipboard();
|
EmptyClipboard();
|
||||||
|
|
||||||
core::stringw tempbuffer;
|
core::stringw tempbuffer;
|
||||||
core::multibyteToWString(tempbuffer, text);
|
core::utf8ToWString(tempbuffer, text);
|
||||||
const u32 size = (tempbuffer.size() + 1) * sizeof(wchar_t);
|
const u32 size = (tempbuffer.size() + 1) * sizeof(wchar_t);
|
||||||
|
|
||||||
HGLOBAL clipbuffer;
|
HGLOBAL clipbuffer;
|
||||||
@ -164,7 +164,7 @@ const c8* COSOperator::getTextFromClipboard() const
|
|||||||
HANDLE hData = GetClipboardData( CF_UNICODETEXT );
|
HANDLE hData = GetClipboardData( CF_UNICODETEXT );
|
||||||
buffer = (wchar_t*) GlobalLock( hData );
|
buffer = (wchar_t*) GlobalLock( hData );
|
||||||
|
|
||||||
core::wStringToMultibyte(ClipboardBuf, buffer);
|
core::wStringToUTF8(ClipboardBuf, buffer);
|
||||||
|
|
||||||
GlobalUnlock( hData );
|
GlobalUnlock( hData );
|
||||||
CloseClipboard();
|
CloseClipboard();
|
||||||
|
@ -11,7 +11,7 @@ namespace irr
|
|||||||
|
|
||||||
class CIrrDeviceLinux;
|
class CIrrDeviceLinux;
|
||||||
|
|
||||||
//! The Operating system operator provides operation system specific methods and information.
|
//! The OSOperator provides OS-specific methods and information.
|
||||||
class COSOperator : public IOSOperator
|
class COSOperator : public IOSOperator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -27,25 +27,31 @@ public:
|
|||||||
COSOperator(const COSOperator &) = delete;
|
COSOperator(const COSOperator &) = delete;
|
||||||
COSOperator &operator=(const COSOperator &) = delete;
|
COSOperator &operator=(const COSOperator &) = delete;
|
||||||
|
|
||||||
//! returns the current operation system version as string.
|
//! Get the current OS version as string.
|
||||||
const core::stringc& getOperatingSystemVersion() const override;
|
const core::stringc& getOperatingSystemVersion() const override;
|
||||||
|
|
||||||
//! copies text to the clipboard
|
//! Copies text to the clipboard
|
||||||
|
//! \param text: text in utf-8
|
||||||
void copyToClipboard(const c8 *text) const override;
|
void copyToClipboard(const c8 *text) const override;
|
||||||
|
|
||||||
//! copies text to the primary selection
|
//! Copies text to the primary selection
|
||||||
|
//! This is a no-op on some platforms.
|
||||||
|
//! \param text: text in utf-8
|
||||||
void copyToPrimarySelection(const c8 *text) const override;
|
void copyToPrimarySelection(const c8 *text) const override;
|
||||||
|
|
||||||
//! gets text from the clipboard
|
//! Get text from the clipboard
|
||||||
|
//! \return Returns 0 if no string is in there, otherwise an utf-8 string.
|
||||||
const c8* getTextFromClipboard() const override;
|
const c8* getTextFromClipboard() const override;
|
||||||
|
|
||||||
//! gets text from the primary selection
|
//! Get text from the primary selection
|
||||||
|
//! This is a no-op on some platforms.
|
||||||
|
//! \return Returns 0 if no string is in there, otherwise an utf-8 string.
|
||||||
const c8* getTextFromPrimarySelection() const override;
|
const c8* getTextFromPrimarySelection() const override;
|
||||||
|
|
||||||
//! gets the total and available system RAM in kB
|
//! Get the total and available system RAM
|
||||||
//! \param Total: will contain the total system memory
|
/** \param totalBytes: will contain the total system memory in Kilobytes (1024 B)
|
||||||
//! \param Avail: will contain the available memory
|
\param availableBytes: will contain the available memory in Kilobytes (1024 B)
|
||||||
//! \return Returns true if successful, false if not
|
\return True if successful, false if not */
|
||||||
bool getSystemMemory(u32* Total, u32* Avail) const override;
|
bool getSystemMemory(u32* Total, u32* Avail) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -48,7 +48,7 @@ bool COpenGLDriver::initDriver()
|
|||||||
|
|
||||||
genericDriverInit();
|
genericDriverInit();
|
||||||
|
|
||||||
#if defined(_IRR_WINDOWS_API_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_)
|
#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_)
|
||||||
extGlSwapInterval(Params.Vsync ? 1 : 0);
|
extGlSwapInterval(Params.Vsync ? 1 : 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -725,7 +725,7 @@ IRenderTarget* COpenGLDriver::addRenderTarget()
|
|||||||
|
|
||||||
|
|
||||||
// small helper function to create vertex buffer object address offsets
|
// small helper function to create vertex buffer object address offsets
|
||||||
static inline const GLvoid * buffer_offset(const long offset)
|
static inline const GLvoid * buffer_offset(const size_t offset)
|
||||||
{
|
{
|
||||||
return (const GLvoid *)offset;
|
return (const GLvoid *)offset;
|
||||||
}
|
}
|
||||||
|
@ -443,7 +443,7 @@ namespace video
|
|||||||
core::matrix4 Matrices[ETS_COUNT];
|
core::matrix4 Matrices[ETS_COUNT];
|
||||||
core::array<u8> ColorBuffer;
|
core::array<u8> ColorBuffer;
|
||||||
|
|
||||||
//! enumeration for rendering modes such as 2d and 3d for minizing the switching of renderStates.
|
//! enumeration for rendering modes such as 2d and 3d for minimizing the switching of renderStates.
|
||||||
enum E_RENDER_MODE
|
enum E_RENDER_MODE
|
||||||
{
|
{
|
||||||
ERM_NONE = 0, // no render state has been set yet.
|
ERM_NONE = 0, // no render state has been set yet.
|
||||||
|
@ -3391,7 +3391,7 @@ inline void COpenGLExtensionHandler::extGlGenerateTextureMipmap(GLuint texture,
|
|||||||
inline void COpenGLExtensionHandler::extGlSwapInterval(int interval)
|
inline void COpenGLExtensionHandler::extGlSwapInterval(int interval)
|
||||||
{
|
{
|
||||||
// we have wglext, so try to use that
|
// we have wglext, so try to use that
|
||||||
#if defined(_IRR_WINDOWS_API_)
|
#if defined(_IRR_WINDOWS_API_) && defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)
|
||||||
#ifdef WGL_EXT_swap_control
|
#ifdef WGL_EXT_swap_control
|
||||||
if (pWglSwapIntervalEXT)
|
if (pWglSwapIntervalEXT)
|
||||||
pWglSwapIntervalEXT(interval);
|
pWglSwapIntervalEXT(interval);
|
||||||
|
@ -119,7 +119,7 @@ CSceneManager::~CSceneManager()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! gets an animateable mesh. loads it if needed. returned pointer must not be dropped.
|
//! gets an animatable mesh. loads it if needed. returned pointer must not be dropped.
|
||||||
IAnimatedMesh* CSceneManager::getMesh(io::IReadFile* file)
|
IAnimatedMesh* CSceneManager::getMesh(io::IReadFile* file)
|
||||||
{
|
{
|
||||||
if (!file)
|
if (!file)
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#include "CWGLManager.h"
|
#include "CWGLManager.h"
|
||||||
|
|
||||||
|
#ifdef _IRR_COMPILE_WITH_WGL_MANAGER_
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
@ -505,3 +507,5 @@ bool CWGLManager::swapBuffers()
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef _IRR_COMPILE_WITH_WGL_MANAGER_
|
||||||
|
|
||||||
#include "SIrrCreationParameters.h"
|
#include "SIrrCreationParameters.h"
|
||||||
#include "SExposedVideoData.h"
|
#include "SExposedVideoData.h"
|
||||||
#include "IContextManager.h"
|
#include "IContextManager.h"
|
||||||
@ -70,3 +72,5 @@ namespace video
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
#endif
|
#endif
|
||||||
//#define BETTER_MESHBUFFER_SPLITTING_FOR_X
|
//#define BETTER_MESHBUFFER_SPLITTING_FOR_X
|
||||||
|
|
||||||
|
#define SET_ERR_AND_RETURN() do { ErrorState = true; return false; } while (0)
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
namespace scene
|
namespace scene
|
||||||
@ -24,7 +26,7 @@ namespace scene
|
|||||||
|
|
||||||
//! Constructor
|
//! Constructor
|
||||||
CXMeshFileLoader::CXMeshFileLoader(scene::ISceneManager* smgr)
|
CXMeshFileLoader::CXMeshFileLoader(scene::ISceneManager* smgr)
|
||||||
: AnimatedMesh(0), Buffer(0), P(0), End(0), BinaryNumCount(0), Line(0),
|
: AnimatedMesh(0), Buffer(0), P(0), End(0), BinaryNumCount(0), Line(0), ErrorState(false),
|
||||||
CurFrame(0), MajorVersion(0), MinorVersion(0), BinaryFormat(false), FloatSize(0)
|
CurFrame(0), MajorVersion(0), MinorVersion(0), BinaryFormat(false), FloatSize(0)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -396,7 +398,8 @@ bool CXMeshFileLoader::readFileIntoMemory(io::IReadFile* file)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer = new c8[size];
|
Buffer = new c8[size+1];
|
||||||
|
Buffer[size] = 0x0; // null-terminate
|
||||||
|
|
||||||
//! read all into memory
|
//! read all into memory
|
||||||
if (file->read(Buffer, size) != static_cast<size_t>(size))
|
if (file->read(Buffer, size) != static_cast<size_t>(size))
|
||||||
@ -465,7 +468,7 @@ bool CXMeshFileLoader::parseFile()
|
|||||||
// loop
|
// loop
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return !ErrorState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -544,7 +547,7 @@ bool CXMeshFileLoader::parseDataObjectTemplate()
|
|||||||
os::Printer::log("Left delimiter in template data object missing.",
|
os::Printer::log("Left delimiter in template data object missing.",
|
||||||
name.c_str(), ELL_WARNING);
|
name.c_str(), ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
// read GUID
|
// read GUID
|
||||||
@ -586,7 +589,7 @@ bool CXMeshFileLoader::parseDataObjectFrame(CSkinnedMesh::SJoint *Parent)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Frame found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Frame found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
CSkinnedMesh::SJoint *joint=0;
|
CSkinnedMesh::SJoint *joint=0;
|
||||||
@ -637,7 +640,7 @@ bool CXMeshFileLoader::parseDataObjectFrame(CSkinnedMesh::SJoint *Parent)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Unexpected ending found in Frame in x file.", ELL_WARNING);
|
os::Printer::log("Unexpected ending found in Frame in x file.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (objectName == "}")
|
if (objectName == "}")
|
||||||
@ -700,7 +703,7 @@ bool CXMeshFileLoader::parseDataObjectTransformationMatrix(core::matrix4 &mat)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Transformation Matrix found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Transformation Matrix found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
readMatrix(mat);
|
readMatrix(mat);
|
||||||
@ -715,7 +718,7 @@ bool CXMeshFileLoader::parseDataObjectTransformationMatrix(core::matrix4 &mat)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in Transformation Matrix found in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in Transformation Matrix found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -733,7 +736,7 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh)
|
|||||||
#endif
|
#endif
|
||||||
os::Printer::log("No opening brace in Mesh found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Mesh found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _XREADER_DEBUG
|
#ifdef _XREADER_DEBUG
|
||||||
@ -777,7 +780,7 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Invalid face count (<3) found in Mesh x file reader.", ELL_WARNING);
|
os::Printer::log("Invalid face count (<3) found in Mesh x file reader.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
// read face indices
|
// read face indices
|
||||||
@ -807,6 +810,15 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (u32 j = 0; j < mesh.Indices.size(); j++)
|
||||||
|
{
|
||||||
|
if (mesh.Indices[j] >= mesh.Vertices.size())
|
||||||
|
{
|
||||||
|
os::Printer::log("Out of range index found in Mesh x file reader.", ELL_WARNING);
|
||||||
|
SET_ERR_AND_RETURN();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!checkForTwoFollowingSemicolons())
|
if (!checkForTwoFollowingSemicolons())
|
||||||
{
|
{
|
||||||
os::Printer::log("No finishing semicolon in Mesh Face Array found in x file", ELL_WARNING);
|
os::Printer::log("No finishing semicolon in Mesh Face Array found in x file", ELL_WARNING);
|
||||||
@ -823,7 +835,7 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Unexpected ending found in Mesh in x file.", ELL_WARNING);
|
os::Printer::log("Unexpected ending found in Mesh in x file.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (objectName == "}")
|
if (objectName == "}")
|
||||||
@ -873,7 +885,7 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No starting brace in DeclData found.", ELL_WARNING);
|
os::Printer::log("No starting brace in DeclData found.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
// arbitrary vertex attributes
|
// arbitrary vertex attributes
|
||||||
// first comes the number of element definitions
|
// first comes the number of element definitions
|
||||||
@ -1004,7 +1016,7 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh)
|
|||||||
os::Printer::log("No closing brace in DeclData.", ELL_WARNING);
|
os::Printer::log("No closing brace in DeclData.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
delete [] data;
|
delete [] data;
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
u8* dataptr = (u8*) data;
|
u8* dataptr = (u8*) data;
|
||||||
if ((uv2pos != -1) && (uv2type == 1))
|
if ((uv2pos != -1) && (uv2type == 1))
|
||||||
@ -1028,7 +1040,7 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No starting brace in FVFData found.", ELL_WARNING);
|
os::Printer::log("No starting brace in FVFData found.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
const u32 dataformat = readInt();
|
const u32 dataformat = readInt();
|
||||||
const u32 datasize = readInt();
|
const u32 datasize = readInt();
|
||||||
@ -1056,7 +1068,7 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in FVFData found in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in FVFData found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1095,7 +1107,7 @@ bool CXMeshFileLoader::parseDataObjectSkinWeights(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Skin Weights found in .x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Skin Weights found in .x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
core::stringc TransformNodeName;
|
core::stringc TransformNodeName;
|
||||||
@ -1104,7 +1116,7 @@ bool CXMeshFileLoader::parseDataObjectSkinWeights(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Unknown syntax while reading transform node name string in .x file", ELL_WARNING);
|
os::Printer::log("Unknown syntax while reading transform node name string in .x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh.HasSkinning=true;
|
mesh.HasSkinning=true;
|
||||||
@ -1178,7 +1190,7 @@ bool CXMeshFileLoader::parseDataObjectSkinWeights(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in Skin Weights found in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in Skin Weights found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1195,7 +1207,7 @@ bool CXMeshFileLoader::parseDataObjectSkinMeshHeader(SXMesh& mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Skin Mesh header found in .x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Skin Mesh header found in .x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh.MaxSkinWeightsPerVertex = readInt();
|
mesh.MaxSkinWeightsPerVertex = readInt();
|
||||||
@ -1209,7 +1221,7 @@ bool CXMeshFileLoader::parseDataObjectSkinMeshHeader(SXMesh& mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in skin mesh header in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in skin mesh header in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1226,7 +1238,7 @@ bool CXMeshFileLoader::parseDataObjectMeshNormals(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Mesh Normals found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Mesh Normals found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
// read count
|
// read count
|
||||||
@ -1249,6 +1261,13 @@ bool CXMeshFileLoader::parseDataObjectMeshNormals(SXMesh &mesh)
|
|||||||
|
|
||||||
// read face normal indices
|
// read face normal indices
|
||||||
const u32 nFNormals = readInt();
|
const u32 nFNormals = readInt();
|
||||||
|
//if (nFNormals >= mesh.IndexCountPerFace.size())
|
||||||
|
if (0) // this condition doesn't work for some reason
|
||||||
|
{
|
||||||
|
os::Printer::log("Too many face normals found in x file", ELL_WARNING);
|
||||||
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
|
SET_ERR_AND_RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
u32 normalidx = 0;
|
u32 normalidx = 0;
|
||||||
core::array<u32> polygonfaces;
|
core::array<u32> polygonfaces;
|
||||||
@ -1262,7 +1281,7 @@ bool CXMeshFileLoader::parseDataObjectMeshNormals(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Not matching normal and face index count found in x file", ELL_WARNING);
|
os::Printer::log("Not matching normal and face index count found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (indexcount == 3)
|
if (indexcount == 3)
|
||||||
@ -1300,7 +1319,7 @@ bool CXMeshFileLoader::parseDataObjectMeshNormals(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in Mesh Normals found in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in Mesh Normals found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1317,10 +1336,18 @@ bool CXMeshFileLoader::parseDataObjectMeshTextureCoords(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Mesh Texture Coordinates found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Mesh Texture Coordinates found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
const u32 nCoords = readInt();
|
const u32 nCoords = readInt();
|
||||||
|
//if (nCoords >= mesh.Vertices.size())
|
||||||
|
if (0) // this condition doesn't work for some reason
|
||||||
|
{
|
||||||
|
os::Printer::log("Too many texture coords found in x file", ELL_WARNING);
|
||||||
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
|
SET_ERR_AND_RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
for (u32 i=0; i<nCoords; ++i)
|
for (u32 i=0; i<nCoords; ++i)
|
||||||
readVector2(mesh.Vertices[i].TCoords);
|
readVector2(mesh.Vertices[i].TCoords);
|
||||||
|
|
||||||
@ -1334,7 +1361,7 @@ bool CXMeshFileLoader::parseDataObjectMeshTextureCoords(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in Mesh Texture Coordinates Array found in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in Mesh Texture Coordinates Array found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1351,7 +1378,7 @@ bool CXMeshFileLoader::parseDataObjectMeshVertexColors(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace for Mesh Vertex Colors found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace for Mesh Vertex Colors found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh.HasVertexColors=true;
|
mesh.HasVertexColors=true;
|
||||||
@ -1363,7 +1390,7 @@ bool CXMeshFileLoader::parseDataObjectMeshVertexColors(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("index value in parseDataObjectMeshVertexColors out of bounds", ELL_WARNING);
|
os::Printer::log("index value in parseDataObjectMeshVertexColors out of bounds", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
readRGBA(mesh.Vertices[Index].Color);
|
readRGBA(mesh.Vertices[Index].Color);
|
||||||
checkForOneFollowingSemicolons();
|
checkForOneFollowingSemicolons();
|
||||||
@ -1396,11 +1423,12 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Mesh Material List found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Mesh Material List found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
// read material count
|
// read material count
|
||||||
mesh.Materials.reallocate(readInt());
|
const u32 nMaterials = readInt();
|
||||||
|
mesh.Materials.reallocate(nMaterials);
|
||||||
|
|
||||||
// read non triangulated face material index count
|
// read non triangulated face material index count
|
||||||
const u32 nFaceIndices = readInt();
|
const u32 nFaceIndices = readInt();
|
||||||
@ -1419,6 +1447,12 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
if (tfi<nFaceIndices)
|
if (tfi<nFaceIndices)
|
||||||
ind = readInt();
|
ind = readInt();
|
||||||
|
if (ind >= core::max_(nMaterials, 1U))
|
||||||
|
{
|
||||||
|
os::Printer::log("Out of range index found in x file", ELL_WARNING);
|
||||||
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
|
SET_ERR_AND_RETURN();
|
||||||
|
}
|
||||||
const u32 fc = mesh.IndexCountPerFace[tfi]/3;
|
const u32 fc = mesh.IndexCountPerFace[tfi]/3;
|
||||||
for (u32 k=0; k<fc; ++k)
|
for (u32 k=0; k<fc; ++k)
|
||||||
mesh.FaceMaterialIndices[triangulatedindex++] = ind;
|
mesh.FaceMaterialIndices[triangulatedindex++] = ind;
|
||||||
@ -1442,7 +1476,7 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Unexpected ending found in Mesh Material list in .x file.", ELL_WARNING);
|
os::Printer::log("Unexpected ending found in Mesh Material list in .x file.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (objectName == "}")
|
if (objectName == "}")
|
||||||
@ -1492,7 +1526,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationSet()
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Animation Set found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Animation Set found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
os::Printer::log("Reading animationset ", AnimationName, ELL_DEBUG);
|
os::Printer::log("Reading animationset ", AnimationName, ELL_DEBUG);
|
||||||
|
|
||||||
@ -1504,7 +1538,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationSet()
|
|||||||
{
|
{
|
||||||
os::Printer::log("Unexpected ending found in Animation set in x file.", ELL_WARNING);
|
os::Printer::log("Unexpected ending found in Animation set in x file.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (objectName == "}")
|
if (objectName == "}")
|
||||||
@ -1537,7 +1571,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationTicksPerSecond()
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Animation found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Animation found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
const u32 ticks = readInt();
|
const u32 ticks = readInt();
|
||||||
@ -1546,14 +1580,14 @@ bool CXMeshFileLoader::parseDataObjectAnimationTicksPerSecond()
|
|||||||
{
|
{
|
||||||
os::Printer::log("No closing semicolon in AnimationTicksPerSecond in x file", ELL_WARNING);
|
os::Printer::log("No closing semicolon in AnimationTicksPerSecond in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checkForClosingBrace())
|
if (!checkForClosingBrace())
|
||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in AnimationTicksPerSecond in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in AnimationTicksPerSecond in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
AnimatedMesh->setAnimationSpeed(static_cast<irr::f32>(ticks));
|
AnimatedMesh->setAnimationSpeed(static_cast<irr::f32>(ticks));
|
||||||
@ -1571,7 +1605,7 @@ bool CXMeshFileLoader::parseDataObjectAnimation()
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Animation found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Animation found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
//anim.closed = true;
|
//anim.closed = true;
|
||||||
@ -1588,7 +1622,7 @@ bool CXMeshFileLoader::parseDataObjectAnimation()
|
|||||||
{
|
{
|
||||||
os::Printer::log("Unexpected ending found in Animation in x file.", ELL_WARNING);
|
os::Printer::log("Unexpected ending found in Animation in x file.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (objectName == "}")
|
if (objectName == "}")
|
||||||
@ -1618,14 +1652,14 @@ bool CXMeshFileLoader::parseDataObjectAnimation()
|
|||||||
{
|
{
|
||||||
os::Printer::log("Unexpected ending found in Animation in x file.", ELL_WARNING);
|
os::Printer::log("Unexpected ending found in Animation in x file.", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
os::Printer::log("Unknown data object in animation in x file", objectName.c_str(), ELL_WARNING);
|
os::Printer::log("Unknown data object in animation in x file", objectName.c_str(), ELL_WARNING);
|
||||||
if (!parseUnknownDataObject())
|
if (!parseUnknownDataObject())
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1690,7 +1724,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Animation Key found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Animation Key found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
// read key type
|
// read key type
|
||||||
@ -1701,7 +1735,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Unknown key type found in Animation Key in x file", ELL_WARNING);
|
os::Printer::log("Unknown key type found in Animation Key in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
// read number of keys
|
// read number of keys
|
||||||
@ -1729,7 +1763,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Expected 4 numbers in animation key in x file", ELL_WARNING);
|
os::Printer::log("Expected 4 numbers in animation key in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
f32 W = -readFloat();
|
f32 W = -readFloat();
|
||||||
@ -1759,7 +1793,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Expected 3 numbers in animation key in x file", ELL_WARNING);
|
os::Printer::log("Expected 3 numbers in animation key in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
core::vector3df vector;
|
core::vector3df vector;
|
||||||
@ -1795,7 +1829,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
|||||||
{
|
{
|
||||||
os::Printer::log("Expected 16 numbers in animation key in x file", ELL_WARNING);
|
os::Printer::log("Expected 16 numbers in animation key in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
// read matrix
|
// read matrix
|
||||||
@ -1848,7 +1882,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
|||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in animation key in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in animation key in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1865,21 +1899,21 @@ bool CXMeshFileLoader::parseDataObjectTextureFilename(core::stringc& texturename
|
|||||||
{
|
{
|
||||||
os::Printer::log("No opening brace in Texture filename found in x file", ELL_WARNING);
|
os::Printer::log("No opening brace in Texture filename found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!getNextTokenAsString(texturename))
|
if (!getNextTokenAsString(texturename))
|
||||||
{
|
{
|
||||||
os::Printer::log("Unknown syntax while reading texture filename string in x file", ELL_WARNING);
|
os::Printer::log("Unknown syntax while reading texture filename string in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checkForClosingBrace())
|
if (!checkForClosingBrace())
|
||||||
{
|
{
|
||||||
os::Printer::log("No closing brace in Texture filename found in x file", ELL_WARNING);
|
os::Printer::log("No closing brace in Texture filename found in x file", ELL_WARNING);
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
return false;
|
SET_ERR_AND_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -167,6 +167,8 @@ private:
|
|||||||
u32 Line;
|
u32 Line;
|
||||||
io::path FilePath;
|
io::path FilePath;
|
||||||
|
|
||||||
|
bool ErrorState;
|
||||||
|
|
||||||
CSkinnedMesh::SJoint *CurFrame;
|
CSkinnedMesh::SJoint *CurFrame;
|
||||||
|
|
||||||
core::array<SXMesh*> Meshes;
|
core::array<SXMesh*> Meshes;
|
||||||
|
@ -13,7 +13,7 @@ static const char* const copyright = "Irrlicht Engine (c) 2002-2017 Nikolaus Geb
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "irrlicht.h"
|
#include "irrlicht.h"
|
||||||
#ifdef _IRR_WINDOWS_API_
|
#ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||||
#include "CIrrDeviceWin32.h"
|
#include "CIrrDeviceWin32.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ namespace irr
|
|||||||
|
|
||||||
IrrlichtDevice* dev = 0;
|
IrrlichtDevice* dev = 0;
|
||||||
|
|
||||||
#ifdef _IRR_WINDOWS_API_
|
#ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
||||||
if (params.DeviceType == EIDT_WIN32 || (!dev && params.DeviceType == EIDT_BEST))
|
if (params.DeviceType == EIDT_WIN32 || (!dev && params.DeviceType == EIDT_BEST))
|
||||||
dev = new CIrrDeviceWin32(params);
|
dev = new CIrrDeviceWin32(params);
|
||||||
#endif
|
#endif
|
||||||
|
Binary file not shown.
@ -46,25 +46,21 @@ namespace video
|
|||||||
|
|
||||||
struct VertexType {
|
struct VertexType {
|
||||||
int VertexSize;
|
int VertexSize;
|
||||||
int AttributeCount;
|
std::vector<VertexAttribute> Attributes;
|
||||||
VertexAttribute Attributes[];
|
|
||||||
|
|
||||||
VertexType(const VertexType &) = delete;
|
|
||||||
VertexType &operator= (const VertexType &) = delete;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const VertexAttribute *begin(const VertexType &type)
|
static const VertexAttribute *begin(const VertexType &type)
|
||||||
{
|
{
|
||||||
return type.Attributes;
|
return type.Attributes.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VertexAttribute *end(const VertexType &type)
|
static const VertexAttribute *end(const VertexType &type)
|
||||||
{
|
{
|
||||||
return type.Attributes + type.AttributeCount;
|
return type.Attributes.data() + type.Attributes.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr VertexType vtStandard = {
|
static const VertexType vtStandard = {
|
||||||
sizeof(S3DVertex), 4, {
|
sizeof(S3DVertex), {
|
||||||
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, Pos)},
|
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, Pos)},
|
||||||
{EVA_NORMAL, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, Normal)},
|
{EVA_NORMAL, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, Normal)},
|
||||||
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertex, Color)},
|
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertex, Color)},
|
||||||
@ -75,8 +71,8 @@ namespace video
|
|||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Winvalid-offsetof"
|
#pragma GCC diagnostic ignored "-Winvalid-offsetof"
|
||||||
|
|
||||||
static constexpr VertexType vt2TCoords = {
|
static const VertexType vt2TCoords = {
|
||||||
sizeof(S3DVertex2TCoords), 5, {
|
sizeof(S3DVertex2TCoords), {
|
||||||
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex2TCoords, Pos)},
|
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex2TCoords, Pos)},
|
||||||
{EVA_NORMAL, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex2TCoords, Normal)},
|
{EVA_NORMAL, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex2TCoords, Normal)},
|
||||||
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertex2TCoords, Color)},
|
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertex2TCoords, Color)},
|
||||||
@ -85,8 +81,8 @@ namespace video
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr VertexType vtTangents = {
|
static const VertexType vtTangents = {
|
||||||
sizeof(S3DVertexTangents), 6, {
|
sizeof(S3DVertexTangents), {
|
||||||
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertexTangents, Pos)},
|
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertexTangents, Pos)},
|
||||||
{EVA_NORMAL, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertexTangents, Normal)},
|
{EVA_NORMAL, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertexTangents, Normal)},
|
||||||
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertexTangents, Color)},
|
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertexTangents, Color)},
|
||||||
@ -108,16 +104,16 @@ namespace video
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr VertexType vt2DImage = {
|
static const VertexType vt2DImage = {
|
||||||
sizeof(S3DVertex), 3, {
|
sizeof(S3DVertex), {
|
||||||
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, Pos)},
|
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, Pos)},
|
||||||
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertex, Color)},
|
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertex, Color)},
|
||||||
{EVA_TCOORD0, 2, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, TCoords)},
|
{EVA_TCOORD0, 2, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, TCoords)},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr VertexType vtPrimitive = {
|
static const VertexType vtPrimitive = {
|
||||||
sizeof(S3DVertex), 2, {
|
sizeof(S3DVertex), {
|
||||||
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, Pos)},
|
{EVA_POSITION, 3, GL_FLOAT, VertexAttribute::Mode::Regular, offsetof(S3DVertex, Pos)},
|
||||||
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertex, Color)},
|
{EVA_COLOR, 4, GL_UNSIGNED_BYTE, VertexAttribute::Mode::Normalized, offsetof(S3DVertex, Color)},
|
||||||
},
|
},
|
||||||
@ -196,19 +192,19 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
QuadsIndices.push_back(4 * k + 2);
|
QuadsIndices.push_back(4 * k + 2);
|
||||||
QuadsIndices.push_back(4 * k + 3);
|
QuadsIndices.push_back(4 * k + 3);
|
||||||
}
|
}
|
||||||
glGenBuffers(1, &QuadIndexBuffer);
|
GL.GenBuffers(1, &QuadIndexBuffer);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, QuadIndexBuffer);
|
GL.BindBuffer(GL_ARRAY_BUFFER, QuadIndexBuffer);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(QuadsIndices[0]) * QuadsIndices.size(), QuadsIndices.data(), GL_STATIC_DRAW);
|
GL.BufferData(GL_ARRAY_BUFFER, sizeof(QuadsIndices[0]) * QuadsIndices.size(), QuadsIndices.data(), GL_STATIC_DRAW);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
GL.BindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
QuadIndexCount = QuadsIndices.size();
|
QuadIndexCount = QuadsIndices.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void COpenGL3DriverBase::initVersion() {
|
void COpenGL3DriverBase::initVersion() {
|
||||||
Name = glGetString(GL_VERSION);
|
Name = GL.GetString(GL_VERSION);
|
||||||
printVersion();
|
printVersion();
|
||||||
|
|
||||||
// print renderer information
|
// print renderer information
|
||||||
VendorName = glGetString(GL_VENDOR);
|
VendorName = GL.GetString(GL_VENDOR);
|
||||||
os::Printer::log(VendorName.c_str(), ELL_INFORMATION);
|
os::Printer::log(VendorName.c_str(), ELL_INFORMATION);
|
||||||
|
|
||||||
Version = getVersionFromOpenGL();
|
Version = getVersionFromOpenGL();
|
||||||
@ -246,7 +242,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
DriverAttributes->setAttribute("Version", 100 * Version.Major + Version.Minor);
|
DriverAttributes->setAttribute("Version", 100 * Version.Major + Version.Minor);
|
||||||
DriverAttributes->setAttribute("AntiAlias", AntiAlias);
|
DriverAttributes->setAttribute("AntiAlias", AntiAlias);
|
||||||
|
|
||||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
GL.PixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||||
|
|
||||||
UserClipPlane.reallocate(0);
|
UserClipPlane.reallocate(0);
|
||||||
|
|
||||||
@ -254,10 +250,10 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
setTransform(static_cast<E_TRANSFORMATION_STATE>(i), core::IdentityMatrix);
|
setTransform(static_cast<E_TRANSFORMATION_STATE>(i), core::IdentityMatrix);
|
||||||
|
|
||||||
setAmbientLight(SColorf(0.0f, 0.0f, 0.0f, 0.0f));
|
setAmbientLight(SColorf(0.0f, 0.0f, 0.0f, 0.0f));
|
||||||
glClearDepthf(1.0f);
|
GL.ClearDepthf(1.0f);
|
||||||
|
|
||||||
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
|
GL.Hint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
|
||||||
glFrontFace(GL_CW);
|
GL.FrontFace(GL_CW);
|
||||||
|
|
||||||
// create material renderers
|
// create material renderers
|
||||||
createMaterialRenderers();
|
createMaterialRenderers();
|
||||||
@ -422,7 +418,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
{
|
{
|
||||||
CNullDriver::endScene();
|
CNullDriver::endScene();
|
||||||
|
|
||||||
glFlush();
|
GL.Flush();
|
||||||
|
|
||||||
if (ContextManager)
|
if (ContextManager)
|
||||||
return ContextManager->swapBuffers();
|
return ContextManager->swapBuffers();
|
||||||
@ -464,7 +460,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
bool newBuffer = false;
|
bool newBuffer = false;
|
||||||
if (!HWBuffer->vbo_verticesID)
|
if (!HWBuffer->vbo_verticesID)
|
||||||
{
|
{
|
||||||
glGenBuffers(1, &HWBuffer->vbo_verticesID);
|
GL.GenBuffers(1, &HWBuffer->vbo_verticesID);
|
||||||
if (!HWBuffer->vbo_verticesID) return false;
|
if (!HWBuffer->vbo_verticesID) return false;
|
||||||
newBuffer = true;
|
newBuffer = true;
|
||||||
}
|
}
|
||||||
@ -473,22 +469,22 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
newBuffer = true;
|
newBuffer = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID);
|
GL.BindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID);
|
||||||
|
|
||||||
// copy data to graphics card
|
// copy data to graphics card
|
||||||
if (!newBuffer)
|
if (!newBuffer)
|
||||||
glBufferSubData(GL_ARRAY_BUFFER, 0, bufferSize, buffer);
|
GL.BufferSubData(GL_ARRAY_BUFFER, 0, bufferSize, buffer);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HWBuffer->vbo_verticesSize = bufferSize;
|
HWBuffer->vbo_verticesSize = bufferSize;
|
||||||
|
|
||||||
if (HWBuffer->Mapped_Vertex == scene::EHM_STATIC)
|
if (HWBuffer->Mapped_Vertex == scene::EHM_STATIC)
|
||||||
glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW);
|
GL.BufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW);
|
||||||
else
|
else
|
||||||
glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_DYNAMIC_DRAW);
|
GL.BufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_DYNAMIC_DRAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
GL.BindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
return (!testGLError(__LINE__));
|
return (!testGLError(__LINE__));
|
||||||
}
|
}
|
||||||
@ -527,7 +523,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
bool newBuffer = false;
|
bool newBuffer = false;
|
||||||
if (!HWBuffer->vbo_indicesID)
|
if (!HWBuffer->vbo_indicesID)
|
||||||
{
|
{
|
||||||
glGenBuffers(1, &HWBuffer->vbo_indicesID);
|
GL.GenBuffers(1, &HWBuffer->vbo_indicesID);
|
||||||
if (!HWBuffer->vbo_indicesID) return false;
|
if (!HWBuffer->vbo_indicesID) return false;
|
||||||
newBuffer = true;
|
newBuffer = true;
|
||||||
}
|
}
|
||||||
@ -536,22 +532,22 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
newBuffer = true;
|
newBuffer = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
|
GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
|
||||||
|
|
||||||
// copy data to graphics card
|
// copy data to graphics card
|
||||||
if (!newBuffer)
|
if (!newBuffer)
|
||||||
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexCount * indexSize, indices);
|
GL.BufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexCount * indexSize, indices);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HWBuffer->vbo_indicesSize = indexCount * indexSize;
|
HWBuffer->vbo_indicesSize = indexCount * indexSize;
|
||||||
|
|
||||||
if (HWBuffer->Mapped_Index == scene::EHM_STATIC)
|
if (HWBuffer->Mapped_Index == scene::EHM_STATIC)
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STATIC_DRAW);
|
GL.BufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STATIC_DRAW);
|
||||||
else
|
else
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_DYNAMIC_DRAW);
|
GL.BufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_DYNAMIC_DRAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
return (!testGLError(__LINE__));
|
return (!testGLError(__LINE__));
|
||||||
}
|
}
|
||||||
@ -631,12 +627,12 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
SHWBufferLink_opengl *HWBuffer = static_cast<SHWBufferLink_opengl*>(_HWBuffer);
|
SHWBufferLink_opengl *HWBuffer = static_cast<SHWBufferLink_opengl*>(_HWBuffer);
|
||||||
if (HWBuffer->vbo_verticesID)
|
if (HWBuffer->vbo_verticesID)
|
||||||
{
|
{
|
||||||
glDeleteBuffers(1, &HWBuffer->vbo_verticesID);
|
GL.DeleteBuffers(1, &HWBuffer->vbo_verticesID);
|
||||||
HWBuffer->vbo_verticesID = 0;
|
HWBuffer->vbo_verticesID = 0;
|
||||||
}
|
}
|
||||||
if (HWBuffer->vbo_indicesID)
|
if (HWBuffer->vbo_indicesID)
|
||||||
{
|
{
|
||||||
glDeleteBuffers(1, &HWBuffer->vbo_indicesID);
|
GL.DeleteBuffers(1, &HWBuffer->vbo_indicesID);
|
||||||
HWBuffer->vbo_indicesID = 0;
|
HWBuffer->vbo_indicesID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -660,13 +656,13 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
|
|
||||||
if (HWBuffer->Mapped_Vertex != scene::EHM_NEVER)
|
if (HWBuffer->Mapped_Vertex != scene::EHM_NEVER)
|
||||||
{
|
{
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID);
|
GL.BindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID);
|
||||||
vertices = 0;
|
vertices = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HWBuffer->Mapped_Index != scene::EHM_NEVER)
|
if (HWBuffer->Mapped_Index != scene::EHM_NEVER)
|
||||||
{
|
{
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
|
GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
|
||||||
indexList = 0;
|
indexList = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -677,10 +673,10 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
mb->getIndexType());
|
mb->getIndexType());
|
||||||
|
|
||||||
if (HWBuffer->Mapped_Vertex != scene::EHM_NEVER)
|
if (HWBuffer->Mapped_Vertex != scene::EHM_NEVER)
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
GL.BindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
if (HWBuffer->Mapped_Index != scene::EHM_NEVER)
|
if (HWBuffer->Mapped_Index != scene::EHM_NEVER)
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -745,25 +741,25 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
{
|
{
|
||||||
case scene::EPT_POINTS:
|
case scene::EPT_POINTS:
|
||||||
case scene::EPT_POINT_SPRITES:
|
case scene::EPT_POINT_SPRITES:
|
||||||
glDrawArrays(GL_POINTS, 0, primitiveCount);
|
GL.DrawArrays(GL_POINTS, 0, primitiveCount);
|
||||||
break;
|
break;
|
||||||
case scene::EPT_LINE_STRIP:
|
case scene::EPT_LINE_STRIP:
|
||||||
glDrawElements(GL_LINE_STRIP, primitiveCount + 1, indexSize, indexList);
|
GL.DrawElements(GL_LINE_STRIP, primitiveCount + 1, indexSize, indexList);
|
||||||
break;
|
break;
|
||||||
case scene::EPT_LINE_LOOP:
|
case scene::EPT_LINE_LOOP:
|
||||||
glDrawElements(GL_LINE_LOOP, primitiveCount, indexSize, indexList);
|
GL.DrawElements(GL_LINE_LOOP, primitiveCount, indexSize, indexList);
|
||||||
break;
|
break;
|
||||||
case scene::EPT_LINES:
|
case scene::EPT_LINES:
|
||||||
glDrawElements(GL_LINES, primitiveCount*2, indexSize, indexList);
|
GL.DrawElements(GL_LINES, primitiveCount*2, indexSize, indexList);
|
||||||
break;
|
break;
|
||||||
case scene::EPT_TRIANGLE_STRIP:
|
case scene::EPT_TRIANGLE_STRIP:
|
||||||
glDrawElements(GL_TRIANGLE_STRIP, primitiveCount + 2, indexSize, indexList);
|
GL.DrawElements(GL_TRIANGLE_STRIP, primitiveCount + 2, indexSize, indexList);
|
||||||
break;
|
break;
|
||||||
case scene::EPT_TRIANGLE_FAN:
|
case scene::EPT_TRIANGLE_FAN:
|
||||||
glDrawElements(GL_TRIANGLE_FAN, primitiveCount + 2, indexSize, indexList);
|
GL.DrawElements(GL_TRIANGLE_FAN, primitiveCount + 2, indexSize, indexList);
|
||||||
break;
|
break;
|
||||||
case scene::EPT_TRIANGLES:
|
case scene::EPT_TRIANGLES:
|
||||||
glDrawElements((LastMaterial.Wireframe) ? GL_LINES : (LastMaterial.PointCloud) ? GL_POINTS : GL_TRIANGLES, primitiveCount*3, indexSize, indexList);
|
GL.DrawElements((LastMaterial.Wireframe) ? GL_LINES : (LastMaterial.PointCloud) ? GL_POINTS : GL_TRIANGLES, primitiveCount*3, indexSize, indexList);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -831,8 +827,8 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
if (!clipRect->isValid())
|
if (!clipRect->isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
GL.Enable(GL_SCISSOR_TEST);
|
||||||
glScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height - clipRect->LowerRightCorner.Y,
|
GL.Scissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height - clipRect->LowerRightCorner.Y,
|
||||||
clipRect->getWidth(), clipRect->getHeight());
|
clipRect->getWidth(), clipRect->getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -850,7 +846,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
drawQuad(vt2DImage, vertices);
|
drawQuad(vt2DImage, vertices);
|
||||||
|
|
||||||
if (clipRect)
|
if (clipRect)
|
||||||
glDisable(GL_SCISSOR_TEST);
|
GL.Disable(GL_SCISSOR_TEST);
|
||||||
|
|
||||||
testGLError(__LINE__);
|
testGLError(__LINE__);
|
||||||
}
|
}
|
||||||
@ -910,8 +906,8 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
if (!clipRect->isValid())
|
if (!clipRect->isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
GL.Enable(GL_SCISSOR_TEST);
|
||||||
glScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height - clipRect->LowerRightCorner.Y,
|
GL.Scissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height - clipRect->LowerRightCorner.Y,
|
||||||
clipRect->getWidth(), clipRect->getHeight());
|
clipRect->getWidth(), clipRect->getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -956,12 +952,12 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y));
|
tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y));
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, QuadIndexBuffer);
|
GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, QuadIndexBuffer);
|
||||||
drawElements(GL_TRIANGLES, vt2DImage, vtx.const_pointer(), vtx.size(), 0, 6 * drawCount);
|
drawElements(GL_TRIANGLES, vt2DImage, vtx.const_pointer(), vtx.size(), 0, 6 * drawCount);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
if (clipRect)
|
if (clipRect)
|
||||||
glDisable(GL_SCISSOR_TEST);
|
GL.Disable(GL_SCISSOR_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1097,25 +1093,25 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
void COpenGL3DriverBase::drawArrays(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount)
|
void COpenGL3DriverBase::drawArrays(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount)
|
||||||
{
|
{
|
||||||
beginDraw(vertexType, reinterpret_cast<uintptr_t>(vertices));
|
beginDraw(vertexType, reinterpret_cast<uintptr_t>(vertices));
|
||||||
glDrawArrays(primitiveType, 0, vertexCount);
|
GL.DrawArrays(primitiveType, 0, vertexCount);
|
||||||
endDraw(vertexType);
|
endDraw(vertexType);
|
||||||
}
|
}
|
||||||
|
|
||||||
void COpenGL3DriverBase::drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount, const u16 *indices, int indexCount)
|
void COpenGL3DriverBase::drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount, const u16 *indices, int indexCount)
|
||||||
{
|
{
|
||||||
beginDraw(vertexType, reinterpret_cast<uintptr_t>(vertices));
|
beginDraw(vertexType, reinterpret_cast<uintptr_t>(vertices));
|
||||||
glDrawRangeElements(primitiveType, 0, vertexCount - 1, indexCount, GL_UNSIGNED_SHORT, indices);
|
GL.DrawRangeElements(primitiveType, 0, vertexCount - 1, indexCount, GL_UNSIGNED_SHORT, indices);
|
||||||
endDraw(vertexType);
|
endDraw(vertexType);
|
||||||
}
|
}
|
||||||
|
|
||||||
void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verticesBase)
|
void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verticesBase)
|
||||||
{
|
{
|
||||||
for (auto attr: vertexType) {
|
for (auto attr: vertexType) {
|
||||||
glEnableVertexAttribArray(attr.Index);
|
GL.EnableVertexAttribArray(attr.Index);
|
||||||
switch (attr.mode) {
|
switch (attr.mode) {
|
||||||
case VertexAttribute::Mode::Regular: glVertexAttribPointer(attr.Index, attr.ComponentCount, attr.ComponentType, GL_FALSE, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset)); break;
|
case VertexAttribute::Mode::Regular: GL.VertexAttribPointer(attr.Index, attr.ComponentCount, attr.ComponentType, GL_FALSE, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset)); break;
|
||||||
case VertexAttribute::Mode::Normalized: glVertexAttribPointer(attr.Index, attr.ComponentCount, attr.ComponentType, GL_TRUE, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset)); break;
|
case VertexAttribute::Mode::Normalized: GL.VertexAttribPointer(attr.Index, attr.ComponentCount, attr.ComponentType, GL_TRUE, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset)); break;
|
||||||
case VertexAttribute::Mode::Integral: glVertexAttribIPointer(attr.Index, attr.ComponentCount, attr.ComponentType, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset)); break;
|
case VertexAttribute::Mode::Integral: GL.VertexAttribIPointer(attr.Index, attr.ComponentCount, attr.ComponentType, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset)); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1123,7 +1119,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
void COpenGL3DriverBase::endDraw(const VertexType &vertexType)
|
void COpenGL3DriverBase::endDraw(const VertexType &vertexType)
|
||||||
{
|
{
|
||||||
for (auto attr: vertexType)
|
for (auto attr: vertexType)
|
||||||
glDisableVertexAttribArray(attr.Index);
|
GL.DisableVertexAttribArray(attr.Index);
|
||||||
}
|
}
|
||||||
|
|
||||||
ITexture* COpenGL3DriverBase::createDeviceDependentTexture(const io::path& name, IImage* image)
|
ITexture* COpenGL3DriverBase::createDeviceDependentTexture(const io::path& name, IImage* image)
|
||||||
@ -1160,7 +1156,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
bool COpenGL3DriverBase::testGLError(int code)
|
bool COpenGL3DriverBase::testGLError(int code)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
GLenum g = glGetError();
|
GLenum g = GL.GetError();
|
||||||
switch (g)
|
switch (g)
|
||||||
{
|
{
|
||||||
case GL_NO_ERROR:
|
case GL_NO_ERROR:
|
||||||
@ -1422,15 +1418,15 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
// TODO: Polygon Offset. Not sure if it was left out deliberately or if it won't work with this driver.
|
// TODO: Polygon Offset. Not sure if it was left out deliberately or if it won't work with this driver.
|
||||||
|
|
||||||
if (resetAllRenderStates || lastmaterial.Thickness != material.Thickness)
|
if (resetAllRenderStates || lastmaterial.Thickness != material.Thickness)
|
||||||
glLineWidth(core::clamp(static_cast<GLfloat>(material.Thickness), DimAliasedLine[0], DimAliasedLine[1]));
|
GL.LineWidth(core::clamp(static_cast<GLfloat>(material.Thickness), DimAliasedLine[0], DimAliasedLine[1]));
|
||||||
|
|
||||||
// Anti aliasing
|
// Anti aliasing
|
||||||
if (resetAllRenderStates || lastmaterial.AntiAliasing != material.AntiAliasing)
|
if (resetAllRenderStates || lastmaterial.AntiAliasing != material.AntiAliasing)
|
||||||
{
|
{
|
||||||
if (material.AntiAliasing & EAAM_ALPHA_TO_COVERAGE)
|
if (material.AntiAliasing & EAAM_ALPHA_TO_COVERAGE)
|
||||||
glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
|
GL.Enable(GL_SAMPLE_ALPHA_TO_COVERAGE);
|
||||||
else if (lastmaterial.AntiAliasing & EAAM_ALPHA_TO_COVERAGE)
|
else if (lastmaterial.AntiAliasing & EAAM_ALPHA_TO_COVERAGE)
|
||||||
glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
|
GL.Disable(GL_SAMPLE_ALPHA_TO_COVERAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Texture parameters
|
// Texture parameters
|
||||||
@ -1459,7 +1455,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].MagFilter != tmpTexture->getStatesCache().MagFilter)
|
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].MagFilter != tmpTexture->getStatesCache().MagFilter)
|
||||||
{
|
{
|
||||||
E_TEXTURE_MAG_FILTER magFilter = material.TextureLayers[i].MagFilter;
|
E_TEXTURE_MAG_FILTER magFilter = material.TextureLayers[i].MagFilter;
|
||||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MAG_FILTER,
|
GL.TexParameteri(tmpTextureType, GL_TEXTURE_MAG_FILTER,
|
||||||
magFilter == ETMAGF_NEAREST ? GL_NEAREST :
|
magFilter == ETMAGF_NEAREST ? GL_NEAREST :
|
||||||
(assert(magFilter == ETMAGF_LINEAR), GL_LINEAR));
|
(assert(magFilter == ETMAGF_LINEAR), GL_LINEAR));
|
||||||
|
|
||||||
@ -1472,7 +1468,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
!tmpTexture->getStatesCache().MipMapStatus)
|
!tmpTexture->getStatesCache().MipMapStatus)
|
||||||
{
|
{
|
||||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayers[i].MinFilter;
|
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayers[i].MinFilter;
|
||||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
GL.TexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||||
minFilter == ETMINF_NEAREST_MIPMAP_NEAREST ? GL_NEAREST_MIPMAP_NEAREST :
|
minFilter == ETMINF_NEAREST_MIPMAP_NEAREST ? GL_NEAREST_MIPMAP_NEAREST :
|
||||||
minFilter == ETMINF_LINEAR_MIPMAP_NEAREST ? GL_LINEAR_MIPMAP_NEAREST :
|
minFilter == ETMINF_LINEAR_MIPMAP_NEAREST ? GL_LINEAR_MIPMAP_NEAREST :
|
||||||
minFilter == ETMINF_NEAREST_MIPMAP_LINEAR ? GL_NEAREST_MIPMAP_LINEAR :
|
minFilter == ETMINF_NEAREST_MIPMAP_LINEAR ? GL_NEAREST_MIPMAP_LINEAR :
|
||||||
@ -1488,7 +1484,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
tmpTexture->getStatesCache().MipMapStatus)
|
tmpTexture->getStatesCache().MipMapStatus)
|
||||||
{
|
{
|
||||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayers[i].MinFilter;
|
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayers[i].MinFilter;
|
||||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
GL.TexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||||
(minFilter == ETMINF_NEAREST_MIPMAP_NEAREST || minFilter == ETMINF_NEAREST_MIPMAP_LINEAR) ? GL_NEAREST :
|
(minFilter == ETMINF_NEAREST_MIPMAP_NEAREST || minFilter == ETMINF_NEAREST_MIPMAP_LINEAR) ? GL_NEAREST :
|
||||||
(assert(minFilter == ETMINF_LINEAR_MIPMAP_NEAREST || minFilter == ETMINF_LINEAR_MIPMAP_LINEAR), GL_LINEAR));
|
(assert(minFilter == ETMINF_LINEAR_MIPMAP_NEAREST || minFilter == ETMINF_LINEAR_MIPMAP_LINEAR), GL_LINEAR));
|
||||||
|
|
||||||
@ -1500,7 +1496,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
if (AnisotropicFilterSupported &&
|
if (AnisotropicFilterSupported &&
|
||||||
(!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].AnisotropicFilter != tmpTexture->getStatesCache().AnisotropicFilter))
|
(!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].AnisotropicFilter != tmpTexture->getStatesCache().AnisotropicFilter))
|
||||||
{
|
{
|
||||||
glTexParameteri(tmpTextureType, GL.TEXTURE_MAX_ANISOTROPY,
|
GL.TexParameteri(tmpTextureType, GL.TEXTURE_MAX_ANISOTROPY,
|
||||||
material.TextureLayers[i].AnisotropicFilter>1 ? core::min_(MaxAnisotropy, material.TextureLayers[i].AnisotropicFilter) : 1);
|
material.TextureLayers[i].AnisotropicFilter>1 ? core::min_(MaxAnisotropy, material.TextureLayers[i].AnisotropicFilter) : 1);
|
||||||
|
|
||||||
tmpTexture->getStatesCache().AnisotropicFilter = material.TextureLayers[i].AnisotropicFilter;
|
tmpTexture->getStatesCache().AnisotropicFilter = material.TextureLayers[i].AnisotropicFilter;
|
||||||
@ -1508,13 +1504,13 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
|
|
||||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].TextureWrapU != tmpTexture->getStatesCache().WrapU)
|
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].TextureWrapU != tmpTexture->getStatesCache().WrapU)
|
||||||
{
|
{
|
||||||
glTexParameteri(tmpTextureType, GL_TEXTURE_WRAP_S, getTextureWrapMode(material.TextureLayers[i].TextureWrapU));
|
GL.TexParameteri(tmpTextureType, GL_TEXTURE_WRAP_S, getTextureWrapMode(material.TextureLayers[i].TextureWrapU));
|
||||||
tmpTexture->getStatesCache().WrapU = material.TextureLayers[i].TextureWrapU;
|
tmpTexture->getStatesCache().WrapU = material.TextureLayers[i].TextureWrapU;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].TextureWrapV != tmpTexture->getStatesCache().WrapV)
|
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayers[i].TextureWrapV != tmpTexture->getStatesCache().WrapV)
|
||||||
{
|
{
|
||||||
glTexParameteri(tmpTextureType, GL_TEXTURE_WRAP_T, getTextureWrapMode(material.TextureLayers[i].TextureWrapV));
|
GL.TexParameteri(tmpTextureType, GL_TEXTURE_WRAP_T, getTextureWrapMode(material.TextureLayers[i].TextureWrapV));
|
||||||
tmpTexture->getStatesCache().WrapV = material.TextureLayers[i].TextureWrapV;
|
tmpTexture->getStatesCache().WrapV = material.TextureLayers[i].TextureWrapV;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1906,7 +1902,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
CacheHandler->setColorMask(ECP_ALL);
|
CacheHandler->setColorMask(ECP_ALL);
|
||||||
|
|
||||||
const f32 inv = 1.0f / 255.0f;
|
const f32 inv = 1.0f / 255.0f;
|
||||||
glClearColor(color.getRed() * inv, color.getGreen() * inv,
|
GL.ClearColor(color.getRed() * inv, color.getGreen() * inv,
|
||||||
color.getBlue() * inv, color.getAlpha() * inv);
|
color.getBlue() * inv, color.getAlpha() * inv);
|
||||||
|
|
||||||
mask |= GL_COLOR_BUFFER_BIT;
|
mask |= GL_COLOR_BUFFER_BIT;
|
||||||
@ -1915,18 +1911,18 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
if (flag & ECBF_DEPTH)
|
if (flag & ECBF_DEPTH)
|
||||||
{
|
{
|
||||||
CacheHandler->setDepthMask(true);
|
CacheHandler->setDepthMask(true);
|
||||||
glClearDepthf(depth);
|
GL.ClearDepthf(depth);
|
||||||
mask |= GL_DEPTH_BUFFER_BIT;
|
mask |= GL_DEPTH_BUFFER_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag & ECBF_STENCIL)
|
if (flag & ECBF_STENCIL)
|
||||||
{
|
{
|
||||||
glClearStencil(stencil);
|
GL.ClearStencil(stencil);
|
||||||
mask |= GL_STENCIL_BUFFER_BIT;
|
mask |= GL_STENCIL_BUFFER_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mask)
|
if (mask)
|
||||||
glClear(mask);
|
GL.Clear(mask);
|
||||||
|
|
||||||
CacheHandler->setColorMask(colorMask);
|
CacheHandler->setColorMask(colorMask);
|
||||||
CacheHandler->setDepthMask(depthMask);
|
CacheHandler->setDepthMask(depthMask);
|
||||||
@ -1945,8 +1941,8 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
GLint internalformat = GL_RGBA;
|
GLint internalformat = GL_RGBA;
|
||||||
GLint type = GL_UNSIGNED_BYTE;
|
GLint type = GL_UNSIGNED_BYTE;
|
||||||
{
|
{
|
||||||
// glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &internalformat);
|
// GL.GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &internalformat);
|
||||||
// glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &type);
|
// GL.GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &type);
|
||||||
// there's a format we don't support ATM
|
// there's a format we don't support ATM
|
||||||
if (GL_UNSIGNED_SHORT_4_4_4_4 == type)
|
if (GL_UNSIGNED_SHORT_4_4_4_4 == type)
|
||||||
{
|
{
|
||||||
@ -1981,7 +1977,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
glReadPixels(0, 0, ScreenSize.Width, ScreenSize.Height, internalformat, type, pixels);
|
GL.ReadPixels(0, 0, ScreenSize.Width, ScreenSize.Height, internalformat, type, pixels);
|
||||||
testGLError(__LINE__);
|
testGLError(__LINE__);
|
||||||
|
|
||||||
// opengl images are horizontally flipped, so we have to fix that here.
|
// opengl images are horizontally flipped, so we have to fix that here.
|
||||||
|
@ -17,7 +17,7 @@ namespace video
|
|||||||
{
|
{
|
||||||
void COpenGL3ExtensionHandler::initExtensionsOld()
|
void COpenGL3ExtensionHandler::initExtensionsOld()
|
||||||
{
|
{
|
||||||
auto extensions_string = reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS));
|
auto extensions_string = reinterpret_cast<const char *>(GL.GetString(GL_EXTENSIONS));
|
||||||
const char *pos = extensions_string;
|
const char *pos = extensions_string;
|
||||||
while (const char *next = strchr(pos, ' ')) {
|
while (const char *next = strchr(pos, ' ')) {
|
||||||
addExtension(std::string{pos, next});
|
addExtension(std::string{pos, next});
|
||||||
@ -39,7 +39,7 @@ namespace video
|
|||||||
Extensions.emplace(std::move(name));
|
Extensions.emplace(std::move(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool COpenGL3ExtensionHandler::queryExtension(const std::string &name) const{
|
bool COpenGL3ExtensionHandler::queryExtension(const std::string &name) const noexcept {
|
||||||
return Extensions.find(name) != Extensions.end();
|
return Extensions.find(name) != Extensions.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user