mirror of
https://github.com/minetest/irrlicht.git
synced 2025-07-03 08:40:26 +02:00
Compare commits
31 Commits
Author | SHA1 | Date | |
---|---|---|---|
128cf1696c | |||
3e81f38098 | |||
593103a261 | |||
0732807cc8 | |||
00a7741cd4 | |||
51ae495c4a | |||
6928c7eb6f | |||
372b3642bf | |||
51dad49d8b | |||
fc4eda0f44 | |||
401e769114 | |||
24594ce226 | |||
ba0396e93d | |||
c9b66c8c58 | |||
8b1d0db8e2 | |||
e469c54f76 | |||
df908ef4ea | |||
01586f584a | |||
95af6d7c08 | |||
00dd274510 | |||
d59bcdbd07 | |||
09b8837ef9 | |||
4fb1c55ec5 | |||
7fb36849c7 | |||
8c0ee7d9ab | |||
684293f527 | |||
1b8be72ccb | |||
d3132e0731 | |||
e5f69157db | |||
fa2a7dc236 | |||
7d1dc8b2d5 |
38
.github/workflows/build.yml
vendored
38
.github/workflows/build.yml
vendored
@ -58,37 +58,49 @@ jobs:
|
||||
LIBGL_ALWAYS_SOFTWARE=true xvfb-run ./AutomatedTest
|
||||
|
||||
win32:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install deps
|
||||
- name: Install compiler
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install cmake g++-mingw-w64-i686 -qyy
|
||||
sudo apt-get update && sudo apt-get install cmake -qyy
|
||||
wget http://minetest.kitsunemimi.pw/mingw-w64-i686_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz
|
||||
sudo tar -xaf mingw.tar.xz -C /usr
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
./scripts/ci-build-mingw.sh
|
||||
./scripts/ci-build-mingw.sh package
|
||||
env:
|
||||
CC: i686-w64-mingw32-gcc
|
||||
CXX: i686-w64-mingw32-g++
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: irrlicht-win32
|
||||
path: ./irrlicht-win32.zip
|
||||
|
||||
win64:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install deps
|
||||
- name: Install compiler
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install cmake g++-mingw-w64-x86-64 -qyy
|
||||
sudo apt-get update && sudo apt-get install cmake -qyy
|
||||
wget http://minetest.kitsunemimi.pw/mingw-w64-x86_64_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz
|
||||
sudo tar -xaf mingw.tar.xz -C /usr
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
./scripts/ci-build-mingw.sh
|
||||
./scripts/ci-build-mingw.sh package
|
||||
env:
|
||||
CC: x86_64-w64-mingw32-gcc
|
||||
CXX: x86_64-w64-mingw32-g++
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: irrlicht-win64
|
||||
path: ./irrlicht-win64.zip
|
||||
|
||||
macos:
|
||||
runs-on: macos-10.15
|
||||
steps:
|
||||
@ -100,5 +112,9 @@ jobs:
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake . -DCMAKE_FIND_FRAMEWORK=LAST
|
||||
cmake . -DCMAKE_FIND_FRAMEWORK=LAST -DBUILD_EXAMPLES=1
|
||||
make -j3
|
||||
|
||||
- name: Test (headless)
|
||||
run: |
|
||||
./bin/OSX/AutomatedTest null
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 2.2 KiB |
@ -1,24 +0,0 @@
|
||||
The Win64-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 Win64
|
||||
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
|
@ -9,6 +9,9 @@ Changes in ogl-es (not yet released - will be merged with trunk at some point)
|
||||
|
||||
--------------------------
|
||||
Changes in 1.9 (not yet released)
|
||||
- IBillboardSceneNode got functions to access meshbuffers. So uv-coordinates can now be modified directly (previously only possible via texture matrix).
|
||||
- vector3d scalar operator/ and operator/= no longer multiply by the inverse but use the expected division.
|
||||
Costs some speed, but fixes floating point troubles caused by this optimization (like x/x no longer being 1.0).
|
||||
- Add equals and set_data functions to core::array for easier working with blocks of data.
|
||||
- SIrrlichtCreationParameters::IgnoreInput set to false works again on X11.
|
||||
Thanks @ Victor Gaydov for report + patch + very good test cases! (bug #401)
|
||||
|
@ -1,34 +0,0 @@
|
||||
The Irrlicht Engine may be compiled to provide support for AES encrypted files. The implementation used by Irrlicht is provided by Dr Brian Gladman. The license for these files (including AES, a PRNG, SHA, and other algorithms) is as follows
|
||||
|
||||
/*
|
||||
---------------------------------------------------------------------------
|
||||
Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK.
|
||||
All rights reserved.
|
||||
|
||||
LICENSE TERMS
|
||||
|
||||
The free distribution and use of this software in both source and binary
|
||||
form is allowed (with or without changes) provided that:
|
||||
|
||||
1. distributions of this source code include the above copyright
|
||||
notice, this list of conditions and the following disclaimer;
|
||||
|
||||
2. distributions in binary form include the above copyright
|
||||
notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other associated materials;
|
||||
|
||||
3. the copyright holder's name is not used to endorse products
|
||||
built using this software without specific written permission.
|
||||
|
||||
ALTERNATIVELY, provided that this notice is retained in full, this product
|
||||
may be distributed under the terms of the GNU General Public License (GPL),
|
||||
in which case the provisions of the GPL apply INSTEAD OF those given above.
|
||||
|
||||
DISCLAIMER
|
||||
|
||||
This software is provided 'as is' with no explicit or implied warranties
|
||||
in respect of its properties, including, but not limited to, correctness
|
||||
and/or fitness for purpose.
|
||||
---------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -1,42 +0,0 @@
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
This program, "bzip2", the associated library "libbzip2", and all
|
||||
documentation, are copyright (C) 1996-2007 Julian R Seward. All
|
||||
rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. 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.
|
||||
|
||||
3. Altered source versions must be plainly marked as such, and must
|
||||
not be misrepresented as being the original software.
|
||||
|
||||
4. The name of the author may not be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Julian Seward, jseward@bzip.org
|
||||
bzip2/libbzip2 version 1.0.5 of 10 December 2007
|
||||
|
||||
--------------------------------------------------------------------------
|
@ -1,351 +0,0 @@
|
||||
The Independent JPEG Group's JPEG software
|
||||
==========================================
|
||||
|
||||
README for release 8d of 15-Jan-2012
|
||||
====================================
|
||||
|
||||
This distribution contains the eighth public release of the Independent JPEG
|
||||
Group's free JPEG software. You are welcome to redistribute this software and
|
||||
to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
|
||||
|
||||
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
||||
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
||||
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
|
||||
and other members of the Independent JPEG Group.
|
||||
|
||||
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
||||
(also known as JPEG, together with ITU-T SG16).
|
||||
|
||||
|
||||
DOCUMENTATION ROADMAP
|
||||
=====================
|
||||
|
||||
This file contains the following sections:
|
||||
|
||||
OVERVIEW General description of JPEG and the IJG software.
|
||||
LEGAL ISSUES Copyright, lack of warranty, terms of distribution.
|
||||
REFERENCES Where to learn more about JPEG.
|
||||
ARCHIVE LOCATIONS Where to find newer versions of this software.
|
||||
ACKNOWLEDGMENTS Special thanks.
|
||||
FILE FORMAT WARS Software *not* to get.
|
||||
TO DO Plans for future IJG releases.
|
||||
|
||||
Other documentation files in the distribution are:
|
||||
|
||||
User documentation:
|
||||
install.txt How to configure and install the IJG software.
|
||||
usage.txt Usage instructions for cjpeg, djpeg, jpegtran,
|
||||
rdjpgcom, and wrjpgcom.
|
||||
*.1 Unix-style man pages for programs (same info as usage.txt).
|
||||
wizard.txt Advanced usage instructions for JPEG wizards only.
|
||||
change.log Version-to-version change highlights.
|
||||
Programmer and internal documentation:
|
||||
libjpeg.txt How to use the JPEG library in your own programs.
|
||||
example.c Sample code for calling the JPEG library.
|
||||
structure.txt Overview of the JPEG library's internal structure.
|
||||
filelist.txt Road map of IJG files.
|
||||
coderules.txt Coding style rules --- please read if you contribute code.
|
||||
|
||||
Please read at least the files install.txt and usage.txt. Some information
|
||||
can also be found in the JPEG FAQ (Frequently Asked Questions) article. See
|
||||
ARCHIVE LOCATIONS below to find out where to obtain the FAQ article.
|
||||
|
||||
If you want to understand how the JPEG code works, we suggest reading one or
|
||||
more of the REFERENCES, then looking at the documentation files (in roughly
|
||||
the order listed) before diving into the code.
|
||||
|
||||
|
||||
OVERVIEW
|
||||
========
|
||||
|
||||
This package contains C software to implement JPEG image encoding, decoding,
|
||||
and transcoding. JPEG (pronounced "jay-peg") is a standardized compression
|
||||
method for full-color and gray-scale images.
|
||||
|
||||
This software implements JPEG baseline, extended-sequential, and progressive
|
||||
compression processes. Provision is made for supporting all variants of these
|
||||
processes, although some uncommon parameter settings aren't implemented yet.
|
||||
We have made no provision for supporting the hierarchical or lossless
|
||||
processes defined in the standard.
|
||||
|
||||
We provide a set of library routines for reading and writing JPEG image files,
|
||||
plus two sample applications "cjpeg" and "djpeg", which use the library to
|
||||
perform conversion between JPEG and some other popular image file formats.
|
||||
The library is intended to be reused in other applications.
|
||||
|
||||
In order to support file conversion and viewing software, we have included
|
||||
considerable functionality beyond the bare JPEG coding/decoding capability;
|
||||
for example, the color quantization modules are not strictly part of JPEG
|
||||
decoding, but they are essential for output to colormapped file formats or
|
||||
colormapped displays. These extra functions can be compiled out of the
|
||||
library if not required for a particular application.
|
||||
|
||||
We have also included "jpegtran", a utility for lossless transcoding between
|
||||
different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple
|
||||
applications for inserting and extracting textual comments in JFIF files.
|
||||
|
||||
The emphasis in designing this software has been on achieving portability and
|
||||
flexibility, while also making it fast enough to be useful. In particular,
|
||||
the software is not intended to be read as a tutorial on JPEG. (See the
|
||||
REFERENCES section for introductory material.) Rather, it is intended to
|
||||
be reliable, portable, industrial-strength code. We do not claim to have
|
||||
achieved that goal in every aspect of the software, but we strive for it.
|
||||
|
||||
We welcome the use of this software as a component of commercial products.
|
||||
No royalty is required, but we do ask for an acknowledgement in product
|
||||
documentation, as described under LEGAL ISSUES.
|
||||
|
||||
|
||||
LEGAL ISSUES
|
||||
============
|
||||
|
||||
In plain English:
|
||||
|
||||
1. We don't promise that this software works. (But if you find any bugs,
|
||||
please let us know!)
|
||||
2. You can use this software for whatever you want. You don't have to pay us.
|
||||
3. You may not pretend that you wrote this software. If you use it in a
|
||||
program, you must acknowledge somewhere in your documentation that
|
||||
you've used the IJG code.
|
||||
|
||||
In legalese:
|
||||
|
||||
The authors make NO WARRANTY or representation, either express or implied,
|
||||
with respect to this software, its quality, accuracy, merchantability, or
|
||||
fitness for a particular purpose. This software is provided "AS IS", and you,
|
||||
its user, assume the entire risk as to its quality and accuracy.
|
||||
|
||||
This software is copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding.
|
||||
All Rights Reserved except as specified below.
|
||||
|
||||
Permission is hereby granted to use, copy, modify, and distribute this
|
||||
software (or portions thereof) for any purpose, without fee, subject to these
|
||||
conditions:
|
||||
(1) If any part of the source code for this software is distributed, then this
|
||||
README file must be included, with this copyright and no-warranty notice
|
||||
unaltered; and any additions, deletions, or changes to the original files
|
||||
must be clearly indicated in accompanying documentation.
|
||||
(2) If only executable code is distributed, then the accompanying
|
||||
documentation must state that "this software is based in part on the work of
|
||||
the Independent JPEG Group".
|
||||
(3) Permission for use of this software is granted only if the user accepts
|
||||
full responsibility for any undesirable consequences; the authors accept
|
||||
NO LIABILITY for damages of any kind.
|
||||
|
||||
These conditions apply to any software derived from or based on the IJG code,
|
||||
not just to the unmodified library. If you use our work, you ought to
|
||||
acknowledge us.
|
||||
|
||||
Permission is NOT granted for the use of any IJG author's name or company name
|
||||
in advertising or publicity relating to this software or products derived from
|
||||
it. This software may be referred to only as "the Independent JPEG Group's
|
||||
software".
|
||||
|
||||
We specifically permit and encourage the use of this software as the basis of
|
||||
commercial products, provided that all warranty or liability claims are
|
||||
assumed by the product vendor.
|
||||
|
||||
|
||||
ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
|
||||
sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
|
||||
ansi2knr.c is NOT covered by the above copyright and conditions, but instead
|
||||
by the usual distribution terms of the Free Software Foundation; principally,
|
||||
that you must include source code if you redistribute it. (See the file
|
||||
ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
|
||||
of any program generated from the IJG code, this does not limit you more than
|
||||
the foregoing paragraphs do.
|
||||
|
||||
The Unix configuration script "configure" was produced with GNU Autoconf.
|
||||
It is copyright by the Free Software Foundation but is freely distributable.
|
||||
The same holds for its supporting scripts (config.guess, config.sub,
|
||||
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
||||
but is also freely distributable.
|
||||
|
||||
The IJG distribution formerly included code to read and write GIF files.
|
||||
To avoid entanglement with the Unisys LZW patent, GIF reading support has
|
||||
been removed altogether, and the GIF writer has been simplified to produce
|
||||
"uncompressed GIFs". This technique does not use the LZW algorithm; the
|
||||
resulting GIF files are larger than usual, but are readable by all standard
|
||||
GIF decoders.
|
||||
|
||||
We are required to state that
|
||||
"The Graphics Interchange Format(c) is the Copyright property of
|
||||
CompuServe Incorporated. GIF(sm) is a Service Mark property of
|
||||
CompuServe Incorporated."
|
||||
|
||||
|
||||
REFERENCES
|
||||
==========
|
||||
|
||||
We recommend reading one or more of these references before trying to
|
||||
understand the innards of the JPEG software.
|
||||
|
||||
The best short technical introduction to the JPEG compression algorithm is
|
||||
Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
|
||||
Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
|
||||
(Adjacent articles in that issue discuss MPEG motion picture compression,
|
||||
applications of JPEG, and related topics.) If you don't have the CACM issue
|
||||
handy, a PostScript file containing a revised version of Wallace's article is
|
||||
available at http://www.ijg.org/files/wallace.ps.gz. The file (actually
|
||||
a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
|
||||
omits the sample images that appeared in CACM, but it includes corrections
|
||||
and some added material. Note: the Wallace article is copyright ACM and IEEE,
|
||||
and it may not be used for commercial purposes.
|
||||
|
||||
A somewhat less technical, more leisurely introduction to JPEG can be found in
|
||||
"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by
|
||||
M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides
|
||||
good explanations and example C code for a multitude of compression methods
|
||||
including JPEG. It is an excellent source if you are comfortable reading C
|
||||
code but don't know much about data compression in general. The book's JPEG
|
||||
sample code is far from industrial-strength, but when you are ready to look
|
||||
at a full implementation, you've got one here...
|
||||
|
||||
The best currently available description of JPEG is the textbook "JPEG Still
|
||||
Image Data Compression Standard" by William B. Pennebaker and Joan L.
|
||||
Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
|
||||
Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG
|
||||
standards (DIS 10918-1 and draft DIS 10918-2).
|
||||
Although this is by far the most detailed and comprehensive exposition of
|
||||
JPEG publicly available, we point out that it is still missing an explanation
|
||||
of the most essential properties and algorithms of the underlying DCT
|
||||
technology.
|
||||
If you think that you know about DCT-based JPEG after reading this book,
|
||||
then you are in delusion. The real fundamentals and corresponding potential
|
||||
of DCT-based JPEG are not publicly known so far, and that is the reason for
|
||||
all the mistaken developments taking place in the image coding domain.
|
||||
|
||||
The original JPEG standard is divided into two parts, Part 1 being the actual
|
||||
specification, while Part 2 covers compliance testing methods. Part 1 is
|
||||
titled "Digital Compression and Coding of Continuous-tone Still Images,
|
||||
Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
|
||||
10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
|
||||
Continuous-tone Still Images, Part 2: Compliance testing" and has document
|
||||
numbers ISO/IEC IS 10918-2, ITU-T T.83.
|
||||
IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension
|
||||
which is specified in two documents: A contributed document at ITU and ISO
|
||||
with title "ITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced
|
||||
Image Coding", April 2006, Geneva, Switzerland. The latest version of this
|
||||
document is Revision 3. And a contributed document ISO/IEC JTC1/SC29/WG1 N
|
||||
5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany.
|
||||
|
||||
The JPEG standard does not specify all details of an interchangeable file
|
||||
format. For the omitted details we follow the "JFIF" conventions, revision
|
||||
1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report
|
||||
and thus received a formal publication status. It is available as a free
|
||||
download in PDF format from
|
||||
http://www.ecma-international.org/publications/techreports/E-TR-098.htm.
|
||||
A PostScript version of the JFIF document is available at
|
||||
http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at
|
||||
http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures.
|
||||
|
||||
The TIFF 6.0 file format specification can be obtained by FTP from
|
||||
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
||||
found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
|
||||
IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
|
||||
Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
|
||||
(Compression tag 7). Copies of this Note can be obtained from
|
||||
http://www.ijg.org/files/. It is expected that the next revision
|
||||
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
||||
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
||||
uses our library to implement TIFF/JPEG per the Note.
|
||||
|
||||
|
||||
ARCHIVE LOCATIONS
|
||||
=================
|
||||
|
||||
The "official" archive site for this software is www.ijg.org.
|
||||
The most recent released version can always be found there in
|
||||
directory "files". This particular version will be archived as
|
||||
http://www.ijg.org/files/jpegsrc.v8d.tar.gz, and in Windows-compatible
|
||||
"zip" archive format as http://www.ijg.org/files/jpegsr8d.zip.
|
||||
|
||||
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
||||
general information about JPEG.
|
||||
It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
|
||||
and other news.answers archive sites, including the official news.answers
|
||||
archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
|
||||
If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
|
||||
with body
|
||||
send usenet/news.answers/jpeg-faq/part1
|
||||
send usenet/news.answers/jpeg-faq/part2
|
||||
|
||||
|
||||
ACKNOWLEDGMENTS
|
||||
===============
|
||||
|
||||
Thank to Juergen Bruder for providing me with a copy of the common DCT
|
||||
algorithm article, only to find out that I had come to the same result
|
||||
in a more direct and comprehensible way with a more generative approach.
|
||||
|
||||
Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the
|
||||
ITU JPEG (Study Group 16) meeting in Geneva, Switzerland.
|
||||
|
||||
Thank to Thomas Wiegand and Gary Sullivan for inviting me to the
|
||||
Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland.
|
||||
|
||||
Thank to Thomas Richter and Daniel Lee for inviting me to the
|
||||
ISO/IEC JTC1/SC29/WG1 (also known as JPEG, together with ITU-T SG16)
|
||||
meeting in Berlin, Germany.
|
||||
|
||||
Thank to John Korejwa and Massimo Ballerini for inviting me to
|
||||
fruitful consultations in Boston, MA and Milan, Italy.
|
||||
|
||||
Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther
|
||||
Maier-Gerber, Walter Stoeber, Fred Schmitz, and Norbert Braunagel
|
||||
for corresponding business development.
|
||||
|
||||
Thank to Nico Zschach and Dirk Stelling of the technical support team
|
||||
at the Digital Images company in Halle for providing me with extra
|
||||
equipment for configuration tests.
|
||||
|
||||
Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful
|
||||
communication about JPEG configuration in Sigma Photo Pro software.
|
||||
|
||||
Thank to Andrew Finkenstadt for hosting the ijg.org site.
|
||||
|
||||
Last but not least special thank to Thomas G. Lane for the original
|
||||
design and development of this singular software package.
|
||||
|
||||
|
||||
FILE FORMAT WARS
|
||||
================
|
||||
|
||||
The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together
|
||||
with ITU-T SG16) currently promotes different formats containing the name
|
||||
"JPEG" which is misleading because these formats are incompatible with
|
||||
original DCT-based JPEG and are based on faulty technologies.
|
||||
IJG therefore does not and will not support such momentary mistakes
|
||||
(see REFERENCES).
|
||||
There exist also distributions under the name "OpenJPEG" promoting such
|
||||
kind of formats which is misleading because they don't support original
|
||||
JPEG images.
|
||||
We have no sympathy for the promotion of inferior formats. Indeed, one of
|
||||
the original reasons for developing this free software was to help force
|
||||
convergence on common, interoperable format standards for JPEG files.
|
||||
Don't use an incompatible file format!
|
||||
(In any case, our decoder will remain capable of reading existing JPEG
|
||||
image files indefinitely.)
|
||||
|
||||
Furthermore, the ISO committee pretends to be "responsible for the popular
|
||||
JPEG" in their public reports which is not true because they don't respond to
|
||||
actual requirements for the maintenance of the original JPEG specification.
|
||||
|
||||
There are currently distributions in circulation containing the name
|
||||
"libjpeg" which claim to be a "derivative" or "fork" of the original
|
||||
libjpeg, but don't have the features and are incompatible with formats
|
||||
supported by actual IJG libjpeg distributions. Furthermore, they
|
||||
violate the license conditions as described under LEGAL ISSUES above.
|
||||
We have no sympathy for the release of misleading and illegal
|
||||
distributions derived from obsolete code bases.
|
||||
Don't use an obsolete code base!
|
||||
|
||||
|
||||
TO DO
|
||||
=====
|
||||
|
||||
Version 8 is the first release of a new generation JPEG standard
|
||||
to overcome the limitations of the original JPEG specification.
|
||||
More features are being prepared for coming releases...
|
||||
|
||||
Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.
|
@ -1,111 +0,0 @@
|
||||
|
||||
This copy of the libpng notices is provided for your convenience. In case of
|
||||
any discrepancy between this copy and the notices in the file png.h that is
|
||||
included in the libpng distribution, the latter shall prevail.
|
||||
|
||||
COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
|
||||
|
||||
If you modify libpng you may insert additional notices immediately following
|
||||
this sentence.
|
||||
|
||||
This code is released under the libpng license.
|
||||
|
||||
libpng versions 1.2.6, August 15, 2004, through 1.5.9, February 18, 2012, are
|
||||
Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
|
||||
distributed according to the same disclaimer and license as libpng-1.2.5
|
||||
with the following individual added to the list of Contributing Authors
|
||||
|
||||
Cosmin Truta
|
||||
|
||||
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
|
||||
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
||||
distributed according to the same disclaimer and license as libpng-1.0.6
|
||||
with the following individuals added to the list of Contributing Authors
|
||||
|
||||
Simon-Pierre Cadieux
|
||||
Eric S. Raymond
|
||||
Gilles Vollant
|
||||
|
||||
and with the following additions to the disclaimer:
|
||||
|
||||
There is no warranty against interference with your enjoyment of the
|
||||
library or against infringement. There is no warranty that our
|
||||
efforts or the library will fulfill any of your particular purposes
|
||||
or needs. This library is provided with all faults, and the entire
|
||||
risk of satisfactory quality, performance, accuracy, and effort is with
|
||||
the user.
|
||||
|
||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||
Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
|
||||
distributed according to the same disclaimer and license as libpng-0.96,
|
||||
with the following individuals added to the list of Contributing Authors:
|
||||
|
||||
Tom Lane
|
||||
Glenn Randers-Pehrson
|
||||
Willem van Schaik
|
||||
|
||||
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||
Copyright (c) 1996, 1997 Andreas Dilger
|
||||
Distributed according to the same disclaimer and license as libpng-0.88,
|
||||
with the following individuals added to the list of Contributing Authors:
|
||||
|
||||
John Bowler
|
||||
Kevin Bracey
|
||||
Sam Bushell
|
||||
Magnus Holmgren
|
||||
Greg Roelofs
|
||||
Tom Tanner
|
||||
|
||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
||||
For the purposes of this copyright and license, "Contributing Authors"
|
||||
is defined as the following set of individuals:
|
||||
|
||||
Andreas Dilger
|
||||
Dave Martindale
|
||||
Guy Eric Schalnat
|
||||
Paul Schmidt
|
||||
Tim Wegner
|
||||
|
||||
The PNG Reference Library is supplied "AS IS". The Contributing Authors
|
||||
and Group 42, Inc. disclaim all warranties, expressed or implied,
|
||||
including, without limitation, the warranties of merchantability and of
|
||||
fitness for any purpose. The Contributing Authors and Group 42, Inc.
|
||||
assume no liability for direct, indirect, incidental, special, exemplary,
|
||||
or consequential damages, which may result from the use of the PNG
|
||||
Reference Library, even if advised of the possibility of such damage.
|
||||
|
||||
Permission is hereby granted to use, copy, modify, and distribute this
|
||||
source code, or portions hereof, for any purpose, without fee, subject
|
||||
to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented.
|
||||
|
||||
2. Altered versions must be plainly marked as such and must not
|
||||
be misrepresented as being the original source.
|
||||
|
||||
3. This Copyright notice may not be removed or altered from any
|
||||
source or altered source distribution.
|
||||
|
||||
The Contributing Authors and Group 42, Inc. specifically permit, without
|
||||
fee, and encourage the use of this source code as a component to
|
||||
supporting the PNG file format in commercial products. If you use this
|
||||
source code in a product, acknowledgment is not required but would be
|
||||
appreciated.
|
||||
|
||||
|
||||
A "png_get_copyright" function is available, for convenient use in "about"
|
||||
boxes and the like:
|
||||
|
||||
printf("%s",png_get_copyright(NULL));
|
||||
|
||||
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||
|
||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
|
||||
certification mark of the Open Source Initiative.
|
||||
|
||||
Glenn Randers-Pehrson
|
||||
glennrp at users.sourceforge.net
|
||||
February 18, 2012
|
@ -1,2 +0,0 @@
|
||||
Linux Users: There are some tools at the web for reading .chm files (try http://xchm.sourceforge.net/).
|
||||
You can find a html version of this documentation at http://irrlicht.sourceforge.net/docu/index.html
|
@ -1,8 +1,14 @@
|
||||
#include <iostream>
|
||||
#include <irrlicht.h>
|
||||
#include "exampleHelper.h"
|
||||
|
||||
using namespace irr;
|
||||
|
||||
static IrrlichtDevice *device = nullptr;
|
||||
static int test_fail = 0;
|
||||
|
||||
extern void test_irr_array();
|
||||
|
||||
static video::E_DRIVER_TYPE chooseDriver(const char *arg_)
|
||||
{
|
||||
if (core::stringc(arg_) == "null")
|
||||
@ -15,18 +21,42 @@ static video::E_DRIVER_TYPE chooseDriver(const char *arg_)
|
||||
return video::EDT_OPENGL;
|
||||
}
|
||||
|
||||
static inline void check(bool ok, const char *msg)
|
||||
{
|
||||
if (!ok)
|
||||
{
|
||||
test_fail++;
|
||||
device->getLogger()->log((core::stringc("FAILED TEST: ") + msg).c_str(), ELL_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
void run_unit_tests() {
|
||||
std::cout << "Running unit tests:" << std::endl;
|
||||
test_irr_array();
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
run_unit_tests();
|
||||
|
||||
SIrrlichtCreationParameters p;
|
||||
p.DriverType = chooseDriver(argc > 1 ? argv[1] : "");
|
||||
p.WindowSize = core::dimension2du(640, 480);
|
||||
p.Vsync = true;
|
||||
p.LoggingLevel = ELL_DEBUG;
|
||||
|
||||
IrrlichtDevice *device = createDeviceEx(p);
|
||||
device = createDeviceEx(p);
|
||||
if (!device)
|
||||
return 1;
|
||||
|
||||
{
|
||||
u32 total = 0;
|
||||
device->getOSOperator()->getSystemMemory(&total, nullptr);
|
||||
core::stringc message = core::stringc("Total RAM in MiB: ") + core::stringc(total >> 10);
|
||||
device->getLogger()->log(message.c_str(), ELL_INFORMATION);
|
||||
check(total > 130 * 1024, "RAM amount");
|
||||
}
|
||||
|
||||
device->setWindowCaption(L"Hello World!");
|
||||
device->setResizable(true);
|
||||
|
||||
@ -46,15 +76,19 @@ int main(int argc, char *argv[])
|
||||
const io::path mediaPath = getExampleMediaPath();
|
||||
|
||||
scene::IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "coolguy_opt.x");
|
||||
if (!mesh)
|
||||
return 1;
|
||||
scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
|
||||
if (node)
|
||||
check(mesh, "mesh loading");
|
||||
if (mesh)
|
||||
{
|
||||
node->setMaterialFlag(video::EMF_LIGHTING, false);
|
||||
node->setFrameLoop(0, 29);
|
||||
node->setAnimationSpeed(30);
|
||||
node->setMaterialTexture(0, driver->getTexture(mediaPath + "cooltexture.png"));
|
||||
video::ITexture* tex = driver->getTexture(mediaPath + "cooltexture.png");
|
||||
check(tex, "texture loading");
|
||||
scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
|
||||
if (node)
|
||||
{
|
||||
node->setMaterialFlag(video::EMF_LIGHTING, false);
|
||||
node->setFrameLoop(0, 29);
|
||||
node->setAnimationSpeed(30);
|
||||
node->setMaterialTexture(0, tex);
|
||||
}
|
||||
}
|
||||
|
||||
smgr->addCameraSceneNode(0, core::vector3df(0,4,5), core::vector3df(0,2,0));
|
||||
@ -102,12 +136,9 @@ int main(int argc, char *argv[])
|
||||
driver->endScene();
|
||||
}
|
||||
|
||||
if (core::stringw(L"a") != editbox->getText()) {
|
||||
device->getLogger()->log("EditBox text mismatch", ELL_INFORMATION);
|
||||
return 1;
|
||||
}
|
||||
check(core::stringw(L"a") == editbox->getText(), "EditBox text");
|
||||
|
||||
device->getLogger()->log("Done.", ELL_INFORMATION);
|
||||
device->drop();
|
||||
return 0;
|
||||
return test_fail > 0 ? 1 : 0;
|
||||
}
|
||||
|
135
examples/AutomatedTest/test_array.cpp
Normal file
135
examples/AutomatedTest/test_array.cpp
Normal file
@ -0,0 +1,135 @@
|
||||
#include "irrArray.h"
|
||||
#include "test_helper.h"
|
||||
|
||||
using namespace irr;
|
||||
using core::array;
|
||||
|
||||
static void test_basics() {
|
||||
array<int> v;
|
||||
v.push_back(1); // 1
|
||||
v.push_front(2); // 2, 1
|
||||
v.insert(4, 0); // 4, 2, 1
|
||||
v.insert(3, 1); // 4, 3, 2, 1
|
||||
v.insert(0, 4); // 4, 3, 2, 1, 0
|
||||
UASSERTEQ(v.size(), 5);
|
||||
UASSERTEQ(v[0], 4);
|
||||
UASSERTEQ(v[1], 3);
|
||||
UASSERTEQ(v[2], 2);
|
||||
UASSERTEQ(v[3], 1);
|
||||
UASSERTEQ(v[4], 0);
|
||||
array<int> w = v;
|
||||
UASSERTEQ(w.size(), 5);
|
||||
UASSERT(w == v);
|
||||
w.clear();
|
||||
UASSERTEQ(w.size(), 0);
|
||||
UASSERTEQ(w.allocated_size(), 0);
|
||||
UASSERT(w.empty());
|
||||
w = v;
|
||||
UASSERTEQ(w.size(), 5);
|
||||
w.set_used(3);
|
||||
UASSERTEQ(w.size(), 3);
|
||||
UASSERTEQ(w[0], 4);
|
||||
UASSERTEQ(w[1], 3);
|
||||
UASSERTEQ(w[2], 2);
|
||||
UASSERTEQ(w.getLast(), 2);
|
||||
w.set_used(20);
|
||||
UASSERTEQ(w.size(), 20);
|
||||
w = v;
|
||||
w.sort();
|
||||
UASSERTEQ(w.size(), 5);
|
||||
UASSERTEQ(w[0], 0);
|
||||
UASSERTEQ(w[1], 1);
|
||||
UASSERTEQ(w[2], 2);
|
||||
UASSERTEQ(w[3], 3);
|
||||
UASSERTEQ(w[4], 4);
|
||||
w.erase(0);
|
||||
UASSERTEQ(w.size(), 4);
|
||||
UASSERTEQ(w[0], 1);
|
||||
UASSERTEQ(w[1], 2);
|
||||
UASSERTEQ(w[2], 3);
|
||||
UASSERTEQ(w[3], 4);
|
||||
w.erase(1, 2);
|
||||
UASSERTEQ(w.size(), 2);
|
||||
UASSERTEQ(w[0], 1);
|
||||
UASSERTEQ(w[1], 4);
|
||||
w.swap(v);
|
||||
UASSERTEQ(w.size(), 5);
|
||||
UASSERTEQ(v.size(), 2);
|
||||
}
|
||||
|
||||
static void test_linear_searches() {
|
||||
// Populate the array with 0, 1, 2, ..., 100, 100, 99, 98, 97, ..., 0
|
||||
array<int> arr;
|
||||
for (int i = 0; i <= 100; i++)
|
||||
arr.push_back(i);
|
||||
for (int i = 100; i >= 0; i--)
|
||||
arr.push_back(i);
|
||||
s32 end = arr.size() - 1;
|
||||
for (int i = 0; i <= 100; i++) {
|
||||
s32 index = arr.linear_reverse_search(i);
|
||||
UASSERTEQ(index, end - i);
|
||||
}
|
||||
for (int i = 0; i <= 100; i++) {
|
||||
s32 index = arr.linear_search(i);
|
||||
UASSERTEQ(index, i);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_binary_searches() {
|
||||
const auto& values = { 3, 5, 1, 2, 5, 10, 19, 9, 7, 1, 2, 5, 8, 15 };
|
||||
array<int> arr;
|
||||
for (int value : values) {
|
||||
arr.push_back(value);
|
||||
}
|
||||
// Test the const form first, it uses a linear search without sorting
|
||||
const array<int> & carr = arr;
|
||||
UASSERTEQ(carr.binary_search(20), -1);
|
||||
UASSERTEQ(carr.binary_search(0), -1);
|
||||
UASSERTEQ(carr.binary_search(1), 2);
|
||||
|
||||
// Sorted: 1, 1, 2, 2, 3, 5, 5, 5, 7, 8, 9, 10, 15, 19
|
||||
UASSERTEQ(arr.binary_search(20), -1);
|
||||
UASSERTEQ(arr.binary_search(0), -1);
|
||||
|
||||
for (int value : values) {
|
||||
s32 i = arr.binary_search(value);
|
||||
UASSERTNE(i, -1);
|
||||
UASSERTEQ(arr[i], value);
|
||||
}
|
||||
|
||||
s32 first, last;
|
||||
first = arr.binary_search_multi(1, last);
|
||||
UASSERTEQ(first, 0);
|
||||
UASSERTEQ(last, 1);
|
||||
|
||||
first = arr.binary_search_multi(2, last);
|
||||
UASSERTEQ(first, 2);
|
||||
UASSERTEQ(last, 3);
|
||||
|
||||
first = arr.binary_search_multi(3, last);
|
||||
UASSERTEQ(first, 4);
|
||||
UASSERTEQ(last, 4);
|
||||
|
||||
first = arr.binary_search_multi(4, last);
|
||||
UASSERTEQ(first, -1);
|
||||
|
||||
first = arr.binary_search_multi(5, last);
|
||||
UASSERTEQ(first, 5);
|
||||
UASSERTEQ(last, 7);
|
||||
|
||||
first = arr.binary_search_multi(7, last);
|
||||
UASSERTEQ(first, 8);
|
||||
UASSERTEQ(last, 8);
|
||||
|
||||
first = arr.binary_search_multi(19, last);
|
||||
UASSERTEQ(first, 13);
|
||||
UASSERTEQ(last, 13);
|
||||
}
|
||||
|
||||
void test_irr_array()
|
||||
{
|
||||
test_basics();
|
||||
test_linear_searches();
|
||||
test_binary_searches();
|
||||
std::cout << " test_irr_array PASSED" << std::endl;
|
||||
}
|
30
examples/AutomatedTest/test_helper.h
Normal file
30
examples/AutomatedTest/test_helper.h
Normal file
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include <exception>
|
||||
#include <iostream>
|
||||
|
||||
class TestFailedException : public std::exception {
|
||||
};
|
||||
|
||||
// Asserts the comparison specified by CMP is true, or fails the current unit test
|
||||
#define UASSERTCMP(CMP, actual, expected) do { \
|
||||
const auto &a = (actual); \
|
||||
const auto &e = (expected); \
|
||||
if (!CMP(a, e)) { \
|
||||
std::cout \
|
||||
<< "Test assertion failed: " << #actual << " " << #CMP << " " \
|
||||
<< #expected << std::endl \
|
||||
<< " at " << __FILE__ << ":" << __LINE__ << std::endl \
|
||||
<< " actual: " << a << std::endl << " expected: " \
|
||||
<< e << std::endl; \
|
||||
throw TestFailedException(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define CMPEQ(a, e) (a == e)
|
||||
#define CMPTRUE(a, e) (a)
|
||||
#define CMPNE(a, e) (a != e)
|
||||
|
||||
#define UASSERTEQ(actual, expected) UASSERTCMP(CMPEQ, actual, expected)
|
||||
#define UASSERTNE(actual, nexpected) UASSERTCMP(CMPNE, actual, nexpected)
|
||||
#define UASSERT(actual) UASSERTCMP(CMPTRUE, actual, true)
|
@ -1,3 +1,5 @@
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(IRREXAMPLES
|
||||
# removed
|
||||
|
@ -21,6 +21,7 @@ namespace scene
|
||||
CMeshBuffer()
|
||||
: ChangedID_Vertex(1), ChangedID_Index(1)
|
||||
, MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)
|
||||
, HWBuffer(NULL)
|
||||
, PrimitiveType(EPT_TRIANGLES)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
@ -193,8 +194,8 @@ namespace scene
|
||||
Vertices.reallocate(vertexCount+numVertices);
|
||||
for (i=0; i<numVertices; ++i)
|
||||
{
|
||||
Vertices.push_back(reinterpret_cast<const T*>(vertices)[i]);
|
||||
BoundingBox.addInternalPoint(reinterpret_cast<const T*>(vertices)[i].Pos);
|
||||
Vertices.push_back(static_cast<const T*>(vertices)[i]);
|
||||
BoundingBox.addInternalPoint(static_cast<const T*>(vertices)[i].Pos);
|
||||
}
|
||||
|
||||
Indices.reallocate(getIndexCount()+numIndices);
|
||||
@ -286,12 +287,22 @@ namespace scene
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID_Index() const _IRR_OVERRIDE_ {return ChangedID_Index;}
|
||||
|
||||
virtual void setHWBuffer(void *ptr) const _IRR_OVERRIDE_ {
|
||||
HWBuffer = ptr;
|
||||
}
|
||||
|
||||
virtual void *getHWBuffer() const _IRR_OVERRIDE_ {
|
||||
return HWBuffer;
|
||||
}
|
||||
|
||||
|
||||
u32 ChangedID_Vertex;
|
||||
u32 ChangedID_Index;
|
||||
|
||||
//! hardware mapping hint
|
||||
E_HARDWARE_MAPPING MappingHint_Vertex;
|
||||
E_HARDWARE_MAPPING MappingHint_Index;
|
||||
mutable void *HWBuffer;
|
||||
|
||||
//! Material for this meshbuffer.
|
||||
video::SMaterial Material;
|
||||
|
@ -12,6 +12,7 @@ namespace irr
|
||||
namespace scene
|
||||
{
|
||||
class ICameraSceneNode;
|
||||
class IMeshBuffer;
|
||||
|
||||
//! A billboard scene node.
|
||||
/** A billboard is like a 3d sprite: A 2d element,
|
||||
@ -74,6 +75,17 @@ public:
|
||||
That is why the usual getBoundingBox will return a "safe" boundingbox which is guaranteed
|
||||
to contain the billboard. While this function can return the real one. */
|
||||
virtual const core::aabbox3d<f32>& getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode* camera) = 0;
|
||||
|
||||
//! Get the amount of mesh buffers.
|
||||
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
|
||||
virtual u32 getMeshBufferCount() const = 0;
|
||||
|
||||
//! Get pointer to a mesh buffer.
|
||||
/** NOTE: Positions and normals of this meshbuffers are re-calculated before rendering.
|
||||
So this is mainly useful to access/modify the uv-coordinates.
|
||||
\param nr: Zero based index of the mesh buffer.
|
||||
\return Pointer to the mesh buffer or 0 if there is no such mesh buffer. */
|
||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const = 0;
|
||||
};
|
||||
|
||||
} // end namespace scene
|
||||
|
@ -6,7 +6,6 @@
|
||||
#define __I_GUI_ELEMENT_H_INCLUDED__
|
||||
|
||||
#include "IReferenceCounted.h"
|
||||
#include "irrList.h"
|
||||
#include "rect.h"
|
||||
#include "irrString.h"
|
||||
#include "IEventReceiver.h"
|
||||
@ -14,6 +13,10 @@
|
||||
#include "EGUIAlignment.h"
|
||||
#include "IAttributes.h"
|
||||
#include "IGUIEnvironment.h"
|
||||
#include <cassert>
|
||||
#include <algorithm>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -50,12 +53,9 @@ public:
|
||||
//! Destructor
|
||||
virtual ~IGUIElement()
|
||||
{
|
||||
// delete all children
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
{
|
||||
(*it)->Parent = 0;
|
||||
(*it)->drop();
|
||||
for (auto child : Children) {
|
||||
child->Parent = nullptr;
|
||||
child->drop();
|
||||
}
|
||||
}
|
||||
|
||||
@ -239,10 +239,9 @@ public:
|
||||
recalculateAbsolutePosition(false);
|
||||
|
||||
// update all children
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
for (auto child : Children)
|
||||
{
|
||||
(*it)->updateAbsolutePosition();
|
||||
child->updateAbsolutePosition();
|
||||
}
|
||||
}
|
||||
|
||||
@ -263,20 +262,19 @@ public:
|
||||
{
|
||||
IGUIElement* target = 0;
|
||||
|
||||
// we have to search from back to front, because later children
|
||||
// might be drawn over the top of earlier ones.
|
||||
|
||||
core::list<IGUIElement*>::ConstIterator it = Children.getLast();
|
||||
|
||||
if (isVisible())
|
||||
{
|
||||
while(it != Children.end())
|
||||
// we have to search from back to front, because later children
|
||||
// might be drawn over the top of earlier ones.
|
||||
auto it = Children.rbegin();
|
||||
auto ie = Children.rend();
|
||||
while (it != ie)
|
||||
{
|
||||
target = (*it)->getElementFromPoint(point);
|
||||
if (target)
|
||||
return target;
|
||||
|
||||
--it;
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
@ -308,17 +306,19 @@ public:
|
||||
//! Removes a child.
|
||||
virtual void removeChild(IGUIElement* child)
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
if ((*it) == child)
|
||||
{
|
||||
(*it)->Parent = 0;
|
||||
(*it)->drop();
|
||||
Children.erase(it);
|
||||
return;
|
||||
}
|
||||
assert(child->Parent == this);
|
||||
Children.erase(child->ParentPos);
|
||||
child->Parent = nullptr;
|
||||
child->drop();
|
||||
}
|
||||
|
||||
//! Removes all children.
|
||||
virtual void removeAllChildren() {
|
||||
while (!Children.empty()) {
|
||||
auto child = Children.back();
|
||||
child->remove();
|
||||
}
|
||||
}
|
||||
|
||||
//! Removes this element from its parent.
|
||||
virtual void remove()
|
||||
@ -333,9 +333,8 @@ public:
|
||||
{
|
||||
if ( isVisible() )
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->draw();
|
||||
for (auto child : Children)
|
||||
child->draw();
|
||||
}
|
||||
}
|
||||
|
||||
@ -345,9 +344,8 @@ public:
|
||||
{
|
||||
if ( isVisible() )
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->OnPostRender( timeMs );
|
||||
for (auto child : Children)
|
||||
child->OnPostRender( timeMs );
|
||||
}
|
||||
}
|
||||
|
||||
@ -555,20 +553,15 @@ public:
|
||||
|
||||
//! Brings a child to front
|
||||
/** \return True if successful, false if not. */
|
||||
virtual bool bringToFront(IGUIElement* element)
|
||||
virtual bool bringToFront(IGUIElement* child)
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
{
|
||||
if (element == (*it))
|
||||
{
|
||||
Children.erase(it);
|
||||
Children.push_back(element);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
if (child->Parent != this)
|
||||
return false;
|
||||
if (std::next(child->ParentPos) == Children.end()) // already there
|
||||
return true;
|
||||
Children.erase(child->ParentPos);
|
||||
child->ParentPos = Children.insert(Children.end(), child);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -576,24 +569,17 @@ public:
|
||||
/** \return True if successful, false if not. */
|
||||
virtual bool sendToBack(IGUIElement* child)
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
if (child == (*it)) // already there
|
||||
if (child->Parent != this)
|
||||
return false;
|
||||
if (child->ParentPos == Children.begin()) // already there
|
||||
return true;
|
||||
for (; it != Children.end(); ++it)
|
||||
{
|
||||
if (child == (*it))
|
||||
{
|
||||
Children.erase(it);
|
||||
Children.push_front(child);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
Children.erase(child->ParentPos);
|
||||
child->ParentPos = Children.insert(Children.begin(), child);
|
||||
return true;
|
||||
}
|
||||
|
||||
//! Returns list with children of this element
|
||||
virtual const core::list<IGUIElement*>& getChildren() const
|
||||
virtual const std::list<IGUIElement*>& getChildren() const
|
||||
{
|
||||
return Children;
|
||||
}
|
||||
@ -610,14 +596,13 @@ public:
|
||||
{
|
||||
IGUIElement* e = 0;
|
||||
|
||||
core::list<IGUIElement*>::ConstIterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
for (auto child : Children)
|
||||
{
|
||||
if ((*it)->getID() == id)
|
||||
return (*it);
|
||||
if (child->getID() == id)
|
||||
return child;
|
||||
|
||||
if (searchchildren)
|
||||
e = (*it)->getElementFromId(id, true);
|
||||
e = child->getElementFromId(id, true);
|
||||
|
||||
if (e)
|
||||
return e;
|
||||
@ -663,7 +648,7 @@ public:
|
||||
if (wanted==-2)
|
||||
wanted = 1073741824; // maximum s32
|
||||
|
||||
core::list<IGUIElement*>::ConstIterator it = Children.begin();
|
||||
auto it = Children.begin();
|
||||
|
||||
s32 closestOrder, currentOrder;
|
||||
|
||||
@ -806,10 +791,40 @@ protected:
|
||||
child->remove(); // remove from old parent
|
||||
child->LastParentRect = getAbsolutePosition();
|
||||
child->Parent = this;
|
||||
Children.push_back(child);
|
||||
child->ParentPos = Children.insert(Children.end(), child);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
template<typename Iterator>
|
||||
static size_t _fastSetChecksum(Iterator begin, Iterator end) {
|
||||
std::hash<typename Iterator::value_type> hasher;
|
||||
size_t checksum = 0;
|
||||
for (Iterator it = begin; it != end; ++it) {
|
||||
size_t h = hasher(*it);
|
||||
checksum ^= 966073049 + (h * 3432918353) + ((h >> 16) * 461845907);
|
||||
}
|
||||
return checksum;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Reorder children [from, to) to the order given by `neworder`
|
||||
void reorderChildren(
|
||||
std::list<IGUIElement*>::iterator from,
|
||||
std::list<IGUIElement*>::iterator to,
|
||||
const std::vector<IGUIElement*> &neworder)
|
||||
{
|
||||
assert(_fastSetChecksum(from, to) == _fastSetChecksum(neworder.begin(), neworder.end()));
|
||||
for (auto e : neworder)
|
||||
{
|
||||
*from = e;
|
||||
e->ParentPos = from;
|
||||
++from;
|
||||
}
|
||||
assert(from == to);
|
||||
}
|
||||
|
||||
|
||||
// not virtual because needed in constructor
|
||||
void recalculateAbsolutePosition(bool recursive)
|
||||
{
|
||||
@ -931,10 +946,9 @@ protected:
|
||||
if ( recursive )
|
||||
{
|
||||
// update all children
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
for (auto child : Children)
|
||||
{
|
||||
(*it)->recalculateAbsolutePosition(recursive);
|
||||
child->recalculateAbsolutePosition(recursive);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -942,11 +956,14 @@ protected:
|
||||
protected:
|
||||
|
||||
//! List of all children of this element
|
||||
core::list<IGUIElement*> Children;
|
||||
std::list<IGUIElement*> Children;
|
||||
|
||||
//! Pointer to the parent
|
||||
IGUIElement* Parent;
|
||||
|
||||
//! Our position in the parent list. Only valid when Parent != nullptr
|
||||
std::list<IGUIElement*>::iterator ParentPos;
|
||||
|
||||
//! relative rect of element
|
||||
core::rect<s32> RelativeRect;
|
||||
|
||||
|
@ -145,6 +145,10 @@ namespace scene
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual u32 getChangedID_Index() const = 0;
|
||||
|
||||
//! Used by the VideoDriver to remember the buffer link.
|
||||
virtual void setHWBuffer(void *ptr) const = 0;
|
||||
virtual void *getHWBuffer() const = 0;
|
||||
|
||||
//! Describe what kind of primitive geometry is used by the meshbuffer
|
||||
/** Note: Default is EPT_TRIANGLES. Using other types is fine for rendering.
|
||||
But meshbuffer manipulation functions might expect type EPT_TRIANGLES
|
||||
|
@ -33,8 +33,8 @@ public:
|
||||
virtual const c8* getTextFromClipboard() const = 0;
|
||||
|
||||
//! Get the total and available system RAM
|
||||
/** \param totalBytes: will contain the total system memory in bytes
|
||||
\param availableBytes: will contain the available memory in bytes
|
||||
/** \param totalBytes: will contain the total system memory in Kilobytes (1024 B)
|
||||
\param availableBytes: will contain the available memory in Kilobytes (1024 B)
|
||||
\return True if successful, false if not */
|
||||
virtual bool getSystemMemory(u32* totalBytes, u32* availableBytes) const = 0;
|
||||
|
||||
|
@ -13,8 +13,8 @@
|
||||
#include "irrString.h"
|
||||
#include "aabbox3d.h"
|
||||
#include "matrix4.h"
|
||||
#include "irrList.h"
|
||||
#include "IAttributes.h"
|
||||
#include <list>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -24,7 +24,7 @@ namespace scene
|
||||
class ISceneManager;
|
||||
|
||||
//! Typedef for list of scene nodes
|
||||
typedef core::list<ISceneNode*> ISceneNodeList;
|
||||
typedef std::list<ISceneNode*> ISceneNodeList;
|
||||
|
||||
//! Scene node interface.
|
||||
/** A scene node is a node in the hierarchical scene graph. Every scene
|
||||
@ -81,7 +81,7 @@ namespace scene
|
||||
{
|
||||
if (IsVisible)
|
||||
{
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->OnRegisterSceneNode();
|
||||
}
|
||||
@ -103,7 +103,7 @@ namespace scene
|
||||
|
||||
// perform the post render process on all children
|
||||
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->OnAnimate(timeMs);
|
||||
}
|
||||
@ -289,7 +289,7 @@ namespace scene
|
||||
e.g. because it couldn't be found in the children list. */
|
||||
virtual bool removeChild(ISceneNode* child)
|
||||
{
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
if ((*it) == child)
|
||||
{
|
||||
@ -309,7 +309,7 @@ namespace scene
|
||||
*/
|
||||
virtual void removeAll()
|
||||
{
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
{
|
||||
(*it)->Parent = 0;
|
||||
@ -519,7 +519,7 @@ namespace scene
|
||||
|
||||
//! Returns a const reference to the list of all children.
|
||||
/** \return The list of all children of this node. */
|
||||
const core::list<ISceneNode*>& getChildren() const
|
||||
const std::list<ISceneNode*>& getChildren() const
|
||||
{
|
||||
return Children;
|
||||
}
|
||||
@ -611,7 +611,7 @@ namespace scene
|
||||
|
||||
// clone children
|
||||
|
||||
ISceneNodeList::Iterator it = toCopyFrom->Children.begin();
|
||||
ISceneNodeList::iterator it = toCopyFrom->Children.begin();
|
||||
for (; it != toCopyFrom->Children.end(); ++it)
|
||||
(*it)->clone(this, newManager);
|
||||
}
|
||||
@ -622,7 +622,7 @@ namespace scene
|
||||
{
|
||||
SceneManager = newManager;
|
||||
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->setSceneManager(newManager);
|
||||
}
|
||||
@ -646,7 +646,7 @@ namespace scene
|
||||
ISceneNode* Parent;
|
||||
|
||||
//! List of all children of this node
|
||||
core::list<ISceneNode*> Children;
|
||||
std::list<ISceneNode*> Children;
|
||||
|
||||
//! Pointer to the scene manager
|
||||
ISceneManager* SceneManager;
|
||||
|
@ -100,7 +100,7 @@ namespace scene
|
||||
private:
|
||||
//! Internal members used by CSkinnedMesh
|
||||
friend class CSkinnedMesh;
|
||||
bool *Moved;
|
||||
char *Moved;
|
||||
core::vector3df StaticPos;
|
||||
core::vector3df StaticNormal;
|
||||
};
|
||||
|
@ -1386,7 +1386,7 @@ namespace video
|
||||
you have to render some special things, you can clear the
|
||||
zbuffer during the rendering process with this method any time.
|
||||
*/
|
||||
_IRR_DEPRECATED_ void clearZBuffer()
|
||||
void clearZBuffer()
|
||||
{
|
||||
clearBuffers(ECBF_DEPTH, SColor(255,0,0,0), 1.f, 0);
|
||||
}
|
||||
|
@ -6,8 +6,8 @@
|
||||
#define __IRR_COMPILE_CONFIG_H_INCLUDED__
|
||||
|
||||
//! Identifies the IrrlichtMt fork customized for the Minetest engine
|
||||
#define IRRLICHT_VERSION_MT_REVISION 4
|
||||
#define IRRLICHT_VERSION_MT "mt4"
|
||||
#define IRRLICHT_VERSION_MT_REVISION 6
|
||||
#define IRRLICHT_VERSION_MT "mt6"
|
||||
|
||||
//! Irrlicht SDK Version
|
||||
#define IRRLICHT_VERSION_MAJOR 1
|
||||
@ -61,7 +61,7 @@
|
||||
//! WIN32 for Windows32
|
||||
//! WIN64 for Windows64
|
||||
// The windows platform and API support SDL and WINDOW device
|
||||
#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
#define _IRR_WINDOWS_
|
||||
#define _IRR_WINDOWS_API_
|
||||
#ifndef _IRR_COMPILE_WITH_SDL_DEVICE_
|
||||
@ -69,14 +69,7 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER < 1500)
|
||||
# error "Only Microsoft Visual Studio 9.0 and later are supported."
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) || defined(MACOSX)
|
||||
#if !defined(MACOSX)
|
||||
#define MACOSX // legacy support
|
||||
#endif
|
||||
#if defined(__APPLE__)
|
||||
#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) || defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
|
||||
#define _IRR_IOS_PLATFORM_
|
||||
#define _IRR_COMPILE_WITH_IOS_DEVICE_
|
||||
@ -181,10 +174,6 @@ If not defined, Windows Multimedia library is used, which offers also broad supp
|
||||
#ifdef NO_IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
|
||||
#undef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
|
||||
#endif
|
||||
// can't get this to compile currently under borland, can be removed if someone has a better solution
|
||||
#if defined(__BORLANDC__)
|
||||
#undef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@ -460,7 +449,7 @@ ones. */
|
||||
#else // _IRR_WINDOWS_API_
|
||||
|
||||
// Force symbol export in shared libraries built with gcc.
|
||||
#if (__GNUC__ >= 4) && !defined(_IRR_STATIC_LIB_) && defined(IRRLICHT_EXPORTS)
|
||||
#if defined(__GNUC__) && !defined(_IRR_STATIC_LIB_) && defined(IRRLICHT_EXPORTS)
|
||||
#define IRRLICHT_API __attribute__ ((visibility("default")))
|
||||
#else
|
||||
#define IRRLICHT_API
|
||||
@ -480,22 +469,6 @@ ones. */
|
||||
#undef __IRR_HAS_S64
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
#include <tchar.h>
|
||||
|
||||
// Borland 5.5.1
|
||||
#if __BORLANDC__ == 0x551
|
||||
#undef _tfinddata_t
|
||||
#undef _tfindfirst
|
||||
#undef _tfindnext
|
||||
|
||||
#define _tfinddata_t __tfinddata_t
|
||||
#define _tfindfirst __tfindfirst
|
||||
#define _tfindnext __tfindnext
|
||||
typedef long intptr_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __has_feature
|
||||
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
|
||||
#endif
|
||||
|
@ -301,16 +301,6 @@ namespace video
|
||||
FogEnable(false), NormalizeNormals(false), UseMipMaps(true)
|
||||
{ }
|
||||
|
||||
//! Copy constructor
|
||||
/** \param other Material to copy from. */
|
||||
SMaterial(const SMaterial& other)
|
||||
{
|
||||
// These pointers are checked during assignment
|
||||
for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
|
||||
TextureLayer[i].TextureMatrix = 0;
|
||||
*this = other;
|
||||
}
|
||||
|
||||
//! Texture layer array.
|
||||
SMaterialLayer TextureLayer[MATERIAL_MAX_TEXTURES];
|
||||
|
||||
|
@ -23,6 +23,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
ChangedID_Vertex(1), ChangedID_Index(1), VertexType(vt),
|
||||
PrimitiveType(EPT_TRIANGLES),
|
||||
MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER),
|
||||
HWBuffer(NULL),
|
||||
BoundingBoxNeedsRecalculated(true)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
@ -383,6 +384,15 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
|
||||
virtual u32 getChangedID_Index() const _IRR_OVERRIDE_ {return ChangedID_Index;}
|
||||
|
||||
virtual void setHWBuffer(void *ptr) const _IRR_OVERRIDE_ {
|
||||
HWBuffer = ptr;
|
||||
}
|
||||
|
||||
virtual void *getHWBuffer() const _IRR_OVERRIDE_ {
|
||||
return HWBuffer;
|
||||
}
|
||||
|
||||
|
||||
//! Call this after changing the positions of any vertex.
|
||||
void boundingBoxNeedsRecalculated(void) { BoundingBoxNeedsRecalculated = true; }
|
||||
|
||||
@ -409,6 +419,8 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
||||
E_HARDWARE_MAPPING MappingHint_Vertex:3;
|
||||
E_HARDWARE_MAPPING MappingHint_Index:3;
|
||||
|
||||
mutable void *HWBuffer;
|
||||
|
||||
bool BoundingBoxNeedsRecalculated:1;
|
||||
};
|
||||
|
||||
|
@ -1,70 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __IRR_HEAPSORT_H_INCLUDED__
|
||||
#define __IRR_HEAPSORT_H_INCLUDED__
|
||||
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace core
|
||||
{
|
||||
|
||||
//! Sinks an element into the heap.
|
||||
template<class T>
|
||||
inline void heapsink(T*array, s32 element, s32 max)
|
||||
{
|
||||
while ((element<<1) < max) // there is a left child
|
||||
{
|
||||
s32 j = (element<<1);
|
||||
|
||||
if (j+1 < max && array[j] < array[j+1])
|
||||
j = j+1; // take right child
|
||||
|
||||
if (array[element] < array[j])
|
||||
{
|
||||
T t = array[j]; // swap elements
|
||||
array[j] = array[element];
|
||||
array[element] = t;
|
||||
element = j;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! Sorts an array with size 'size' using heapsort.
|
||||
template<class T>
|
||||
inline void heapsort(T* array_, s32 size)
|
||||
{
|
||||
// for heapsink we pretend this is not c++, where
|
||||
// arrays start with index 0. So we decrease the array pointer,
|
||||
// the maximum always +2 and the element always +1
|
||||
|
||||
T* virtualArray = array_ - 1;
|
||||
s32 virtualSize = size + 2;
|
||||
s32 i;
|
||||
|
||||
// build heap
|
||||
|
||||
for (i=((size-1)/2); i>=0; --i)
|
||||
heapsink(virtualArray, i+1, virtualSize-1);
|
||||
|
||||
// sort array, leave out the last element (0)
|
||||
for (i=size-1; i>0; --i)
|
||||
{
|
||||
T t = array_[0];
|
||||
array_[0] = array_[i];
|
||||
array_[i] = t;
|
||||
heapsink(virtualArray, 1, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
} // end namespace core
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -15,11 +15,6 @@ namespace irr
|
||||
namespace core
|
||||
{
|
||||
|
||||
#ifdef DEBUG_CLIENTBLOCK
|
||||
#undef DEBUG_CLIENTBLOCK
|
||||
#define DEBUG_CLIENTBLOCK new
|
||||
#endif
|
||||
|
||||
//! Very simple allocator implementation, containers using it can be used across dll boundaries
|
||||
template<typename T>
|
||||
class irrAllocator
|
||||
@ -102,12 +97,6 @@ public:
|
||||
};
|
||||
|
||||
|
||||
|
||||
#ifdef DEBUG_CLIENTBLOCK
|
||||
#undef DEBUG_CLIENTBLOCK
|
||||
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
|
||||
#endif
|
||||
|
||||
//! defines an allocation strategy (used only by irr::array so far)
|
||||
enum eAllocStrategy
|
||||
{
|
||||
|
@ -5,9 +5,11 @@
|
||||
#ifndef __IRR_ARRAY_H_INCLUDED__
|
||||
#define __IRR_ARRAY_H_INCLUDED__
|
||||
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <vector>
|
||||
|
||||
#include "irrTypes.h"
|
||||
#include "heapsort.h"
|
||||
#include "irrAllocator.h"
|
||||
#include "irrMath.h"
|
||||
|
||||
namespace irr
|
||||
@ -18,44 +20,27 @@ namespace core
|
||||
//! Self reallocating template array (like stl vector) with additional features.
|
||||
/** Some features are: Heap sorting, binary search methods, easier debugging.
|
||||
*/
|
||||
template <class T, typename TAlloc = irrAllocator<T> >
|
||||
template <class T>
|
||||
class array
|
||||
{
|
||||
|
||||
public:
|
||||
static_assert(!std::is_same<T, bool>::value,
|
||||
"irr::core::array<T> with T = bool not supported. Use std::vector instead.");
|
||||
|
||||
//! Default constructor for empty array.
|
||||
array() : data(0), allocated(0), used(0),
|
||||
strategy(ALLOC_STRATEGY_DOUBLE), free_when_destroyed(true), is_sorted(true)
|
||||
{
|
||||
}
|
||||
|
||||
array() : m_data(), is_sorted(true)
|
||||
{ }
|
||||
|
||||
//! Constructs an array and allocates an initial chunk of memory.
|
||||
/** \param start_count Amount of elements to pre-allocate. */
|
||||
explicit array(u32 start_count) : data(0), allocated(0), used(0),
|
||||
strategy(ALLOC_STRATEGY_DOUBLE),
|
||||
free_when_destroyed(true), is_sorted(true)
|
||||
explicit array(u32 start_count) : m_data(), is_sorted(true)
|
||||
{
|
||||
reallocate(start_count);
|
||||
m_data.reserve(start_count);
|
||||
}
|
||||
|
||||
|
||||
//! Copy constructor
|
||||
array(const array<T, TAlloc>& other) : data(0)
|
||||
{
|
||||
*this = other;
|
||||
}
|
||||
|
||||
|
||||
//! Destructor.
|
||||
/** Frees allocated memory, if set_free_when_destroyed was not set to
|
||||
false by the user before. */
|
||||
~array()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
array(const array<T>& other) : m_data(other.m_data), is_sorted(other.is_sorted)
|
||||
{ }
|
||||
|
||||
//! Reallocates the array, make it bigger or smaller.
|
||||
/** \param new_size New size of array.
|
||||
@ -65,52 +50,28 @@ public:
|
||||
*/
|
||||
void reallocate(u32 new_size, bool canShrink=true)
|
||||
{
|
||||
if (allocated==new_size)
|
||||
return;
|
||||
if (!canShrink && (new_size < allocated))
|
||||
return;
|
||||
|
||||
T* old_data = data;
|
||||
|
||||
data = allocator.allocate(new_size); //new T[new_size];
|
||||
allocated = new_size;
|
||||
|
||||
// copy old data
|
||||
const s32 end = used < new_size ? used : new_size;
|
||||
|
||||
for (s32 i=0; i<end; ++i)
|
||||
{
|
||||
// data[i] = old_data[i];
|
||||
allocator.construct(&data[i], old_data[i]);
|
||||
size_t allocated = m_data.capacity();
|
||||
if (new_size < allocated) {
|
||||
if (canShrink)
|
||||
m_data.resize(new_size);
|
||||
} else {
|
||||
m_data.reserve(new_size);
|
||||
}
|
||||
|
||||
// destruct old data
|
||||
for (u32 j=0; j<used; ++j)
|
||||
allocator.destruct(&old_data[j]);
|
||||
|
||||
if (allocated < used)
|
||||
used = allocated;
|
||||
|
||||
allocator.deallocate(old_data); //delete [] old_data;
|
||||
}
|
||||
|
||||
|
||||
//! set a new allocation strategy
|
||||
/** if the maximum size of the array is unknown, you can define how big the
|
||||
allocation should happen.
|
||||
\param newStrategy New strategy to apply to this array. */
|
||||
void setAllocStrategy ( eAllocStrategy newStrategy = ALLOC_STRATEGY_DOUBLE )
|
||||
{
|
||||
strategy = newStrategy;
|
||||
}
|
||||
|
||||
|
||||
//! Adds an element at back of array.
|
||||
/** If the array is too small to add this new element it is made bigger.
|
||||
\param element: Element to add at the back of the array. */
|
||||
void push_back(const T& element)
|
||||
{
|
||||
insert(element, used);
|
||||
m_data.push_back(element);
|
||||
is_sorted = false;
|
||||
}
|
||||
|
||||
void push_back(T&& element)
|
||||
{
|
||||
m_data.push_back(std::move(element));
|
||||
is_sorted = false;
|
||||
}
|
||||
|
||||
|
||||
@ -121,7 +82,14 @@ public:
|
||||
\param element Element to add at the back of the array. */
|
||||
void push_front(const T& element)
|
||||
{
|
||||
insert(element);
|
||||
m_data.insert(m_data.begin(), element);
|
||||
is_sorted = false;
|
||||
}
|
||||
|
||||
void push_front(T&& element)
|
||||
{
|
||||
m_data.insert(m_data.begin(), std::move(element));
|
||||
is_sorted = false;
|
||||
}
|
||||
|
||||
|
||||
@ -131,106 +99,21 @@ public:
|
||||
\param index: Where position to insert the new element. */
|
||||
void insert(const T& element, u32 index=0)
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(index>used) // access violation
|
||||
|
||||
if (used + 1 > allocated)
|
||||
{
|
||||
// this doesn't work if the element is in the same
|
||||
// array. So we'll copy the element first to be sure
|
||||
// we'll get no data corruption
|
||||
const T e(element);
|
||||
|
||||
// increase data block
|
||||
u32 newAlloc;
|
||||
switch ( strategy )
|
||||
{
|
||||
case ALLOC_STRATEGY_DOUBLE:
|
||||
newAlloc = used + 5 + (allocated < 500 ? used : used >> 2);
|
||||
break;
|
||||
default:
|
||||
case ALLOC_STRATEGY_SAFE:
|
||||
newAlloc = used + 1;
|
||||
break;
|
||||
}
|
||||
reallocate( newAlloc);
|
||||
|
||||
// move array content and construct new element
|
||||
// first move end one up
|
||||
for (u32 i=used; i>index; --i)
|
||||
{
|
||||
if (i<used)
|
||||
allocator.destruct(&data[i]);
|
||||
allocator.construct(&data[i], data[i-1]); // data[i] = data[i-1];
|
||||
}
|
||||
// then add new element
|
||||
if (used > index)
|
||||
allocator.destruct(&data[index]);
|
||||
allocator.construct(&data[index], e); // data[index] = e;
|
||||
}
|
||||
else
|
||||
{
|
||||
// element inserted not at end
|
||||
if ( used > index )
|
||||
{
|
||||
// create one new element at the end
|
||||
allocator.construct(&data[used], data[used-1]);
|
||||
|
||||
// move the rest of the array content
|
||||
for (u32 i=used-1; i>index; --i)
|
||||
{
|
||||
data[i] = data[i-1];
|
||||
}
|
||||
// insert the new element
|
||||
data[index] = element;
|
||||
}
|
||||
else
|
||||
{
|
||||
// insert the new element to the end
|
||||
allocator.construct(&data[index], element);
|
||||
}
|
||||
}
|
||||
// set to false as we don't know if we have the comparison operators
|
||||
_IRR_DEBUG_BREAK_IF(index > m_data.size()) // access violation
|
||||
auto pos = std::next(m_data.begin(), index);
|
||||
m_data.insert(pos, element);
|
||||
is_sorted = false;
|
||||
++used;
|
||||
}
|
||||
|
||||
|
||||
//! Clears the array and deletes all allocated memory.
|
||||
void clear()
|
||||
{
|
||||
if (free_when_destroyed)
|
||||
{
|
||||
for (u32 i=0; i<used; ++i)
|
||||
allocator.destruct(&data[i]);
|
||||
|
||||
allocator.deallocate(data); // delete [] data;
|
||||
}
|
||||
data = 0;
|
||||
used = 0;
|
||||
allocated = 0;
|
||||
// vector::clear() reduces the size to 0, but doesn't free memory.
|
||||
// This swap is guaranteed to delete the allocated memory.
|
||||
std::vector<T>().swap(m_data);
|
||||
is_sorted = true;
|
||||
}
|
||||
|
||||
|
||||
//! Sets pointer to new array, using this as new workspace.
|
||||
/** Make sure that set_free_when_destroyed is used properly.
|
||||
\param newPointer: Pointer to new array of elements.
|
||||
\param size: Size of the new array.
|
||||
\param _is_sorted Flag which tells whether the new array is already
|
||||
sorted.
|
||||
\param _free_when_destroyed Sets whether the new memory area shall be
|
||||
freed by the array upon destruction, or if this will be up to the user
|
||||
application. */
|
||||
void set_pointer(T* newPointer, u32 size, bool _is_sorted=false, bool _free_when_destroyed=true)
|
||||
{
|
||||
clear();
|
||||
data = newPointer;
|
||||
allocated = size;
|
||||
used = size;
|
||||
is_sorted = _is_sorted;
|
||||
free_when_destroyed=_free_when_destroyed;
|
||||
}
|
||||
|
||||
//! Set (copy) data from given memory block
|
||||
/** \param newData data to set, must have newSize elements
|
||||
\param newSize Amount of elements in newData
|
||||
@ -240,12 +123,11 @@ public:
|
||||
*/
|
||||
void set_data(const T* newData, u32 newSize, bool newDataIsSorted=false, bool canShrink=false)
|
||||
{
|
||||
reallocate(newSize, canShrink);
|
||||
set_used(newSize);
|
||||
for ( u32 i=0; i<newSize; ++i)
|
||||
{
|
||||
data[i] = newData[i];
|
||||
m_data.resize(newSize);
|
||||
if (canShrink) {
|
||||
m_data.shrink_to_fit();
|
||||
}
|
||||
std::copy(newData, newData + newSize, m_data.begin());
|
||||
is_sorted = newDataIsSorted;
|
||||
}
|
||||
|
||||
@ -255,80 +137,51 @@ public:
|
||||
\param size Amount of elements in otherData */
|
||||
bool equals(const T* otherData, u32 size) const
|
||||
{
|
||||
if (used != size)
|
||||
if (m_data.size() != size)
|
||||
return false;
|
||||
|
||||
for (u32 i=0; i<size; ++i)
|
||||
if (data[i] != otherData[i])
|
||||
return false;
|
||||
return true;
|
||||
return std::equal(m_data.begin(), m_data.end(), otherData);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Sets if the array should delete the memory it uses upon destruction.
|
||||
/** Also clear and set_pointer will only delete the (original) memory
|
||||
area if this flag is set to true, which is also the default. The
|
||||
methods reallocate, set_used, push_back, push_front, insert, and erase
|
||||
will still try to deallocate the original memory, which might cause
|
||||
troubles depending on the intended use of the memory area.
|
||||
\param f If true, the array frees the allocated memory in its
|
||||
destructor, otherwise not. The default is true. */
|
||||
void set_free_when_destroyed(bool f)
|
||||
{
|
||||
free_when_destroyed = f;
|
||||
}
|
||||
|
||||
|
||||
//! Sets the size of the array and allocates new elements if necessary.
|
||||
/** Please note: This is only secure when using it with simple types,
|
||||
because no default constructor will be called for the added elements.
|
||||
\param usedNow Amount of elements now used. */
|
||||
/** \param usedNow Amount of elements now used. */
|
||||
void set_used(u32 usedNow)
|
||||
{
|
||||
if (allocated < usedNow)
|
||||
reallocate(usedNow);
|
||||
|
||||
used = usedNow;
|
||||
m_data.resize(usedNow);
|
||||
}
|
||||
|
||||
//! Assignment operator
|
||||
const array<T, TAlloc>& operator=(const array<T, TAlloc>& other)
|
||||
const array<T>& operator=(const array<T>& other)
|
||||
{
|
||||
if (this == &other)
|
||||
return *this;
|
||||
strategy = other.strategy;
|
||||
|
||||
if (data)
|
||||
clear();
|
||||
|
||||
//if (allocated < other.allocated)
|
||||
if (other.allocated == 0)
|
||||
data = 0;
|
||||
else
|
||||
data = allocator.allocate(other.allocated); // new T[other.allocated];
|
||||
|
||||
used = other.used;
|
||||
free_when_destroyed = true;
|
||||
m_data = other.m_data;
|
||||
is_sorted = other.is_sorted;
|
||||
allocated = other.allocated;
|
||||
|
||||
for (u32 i=0; i<other.used; ++i)
|
||||
allocator.construct(&data[i], other.data[i]); // data[i] = other.data[i];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
array<T>& operator=(const std::vector<T> &other)
|
||||
{
|
||||
m_data = other;
|
||||
is_sorted = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
array<T>& operator=(std::vector<T> &&other)
|
||||
{
|
||||
m_data = std::move(other);
|
||||
is_sorted = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! Equality operator
|
||||
bool operator == (const array<T, TAlloc>& other) const
|
||||
bool operator == (const array<T>& other) const
|
||||
{
|
||||
return equals(other.const_pointer(), other.size());
|
||||
}
|
||||
|
||||
|
||||
//! Inequality operator
|
||||
bool operator != (const array<T, TAlloc>& other) const
|
||||
bool operator != (const array<T>& other) const
|
||||
{
|
||||
return !(*this==other);
|
||||
}
|
||||
@ -337,36 +190,36 @@ public:
|
||||
//! Direct access operator
|
||||
T& operator [](u32 index)
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(index>=used) // access violation
|
||||
_IRR_DEBUG_BREAK_IF(index >= m_data.size()) // access violation
|
||||
|
||||
return data[index];
|
||||
return m_data[index];
|
||||
}
|
||||
|
||||
|
||||
//! Direct const access operator
|
||||
const T& operator [](u32 index) const
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(index>=used) // access violation
|
||||
_IRR_DEBUG_BREAK_IF(index >= m_data.size()) // access violation
|
||||
|
||||
return data[index];
|
||||
return m_data[index];
|
||||
}
|
||||
|
||||
|
||||
//! Gets last element.
|
||||
T& getLast()
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!used) // access violation
|
||||
_IRR_DEBUG_BREAK_IF(m_data.empty()) // access violation
|
||||
|
||||
return data[used-1];
|
||||
return m_data.back();
|
||||
}
|
||||
|
||||
|
||||
//! Gets last element
|
||||
const T& getLast() const
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(!used) // access violation
|
||||
_IRR_DEBUG_BREAK_IF(m_data.empty()) // access violation
|
||||
|
||||
return data[used-1];
|
||||
return m_data.back();
|
||||
}
|
||||
|
||||
|
||||
@ -374,7 +227,7 @@ public:
|
||||
/** \return Pointer to the array. */
|
||||
T* pointer()
|
||||
{
|
||||
return data;
|
||||
return &m_data[0];
|
||||
}
|
||||
|
||||
|
||||
@ -382,7 +235,7 @@ public:
|
||||
/** \return Pointer to the array. */
|
||||
const T* const_pointer() const
|
||||
{
|
||||
return data;
|
||||
return &m_data[0];
|
||||
}
|
||||
|
||||
|
||||
@ -390,7 +243,7 @@ public:
|
||||
/** \return Size of elements in the array which are actually occupied. */
|
||||
u32 size() const
|
||||
{
|
||||
return used;
|
||||
return m_data.size();
|
||||
}
|
||||
|
||||
|
||||
@ -399,7 +252,7 @@ public:
|
||||
allocated would be allocated_size() * sizeof(ElementTypeUsed); */
|
||||
u32 allocated_size() const
|
||||
{
|
||||
return allocated;
|
||||
return m_data.capacity();
|
||||
}
|
||||
|
||||
|
||||
@ -407,7 +260,7 @@ public:
|
||||
/** \return True if the array is empty false if not. */
|
||||
bool empty() const
|
||||
{
|
||||
return used == 0;
|
||||
return m_data.empty();
|
||||
}
|
||||
|
||||
|
||||
@ -416,9 +269,10 @@ public:
|
||||
O(n*log n) in worst case. */
|
||||
void sort()
|
||||
{
|
||||
if (!is_sorted && used>1)
|
||||
heapsort(data, used);
|
||||
is_sorted = true;
|
||||
if (!is_sorted) {
|
||||
std::sort(m_data.begin(), m_data.end());
|
||||
is_sorted = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -432,10 +286,9 @@ public:
|
||||
s32 binary_search(const T& element)
|
||||
{
|
||||
sort();
|
||||
return binary_search(element, 0, used-1);
|
||||
return binary_search(element, 0, (s32)m_data.size() - 1);
|
||||
}
|
||||
|
||||
|
||||
//! Performs a binary search for an element if possible, returns -1 if not found.
|
||||
/** This method is for const arrays and so cannot call sort(), if the array is
|
||||
not sorted then linear_search will be used instead. Potentially very slow!
|
||||
@ -445,12 +298,11 @@ public:
|
||||
s32 binary_search(const T& element) const
|
||||
{
|
||||
if (is_sorted)
|
||||
return binary_search(element, 0, used-1);
|
||||
return binary_search(element, 0, (s32)m_data.size() - 1);
|
||||
else
|
||||
return linear_search(element);
|
||||
}
|
||||
|
||||
|
||||
//! Performs a binary search for an element, returns -1 if not found.
|
||||
/** \param element: Element to search for.
|
||||
\param left First left index
|
||||
@ -459,31 +311,15 @@ public:
|
||||
is returned. */
|
||||
s32 binary_search(const T& element, s32 left, s32 right) const
|
||||
{
|
||||
if (!used)
|
||||
if (left > right)
|
||||
return -1;
|
||||
|
||||
s32 m;
|
||||
|
||||
do
|
||||
{
|
||||
m = (left+right)>>1;
|
||||
|
||||
if (element < data[m])
|
||||
right = m - 1;
|
||||
else
|
||||
left = m + 1;
|
||||
|
||||
} while((element < data[m] || data[m] < element) && left<=right);
|
||||
// this last line equals to:
|
||||
// " while((element != array[m]) && left<=right);"
|
||||
// but we only want to use the '<' operator.
|
||||
// the same in next line, it is "(element == array[m])"
|
||||
|
||||
|
||||
if (!(element < data[m]) && !(data[m] < element))
|
||||
return m;
|
||||
|
||||
return -1;
|
||||
auto lpos = std::next(m_data.begin(), left);
|
||||
auto rpos = std::next(m_data.begin(), right);
|
||||
auto it = std::lower_bound(lpos, rpos, element);
|
||||
// *it = first element in [first, last) that is >= element, or last if not found.
|
||||
if (*it < element || element < *it)
|
||||
return -1;
|
||||
return it - m_data.begin();
|
||||
}
|
||||
|
||||
|
||||
@ -498,25 +334,11 @@ public:
|
||||
s32 binary_search_multi(const T& element, s32 &last)
|
||||
{
|
||||
sort();
|
||||
s32 index = binary_search(element, 0, used-1);
|
||||
if ( index < 0 )
|
||||
return index;
|
||||
|
||||
// The search can be somewhere in the middle of the set
|
||||
// look linear previous and past the index
|
||||
last = index;
|
||||
|
||||
while ( index > 0 && !(element < data[index - 1]) && !(data[index - 1] < element) )
|
||||
{
|
||||
index -= 1;
|
||||
}
|
||||
// look linear up
|
||||
while ( last < (s32) used - 1 && !(element < data[last + 1]) && !(data[last + 1] < element) )
|
||||
{
|
||||
last += 1;
|
||||
}
|
||||
|
||||
return index;
|
||||
auto iters = std::equal_range(m_data.begin(), m_data.end(), element);
|
||||
if (iters.first == iters.second)
|
||||
return -1;
|
||||
last = (iters.second - m_data.begin()) - 1;
|
||||
return iters.first - m_data.begin();
|
||||
}
|
||||
|
||||
|
||||
@ -528,11 +350,10 @@ public:
|
||||
is returned. */
|
||||
s32 linear_search(const T& element) const
|
||||
{
|
||||
for (u32 i=0; i<used; ++i)
|
||||
if (element == data[i])
|
||||
return (s32)i;
|
||||
|
||||
return -1;
|
||||
auto it = std::find(m_data.begin(), m_data.end(), element);
|
||||
if (it == m_data.end())
|
||||
return -1;
|
||||
return it - m_data.begin();
|
||||
}
|
||||
|
||||
|
||||
@ -544,11 +365,11 @@ public:
|
||||
is returned. */
|
||||
s32 linear_reverse_search(const T& element) const
|
||||
{
|
||||
for (s32 i=used-1; i>=0; --i)
|
||||
if (data[i] == element)
|
||||
return i;
|
||||
|
||||
return -1;
|
||||
auto it = std::find(m_data.rbegin(), m_data.rend(), element);
|
||||
if (it == m_data.rend())
|
||||
return -1;
|
||||
size_t offset = it - m_data.rbegin();
|
||||
return m_data.size() - offset - 1;
|
||||
}
|
||||
|
||||
|
||||
@ -558,17 +379,9 @@ public:
|
||||
\param index: Index of element to be erased. */
|
||||
void erase(u32 index)
|
||||
{
|
||||
_IRR_DEBUG_BREAK_IF(index>=used) // access violation
|
||||
|
||||
for (u32 i=index+1; i<used; ++i)
|
||||
{
|
||||
allocator.destruct(&data[i-1]);
|
||||
allocator.construct(&data[i-1], data[i]); // data[i-1] = data[i];
|
||||
}
|
||||
|
||||
allocator.destruct(&data[used-1]);
|
||||
|
||||
--used;
|
||||
_IRR_DEBUG_BREAK_IF(index >= m_data.size()) // access violation
|
||||
auto it = std::next(m_data.begin(), index);
|
||||
m_data.erase(it);
|
||||
}
|
||||
|
||||
|
||||
@ -579,30 +392,14 @@ public:
|
||||
\param count: Amount of elements to be erased. */
|
||||
void erase(u32 index, s32 count)
|
||||
{
|
||||
if (index>=used || count<1)
|
||||
if (index >= m_data.size() || count < 1)
|
||||
return;
|
||||
if (index+count>used)
|
||||
count = used-index;
|
||||
|
||||
u32 i;
|
||||
for (i=index; i<index+count; ++i)
|
||||
allocator.destruct(&data[i]);
|
||||
|
||||
for (i=index+count; i<used; ++i)
|
||||
{
|
||||
if (i-count >= index+count) // not already destructed before loop
|
||||
allocator.destruct(&data[i-count]);
|
||||
|
||||
allocator.construct(&data[i-count], data[i]); // data[i-count] = data[i];
|
||||
|
||||
if (i >= used-count) // those which are not overwritten
|
||||
allocator.destruct(&data[i]);
|
||||
}
|
||||
|
||||
used-= count;
|
||||
count = std::min(count, (s32)m_data.size() - (s32)index);
|
||||
auto first = std::next(m_data.begin(), index);
|
||||
auto last = std::next(first, count);
|
||||
m_data.erase(first, last);
|
||||
}
|
||||
|
||||
|
||||
//! Sets if the array is sorted
|
||||
void set_sorted(bool _is_sorted)
|
||||
{
|
||||
@ -614,38 +411,30 @@ public:
|
||||
/** Afterward this object will contain the content of the other object and the other
|
||||
object will contain the content of this object.
|
||||
\param other Swap content with this object */
|
||||
void swap(array<T, TAlloc>& other)
|
||||
void swap(array<T>& other)
|
||||
{
|
||||
core::swap(data, other.data);
|
||||
core::swap(allocated, other.allocated);
|
||||
core::swap(used, other.used);
|
||||
core::swap(allocator, other.allocator); // memory is still released by the same allocator used for allocation
|
||||
eAllocStrategy helper_strategy(strategy); // can't use core::swap with bitfields
|
||||
strategy = other.strategy;
|
||||
other.strategy = helper_strategy;
|
||||
bool helper_free_when_destroyed(free_when_destroyed);
|
||||
free_when_destroyed = other.free_when_destroyed;
|
||||
other.free_when_destroyed = helper_free_when_destroyed;
|
||||
bool helper_is_sorted(is_sorted);
|
||||
is_sorted = other.is_sorted;
|
||||
other.is_sorted = helper_is_sorted;
|
||||
m_data.swap(other.m_data);
|
||||
std::swap(is_sorted, other.is_sorted);
|
||||
}
|
||||
|
||||
//! Pull the contents of this array as a vector.
|
||||
// The array is left empty.
|
||||
std::vector<T> steal()
|
||||
{
|
||||
std::vector<T> ret = std::move(m_data);
|
||||
m_data.clear();
|
||||
is_sorted = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
typedef TAlloc allocator_type;
|
||||
typedef T value_type;
|
||||
typedef u32 size_type;
|
||||
|
||||
private:
|
||||
T* data;
|
||||
u32 allocated;
|
||||
u32 used;
|
||||
TAlloc allocator;
|
||||
eAllocStrategy strategy:4;
|
||||
bool free_when_destroyed:1;
|
||||
bool is_sorted:1;
|
||||
std::vector<T> m_data;
|
||||
bool is_sorted;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace core
|
||||
} // end namespace irr
|
||||
|
||||
|
@ -1,414 +0,0 @@
|
||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __IRR_LIST_H_INCLUDED__
|
||||
#define __IRR_LIST_H_INCLUDED__
|
||||
|
||||
#include "irrTypes.h"
|
||||
#include "irrAllocator.h"
|
||||
#include "irrMath.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace core
|
||||
{
|
||||
|
||||
|
||||
//! Doubly linked list template.
|
||||
template <class T>
|
||||
class list
|
||||
{
|
||||
private:
|
||||
|
||||
//! List element node with pointer to previous and next element in the list.
|
||||
struct SKListNode
|
||||
{
|
||||
SKListNode(const T& e) : Next(0), Prev(0), Element(e) {}
|
||||
|
||||
SKListNode* Next;
|
||||
SKListNode* Prev;
|
||||
T Element;
|
||||
};
|
||||
|
||||
public:
|
||||
class ConstIterator;
|
||||
|
||||
//! List iterator.
|
||||
class Iterator
|
||||
{
|
||||
public:
|
||||
Iterator() : Current(0) {}
|
||||
|
||||
Iterator& operator ++() { Current = Current->Next; return *this; }
|
||||
Iterator& operator --() { Current = Current->Prev; return *this; }
|
||||
Iterator operator ++(s32) { Iterator tmp = *this; Current = Current->Next; return tmp; }
|
||||
Iterator operator --(s32) { Iterator tmp = *this; Current = Current->Prev; return tmp; }
|
||||
|
||||
Iterator& operator +=(s32 num)
|
||||
{
|
||||
if(num > 0)
|
||||
{
|
||||
while (num-- && this->Current != 0) ++(*this);
|
||||
}
|
||||
else
|
||||
{
|
||||
while(num++ && this->Current != 0) --(*this);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Iterator operator + (s32 num) const { Iterator tmp = *this; return tmp += num; }
|
||||
Iterator& operator -=(s32 num) { return (*this)+=(-num); }
|
||||
Iterator operator - (s32 num) const { return (*this)+ (-num); }
|
||||
|
||||
bool operator ==(const Iterator& other) const { return Current == other.Current; }
|
||||
bool operator !=(const Iterator& other) const { return Current != other.Current; }
|
||||
bool operator ==(const ConstIterator& other) const { return Current == other.Current; }
|
||||
bool operator !=(const ConstIterator& other) const { return Current != other.Current; }
|
||||
|
||||
T & operator * () { return Current->Element; }
|
||||
T * operator ->() { return &Current->Element; }
|
||||
|
||||
private:
|
||||
explicit Iterator(SKListNode* begin) : Current(begin) {}
|
||||
|
||||
SKListNode* Current;
|
||||
|
||||
friend class list<T>;
|
||||
friend class ConstIterator;
|
||||
};
|
||||
|
||||
//! List iterator for const access.
|
||||
class ConstIterator
|
||||
{
|
||||
public:
|
||||
|
||||
ConstIterator() : Current(0) {}
|
||||
ConstIterator(const Iterator& iter) : Current(iter.Current) {}
|
||||
|
||||
ConstIterator& operator ++() { Current = Current->Next; return *this; }
|
||||
ConstIterator& operator --() { Current = Current->Prev; return *this; }
|
||||
ConstIterator operator ++(s32) { ConstIterator tmp = *this; Current = Current->Next; return tmp; }
|
||||
ConstIterator operator --(s32) { ConstIterator tmp = *this; Current = Current->Prev; return tmp; }
|
||||
|
||||
ConstIterator& operator +=(s32 num)
|
||||
{
|
||||
if(num > 0)
|
||||
{
|
||||
while(num-- && this->Current != 0) ++(*this);
|
||||
}
|
||||
else
|
||||
{
|
||||
while(num++ && this->Current != 0) --(*this);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
ConstIterator operator + (s32 num) const { ConstIterator tmp = *this; return tmp += num; }
|
||||
ConstIterator& operator -=(s32 num) { return (*this)+=(-num); }
|
||||
ConstIterator operator - (s32 num) const { return (*this)+ (-num); }
|
||||
|
||||
bool operator ==(const ConstIterator& other) const { return Current == other.Current; }
|
||||
bool operator !=(const ConstIterator& other) const { return Current != other.Current; }
|
||||
bool operator ==(const Iterator& other) const { return Current == other.Current; }
|
||||
bool operator !=(const Iterator& other) const { return Current != other.Current; }
|
||||
|
||||
const T & operator * () { return Current->Element; }
|
||||
const T * operator ->() { return &Current->Element; }
|
||||
|
||||
ConstIterator & operator =(const Iterator & iterator) { Current = iterator.Current; return *this; }
|
||||
|
||||
private:
|
||||
explicit ConstIterator(SKListNode* begin) : Current(begin) {}
|
||||
|
||||
SKListNode* Current;
|
||||
|
||||
friend class Iterator;
|
||||
friend class list<T>;
|
||||
};
|
||||
|
||||
//! Default constructor for empty list.
|
||||
list()
|
||||
: First(0), Last(0), Size(0) {}
|
||||
|
||||
|
||||
//! Copy constructor.
|
||||
list(const list<T>& other) : First(0), Last(0), Size(0)
|
||||
{
|
||||
*this = other;
|
||||
}
|
||||
|
||||
|
||||
//! Destructor
|
||||
~list()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
|
||||
//! Assignment operator
|
||||
void operator=(const list<T>& other)
|
||||
{
|
||||
if(&other == this)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
clear();
|
||||
|
||||
SKListNode* node = other.First;
|
||||
while(node)
|
||||
{
|
||||
push_back(node->Element);
|
||||
node = node->Next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! Returns amount of elements in list.
|
||||
/** \return Amount of elements in the list. */
|
||||
u32 size() const
|
||||
{
|
||||
return Size;
|
||||
}
|
||||
u32 getSize() const
|
||||
{
|
||||
return Size;
|
||||
}
|
||||
|
||||
|
||||
//! Clears the list, deletes all elements in the list.
|
||||
/** All existing iterators of this list will be invalid. */
|
||||
void clear()
|
||||
{
|
||||
while(First)
|
||||
{
|
||||
SKListNode * next = First->Next;
|
||||
allocator.destruct(First);
|
||||
allocator.deallocate(First);
|
||||
First = next;
|
||||
}
|
||||
|
||||
//First = 0; handled by loop
|
||||
Last = 0;
|
||||
Size = 0;
|
||||
}
|
||||
|
||||
|
||||
//! Checks for empty list.
|
||||
/** \return True if the list is empty and false if not. */
|
||||
bool empty() const
|
||||
{
|
||||
return (First == 0);
|
||||
}
|
||||
|
||||
|
||||
//! Adds an element at the end of the list.
|
||||
/** \param element Element to add to the list. */
|
||||
void push_back(const T& element)
|
||||
{
|
||||
SKListNode* node = allocator.allocate(1);
|
||||
allocator.construct(node, element);
|
||||
|
||||
++Size;
|
||||
|
||||
if (First == 0)
|
||||
First = node;
|
||||
|
||||
node->Prev = Last;
|
||||
|
||||
if (Last != 0)
|
||||
Last->Next = node;
|
||||
|
||||
Last = node;
|
||||
}
|
||||
|
||||
|
||||
//! Adds an element at the begin of the list.
|
||||
/** \param element: Element to add to the list. */
|
||||
void push_front(const T& element)
|
||||
{
|
||||
SKListNode* node = allocator.allocate(1);
|
||||
allocator.construct(node, element);
|
||||
|
||||
++Size;
|
||||
|
||||
if (First == 0)
|
||||
{
|
||||
Last = node;
|
||||
First = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
node->Next = First;
|
||||
First->Prev = node;
|
||||
First = node;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! Gets first node.
|
||||
/** \return A list iterator pointing to the beginning of the list. */
|
||||
Iterator begin()
|
||||
{
|
||||
return Iterator(First);
|
||||
}
|
||||
|
||||
|
||||
//! Gets first node.
|
||||
/** \return A const list iterator pointing to the beginning of the list. */
|
||||
ConstIterator begin() const
|
||||
{
|
||||
return ConstIterator(First);
|
||||
}
|
||||
|
||||
|
||||
//! Gets end node.
|
||||
/** \return List iterator pointing to null. */
|
||||
Iterator end()
|
||||
{
|
||||
return Iterator(0);
|
||||
}
|
||||
|
||||
|
||||
//! Gets end node.
|
||||
/** \return Const list iterator pointing to null. */
|
||||
ConstIterator end() const
|
||||
{
|
||||
return ConstIterator(0);
|
||||
}
|
||||
|
||||
|
||||
//! Gets last element.
|
||||
/** \return List iterator pointing to the last element of the list. */
|
||||
Iterator getLast()
|
||||
{
|
||||
return Iterator(Last);
|
||||
}
|
||||
|
||||
|
||||
//! Gets last element.
|
||||
/** \return Const list iterator pointing to the last element of the list. */
|
||||
ConstIterator getLast() const
|
||||
{
|
||||
return ConstIterator(Last);
|
||||
}
|
||||
|
||||
|
||||
//! Inserts an element after an element.
|
||||
/** \param it Iterator pointing to element after which the new element
|
||||
should be inserted.
|
||||
\param element The new element to be inserted into the list.
|
||||
*/
|
||||
void insert_after(const Iterator& it, const T& element)
|
||||
{
|
||||
SKListNode* node = allocator.allocate(1);
|
||||
allocator.construct(node, element);
|
||||
|
||||
node->Next = it.Current->Next;
|
||||
|
||||
if (it.Current->Next)
|
||||
it.Current->Next->Prev = node;
|
||||
|
||||
node->Prev = it.Current;
|
||||
it.Current->Next = node;
|
||||
++Size;
|
||||
|
||||
if (it.Current == Last)
|
||||
Last = node;
|
||||
}
|
||||
|
||||
|
||||
//! Inserts an element before an element.
|
||||
/** \param it Iterator pointing to element before which the new element
|
||||
should be inserted.
|
||||
\param element The new element to be inserted into the list.
|
||||
*/
|
||||
void insert_before(const Iterator& it, const T& element)
|
||||
{
|
||||
SKListNode* node = allocator.allocate(1);
|
||||
allocator.construct(node, element);
|
||||
|
||||
node->Prev = it.Current->Prev;
|
||||
|
||||
if (it.Current->Prev)
|
||||
it.Current->Prev->Next = node;
|
||||
|
||||
node->Next = it.Current;
|
||||
it.Current->Prev = node;
|
||||
++Size;
|
||||
|
||||
if (it.Current == First)
|
||||
First = node;
|
||||
}
|
||||
|
||||
|
||||
//! Erases an element.
|
||||
/** \param it Iterator pointing to the element which shall be erased.
|
||||
\return Iterator pointing to next element. */
|
||||
Iterator erase(Iterator& it)
|
||||
{
|
||||
// suggest changing this to a const Iterator& and
|
||||
// working around line: it.Current = 0 (possibly with a mutable, or just let it be garbage?)
|
||||
|
||||
Iterator returnIterator(it);
|
||||
++returnIterator;
|
||||
|
||||
if(it.Current == First)
|
||||
{
|
||||
First = it.Current->Next;
|
||||
}
|
||||
else
|
||||
{
|
||||
it.Current->Prev->Next = it.Current->Next;
|
||||
}
|
||||
|
||||
if(it.Current == Last)
|
||||
{
|
||||
Last = it.Current->Prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
it.Current->Next->Prev = it.Current->Prev;
|
||||
}
|
||||
|
||||
allocator.destruct(it.Current);
|
||||
allocator.deallocate(it.Current);
|
||||
it.Current = 0;
|
||||
--Size;
|
||||
|
||||
return returnIterator;
|
||||
}
|
||||
|
||||
//! Swap the content of this list container with the content of another list
|
||||
/** Afterward this object will contain the content of the other object and the other
|
||||
object will contain the content of this object. Iterators will afterward be valid for
|
||||
the swapped object.
|
||||
\param other Swap content with this object */
|
||||
void swap(list<T>& other)
|
||||
{
|
||||
core::swap(First, other.First);
|
||||
core::swap(Last, other.Last);
|
||||
core::swap(Size, other.Size);
|
||||
core::swap(allocator, other.allocator); // memory is still released by the same allocator used for allocation
|
||||
}
|
||||
|
||||
typedef T value_type;
|
||||
typedef u32 size_type;
|
||||
|
||||
private:
|
||||
|
||||
SKListNode* First;
|
||||
SKListNode* Last;
|
||||
u32 Size;
|
||||
irrAllocator<SKListNode> allocator;
|
||||
|
||||
};
|
||||
|
||||
|
||||
} // end namespace core
|
||||
}// end namespace irr
|
||||
|
||||
#endif
|
||||
|
1082
include/irrMap.h
1082
include/irrMap.h
File diff suppressed because it is too large
Load Diff
@ -61,22 +61,17 @@ typedef double f64;
|
||||
|
||||
|
||||
#include <wchar.h>
|
||||
#ifdef _IRR_WINDOWS_API_
|
||||
//! Defines for s{w,n}printf_irr because s{w,n}printf methods do not match the ISO C
|
||||
//! standard on Windows platforms.
|
||||
//! We want int snprintf_irr(char *str, size_t size, const char *format, ...);
|
||||
//! and int swprintf_irr(wchar_t *wcs, size_t maxlen, const wchar_t *format, ...);
|
||||
#if defined(_MSC_VER) && _MSC_VER > 1310 && !defined (_WIN32_WCE)
|
||||
#if defined(_MSC_VER)
|
||||
#define swprintf_irr swprintf_s
|
||||
#define snprintf_irr sprintf_s
|
||||
#elif !defined(__CYGWIN__)
|
||||
#define swprintf_irr _snwprintf
|
||||
#define snprintf_irr _snprintf
|
||||
#endif
|
||||
#else
|
||||
#define swprintf_irr swprintf
|
||||
#define snprintf_irr snprintf
|
||||
#endif // _IRR_WINDOWS_API_
|
||||
#endif // _MSC_VER
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -89,15 +84,11 @@ namespace irr
|
||||
|
||||
//! define a break macro for debugging.
|
||||
#if defined(_DEBUG)
|
||||
#if defined(_IRR_WINDOWS_API_) && defined(_MSC_VER) && !defined (_WIN32_WCE)
|
||||
#if defined(WIN64) || defined(_WIN64) // using portable common solution for x64 configuration
|
||||
#if defined(_IRR_WINDOWS_API_) && defined(_MSC_VER)
|
||||
#include <crtdbg.h>
|
||||
#define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) if (_CONDITION_) {_CrtDbgBreak();}
|
||||
#else
|
||||
#define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) if (_CONDITION_) {_asm int 3}
|
||||
#endif
|
||||
#else
|
||||
#include "assert.h"
|
||||
#include <assert.h>
|
||||
#define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) assert( !(_CONDITION_) );
|
||||
#endif
|
||||
#else
|
||||
@ -113,9 +104,9 @@ For functions: template<class T> _IRR_DEPRECATED_ void test4(void) {}
|
||||
**/
|
||||
#if defined(IGNORE_DEPRECATED_WARNING)
|
||||
#define _IRR_DEPRECATED_
|
||||
#elif _MSC_VER >= 1310 //vs 2003 or higher
|
||||
#elif defined(_MSC_VER)
|
||||
#define _IRR_DEPRECATED_ __declspec(deprecated)
|
||||
#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) // all versions above 3.0 should support this feature
|
||||
#elif defined(__GNUC__)
|
||||
#define _IRR_DEPRECATED_ __attribute__ ((deprecated))
|
||||
#else
|
||||
#define _IRR_DEPRECATED_
|
||||
@ -125,35 +116,7 @@ For functions: template<class T> _IRR_DEPRECATED_ void test4(void) {}
|
||||
/** Usage in a derived class:
|
||||
virtual void somefunc() _IRR_OVERRIDE_;
|
||||
*/
|
||||
#if ( ((__GNUC__ > 4 ) || ((__GNUC__ == 4 ) && (__GNUC_MINOR__ >= 7))) && (defined(__GXX_EXPERIMENTAL_CXX0X) || __cplusplus >= 201103L) )
|
||||
#define _IRR_OVERRIDE_ override
|
||||
#elif (_MSC_VER >= 1600 ) /* supported since MSVC 2010 */
|
||||
#define _IRR_OVERRIDE_ override
|
||||
#elif (__clang_major__ >= 3 && __has_feature(cxx_override_control))
|
||||
#define _IRR_OVERRIDE_ override
|
||||
#else
|
||||
#define _IRR_OVERRIDE_
|
||||
#endif
|
||||
|
||||
// memory debugging
|
||||
#if defined(_DEBUG) && defined(IRRLICHT_EXPORTS) && defined(_MSC_VER) && \
|
||||
(_MSC_VER > 1299) && !defined(_IRR_DONT_DO_MEMORY_DEBUGGING_HERE) && !defined(_WIN32_WCE)
|
||||
|
||||
#define CRTDBG_MAP_ALLOC
|
||||
#define _CRTDBG_MAP_ALLOC
|
||||
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
|
||||
#include <stdlib.h>
|
||||
#include <crtdbg.h>
|
||||
#define new DEBUG_CLIENTBLOCK
|
||||
#endif
|
||||
|
||||
//! ignore VC8 warning deprecated
|
||||
/** The Microsoft compiler */
|
||||
#if defined(_IRR_WINDOWS_API_) && defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||
//#pragma warning( disable: 4996)
|
||||
//#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
//#define _CRT_NONSTDC_NO_DEPRECATE 1
|
||||
#endif
|
||||
|
||||
|
||||
//! creates four CC codes used in Irrlicht for simple ids
|
||||
|
@ -50,7 +50,6 @@
|
||||
#include "EMessageBoxFlags.h"
|
||||
#include "ESceneNodeTypes.h"
|
||||
#include "fast_atof.h"
|
||||
#include "heapsort.h"
|
||||
#include "IAnimatedMesh.h"
|
||||
#include "IAnimatedMeshSceneNode.h"
|
||||
#include "IAttributes.h"
|
||||
@ -112,8 +111,6 @@
|
||||
#include "IRandomizer.h"
|
||||
#include "IRenderTarget.h"
|
||||
#include "IrrlichtDevice.h"
|
||||
#include "irrList.h"
|
||||
#include "irrMap.h"
|
||||
#include "irrMath.h"
|
||||
#include "irrString.h"
|
||||
#include "irrTypes.h"
|
||||
|
@ -13,26 +13,13 @@
|
||||
// in between!
|
||||
|
||||
// byte-align structures
|
||||
#if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__)
|
||||
#if defined(_MSC_VER)
|
||||
# pragma warning(disable: 4103)
|
||||
# pragma pack( push, packing )
|
||||
# pragma pack( 1 )
|
||||
# define PACK_STRUCT
|
||||
#elif defined( __DMC__ )
|
||||
# pragma pack( push, 1 )
|
||||
# define PACK_STRUCT
|
||||
#elif defined( __GNUC__ )
|
||||
// Using pragma pack might work with earlier gcc versions already, but
|
||||
// it started to be necessary with gcc 4.7 on mingw unless compiled with -mno-ms-bitfields.
|
||||
// And I found some hints on the web that older gcc versions on the other hand had sometimes
|
||||
// trouble with pragma pack while they worked with __attribute__((packed)).
|
||||
# if (__GNUC__ > 4 ) || ((__GNUC__ == 4 ) && (__GNUC_MINOR__ >= 7))
|
||||
# pragma pack( push, packing )
|
||||
# pragma pack( 1 )
|
||||
# define PACK_STRUCT
|
||||
# else
|
||||
# define PACK_STRUCT __attribute__((packed))
|
||||
#endif
|
||||
# define PACK_STRUCT __attribute__((packed))
|
||||
#else
|
||||
# error compiler not supported
|
||||
#endif
|
||||
|
@ -6,14 +6,8 @@
|
||||
// file belongs to irrpack.h, see there for more info
|
||||
|
||||
// Default alignment
|
||||
#if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__)
|
||||
#if defined(_MSC_VER)
|
||||
# pragma pack( pop, packing )
|
||||
#elif defined (__DMC__)
|
||||
# pragma pack( pop )
|
||||
#elif defined( __GNUC__ )
|
||||
# if (__GNUC__ > 4 ) || ((__GNUC__ == 4 ) && (__GNUC_MINOR__ >= 7))
|
||||
# pragma pack( pop, packing )
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#undef PACK_STRUCT
|
||||
|
@ -102,6 +102,9 @@ namespace core
|
||||
//! Simple operator for linearly accessing every element of the matrix.
|
||||
const T& operator[](u32 index) const { return M[index]; }
|
||||
|
||||
//! Sets this matrix equal to the other matrix.
|
||||
CMatrix4<T>& operator=(const CMatrix4<T> &other) = default;
|
||||
|
||||
//! Sets all elements of this matrix to the value.
|
||||
inline CMatrix4<T>& operator=(const T& scalar);
|
||||
|
||||
|
@ -8,6 +8,8 @@
|
||||
#include "irrMath.h"
|
||||
#include "dimension2d.h"
|
||||
|
||||
#include <functional>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace core
|
||||
@ -414,5 +416,21 @@ public:
|
||||
} // end namespace core
|
||||
} // end namespace irr
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
template<class T>
|
||||
struct hash<irr::core::vector2d<T> >
|
||||
{
|
||||
size_t operator()(const irr::core::vector2d<T>& vec) const
|
||||
{
|
||||
size_t h1 = hash<T>()(vec.X);
|
||||
size_t h2 = hash<T>()(vec.Y);
|
||||
return (h1 << (4 * sizeof(h1)) | h1 >> (4 * sizeof(h1))) ^ h2;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -7,6 +7,8 @@
|
||||
|
||||
#include "irrMath.h"
|
||||
|
||||
#include <functional>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace core
|
||||
@ -50,8 +52,8 @@ namespace core
|
||||
|
||||
vector3d<T> operator/(const vector3d<T>& other) const { return vector3d<T>(X / other.X, Y / other.Y, Z / other.Z); }
|
||||
vector3d<T>& operator/=(const vector3d<T>& other) { X/=other.X; Y/=other.Y; Z/=other.Z; return *this; }
|
||||
vector3d<T> operator/(const T v) const { T i=(T)1.0/v; return vector3d<T>(X * i, Y * i, Z * i); }
|
||||
vector3d<T>& operator/=(const T v) { T i=(T)1.0/v; X*=i; Y*=i; Z*=i; return *this; }
|
||||
vector3d<T> operator/(const T v) const { return vector3d<T>(X/v, Y/v, Z/v); }
|
||||
vector3d<T>& operator/=(const T v) { X/=v; Y/=v; Z/=v; return *this; }
|
||||
|
||||
T& operator [](u32 index)
|
||||
{
|
||||
@ -466,5 +468,22 @@ namespace core
|
||||
} // end namespace core
|
||||
} // end namespace irr
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
template<class T>
|
||||
struct hash<irr::core::vector3d<T> >
|
||||
{
|
||||
size_t operator()(const irr::core::vector3d<T>& vec) const
|
||||
{
|
||||
size_t h1 = hash<T>()(vec.X);
|
||||
size_t h2 = hash<T>()(vec.Y);
|
||||
size_t h3 = hash<T>()(vec.Z);
|
||||
return (h1 << (5 * sizeof(h1)) | h1 >> (3 * sizeof(h1))) ^ (h2 << (2 * sizeof(h2)) | h2 >> (6 * sizeof(h2))) ^ h3;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -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.
|
@ -5,25 +5,27 @@
|
||||
variant=win32
|
||||
[[ "$(basename "$CXX")" == "x86_64-"* ]] && variant=win64
|
||||
|
||||
libjpeg_version=2.0.6
|
||||
libjpeg_version=2.1.2
|
||||
libpng_version=1.6.37
|
||||
zlib_version=1.2.11
|
||||
|
||||
mkdir -p libs
|
||||
pushd libs
|
||||
libs=$PWD
|
||||
tmp=
|
||||
[ "$variant" = win32 ] && tmp=dw2/
|
||||
[ -e libjpeg.zip ] || \
|
||||
wget "http://minetest.kitsunemimi.pw/libjpeg-$libjpeg_version-$variant.zip" -O libjpeg.zip
|
||||
[ -e libpng.zip ] || \
|
||||
wget "http://minetest.kitsunemimi.pw/libpng-$libpng_version-$variant.zip" -O libpng.zip
|
||||
wget "http://minetest.kitsunemimi.pw/${tmp}libpng-$libpng_version-$variant.zip" -O libpng.zip
|
||||
[ -e zlib.zip ] || \
|
||||
wget "http://minetest.kitsunemimi.pw/zlib-$zlib_version-$variant.zip" -O zlib.zip
|
||||
wget "http://minetest.kitsunemimi.pw/${tmp}zlib-$zlib_version-$variant.zip" -O zlib.zip
|
||||
[ -d libjpeg ] || unzip -o libjpeg.zip -d libjpeg
|
||||
[ -d libpng ] || unzip -o libpng.zip -d libpng
|
||||
[ -d zlib ] || unzip -o zlib.zip -d zlib
|
||||
popd
|
||||
|
||||
cmake . \
|
||||
tmp=(
|
||||
-DCMAKE_SYSTEM_NAME=Windows \
|
||||
-DPNG_LIBRARY=$libs/libpng/lib/libpng.dll.a \
|
||||
-DPNG_PNG_INCLUDE_DIR=$libs/libpng/include \
|
||||
@ -31,6 +33,18 @@ cmake . \
|
||||
-DJPEG_INCLUDE_DIR=$libs/libjpeg/include \
|
||||
-DZLIB_LIBRARY=$libs/zlib/lib/libz.dll.a \
|
||||
-DZLIB_INCLUDE_DIR=$libs/zlib/include
|
||||
)
|
||||
|
||||
cmake . "${tmp[@]}"
|
||||
make -j$(nproc)
|
||||
|
||||
if [ "$1" = "package" ]; then
|
||||
make DESTDIR=$PWD/_install install
|
||||
# strip library
|
||||
"${CXX%-*}-strip" --strip-unneeded _install/usr/local/lib/*.dll
|
||||
# bundle the DLLs that are specific to Irrlicht (kind of a hack)
|
||||
cp -p $libs/*/bin/lib{jpeg,png}*.dll _install/usr/local/lib/
|
||||
# create a ZIP
|
||||
(cd _install/usr/local; zip -9r "$OLDPWD"/irrlicht-$variant.zip -- *)
|
||||
fi
|
||||
exit 0
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,18 +0,0 @@
|
||||
<!--BEGIN GENERATE_TREEVIEW-->
|
||||
<li class="footer">
|
||||
<a href="http://irrlicht.sourceforge.net" target="_blank">Irrlicht
|
||||
Engine</a> Documentation © 2003-2019 by Nikolaus Gebhardt. $generatedby
|
||||
<a href="http://www.doxygen.org/index.html" target="_blank">Doxygen</a> $doxygenversion </li>
|
||||
</ul>
|
||||
</div>
|
||||
<!--END GENERATE_TREEVIEW-->
|
||||
<!--BEGIN !GENERATE_TREEVIEW-->
|
||||
<hr class="footer"/><address class="footer"><small>
|
||||
<a href="http://irrlicht.sourceforge.net" target="_blank">Irrlicht
|
||||
Engine</a> Documentation © 2003-2019 by Nikolaus Gebhardt. $generatedby
|
||||
<a href="http://www.doxygen.org/index.html" target="_blank">Doxygen
|
||||
</a> $doxygenversion
|
||||
</small></address>
|
||||
<!--END !GENERATE_TREEVIEW-->
|
||||
</body>
|
||||
</html>
|
Binary file not shown.
Before Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
Before Width: | Height: | Size: 12 KiB |
Binary file not shown.
Before Width: | Height: | Size: 7.0 KiB |
@ -1,44 +0,0 @@
|
||||
mkdir ..\..\..\doctemp
|
||||
mkdir ..\..\..\doctemp\html
|
||||
copy doxygen.css ..\..\..\doctemp\html
|
||||
copy irrlicht.png ..\..\..\doctemp\html
|
||||
copy logobig.png ..\..\..\doctemp\html
|
||||
|
||||
rem enable following line for skipping tutorial generation (can be used for faster testing documentation layout)
|
||||
rem goto SKIP_TUTS
|
||||
|
||||
rem for /F %%i in ('dir ..\..\..\examples\[01]*\main.cpp') DO ..\sed.exe -f tutorials.sed %i >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\01.HelloWorld\main.cpp >tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\02.Quake3Map\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\03.CustomSceneNode\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\04.Movement\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\05.UserInterface\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\06.2DGraphics\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\07.Collision\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\08.SpecialFX\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\09.MeshViewer\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\10.Shaders\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\11.PerPixelLighting\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\12.TerrainRendering\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\13.RenderToTexture\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\14.Win32Window\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\15.LoadIrrFile\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\16.Quake3MapShader\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\17.HelloWorld_Mobile\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\18.SplitScreen\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\19.MouseAndJoystick\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\20.ManagedLights\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\21.Quake3Explorer\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\22.MaterialViewer\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\23.SMeshHandling\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\24.CursorControl\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\25.XmlHandling\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\26.OcclusionQuery\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\27.PostProcessing\main.cpp >>tut.txt
|
||||
..\sed.exe -f tutorials.sed ..\..\..\examples\28.CubeMapping\main.cpp >>tut.txt
|
||||
|
||||
:SKIP_TUTS
|
||||
|
||||
..\doxygen.exe doxygen.cfg
|
||||
|
||||
pause
|
@ -1,20 +0,0 @@
|
||||
mkdir -p ../../../doctemp/html
|
||||
|
||||
rm tut.txt || true;
|
||||
|
||||
mkdir ../../../doctemp
|
||||
mkdir ../../../doctemp/html
|
||||
cp doxygen.css irrlicht.png logobig.png ../../../doctemp/html
|
||||
|
||||
for i in ../../../examples/[012]*/main.cpp; do
|
||||
sed -f tutorials.sed $i >>tut.txt;
|
||||
done
|
||||
|
||||
# Enable for latex docs
|
||||
#doxygen doxygen-pdf.cfg
|
||||
|
||||
# Enable for html docs
|
||||
doxygen doxygen.cfg
|
||||
|
||||
#cp doxygen.css ../../../doctemp/html
|
||||
cp irrlicht.png logobig.png ../../../doctemp/html
|
@ -1,7 +0,0 @@
|
||||
# run on single_tut.txt which is created in maketutorial.sh (or .bat)
|
||||
|
||||
# replace image links as we don't copy the images into example folders but keep them below media folder
|
||||
# most images should be in media
|
||||
s/img src="/img src="..\/..\/media\//g
|
||||
# ???shots.jpg files are in media/example_screenshots another subfolder (earlier replacement already moved them to ../../media/)
|
||||
s/img src="..\/..\/media\/\([0-9]\{3\}shot\)/img src="..\/..\/media\/example_screenshots\/\1/
|
@ -1,4 +0,0 @@
|
||||
REM OUTDATED - don't use this anymore. For now only maketutorial.sh works, this one still has to be updated.
|
||||
REM type tut_head.html >%2
|
||||
REM ..\sed.exe -f maketut.sed %1 >>%2
|
||||
REM type tut_end.html >>%2
|
@ -1,34 +0,0 @@
|
||||
# Create the tutorial.html files in each example folder
|
||||
|
||||
# for every folder below examples
|
||||
for i in ../../../examples/[0123]*; do
|
||||
#for i in ../../../examples/01.*; do # if you want to run/update a single example use this loop
|
||||
echo NOW doing $i
|
||||
|
||||
if ! [ -f "$i/main.cpp" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# uses the main.cpp files to create some file to use as doxygen input
|
||||
sed -f tutorials.sed $i/main.cpp >single_tut.txt
|
||||
# echo tutorials.sed has run
|
||||
|
||||
# create the html file
|
||||
doxygen doxygen_tutorial.cfg
|
||||
# echo doxygen has run
|
||||
|
||||
# Fix the image links
|
||||
sed -f maketut.sed html/example???.html >tutorial.html
|
||||
# echo maketut.sed has run
|
||||
|
||||
#move to example folder
|
||||
mv tutorial.html $i/tutorial.html
|
||||
# echo copied
|
||||
|
||||
#cleanup
|
||||
rm -r html
|
||||
# echo cleaned
|
||||
done
|
||||
|
||||
#cleanup
|
||||
rm single_tut.txt
|
@ -1,5 +0,0 @@
|
||||
<!-- HTML footer for doxygen 1.8.13-->
|
||||
<!-- start footer part -->
|
||||
<p> </p>
|
||||
</body>
|
||||
</html>
|
@ -1,228 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
|
||||
<!-- Wanted to avoid copying .css to each folder, so copied default .css from doxyen in here, kicked out most stuff we don't need for examples and modified some a little bit.
|
||||
Target was having a single html in each example folder which is created from the main.cpp files and needs no files besides some images below media folder.
|
||||
Feel free to improve :)
|
||||
-->
|
||||
<style>
|
||||
body, table, div, p, dl {
|
||||
font: 400 14px/22px;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #F0F0F0;
|
||||
color: black;
|
||||
margin-left: 5%;
|
||||
margin-right: 5%;
|
||||
}
|
||||
|
||||
p.reference, p.definition {
|
||||
font: 400 14px/22px;
|
||||
}
|
||||
|
||||
.title {
|
||||
font: 400 14px/28px;
|
||||
font-size: 150%;
|
||||
font-weight: bold;
|
||||
margin: 10px 2px;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
-webkit-transition: text-shadow 0.5s linear;
|
||||
-moz-transition: text-shadow 0.5s linear;
|
||||
-ms-transition: text-shadow 0.5s linear;
|
||||
-o-transition: text-shadow 0.5s linear;
|
||||
transition: text-shadow 0.5s linear;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
caption {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h3.version {
|
||||
font-size: 90%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #3D578C;
|
||||
font-weight: normal;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.contents a:visited {
|
||||
color: #4665A2;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a.el {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a.code, a.code:visited, a.line, a.line:visited {
|
||||
color: #4665A2;
|
||||
}
|
||||
|
||||
a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
|
||||
color: #4665A2;
|
||||
}
|
||||
|
||||
pre.fragment {
|
||||
border: 1px solid #C4CFE5;
|
||||
background-color: #FBFCFD;
|
||||
padding: 4px 6px;
|
||||
margin: 4px 8px 4px 2px;
|
||||
overflow: auto;
|
||||
word-wrap: break-word;
|
||||
font-size: 9pt;
|
||||
line-height: 125%;
|
||||
font-family: monospace, fixed;
|
||||
font-size: 105%;
|
||||
}
|
||||
|
||||
div.fragment {
|
||||
padding: 0px;
|
||||
margin: 4px 8px 4px 2px;
|
||||
background-color: #FBFCFD;
|
||||
border: 1px solid #C4CFE5;
|
||||
}
|
||||
|
||||
div.line {
|
||||
font-family: monospace, fixed;
|
||||
font-size: 13px;
|
||||
min-height: 13px;
|
||||
line-height: 1.0;
|
||||
text-wrap: unrestricted;
|
||||
white-space: -moz-pre-wrap; /* Moz */
|
||||
white-space: -pre-wrap; /* Opera 4-6 */
|
||||
white-space: -o-pre-wrap; /* Opera 7 */
|
||||
white-space: pre-wrap; /* CSS3 */
|
||||
word-wrap: break-word; /* IE 5.5+ */
|
||||
text-indent: -53px;
|
||||
padding-left: 53px;
|
||||
padding-bottom: 0px;
|
||||
margin: 0px;
|
||||
-webkit-transition-property: background-color, box-shadow;
|
||||
-webkit-transition-duration: 0.5s;
|
||||
-moz-transition-property: background-color, box-shadow;
|
||||
-moz-transition-duration: 0.5s;
|
||||
-ms-transition-property: background-color, box-shadow;
|
||||
-ms-transition-duration: 0.5s;
|
||||
-o-transition-property: background-color, box-shadow;
|
||||
-o-transition-duration: 0.5s;
|
||||
transition-property: background-color, box-shadow;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
div.contents {
|
||||
margin-top: 10px;
|
||||
margin-left: 12px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
div.center {
|
||||
text-align: center;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
div.center img {
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
span.keyword {
|
||||
color: #008000
|
||||
}
|
||||
|
||||
span.keywordtype {
|
||||
color: #604020
|
||||
}
|
||||
|
||||
span.keywordflow {
|
||||
color: #e08000
|
||||
}
|
||||
|
||||
span.comment {
|
||||
color: #800000
|
||||
}
|
||||
|
||||
span.preprocessor {
|
||||
color: #806020
|
||||
}
|
||||
|
||||
span.stringliteral {
|
||||
color: #002080
|
||||
}
|
||||
|
||||
span.charliteral {
|
||||
color: #008080
|
||||
}
|
||||
|
||||
blockquote {
|
||||
background-color: #F7F8FB;
|
||||
border-left: 2px solid #9CAFD4;
|
||||
margin: 0 24px 0 4px;
|
||||
padding: 0 12px 0 16px;
|
||||
}
|
||||
|
||||
hr {
|
||||
height: 0px;
|
||||
border: none;
|
||||
border-top: 1px solid #4A6AAA;
|
||||
}
|
||||
|
||||
address {
|
||||
font-style: normal;
|
||||
color: #2A3D61;
|
||||
}
|
||||
|
||||
div.header {
|
||||
background-image:url('nav_h.png');
|
||||
background-repeat:repeat-x;
|
||||
background-color: #F9FAFC;
|
||||
margin: 0px;
|
||||
border-bottom: 1px solid #C4CFE5;
|
||||
}
|
||||
|
||||
div.headertitle {
|
||||
padding: 5px 5px 5px 10px;
|
||||
}
|
||||
|
||||
.image {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.caption {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.zoom {
|
||||
border: 1px solid #90A5CE;
|
||||
}
|
||||
|
||||
tr.heading h2 {
|
||||
margin-top: 12px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||
|
||||
<!--END TITLEAREA-->
|
||||
<!-- end header part -->
|
@ -1,13 +0,0 @@
|
||||
# Page start and end are delimited by /** and **/
|
||||
# we keep the end unchanged, the header is extended
|
||||
s/\/\*\* Example \(0*\)\([0-9]*\) \(.*\)$/\/\*\* \\page example\1\2 Tutorial \2: \3\n \\image html \"\1\2shot.jpg\"\n \\image latex \"\1\2shot.jpg\"/
|
||||
|
||||
# All other comments start and end code sections
|
||||
s/\([^\*]\)\*\//\1\\code/
|
||||
s/^\*\//\\code/
|
||||
|
||||
s/\/\*\([^\*]\)/\\endcode \1/
|
||||
s/\/\*$/\\endcode\n/
|
||||
|
||||
#remove DOS line endings
|
||||
s/\r//g
|
Binary file not shown.
@ -1,9 +0,0 @@
|
||||
GNU sed version 4.0.7 - compiled for Win32.
|
||||
Native executable requires only the Microsoft
|
||||
C runtime MSVCRT.DLL, not an emulation layer
|
||||
like Cygwin. This .EXE file was obtained from
|
||||
http://unxutils.sourceforge.net on 2003-10-21.
|
||||
For documentation, GPL license, source code,
|
||||
etc., visit http://unxutils.sourceforge.net.
|
||||
|
||||
Downloaded from http://www.student.northpark.edu/pemente/sed/
|
@ -1,324 +0,0 @@
|
||||
# Copyright (c) 2007-2011 oc2pus
|
||||
# This file and all modifications and additions to the pristine
|
||||
# package are under the same license as the package itself.
|
||||
#
|
||||
# Please submit bugfixes or comments to toni@links2linux.de
|
||||
|
||||
# Packmangroup: Libraries
|
||||
# Packmanpackagename: Irrlicht
|
||||
# Packman: Toni Graffy
|
||||
|
||||
# norootforbuild
|
||||
|
||||
Name: libIrrlicht1
|
||||
Version: 1.9.0
|
||||
Release: 0.pm.1
|
||||
Summary: The Irrlicht Engine SDK
|
||||
License: see readme.txt
|
||||
Group: System/Libraries
|
||||
URL: http://irrlicht.sourceforge.net/
|
||||
Source: irrlicht-%{version}.tar.bz2
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
BuildRequires: freeglut-devel
|
||||
BuildRequires: ImageMagick
|
||||
BuildRequires: gcc-c++
|
||||
%if %suse_version >= 1020
|
||||
BuildRequires: Mesa-devel
|
||||
%else
|
||||
BuildRequires: xorg-x11-devel
|
||||
%endif
|
||||
BuildRequires: update-desktop-files
|
||||
|
||||
%description
|
||||
The Irrlicht Engine is an open source high performance realtime 3d engine
|
||||
written and usable in C++. It is completely cross-platform, using D3D, OpenGL
|
||||
and its own software renderer, and has all of the state-of-the-art features
|
||||
which can be found in commercial 3d engines.
|
||||
|
||||
We've got a huge active community, and there are lots of projects in
|
||||
development that use the engine. You can find enhancements for Irrlicht all
|
||||
over the web, like alternative terrain renderers, portal renderers, exporters,
|
||||
world layers, tutorials, editors, language bindings for .NET, Java, Perl, Ruby,
|
||||
Basic, Python, Lua, and so on. And best of all: It's completely free.
|
||||
|
||||
%package -n libIrrlicht-devel
|
||||
Summary: Development package for the Irrlicht library
|
||||
Group: Development/Languages/C and C++
|
||||
Requires: libIrrlicht1 = %{version}
|
||||
# Packmandepends: libIrrlicht1
|
||||
|
||||
%description -n libIrrlicht-devel
|
||||
The Irrlicht Engine is an open source high performance realtime 3d engine
|
||||
written and usable in C++. It is completely cross-platform, using D3D, OpenGL
|
||||
and its own software renderer, and has all of the state-of-the-art features
|
||||
which can be found in commercial 3d engines.
|
||||
|
||||
We've got a huge active community, and there are lots of projects in
|
||||
development that use the engine. You can find enhancements for Irrlicht all
|
||||
over the web, like alternative terrain renderers, portal renderers, exporters,
|
||||
world layers, tutorials, editors, language bindings for .NET, Java, Perl, Ruby,
|
||||
Basic, Python, Lua, and so on. And best of all: It's completely free.
|
||||
|
||||
%package -n Irrlicht-examples
|
||||
Summary: Demos and examples for the Irrlicht-SDK
|
||||
Group: Development/Tools/GUI Builders
|
||||
Requires: libIrrlicht1 = %{version}
|
||||
# Packmandepends: Irrlicht-media libIrrlicht1
|
||||
|
||||
%description -n Irrlicht-examples
|
||||
The Irrlicht Engine is an open source high performance realtime 3d engine
|
||||
written and usable in C++. It is completely cross-platform, using D3D, OpenGL
|
||||
and its own software renderer, and has all of the state-of-the-art features
|
||||
which can be found in commercial 3d engines.
|
||||
|
||||
We've got a huge active community, and there are lots of projects in
|
||||
development that use the engine. You can find enhancements for Irrlicht all
|
||||
over the web, like alternative terrain renderers, portal renderers, exporters,
|
||||
world layers, tutorials, editors, language bindings for .NET, Java, Perl, Ruby,
|
||||
Basic, Python, Lua, and so on. And best of all: It's completely free.
|
||||
|
||||
This package contains some demos and examples for the Irrlicht-SDK.
|
||||
|
||||
%package -n Irrlicht-doc
|
||||
Summary: User documentation for the Irrlicht SDK.
|
||||
Group: Documentation/Other
|
||||
|
||||
%description -n Irrlicht-doc
|
||||
User documentation for the Irrlicht SDK.
|
||||
|
||||
You need a chm-viewer to read the docs (e.g. kchmviewer).
|
||||
|
||||
%package -n Irrlicht-tools
|
||||
Summary: Some tools for the Irrlicht-SDK
|
||||
Group: Development/Tools/GUI Builders
|
||||
Requires: libIrrlicht1 = %{version}
|
||||
Requires: Irrlicht-media
|
||||
# Packmandepends: Irrlicht-media libIrrlicht1
|
||||
|
||||
%description -n Irrlicht-tools
|
||||
Some tools for the Irrlicht-SDK.
|
||||
|
||||
GUIEditor, FontTool and Meshviewer.
|
||||
|
||||
%package -n Irrlicht-media
|
||||
Summary: Some media files for Irrlicht SDK
|
||||
Group: Development/Languages/C and C++
|
||||
|
||||
%description -n Irrlicht-media
|
||||
Some media files for Irrlicht tools and demos.
|
||||
|
||||
%debug_package
|
||||
|
||||
%prep
|
||||
%setup -q -n irrlicht-%{version}
|
||||
|
||||
# only for windows-platform
|
||||
%__rm -r examples/14.Win32Window
|
||||
|
||||
# avoid irrKlang
|
||||
%__sed -i -e 's|^#define USE_IRRKLANG|//#define USE_IRRKLANG|g' \
|
||||
examples/Demo/CDemo.h
|
||||
|
||||
# adjust media path in examples
|
||||
find ./examples -name *.cpp | xargs %__sed -i -e 's|../../media/|%{_datadir}/irrlicht/|g'
|
||||
# adjust media path in tools
|
||||
%__sed -i -e 's|../../media/|%{_datadir}/irrlicht/|g' \
|
||||
tools/GUIEditor/main.cpp
|
||||
|
||||
# pack example-sources
|
||||
tar cj \
|
||||
--exclude *.cbp \
|
||||
--exclude *.dev \
|
||||
--exclude *.dsp \
|
||||
--exclude *.dsw \
|
||||
--exclude *.html \
|
||||
--exclude *.sln \
|
||||
--exclude *.vcproj \
|
||||
-f irrlicht-examples-src.tar.bz2 examples/*
|
||||
|
||||
%build
|
||||
# create shared-lib first
|
||||
pushd source/Irrlicht
|
||||
%__make sharedlib %{?_smp_mflags}
|
||||
popd
|
||||
|
||||
# create necessary links to avoid linker-error for tools/examples
|
||||
pushd lib/Linux
|
||||
ln -s libIrrlicht.so.%{version} libIrrlicht.so.1
|
||||
ln -s libIrrlicht.so.%{version} libIrrlicht.so
|
||||
popd
|
||||
|
||||
# tools
|
||||
pushd tools
|
||||
cd GUIEditor
|
||||
%__make %{?_smp_mflags}
|
||||
cd ..
|
||||
cd IrrFontTool/newFontTool
|
||||
%__make %{?_smp_mflags}
|
||||
cd ../..
|
||||
popd
|
||||
|
||||
# examples
|
||||
pushd examples
|
||||
sh buildAllExamples.sh
|
||||
popd
|
||||
|
||||
# build static lib
|
||||
pushd source/Irrlicht
|
||||
%__make %{?_smp_mflags}
|
||||
popd
|
||||
|
||||
%install
|
||||
%__install -dm 755 %{buildroot}%{_libdir}
|
||||
%__install -m 644 lib/Linux/libIrrlicht.a \
|
||||
%{buildroot}%{_libdir}
|
||||
%__install -m 644 lib/Linux/libIrrlicht.so.%{version} \
|
||||
%{buildroot}%{_libdir}
|
||||
|
||||
pushd %{buildroot}%{_libdir}
|
||||
ln -s libIrrlicht.so.%{version} libIrrlicht.so.1
|
||||
ln -s libIrrlicht.so.%{version} libIrrlicht.so
|
||||
popd
|
||||
|
||||
# includes
|
||||
%__install -dm 755 %{buildroot}%{_includedir}/irrlicht
|
||||
%__install -m 644 include/*.h \
|
||||
%{buildroot}%{_includedir}/irrlicht
|
||||
|
||||
# tools
|
||||
%__install -dm 755 %{buildroot}%{_bindir}
|
||||
%__install -m 755 tools/GUIEditor/GUIEditor \
|
||||
%{buildroot}%{_bindir}/irrlicht-GUIEditor
|
||||
%__install -m 755 bin/Linux/FontTool \
|
||||
%{buildroot}%{_bindir}/irrlicht-FontTool
|
||||
|
||||
# examples
|
||||
%__install -dm 755 %{buildroot}%{_bindir}
|
||||
ex_list=`ls -1 bin/Linux/??.*`
|
||||
for i in $ex_list; do
|
||||
FE=`echo $i | awk 'BEGIN { FS="." }{ print $2 }'`
|
||||
%__install -m 755 $i \
|
||||
%{buildroot}%{_bindir}/irrlicht-$FE
|
||||
done
|
||||
|
||||
# examples-docs
|
||||
pushd examples
|
||||
%__install -dm 755 %{buildroot}%{_docdir}/Irrlicht-examples
|
||||
ex_dir=`find . -name tutorial.html`
|
||||
for i in $ex_dir; do
|
||||
dir_name=`dirname $i`
|
||||
%__install -dm 755 %{buildroot}%{_docdir}/Irrlicht-examples/$dir_name
|
||||
%__install -m 644 $i \
|
||||
%{buildroot}%{_docdir}/Irrlicht-examples/$dir_name
|
||||
done
|
||||
%__rm -r %{buildroot}%{_docdir}/Irrlicht-examples/09.Meshviewer
|
||||
popd
|
||||
|
||||
# examples sources
|
||||
%__install -m 644 irrlicht-examples-src.tar.bz2 \
|
||||
%{buildroot}%{_docdir}/Irrlicht-examples
|
||||
|
||||
# media
|
||||
%__install -dm 755 %{buildroot}%{_datadir}/irrlicht
|
||||
%__install -m 755 media/* \
|
||||
%{buildroot}%{_datadir}/irrlicht
|
||||
|
||||
# icons
|
||||
%__install -dm 755 %{buildroot}%{_datadir}/pixmaps
|
||||
convert examples/09.Meshviewer/icon.ico -resize 48x48! \
|
||||
irrlicht-Meshviewer.png
|
||||
convert bin/Win32-gcc/irrlicht.ico -resize 48x48! \
|
||||
irrlicht.png
|
||||
%__install -m 644 irrlicht*.png \
|
||||
%{buildroot}%{_datadir}/pixmaps
|
||||
|
||||
# menu-entries
|
||||
%__cat > irrlicht-GUIEditor.desktop << EOF
|
||||
[Desktop Entry]
|
||||
Comment=Irrlicht GUI Editor
|
||||
Name=Irrlicht GUI Editor
|
||||
GenericName=
|
||||
Type=Application
|
||||
Exec=irrlicht-GUIEditor
|
||||
Icon=irrlicht.png
|
||||
DocPath=
|
||||
Terminal=0
|
||||
EOF
|
||||
%suse_update_desktop_file -i irrlicht-GUIEditor Development GUIDesigner
|
||||
|
||||
%__cat > irrlicht-FontTool.desktop << EOF
|
||||
[Desktop Entry]
|
||||
Comment=Irrlicht-FontTool
|
||||
Name=Irrlicht-FontTool
|
||||
GenericName=
|
||||
Type=Application
|
||||
Exec=irrlicht-IrrFontTool
|
||||
Icon=irrlicht.png
|
||||
DocPath=
|
||||
Terminal=0
|
||||
EOF
|
||||
%suse_update_desktop_file -i irrlicht-FontTool Development GUIDesigner
|
||||
|
||||
%__cat > irrlicht-Meshviewer.desktop << EOF
|
||||
[Desktop Entry]
|
||||
Comment=Irrlicht-Meshviewer
|
||||
Name=Irrlicht-Meshviewer
|
||||
GenericName=
|
||||
Type=Application
|
||||
Exec=irrlicht-Meshviewer
|
||||
Icon=irrlicht-Meshviewer.png
|
||||
DocPath=
|
||||
Terminal=1
|
||||
EOF
|
||||
%suse_update_desktop_file -i irrlicht-Meshviewer Graphics Viewer
|
||||
|
||||
%clean
|
||||
[ -d %{buildroot} -a "%{buildroot}" != "" ] && %__rm -rf %{buildroot}
|
||||
|
||||
%files
|
||||
%defattr(-, root, root)
|
||||
%doc *.txt
|
||||
%{_libdir}/lib*.so.*
|
||||
|
||||
%files -n libIrrlicht-devel
|
||||
%defattr(-, root, root)
|
||||
%{_libdir}/lib*.so
|
||||
%{_libdir}/lib*.a
|
||||
%dir %{_includedir}/irrlicht
|
||||
%{_includedir}/irrlicht/*.h
|
||||
|
||||
%files -n Irrlicht-examples
|
||||
%defattr(-, root, root)
|
||||
%dir %{_docdir}/Irrlicht-examples
|
||||
%{_docdir}/Irrlicht-examples/*
|
||||
%exclude %{_bindir}/irrlicht-GUIEditor
|
||||
%exclude %{_bindir}/irrlicht-FontTool
|
||||
%exclude %{_bindir}/irrlicht-Meshviewer
|
||||
%{_bindir}/irrlicht-*
|
||||
|
||||
%files -n Irrlicht-tools
|
||||
%defattr(-, root, root)
|
||||
%doc examples/09.Meshviewer/tutorial.html
|
||||
%{_bindir}/irrlicht-GUIEditor
|
||||
%{_bindir}/irrlicht-FontTool
|
||||
%{_bindir}/irrlicht-Meshviewer
|
||||
%{_datadir}/applications/irrlicht-GUIEditor.desktop
|
||||
%{_datadir}/applications/irrlicht-FontTool.desktop
|
||||
%{_datadir}/applications/irrlicht-Meshviewer.desktop
|
||||
%{_datadir}/pixmaps/irrlicht*.png
|
||||
|
||||
%files -n Irrlicht-doc
|
||||
%defattr(-, root, root)
|
||||
%doc doc/irrlicht.chm
|
||||
%doc doc/*.txt
|
||||
|
||||
%files -n Irrlicht-media
|
||||
%defattr(-, root, root)
|
||||
%dir %{_datadir}/irrlicht
|
||||
%{_datadir}/irrlicht/*
|
||||
|
||||
%changelog
|
||||
* Wed Jun 20 2007 Toni Graffy <toni@links2linux.de> - 1.3.1-0.pm.1
|
||||
- update to 1.3.1
|
||||
* Sat Jun 16 2007 Toni Graffy <toni@links2linux.de> - 1.3-0.pm.1
|
||||
- initial build 1.3
|
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
<pkgref spec="1.12" uuid="2386F932-20DF-4969-AC74-D8E599723083"><config><identifier>org.irrlichtengine.irrlichtEngineV151.irrlicht.pkg</identifier><version>1</version><description></description><post-install type="none"/><requireAuthorization/><installFrom includeRoot="true">/Library/Frameworks/Irrlicht.framework</installFrom><installTo>/Library/Frameworks</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>parent</mod><mod>requireAuthorization</mod><mod>extraFiles</mod><mod>version</mod><mod>installTo</mod><mod>identifier</mod></config><contents><file-list>01irrlicht-contents.xml</file-list><component id="org.irrlichtengine.Irrlicht" path="/Library/Frameworks/Irrlicht.framework" version="1.6"><component id="org.irrlichtengine.Irrlicht" path="/Library/Frameworks/Irrlicht.framework/Versions/1.5" version="1.6"/></component><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents><extra-files/></pkgref>
|
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
<pkgref spec="1.12" uuid="39601D70-59FA-4C66-9AFF-A8523FAD4C7D"><config><identifier>com.irrlicht.irrlichtEngineV151.html.pkg</identifier><version>1</version><description></description><post-install type="none"/><installFrom relative="true">../../../doctemp/html</installFrom><installTo mod="true">/private/tmp/Irrlicht1.5.1-install/doc/</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>parent</mod><mod>scripts.postinstall.path</mod><mod>requireAuthorization</mod><mod>installTo.isAbsoluteType</mod><mod>scripts.postinstall.isRelativeType</mod><mod>installFrom.isRelativeType</mod><mod>installTo.path</mod><mod>version</mod><mod>installTo</mod></config><contents><file-list>02html-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
|
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
<pkgref spec="1.12" uuid="C29A053C-0445-485A-8194-7261BB730C44"><config><identifier>com.irrlicht.irrlichtEngineV151.media.pkg</identifier><version>1</version><description/><post-install type="none"/><requireAuthorization/><installFrom>/Users/gazdavidson/svn/irr1.5/media</installFrom><installTo mod="true">/private/tmp/Irrlicht1.5.1-install/media/</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"/><mod>parent</mod><mod>installTo.path</mod><mod>installTo</mod></config><contents><file-list>03media-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
<pkgref spec="1.12" uuid="90910AF1-E4E6-4A7B-BE2C-D5651EB803FD"><config><identifier>com.irrlicht.irrlichtEngineV151.tools.pkg</identifier><version>1</version><description/><post-install type="none"/><requireAuthorization/><installFrom>/Users/gazdavidson/svn/irr1.5/tools</installFrom><installTo mod="true">/private/tmp/Irrlicht1.5.1-install/tools/</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"/><mod>parent</mod><mod>installTo.path</mod><mod>installTo</mod></config><contents><file-list>05tools-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
<pkg-contents spec="1.12"><f n="changes.txt" o="gazdavidson" g="staff" p="33188" pt="/Users/gazdavidson/svn/irr1.5/changes.txt" m="false" t="file"/></pkg-contents>
|
@ -1 +0,0 @@
|
||||
<pkgref spec="1.12" uuid="6023EA57-F1C6-45DA-B563-D72F5E02D7EA"><config><identifier>com.irrlicht.irrlichtEngineV151.changes.pkg</identifier><version>1</version><description/><post-install type="none"/><requireAuthorization/><installFrom>/Users/gazdavidson/svn/irr1.5/changes.txt</installFrom><installTo mod="true">/private/tmp/Irrlicht1.5.1-install/</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"/><mod>parent</mod><mod>installTo.path</mod><mod>installTo</mod></config><contents><file-list>07changes-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
|
@ -1 +0,0 @@
|
||||
<pkg-contents spec="1.12"><f n="readme.txt" o="gazdavidson" g="staff" p="33188" pt="/Users/gazdavidson/svn/irr1.5/readme.txt" m="false" t="file"/></pkg-contents>
|
@ -1 +0,0 @@
|
||||
<pkgref spec="1.12" uuid="C1B685D8-ECDF-4CE4-A672-82B0F1C0EC80"><config><identifier>com.irrlicht.irrlichtEngineV151.readme.pkg</identifier><version>1</version><description/><post-install type="none"/><requireAuthorization/><installFrom>/Users/gazdavidson/svn/irr1.5/readme.txt</installFrom><installTo mod="true">/private/tmp/Irrlicht1.5.1-install/</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"/><mod>parent</mod><mod>scripts.postinstall.path</mod><mod>scripts.postupgrade.isRelativeType</mod><mod>scripts.postupgrade.path</mod><mod>installTo.path</mod><mod>installTo</mod></config><scripts><postinstall relative="true" mod="true">moveAll.sh</postinstall><postupgrade relative="true" mod="true">moveAll.sh</postupgrade></scripts><contents><file-list>08readme-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
|
@ -1,47 +0,0 @@
|
||||
<pkmkdoc spec="1.12"><properties><title>Irrlicht Engine v1.5.1</title><build>/Users/gazdavidson/Desktop/installer/Irrlicht v1.5.1.mpkg</build><organization>com.irrlicht</organization><userSees ui="easy"/><min-target os="2"/><domain system="true"/></properties><distribution><versions min-spec="1.000000"/><scripts></scripts></distribution><contents><choice title="Irrlicht.framework" id="installframework" description="This is required, unless you want to build from source." starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="org.irrlichtengine.irrlichtEngineV151.irrlicht.pkg"/></choice><choice title="Documentation" id="installdocs" description="This will install the documentation" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.irrlicht.irrlichtEngineV151.html.pkg"/></choice><choice title="Example media" id="installmedia" description="The media for the examples, without this the examples will not run." starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.irrlicht.irrlichtEngineV151.media.pkg"/></choice><choice title="Examples" id="installexamples" description="The examples, which you'll need if you want to get started." starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.irrlicht.irrlichtEngineV151.examples.pkg"/></choice><choice title="Tools" id="installtools" description="Some useful tools; GUI editor, mesh converter and bitmap font generator" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.irrlicht.irrlichtEngineV151.tools.pkg"/></choice><choice title="Source code" id="installsource" description="The complete source code to the Irrlicht Engine, this allows you to make changes to the core and make your own custom versions of Irrlicht." starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.irrlicht.irrlichtEngineV151.source.pkg"/></choice><choice title="changes" id="installchangelog" starts_selected="true" starts_enabled="true" starts_hidden="true"><pkgref id="com.irrlicht.irrlichtEngineV151.changes.pkg"/></choice><choice title="readme" id="installreadme" starts_selected="true" starts_enabled="true" starts_hidden="true"><pkgref id="com.irrlicht.irrlichtEngineV151.readme.pkg"/></choice></contents><resources bg-scale="none" bg-align="topleft"><locale lang="en"><resource mime-type="text/rtf" kind="embedded" type="license"><![CDATA[{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf430
|
||||
{\fonttbl\f0\fnil\fcharset0 Verdana;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}}
|
||||
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
|
||||
\deftab720
|
||||
\pard\pardeftab720\sl320\sa220\ql\qnatural
|
||||
|
||||
\f0\fs22 \cf0 The Irrlicht Engine License\
|
||||
Copyright \'a9 2002-2009 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:\
|
||||
\pard\tx220\tx720\pardeftab720\li720\fi-720\sl320\ql\qnatural
|
||||
\ls1\ilvl0\cf0 {\listtext 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.\
|
||||
{\listtext 2. }Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\
|
||||
{\listtext 3. }This notice may not be removed or altered from any source distribution.}]]></resource><resource mime-type="text/rtf" kind="embedded" type="readme"><![CDATA[{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf430
|
||||
{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
|
||||
|
||||
\f0\fs26 \cf0 The Irrlicht Engine is a cross platform, high performance 3D scene graph API for C++ programmers.\
|
||||
\
|
||||
This package contains:\
|
||||
\
|
||||
* The library runtime. This installs to /Library/Frameworks/Irrlicht.framework and allows you to create and run Irrlicht 3D applications.\
|
||||
\
|
||||
* The examples and project files, which will allow you to get started developing Irrlicht applications.\
|
||||
\
|
||||
* The documentation, which is also available online at http://irrlicht.sourceforge.net/\
|
||||
\
|
||||
* The source to the engine, so that you can modify the engine itself.}]]></resource></locale><locale lang="fr"><resource mime-type="text/rtf" kind="embedded" type="readme"><![CDATA[{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf430
|
||||
{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\deftab720
|
||||
\pard\pardeftab720\ql\qnatural
|
||||
|
||||
\f0\fs24 \cf0 Le moteur Irrlicht est une API de rendu 3D tr\'e8s performante pour les programmeurs C++.\
|
||||
\
|
||||
Ce paquet contient:\
|
||||
\
|
||||
* La biblioth\'e8que de runtime. Ceci s'installe vers /Library/Frameworks/Irrlicht.framework et vous permet de cr\'e9er et de lancer des applications Irrlicht, notamment en 3d.\
|
||||
\
|
||||
* Les exemples et les projets, qui vous permettront de commencer \'e0 d\'e9velopper des applications Irrlicht.\
|
||||
\
|
||||
* La documentation, qui est aussi disponible sur http://irrlicht.sourceforge.net/\
|
||||
\
|
||||
* Les sources du moteur, afin que vous puissiez modifier le moteur vous-m\'eame.}]]></resource></locale></resources><flags/><extra-files/><item type="file">01irrlicht.xml</item><item type="file">02html.xml</item><item type="file">03media.xml</item><item type="file">04examples.xml</item><item type="file">05tools.xml</item><item type="file">06source.xml</item><item type="file">07changes.xml</item><item type="file">08readme.xml</item><mod>properties.userDomain</mod><mod>properties.systemDomain</mod><mod>properties.anywhereDomain</mod><mod>properties.customizeOption</mod><mod>extraFiles</mod><mod>properties.title</mod></pkmkdoc>
|
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
mkdir -p $HOME/Irrlicht1.6.0/
|
||||
chmod a+rw $HOME/Irrlicht1.6.0
|
||||
find /private/tmp/Irrlicht1.6.0-install -exec chmod a+rw {} \;
|
||||
cp -rfp /private/tmp/Irrlicht1.6.0-install/ $HOME/Irrlicht1.6.0/
|
||||
rm -Rf /private/tmp/Irrlicht1.6.0-install
|
@ -1,28 +0,0 @@
|
||||
This is the source package for the Irrlicht framework installer.
|
||||
|
||||
Build steps are as follows-
|
||||
|
||||
1) Remove the framework so you don't accidentally package more than one version, if you use the GUI to do this empty the trash so XCode doesn't build to the trash! It's best to run this command from the console:
|
||||
|
||||
rm -Rf /Library/Frameworks/Irrlicht.framework
|
||||
|
||||
2) Build the library and the binaries.
|
||||
|
||||
* Navigate to source/Irrlicht/MacOSX and open the XCode project
|
||||
|
||||
* Choose release mode and build Irrlicht.framework
|
||||
|
||||
** For the moment it's not worth installing the sample binaries, they can't be launched due to console input
|
||||
|
||||
3) Build the documentation
|
||||
|
||||
* Open the console and navigate to scripts/doc/irrlicht
|
||||
|
||||
* Make sure you have doxygen installed. If you have Aptitude for OSX then type:
|
||||
|
||||
sudo apt-get install doxygen
|
||||
|
||||
* Now run the makedocumentation bash script:
|
||||
./makedocumentation.sh
|
||||
|
||||
4) Now double click the package file and build it.
|
@ -192,7 +192,7 @@ IMesh * CAnimatedMeshSceneNode::getMeshForCurrentFrame()
|
||||
// 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.
|
||||
|
||||
CSkinnedMesh* skinnedMesh = reinterpret_cast<CSkinnedMesh*>(Mesh);
|
||||
CSkinnedMesh* skinnedMesh = static_cast<CSkinnedMesh*>(Mesh);
|
||||
|
||||
if (JointMode == EJUOR_CONTROL)//write to mesh
|
||||
skinnedMesh->transferJointsToMesh(JointChildSceneNodes);
|
||||
@ -747,7 +747,7 @@ void CAnimatedMeshSceneNode::animateJoints(bool CalculateAbsolutePositions)
|
||||
checkJoints();
|
||||
const f32 frame = getFrameNr(); //old?
|
||||
|
||||
CSkinnedMesh* skinnedMesh=reinterpret_cast<CSkinnedMesh*>(Mesh);
|
||||
CSkinnedMesh* skinnedMesh=static_cast<CSkinnedMesh*>(Mesh);
|
||||
|
||||
skinnedMesh->transferOnlyJointsHintsToMesh( JointChildSceneNodes );
|
||||
skinnedMesh->animateMesh(frame, 1.0f);
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include "IMeshBuffer.h"
|
||||
#include "IWriteFile.h"
|
||||
#include "ITexture.h"
|
||||
#include "irrMap.h"
|
||||
|
||||
|
||||
namespace irr
|
||||
@ -60,7 +59,7 @@ bool CB3DMeshWriter::writeMesh(io::IWriteFile* file, IMesh* const mesh, s32 flag
|
||||
|
||||
const u32 numMeshBuffers = mesh->getMeshBufferCount();
|
||||
array<SB3dTexture> texs;
|
||||
map<ITexture *, u32> tex2id; // TODO: texture pointer as key not sufficient as same texture can have several id's
|
||||
std::map<ITexture *, u32> tex2id; // TODO: texture pointer as key not sufficient as same texture can have several id's
|
||||
u32 texsizes = 0;
|
||||
for (u32 i = 0; i < numMeshBuffers; i++)
|
||||
{
|
||||
|
@ -72,6 +72,20 @@ public:
|
||||
//! Get the real boundingbox used by the billboard (which depends on the active camera)
|
||||
virtual const core::aabbox3d<f32>& getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode* camera) _IRR_OVERRIDE_;
|
||||
|
||||
//! Get the amount of mesh buffers.
|
||||
virtual u32 getMeshBufferCount() const _IRR_OVERRIDE_
|
||||
{
|
||||
return Buffer ? 1 : 0;
|
||||
}
|
||||
|
||||
//! Get pointer to the mesh buffer.
|
||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const _IRR_OVERRIDE_
|
||||
{
|
||||
if ( nr == 0 )
|
||||
return Buffer;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//! Returns type of the scene node
|
||||
virtual ESCENE_NODE_TYPE getType() const _IRR_OVERRIDE_ { return ESNT_BILLBOARD; }
|
||||
|
||||
|
@ -71,7 +71,7 @@ void CBoneSceneNode::OnAnimate(u32 timeMs)
|
||||
//updateAbsolutePosition();
|
||||
|
||||
// perform the post render process on all children
|
||||
ISceneNodeList::Iterator it = Children.begin();
|
||||
ISceneNodeList::iterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
(*it)->OnAnimate(timeMs);
|
||||
}
|
||||
@ -82,7 +82,7 @@ void CBoneSceneNode::helper_updateAbsolutePositionOfAllChildren(ISceneNode *Node
|
||||
{
|
||||
Node->updateAbsolutePosition();
|
||||
|
||||
ISceneNodeList::ConstIterator it = Node->getChildren().begin();
|
||||
ISceneNodeList::const_iterator it = Node->getChildren().begin();
|
||||
for (; it != Node->getChildren().end(); ++it)
|
||||
{
|
||||
helper_updateAbsolutePositionOfAllChildren( (*it) );
|
||||
|
@ -15,10 +15,6 @@
|
||||
#include "SExposedVideoData.h"
|
||||
#include "IContextManager.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma comment(lib, "libEGL.lib")
|
||||
#endif
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
|
@ -16,18 +16,16 @@
|
||||
#include "CMemoryFile.h"
|
||||
#include "CLimitReadFile.h"
|
||||
#include "CWriteFile.h"
|
||||
#include "irrList.h"
|
||||
#include <list>
|
||||
|
||||
#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.
|
||||
#endif
|
||||
|
||||
#if defined (_IRR_WINDOWS_API_)
|
||||
#if !defined ( _WIN32_WCE )
|
||||
#include <direct.h> // for _chdir
|
||||
#include <io.h> // for _access
|
||||
#include <tchar.h>
|
||||
#endif
|
||||
#include <direct.h> // for _chdir
|
||||
#include <io.h> // for _access
|
||||
#include <tchar.h>
|
||||
#elif (defined(_IRR_POSIX_API_) || defined(_IRR_OSX_PLATFORM_) || defined(_IRR_IOS_PLATFORM_) || defined(_IRR_ANDROID_PLATFORM_))
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -716,11 +714,10 @@ path CFileSystem::getRelativeFilename(const path& filename, const path& director
|
||||
io::path path1, file, ext;
|
||||
core::splitFilename(getAbsolutePath(filename), &path1, &file, &ext);
|
||||
io::path path2(getAbsolutePath(directory));
|
||||
core::list<io::path> list1, list2;
|
||||
std::list<io::path> list1, list2;
|
||||
path1.split(list1, _IRR_TEXT("/\\"), 2);
|
||||
path2.split(list2, _IRR_TEXT("/\\"), 2);
|
||||
u32 i=0;
|
||||
core::list<io::path>::ConstIterator it1,it2;
|
||||
std::list<io::path>::const_iterator it1,it2;
|
||||
it1=list1.begin();
|
||||
it2=list2.begin();
|
||||
|
||||
@ -744,19 +741,19 @@ path CFileSystem::getRelativeFilename(const path& filename, const path& director
|
||||
#endif
|
||||
|
||||
|
||||
for (; i<list1.size() && i<list2.size()
|
||||
for (; it1 != list1.end() && it2 != list2.end()
|
||||
#if defined (_IRR_WINDOWS_API_)
|
||||
&& (io::path(*it1).make_lower()==io::path(*it2).make_lower())
|
||||
#else
|
||||
&& (*it1==*it2)
|
||||
#endif
|
||||
; ++i)
|
||||
;)
|
||||
{
|
||||
++it1;
|
||||
++it2;
|
||||
}
|
||||
path1=_IRR_TEXT("");
|
||||
for (; i<list2.size(); ++i)
|
||||
for (; it2 != list2.end(); ++it2)
|
||||
path1 += _IRR_TEXT("../");
|
||||
while (it1 != list1.end())
|
||||
{
|
||||
@ -797,7 +794,6 @@ IFileList* CFileSystem::createFileList()
|
||||
// --------------------------------------------
|
||||
//! Windows version
|
||||
#ifdef _IRR_WINDOWS_API_
|
||||
#if !defined ( _WIN32_WCE )
|
||||
|
||||
r = new CFileList(Path, true, false);
|
||||
|
||||
@ -819,12 +815,7 @@ IFileList* CFileSystem::createFileList()
|
||||
|
||||
_findclose( hFile );
|
||||
}
|
||||
#endif
|
||||
|
||||
//TODO add drives
|
||||
//entry.Name = "E:\\";
|
||||
//entry.isDirectory = true;
|
||||
//Files.push_back(entry);
|
||||
#endif
|
||||
|
||||
// --------------------------------------------
|
||||
|
@ -313,18 +313,41 @@ void CGLXManager::destroySurface()
|
||||
|
||||
bool CGLXManager::generateContext()
|
||||
{
|
||||
GLXContext context;
|
||||
GLXContext context = 0;
|
||||
|
||||
if (glxFBConfig)
|
||||
{
|
||||
if (GlxWin)
|
||||
{
|
||||
// create glx context
|
||||
context = glXCreateNewContext((Display*)CurrentContext.OpenGLLinux.X11Display, (GLXFBConfig)glxFBConfig, GLX_RGBA_TYPE, NULL, True);
|
||||
if (!context)
|
||||
#if defined(GLX_ARB_create_context)
|
||||
|
||||
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
|
||||
PFNGLXCREATECONTEXTATTRIBSARBPROC glxCreateContextAttribsARB=(PFNGLXCREATECONTEXTATTRIBSARBPROC)glXGetProcAddress(reinterpret_cast<const GLubyte*>("glXCreateContextAttribsARB"));
|
||||
#else
|
||||
PFNGLXCREATECONTEXTATTRIBSARBPROC glxCreateContextAttribsARB=glXCreateContextAttribsARB;
|
||||
#endif
|
||||
|
||||
if (glxCreateContextAttribsARB)
|
||||
{
|
||||
os::Printer::log("Could not create GLX rendering context.", ELL_WARNING);
|
||||
return false;
|
||||
int contextAttrBuffer[] = {
|
||||
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
|
||||
GLX_CONTEXT_MINOR_VERSION_ARB, 0,
|
||||
// GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
|
||||
None
|
||||
};
|
||||
context = glxCreateContextAttribsARB((Display*)CurrentContext.OpenGLLinux.X11Display, (GLXFBConfig)glxFBConfig, NULL, True, contextAttrBuffer);
|
||||
// transparently fall back to legacy call
|
||||
}
|
||||
if (!context)
|
||||
#endif
|
||||
{
|
||||
// create glx context
|
||||
context = glXCreateNewContext((Display*)CurrentContext.OpenGLLinux.X11Display, (GLXFBConfig)glxFBConfig, GLX_RGBA_TYPE, NULL, True);
|
||||
if (!context)
|
||||
{
|
||||
os::Printer::log("Could not create GLX rendering context.", ELL_WARNING);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -387,11 +387,7 @@ void CGUIEnvironment::clear()
|
||||
HoveredNoSubelement = 0;
|
||||
}
|
||||
|
||||
// get the root's children in case the root changes in future
|
||||
const core::list<IGUIElement*>& children = getRootGUIElement()->getChildren();
|
||||
|
||||
while (!children.empty())
|
||||
(*children.getLast())->remove();
|
||||
getRootGUIElement()->removeAllChildren();
|
||||
}
|
||||
|
||||
|
||||
|
@ -165,7 +165,7 @@ bool CGUIFont::load(io::IXMLReader* xml, const io::path& directory)
|
||||
}
|
||||
rectangle.LowerRightCorner.Y = val;
|
||||
|
||||
CharacterMap.insert(ch,Areas.size());
|
||||
CharacterMap.emplace(ch, Areas.size());
|
||||
|
||||
// make frame
|
||||
f.rectNumber = SpriteBank->getPositions().size();
|
||||
@ -374,7 +374,7 @@ void CGUIFont::readPositions(video::IImage* image, s32& lowerRightPositions)
|
||||
Areas.push_back(a);
|
||||
// map letter to character
|
||||
wchar_t ch = (wchar_t)(lowerRightPositions + 32);
|
||||
CharacterMap.set(ch, lowerRightPositions);
|
||||
CharacterMap[ch] = lowerRightPositions;
|
||||
|
||||
++lowerRightPositions;
|
||||
}
|
||||
@ -435,9 +435,9 @@ u32 CGUIFont::getSpriteNoFromChar(const wchar_t *c) const
|
||||
|
||||
s32 CGUIFont::getAreaFromCharacter(const wchar_t c) const
|
||||
{
|
||||
core::map<wchar_t, s32>::Node* n = CharacterMap.find(c);
|
||||
if (n)
|
||||
return n->getValue();
|
||||
auto n = CharacterMap.find(c);
|
||||
if (n != CharacterMap.end())
|
||||
return n->second;
|
||||
else
|
||||
return WrongCharacter;
|
||||
}
|
||||
|
@ -10,9 +10,9 @@
|
||||
|
||||
#include "IGUIFontBitmap.h"
|
||||
#include "irrString.h"
|
||||
#include "irrMap.h"
|
||||
#include "IReadFile.h"
|
||||
#include "irrArray.h"
|
||||
#include <map>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -97,7 +97,7 @@ private:
|
||||
void popTextureCreationFlags(const bool(&flags)[3]);
|
||||
|
||||
core::array<SFontArea> Areas;
|
||||
core::map<wchar_t, s32> CharacterMap;
|
||||
std::map<wchar_t, s32> CharacterMap;
|
||||
video::IVideoDriver* Driver;
|
||||
IGUISpriteBank* SpriteBank;
|
||||
IGUIEnvironment* Environment;
|
||||
|
@ -57,17 +57,12 @@ bool CGUIModalScreen::isVisible() const
|
||||
}
|
||||
|
||||
// any child visible?
|
||||
bool visible = false;
|
||||
core::list<IGUIElement*>::ConstIterator it = Children.begin();
|
||||
for (; it != Children.end(); ++it)
|
||||
for (const auto& child : Children)
|
||||
{
|
||||
if ( (*it)->isVisible() )
|
||||
{
|
||||
visible = true;
|
||||
break;
|
||||
}
|
||||
if ( child->isVisible() )
|
||||
return true;
|
||||
}
|
||||
return visible;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CGUIModalScreen::isPointInside(const core::position2d<s32>& point) const
|
||||
@ -98,7 +93,7 @@ bool CGUIModalScreen::OnEvent(const SEvent& event)
|
||||
if ( !canTakeFocus(event.GUIEvent.Caller))
|
||||
{
|
||||
if ( !Children.empty() )
|
||||
Environment->setFocus(*(Children.begin()));
|
||||
Environment->setFocus(Children.front());
|
||||
else
|
||||
Environment->setFocus(this);
|
||||
}
|
||||
@ -110,7 +105,7 @@ bool CGUIModalScreen::OnEvent(const SEvent& event)
|
||||
if ( isMyChild(event.GUIEvent.Caller) )
|
||||
{
|
||||
if ( !Children.empty() )
|
||||
Environment->setFocus(*(Children.begin()));
|
||||
Environment->setFocus(Children.front());
|
||||
else
|
||||
Environment->setFocus(this);
|
||||
}
|
||||
@ -171,15 +166,14 @@ void CGUIModalScreen::draw()
|
||||
u32 now = os::Timer::getTime();
|
||||
if (BlinkMode && now - MouseDownTime < 300 && (now / 70)%2)
|
||||
{
|
||||
core::list<IGUIElement*>::Iterator it = Children.begin();
|
||||
core::rect<s32> r;
|
||||
video::SColor c = Environment->getSkin()->getColor(gui::EGDC_3D_HIGH_LIGHT);
|
||||
|
||||
for (; it != Children.end(); ++it)
|
||||
for (auto child : Children)
|
||||
{
|
||||
if ((*it)->isVisible())
|
||||
if (child->isVisible())
|
||||
{
|
||||
r = (*it)->getAbsolutePosition();
|
||||
r = child->getAbsolutePosition();
|
||||
r.LowerRightCorner.X += 1;
|
||||
r.LowerRightCorner.Y += 1;
|
||||
r.UpperLeftCorner.X -= 1;
|
||||
|
@ -34,11 +34,8 @@ CGUIToolBar::CGUIToolBar(IGUIEnvironment* environment, IGUIElement* parent, s32
|
||||
parentwidth = Parent->getAbsolutePosition().getWidth();
|
||||
s32 parentheight = Parent->getAbsolutePosition().getHeight();
|
||||
|
||||
const core::list<IGUIElement*>& children = parent->getChildren();
|
||||
core::list<IGUIElement*>::ConstIterator it = children.begin();
|
||||
for (; it != children.end(); ++it)
|
||||
for (const auto& e : parent->getChildren())
|
||||
{
|
||||
const IGUIElement* e = *it;
|
||||
if ( e->hasType(EGUIET_CONTEXT_MENU)
|
||||
|| e->hasType(EGUIET_MENU)
|
||||
|| e->hasType(EGUIET_TOOL_BAR) )
|
||||
|
@ -66,11 +66,10 @@ void CGUITreeViewNode::setIcon( const wchar_t* icon )
|
||||
|
||||
void CGUITreeViewNode::clearChildren()
|
||||
{
|
||||
core::list<CGUITreeViewNode*>::Iterator it;
|
||||
|
||||
for( it = Children.begin(); it != Children.end(); it++ )
|
||||
for (auto child : Children)
|
||||
{
|
||||
( *it )->drop();
|
||||
child->Parent = nullptr;
|
||||
child->drop();
|
||||
}
|
||||
Children.clear();
|
||||
}
|
||||
@ -83,9 +82,8 @@ IGUITreeViewNode* CGUITreeViewNode::addChildBack(
|
||||
void* data /*= 0*/,
|
||||
IReferenceCounted* data2 /*= 0*/ )
|
||||
{
|
||||
CGUITreeViewNode* newChild = new CGUITreeViewNode( Owner, this );
|
||||
|
||||
Children.push_back( newChild );
|
||||
auto newChild = new CGUITreeViewNode( Owner, this );
|
||||
newChild->ParentPos = Children.insert(Children.end(), newChild);
|
||||
newChild->Text = text;
|
||||
newChild->Icon = icon;
|
||||
newChild->ImageIndex = imageIndex;
|
||||
@ -107,9 +105,8 @@ IGUITreeViewNode* CGUITreeViewNode::addChildFront(
|
||||
void* data /*= 0*/,
|
||||
IReferenceCounted* data2 /*= 0*/ )
|
||||
{
|
||||
CGUITreeViewNode* newChild = new CGUITreeViewNode( Owner, this );
|
||||
|
||||
Children.push_front( newChild );
|
||||
auto newChild = new CGUITreeViewNode( Owner, this );
|
||||
newChild->ParentPos = Children.insert(Children.begin(), newChild);
|
||||
newChild->Text = text;
|
||||
newChild->Icon = icon;
|
||||
newChild->ImageIndex = imageIndex;
|
||||
@ -124,7 +121,7 @@ IGUITreeViewNode* CGUITreeViewNode::addChildFront(
|
||||
}
|
||||
|
||||
IGUITreeViewNode* CGUITreeViewNode::insertChildAfter(
|
||||
IGUITreeViewNode* other,
|
||||
IGUITreeViewNode* iother,
|
||||
const wchar_t* text,
|
||||
const wchar_t* icon /*= 0*/,
|
||||
s32 imageIndex /*= -1*/,
|
||||
@ -132,33 +129,27 @@ IGUITreeViewNode* CGUITreeViewNode::insertChildAfter(
|
||||
void* data /*= 0*/,
|
||||
IReferenceCounted* data2/* = 0*/ )
|
||||
{
|
||||
core::list<CGUITreeViewNode*>::Iterator itOther;
|
||||
CGUITreeViewNode* newChild = 0;
|
||||
|
||||
for( itOther = Children.begin(); itOther != Children.end(); itOther++ )
|
||||
{
|
||||
if( other == *itOther )
|
||||
{
|
||||
newChild = new CGUITreeViewNode( Owner, this );
|
||||
newChild->Text = text;
|
||||
newChild->Icon = icon;
|
||||
newChild->ImageIndex = imageIndex;
|
||||
newChild->SelectedImageIndex = selectedImageIndex;
|
||||
newChild->Data = data;
|
||||
newChild->Data2 = data2;
|
||||
if( data2 )
|
||||
{
|
||||
data2->grab();
|
||||
}
|
||||
Children.insert_after( itOther, newChild );
|
||||
break;
|
||||
}
|
||||
}
|
||||
// This cast is needed to access the ParentPos member of `other`.
|
||||
// The abstraction was already broken, because Children is a list of
|
||||
// CGUITreeViewNode, not IGUITreeViewNode. The existing code was
|
||||
// implicitly casting through pointer comparison.
|
||||
auto other = static_cast<CGUITreeViewNode*>(iother);
|
||||
assert(other->Parent == this);
|
||||
auto newChild = new CGUITreeViewNode( Owner, this );
|
||||
newChild->ParentPos = Children.insert(std::next(other->ParentPos), newChild);
|
||||
newChild->Text = text;
|
||||
newChild->Icon = icon;
|
||||
newChild->ImageIndex = imageIndex;
|
||||
newChild->SelectedImageIndex = selectedImageIndex;
|
||||
newChild->Data = data;
|
||||
newChild->Data2 = data2;
|
||||
if( data2 )
|
||||
data2->grab();
|
||||
return newChild;
|
||||
}
|
||||
|
||||
IGUITreeViewNode* CGUITreeViewNode::insertChildBefore(
|
||||
IGUITreeViewNode* other,
|
||||
IGUITreeViewNode* iother,
|
||||
const wchar_t* text,
|
||||
const wchar_t* icon /*= 0*/,
|
||||
s32 imageIndex /*= -1*/,
|
||||
@ -166,28 +157,18 @@ IGUITreeViewNode* CGUITreeViewNode::insertChildBefore(
|
||||
void* data /*= 0*/,
|
||||
IReferenceCounted* data2/* = 0*/ )
|
||||
{
|
||||
core::list<CGUITreeViewNode*>::Iterator itOther;
|
||||
CGUITreeViewNode* newChild = 0;
|
||||
|
||||
for( itOther = Children.begin(); itOther != Children.end(); itOther++ )
|
||||
{
|
||||
if( other == *itOther )
|
||||
{
|
||||
newChild = new CGUITreeViewNode( Owner, this );
|
||||
newChild->Text = text;
|
||||
newChild->Icon = icon;
|
||||
newChild->ImageIndex = imageIndex;
|
||||
newChild->SelectedImageIndex = selectedImageIndex;
|
||||
newChild->Data = data;
|
||||
newChild->Data2 = data2;
|
||||
if( data2 )
|
||||
{
|
||||
data2->grab();
|
||||
}
|
||||
Children.insert_before( itOther, newChild );
|
||||
break;
|
||||
}
|
||||
}
|
||||
auto other = static_cast<CGUITreeViewNode*>(iother);
|
||||
assert(other->Parent == this);
|
||||
auto newChild = new CGUITreeViewNode( Owner, this );
|
||||
newChild->ParentPos = Children.insert(other->ParentPos, newChild);
|
||||
newChild->Text = text;
|
||||
newChild->Icon = icon;
|
||||
newChild->ImageIndex = imageIndex;
|
||||
newChild->SelectedImageIndex = selectedImageIndex;
|
||||
newChild->Data = data;
|
||||
newChild->Data2 = data2;
|
||||
if( data2 )
|
||||
data2->grab();
|
||||
return newChild;
|
||||
}
|
||||
|
||||
@ -199,7 +180,7 @@ IGUITreeViewNode* CGUITreeViewNode::getFirstChild() const
|
||||
}
|
||||
else
|
||||
{
|
||||
return *( Children.begin() );
|
||||
return Children.front();
|
||||
}
|
||||
}
|
||||
|
||||
@ -211,54 +192,25 @@ IGUITreeViewNode* CGUITreeViewNode::getLastChild() const
|
||||
}
|
||||
else
|
||||
{
|
||||
return *( Children.getLast() );
|
||||
return Children.back();
|
||||
}
|
||||
}
|
||||
|
||||
IGUITreeViewNode* CGUITreeViewNode::getPrevSibling() const
|
||||
{
|
||||
core::list<CGUITreeViewNode*>::Iterator itThis;
|
||||
core::list<CGUITreeViewNode*>::Iterator itOther;
|
||||
CGUITreeViewNode* other = 0;
|
||||
|
||||
if( Parent )
|
||||
{
|
||||
for( itThis = Parent->Children.begin(); itThis != Parent->Children.end(); itThis++ )
|
||||
{
|
||||
if( this == *itThis )
|
||||
{
|
||||
if( itThis != Parent->Children.begin() )
|
||||
{
|
||||
other = *itOther;
|
||||
}
|
||||
break;
|
||||
}
|
||||
itOther = itThis;
|
||||
}
|
||||
}
|
||||
return other;
|
||||
if (!Parent || ParentPos == Parent->Children.begin())
|
||||
return nullptr;
|
||||
return *std::prev(ParentPos);
|
||||
}
|
||||
|
||||
IGUITreeViewNode* CGUITreeViewNode::getNextSibling() const
|
||||
{
|
||||
core::list<CGUITreeViewNode*>::Iterator itThis;
|
||||
CGUITreeViewNode* other = 0;
|
||||
|
||||
if( Parent )
|
||||
{
|
||||
for( itThis = Parent->Children.begin(); itThis != Parent->Children.end(); itThis++ )
|
||||
{
|
||||
if( this == *itThis )
|
||||
{
|
||||
if( itThis != Parent->Children.getLast() )
|
||||
{
|
||||
other = *( ++itThis );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return other;
|
||||
if (!Parent)
|
||||
return nullptr;
|
||||
auto nextIt = std::next(ParentPos);
|
||||
if (nextIt == Parent->Children.end())
|
||||
return nullptr;
|
||||
return *nextIt;
|
||||
}
|
||||
|
||||
IGUITreeViewNode* CGUITreeViewNode::getNextVisible() const
|
||||
@ -286,73 +238,40 @@ IGUITreeViewNode* CGUITreeViewNode::getNextVisible() const
|
||||
return next;
|
||||
}
|
||||
|
||||
bool CGUITreeViewNode::deleteChild( IGUITreeViewNode* child )
|
||||
bool CGUITreeViewNode::deleteChild( IGUITreeViewNode* ichild )
|
||||
{
|
||||
core::list<CGUITreeViewNode*>::Iterator itChild;
|
||||
bool deleted = false;
|
||||
|
||||
for( itChild = Children.begin(); itChild != Children.end(); itChild++ )
|
||||
{
|
||||
if( child == *itChild )
|
||||
{
|
||||
child->drop();
|
||||
Children.erase( itChild );
|
||||
deleted = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return deleted;
|
||||
auto child = static_cast<CGUITreeViewNode*>(ichild);
|
||||
assert(child->Parent == this);
|
||||
Children.erase(child->ParentPos);
|
||||
child->Parent = nullptr;
|
||||
child->drop();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGUITreeViewNode::moveChildUp( IGUITreeViewNode* child )
|
||||
bool CGUITreeViewNode::moveChildUp( IGUITreeViewNode* ichild )
|
||||
{
|
||||
core::list<CGUITreeViewNode*>::Iterator itChild;
|
||||
core::list<CGUITreeViewNode*>::Iterator itOther;
|
||||
CGUITreeViewNode* nodeTmp;
|
||||
bool moved = false;
|
||||
|
||||
for( itChild = Children.begin(); itChild != Children.end(); itChild++ )
|
||||
{
|
||||
if( child == *itChild )
|
||||
{
|
||||
if( itChild != Children.begin() )
|
||||
{
|
||||
nodeTmp = *itChild;
|
||||
*itChild = *itOther;
|
||||
*itOther = nodeTmp;
|
||||
moved = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
itOther = itChild;
|
||||
}
|
||||
return moved;
|
||||
auto child = static_cast<CGUITreeViewNode*>(ichild);
|
||||
assert(child->Parent == this);
|
||||
if (child->ParentPos == Children.begin())
|
||||
return false;
|
||||
auto curPos = child->ParentPos;
|
||||
auto prevPos = std::prev(child->ParentPos);
|
||||
std::swap(*curPos, *prevPos);
|
||||
std::swap((*curPos)->ParentPos, (*prevPos)->ParentPos);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGUITreeViewNode::moveChildDown( IGUITreeViewNode* child )
|
||||
bool CGUITreeViewNode::moveChildDown( IGUITreeViewNode* ichild )
|
||||
{
|
||||
core::list<CGUITreeViewNode*>::Iterator itChild;
|
||||
core::list<CGUITreeViewNode*>::Iterator itOther;
|
||||
CGUITreeViewNode* nodeTmp;
|
||||
bool moved = false;
|
||||
|
||||
for( itChild = Children.begin(); itChild != Children.end(); itChild++ )
|
||||
{
|
||||
if( child == *itChild )
|
||||
{
|
||||
if( itChild != Children.getLast() )
|
||||
{
|
||||
itOther = itChild;
|
||||
++itOther;
|
||||
nodeTmp = *itChild;
|
||||
*itChild = *itOther;
|
||||
*itOther = nodeTmp;
|
||||
moved = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return moved;
|
||||
auto child = static_cast<CGUITreeViewNode*>(ichild);
|
||||
assert(child->Parent == this);
|
||||
auto nextPos = std::next(child->ParentPos);
|
||||
if (nextPos == Children.end())
|
||||
return false;
|
||||
auto curPos = child->ParentPos;
|
||||
std::swap(*curPos, *nextPos);
|
||||
std::swap((*curPos)->ParentPos, (*nextPos)->ParentPos);
|
||||
return true;
|
||||
}
|
||||
|
||||
void CGUITreeViewNode::setExpanded( bool expanded )
|
||||
|
@ -5,7 +5,6 @@
|
||||
#define __C_GUI_TREE_VIEW_H_INCLUDED__
|
||||
|
||||
#include "IGUITreeView.h"
|
||||
#include "irrList.h"
|
||||
|
||||
|
||||
namespace irr
|
||||
@ -93,7 +92,7 @@ namespace gui
|
||||
|
||||
//! returns the child item count
|
||||
virtual u32 getChildCount() const _IRR_OVERRIDE_
|
||||
{ return Children.getSize(); }
|
||||
{ return Children.size(); }
|
||||
|
||||
//! removes all children (recursive) from this node
|
||||
virtual void clearChildren() _IRR_OVERRIDE_;
|
||||
@ -231,7 +230,10 @@ namespace gui
|
||||
void* Data;
|
||||
IReferenceCounted* Data2;
|
||||
bool Expanded;
|
||||
core::list<CGUITreeViewNode*> Children;
|
||||
std::list<CGUITreeViewNode*> Children;
|
||||
// Position of this node in Parent->Children.
|
||||
// Only valid when Parent != NULL
|
||||
std::list<CGUITreeViewNode*>::iterator ParentPos;
|
||||
};
|
||||
|
||||
|
||||
|
@ -18,9 +18,7 @@
|
||||
|
||||
#ifdef _IRR_WINDOWS_API_
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#if !defined(_IRR_XBOX_PLATFORM_)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#define _IRR_WINDOWS_NT_CONSOLE_
|
||||
#else
|
||||
#include <time.h>
|
||||
|
@ -1701,7 +1701,7 @@ bool CIrrDeviceLinux::activateJoysticks(core::array<SJoystickInfo> & joystickInf
|
||||
for (joystick = 0; joystick < joystickInfo.size(); ++joystick)
|
||||
{
|
||||
char logString[256];
|
||||
(void)sprintf(logString, "Found joystick %u, %u axes, %u buttons '%s'",
|
||||
snprintf_irr(logString, sizeof(logString), "Found joystick %d, %d axes, %d buttons '%s'",
|
||||
joystick, joystickInfo[joystick].Axes,
|
||||
joystickInfo[joystick].Buttons, joystickInfo[joystick].Name.c_str());
|
||||
os::Printer::log(logString, ELL_INFORMATION);
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include "CIrrDeviceOSX.h"
|
||||
|
||||
#include "IEventReceiver.h"
|
||||
#include "irrList.h"
|
||||
#include "os.h"
|
||||
#include "CTimer.h"
|
||||
#include "irrString.h"
|
||||
@ -553,7 +552,6 @@ CIrrDeviceMacOSX::CIrrDeviceMacOSX(const SIrrlichtCreationParameters& param)
|
||||
IsActive(true), IsFullscreen(false), IsShiftDown(false), IsControlDown(false), IsResizable(false)
|
||||
{
|
||||
struct utsname name;
|
||||
NSString *path;
|
||||
|
||||
#ifdef _DEBUG
|
||||
setDebugName("CIrrDeviceMacOSX");
|
||||
@ -568,27 +566,31 @@ CIrrDeviceMacOSX::CIrrDeviceMacOSX(const SIrrlichtCreationParameters& param)
|
||||
[[NSAutoreleasePool alloc] init];
|
||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||
[NSApp setDelegate:(id<NSApplicationDelegate>)[[[CIrrDelegateOSX alloc] initWithDevice:this] autorelease]];
|
||||
|
||||
|
||||
// Create menu
|
||||
|
||||
|
||||
NSString* bundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
|
||||
|
||||
if (bundleName == nil)
|
||||
bundleName = @"Irrlicht";
|
||||
|
||||
NSMenu* mainMenu = [[[NSMenu alloc] initWithTitle:@"MainMenu"] autorelease];
|
||||
NSMenu* menu = [[[NSMenu alloc] initWithTitle:bundleName] autorelease];
|
||||
NSMenuItem* menuItem = [mainMenu addItemWithTitle:bundleName action:nil keyEquivalent:@""];
|
||||
[mainMenu setSubmenu:menu forItem:menuItem];
|
||||
menuItem = [menu addItemWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
|
||||
[menuItem setKeyEquivalentModifierMask:NSCommandKeyMask];
|
||||
|
||||
|
||||
[NSApp setMainMenu:mainMenu];
|
||||
|
||||
[NSApp finishLaunching];
|
||||
}
|
||||
|
||||
path = [[NSBundle mainBundle] bundlePath];
|
||||
path = [path stringByAppendingString:@"/Contents/Resources"];
|
||||
chdir([path fileSystemRepresentation]);
|
||||
[path release];
|
||||
NSString *path = [[NSBundle mainBundle] bundlePath];
|
||||
if (path != nil) {
|
||||
path = [path stringByAppendingString:@"/Contents/Resources"];
|
||||
chdir([path fileSystemRepresentation]);
|
||||
[path release];
|
||||
}
|
||||
}
|
||||
|
||||
uname(&name);
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
#include "CIrrDeviceSDL.h"
|
||||
#include "IEventReceiver.h"
|
||||
#include "irrList.h"
|
||||
#include "os.h"
|
||||
#include "CTimer.h"
|
||||
#include "irrString.h"
|
||||
@ -17,7 +16,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "SIrrCreationParameters.h"
|
||||
#include <SDL2/SDL_video.h>
|
||||
#include <SDL_video.h>
|
||||
|
||||
#ifdef _IRR_EMSCRIPTEN_PLATFORM_
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
||||
@ -26,28 +25,26 @@
|
||||
#include <emscripten.h>
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
||||
#include "CSDLManager.h"
|
||||
#endif
|
||||
|
||||
static int SDLDeviceInstances = 0;
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_DIRECT3D_9_
|
||||
IVideoDriver* createDirectX9Driver(const irr::SIrrlichtCreationParameters& params,
|
||||
io::IFileSystem* io, HWND window);
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
||||
IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params,
|
||||
io::IFileSystem* io, CIrrDeviceSDL* device);
|
||||
IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||
#endif
|
||||
|
||||
#if defined(_IRR_COMPILE_WITH_OGLES2_) && defined(_IRR_EMSCRIPTEN_PLATFORM_)
|
||||
IVideoDriver* createOGLES2Driver(const irr::SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
||||
IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||
#endif
|
||||
|
||||
#if defined(_IRR_COMPILE_WITH_WEBGL1_) && defined(_IRR_EMSCRIPTEN_PLATFORM_)
|
||||
IVideoDriver* createWebGL1Driver(const irr::SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||
#ifdef _IRR_COMPILE_WITH_WEBGL1_
|
||||
IVideoDriver* createWebGL1Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||
#endif
|
||||
} // end namespace video
|
||||
|
||||
@ -461,7 +458,8 @@ void CIrrDeviceSDL::createDriver()
|
||||
|
||||
case video::EDT_OPENGL:
|
||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
||||
VideoDriver = video::createOpenGLDriver(CreationParams, FileSystem, this);
|
||||
ContextManager = new video::CSDLManager(this);
|
||||
VideoDriver = video::createOpenGLDriver(CreationParams, FileSystem, ContextManager);
|
||||
#else
|
||||
os::Printer::log("No OpenGL support compiled in.", ELL_ERROR);
|
||||
#endif
|
||||
@ -846,9 +844,9 @@ bool CIrrDeviceSDL::activateJoysticks(core::array<SJoystickInfo> & joystickInfo)
|
||||
for(joystick = 0; joystick < (int)joystickInfo.size(); ++joystick)
|
||||
{
|
||||
char logString[256];
|
||||
(void)sprintf(logString, "Found joystick %d, %d axes, %d buttons '%s'",
|
||||
joystick, joystickInfo[joystick].Axes,
|
||||
joystickInfo[joystick].Buttons, joystickInfo[joystick].Name.c_str());
|
||||
snprintf_irr(logString, sizeof(logString), "Found joystick %d, %d axes, %d buttons '%s'",
|
||||
joystick, joystickInfo[joystick].Axes,
|
||||
joystickInfo[joystick].Buttons, joystickInfo[joystick].Name.c_str());
|
||||
os::Printer::log(logString, ELL_INFORMATION);
|
||||
}
|
||||
|
||||
|
@ -20,8 +20,8 @@
|
||||
#include <emscripten/html5.h>
|
||||
#endif
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
#include <SDL2/SDL_syswm.h>
|
||||
#include <SDL.h>
|
||||
#include <SDL_syswm.h>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
@ -12,7 +12,6 @@
|
||||
|
||||
#include "CIrrDeviceWin32.h"
|
||||
#include "IEventReceiver.h"
|
||||
#include "irrList.h"
|
||||
#include "os.h"
|
||||
|
||||
#include "CTimer.h"
|
||||
@ -22,20 +21,13 @@
|
||||
#include "IGUISpriteBank.h"
|
||||
#include <winuser.h>
|
||||
#include "SExposedVideoData.h"
|
||||
|
||||
#if defined(_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)
|
||||
#include <mmsystem.h>
|
||||
#include <regstr.h>
|
||||
#ifdef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
|
||||
#define DIRECTINPUT_VERSION 0x0800
|
||||
#include <dinput.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma comment(lib, "dinput8.lib")
|
||||
#pragma comment(lib, "dxguid.lib")
|
||||
#endif
|
||||
#else
|
||||
#ifdef _MSC_VER
|
||||
#pragma comment(lib, "winmm.lib")
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -514,7 +506,7 @@ bool SJoystickWin32Control::activateJoysticks(core::array<SJoystickInfo> & joyst
|
||||
for(joystick = 0; joystick < joystickInfo.size(); ++joystick)
|
||||
{
|
||||
char logString[256];
|
||||
(void)sprintf(logString, "Found joystick %d, %d axes, %d buttons '%s'",
|
||||
snprintf_irr(logString, sizeof(logString), "Found joystick %d, %d axes, %d buttons '%s'",
|
||||
joystick, joystickInfo[joystick].Axes,
|
||||
joystickInfo[joystick].Buttons, joystickInfo[joystick].Name.c_str());
|
||||
os::Printer::log(logString, ELL_INFORMATION);
|
||||
@ -1096,12 +1088,12 @@ void CIrrDeviceWin32::resizeIfNecessary()
|
||||
|
||||
if (r.right < 2 || r.bottom < 2)
|
||||
{
|
||||
sprintf(tmp, "Ignoring resize operation to (%ld %ld)", r.right, r.bottom);
|
||||
snprintf_irr(tmp, sizeof(tmp), "Ignoring resize operation to (%ld %ld)", r.right, r.bottom);
|
||||
os::Printer::log(tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(tmp, "Resizing window (%ld %ld)", r.right, r.bottom);
|
||||
snprintf_irr(tmp, sizeof(tmp), "Resizing window (%ld %ld)", r.right, r.bottom);
|
||||
os::Printer::log(tmp);
|
||||
|
||||
getVideoDriver()->OnResize(irr::core::dimension2du((u32)r.right, (u32)r.bottom));
|
||||
@ -1140,7 +1132,7 @@ bool CIrrDeviceWin32::present(video::IImage* image, void* windowId, core::rect<s
|
||||
{
|
||||
HWND hwnd = HWnd;
|
||||
if ( windowId )
|
||||
hwnd = reinterpret_cast<HWND>(windowId);
|
||||
hwnd = static_cast<HWND>(windowId);
|
||||
|
||||
HDC dc = GetDC(hwnd);
|
||||
|
||||
|
@ -13,11 +13,9 @@
|
||||
#include "IImagePresenter.h"
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#if !defined(_IRR_XBOX_PLATFORM_)
|
||||
#include <windows.h>
|
||||
#include <mmsystem.h> // For JOYCAPS
|
||||
#include <windowsx.h>
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <mmsystem.h> // For JOYCAPS
|
||||
#include <windowsx.h>
|
||||
#if !defined(GET_X_LPARAM)
|
||||
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
|
||||
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
|
||||
|
@ -48,8 +48,7 @@ find_package(ZLIB REQUIRED)
|
||||
find_package(JPEG REQUIRED)
|
||||
find_package(PNG REQUIRED)
|
||||
|
||||
# To configure the features available in this Irrlicht build please edit
|
||||
# include/IrrCompileConfig.h and re-run CMake from a clean state
|
||||
# To configure the features available in this Irrlicht build please edit include/IrrCompileConfig.h.
|
||||
include(CheckSymbolExists)
|
||||
set(CMAKE_REQUIRED_INCLUDES ${PROJECT_SOURCE_DIR}/include)
|
||||
unset(OGLES1_ENABLED CACHE)
|
||||
@ -58,6 +57,9 @@ unset(OGL_ENABLED CACHE)
|
||||
unset(XINPUT2_ENABLED CACHE)
|
||||
unset(SDL_ENABLED CACHE)
|
||||
|
||||
# tell cmake about the dependency
|
||||
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_REQUIRED_INCLUDES}/IrrCompileConfig.h)
|
||||
|
||||
check_symbol_exists(_IRR_COMPILE_WITH_OGLES1_ "IrrCompileConfig.h" OGLES1_ENABLED)
|
||||
if(OGLES1_ENABLED)
|
||||
# only tested on Android, probably works on Linux (is this needed anywhere else?)
|
||||
@ -75,11 +77,12 @@ if(OGL_ENABLED)
|
||||
set(OpenGL_GL_PREFERENCE "LEGACY")
|
||||
find_package(OpenGL REQUIRED)
|
||||
endif()
|
||||
check_symbol_exists(_IRR_LINUX_X11_XINPUT2_ "IrrCompileConfig.h" XINPUT2_ENABLED)
|
||||
if(XINPUT2_ENABLED)
|
||||
find_library(XINPUT_LIBRARY Xi REQUIRED)
|
||||
if(NOT ANDROID AND NOT APPLE)
|
||||
check_symbol_exists(_IRR_LINUX_X11_XINPUT2_ "IrrCompileConfig.h" XINPUT2_ENABLED)
|
||||
if(XINPUT2_ENABLED)
|
||||
find_library(XINPUT_LIBRARY Xi REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
check_symbol_exists(_IRR_COMPILE_WITH_SDL_DEVICE_ "IrrCompileConfig.h" SDL_ENABLED)
|
||||
if(SDL_ENABLED)
|
||||
find_package(SDL2 CONFIG REQUIRED)
|
||||
@ -185,6 +188,7 @@ set(IRRDRVROBJ
|
||||
CGLXManager.cpp
|
||||
CWGLManager.cpp
|
||||
CEGLManager.cpp
|
||||
CSDLManager.cpp
|
||||
mt_opengl_loader.cpp
|
||||
)
|
||||
|
||||
|
@ -8,8 +8,8 @@
|
||||
#include "CMeshBuffer.h"
|
||||
#include "SAnimatedMesh.h"
|
||||
#include "os.h"
|
||||
#include "irrMap.h"
|
||||
#include "triangle3d.h"
|
||||
#include <map>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
@ -1789,8 +1789,8 @@ IMesh* CMeshManipulator::createForsythOptimizedMesh(const IMesh *mesh) const
|
||||
buf->Vertices.reallocate(vcount);
|
||||
buf->Indices.reallocate(icount);
|
||||
|
||||
core::map<const video::S3DVertex, const u16> sind; // search index for fast operation
|
||||
typedef core::map<const video::S3DVertex, const u16>::Node snode;
|
||||
std::map<const video::S3DVertex, const u16> sind; // search index for fast operation
|
||||
typedef std::map<const video::S3DVertex, const u16>::iterator snode;
|
||||
|
||||
// Main algorithm
|
||||
u32 highest = 0;
|
||||
@ -1820,45 +1820,45 @@ IMesh* CMeshManipulator::createForsythOptimizedMesh(const IMesh *mesh) const
|
||||
// Output the best triangle
|
||||
u16 newind = buf->Vertices.size();
|
||||
|
||||
snode *s = sind.find(v[tc[highest].ind[0]]);
|
||||
snode s = sind.find(v[tc[highest].ind[0]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[0]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[0]], newind);
|
||||
sind.emplace(v[tc[highest].ind[0]], newind);
|
||||
newind++;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
s = sind.find(v[tc[highest].ind[1]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[1]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[1]], newind);
|
||||
sind.emplace(v[tc[highest].ind[1]], newind);
|
||||
newind++;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
s = sind.find(v[tc[highest].ind[2]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[2]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[2]], newind);
|
||||
sind.emplace(v[tc[highest].ind[2]], newind);
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
vc[tc[highest].ind[0]].NumActiveTris--;
|
||||
@ -1901,8 +1901,8 @@ IMesh* CMeshManipulator::createForsythOptimizedMesh(const IMesh *mesh) const
|
||||
buf->Vertices.reallocate(vcount);
|
||||
buf->Indices.reallocate(icount);
|
||||
|
||||
core::map<const video::S3DVertex2TCoords, const u16> sind; // search index for fast operation
|
||||
typedef core::map<const video::S3DVertex2TCoords, const u16>::Node snode;
|
||||
std::map<const video::S3DVertex2TCoords, const u16> sind; // search index for fast operation
|
||||
typedef std::map<const video::S3DVertex2TCoords, const u16>::iterator snode;
|
||||
|
||||
// Main algorithm
|
||||
u32 highest = 0;
|
||||
@ -1932,45 +1932,45 @@ IMesh* CMeshManipulator::createForsythOptimizedMesh(const IMesh *mesh) const
|
||||
// Output the best triangle
|
||||
u16 newind = buf->Vertices.size();
|
||||
|
||||
snode *s = sind.find(v[tc[highest].ind[0]]);
|
||||
snode s = sind.find(v[tc[highest].ind[0]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[0]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[0]], newind);
|
||||
sind.emplace(v[tc[highest].ind[0]], newind);
|
||||
newind++;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
s = sind.find(v[tc[highest].ind[1]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[1]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[1]], newind);
|
||||
sind.emplace(v[tc[highest].ind[1]], newind);
|
||||
newind++;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
s = sind.find(v[tc[highest].ind[2]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[2]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[2]], newind);
|
||||
sind.emplace(v[tc[highest].ind[2]], newind);
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
vc[tc[highest].ind[0]].NumActiveTris--;
|
||||
@ -2014,8 +2014,8 @@ IMesh* CMeshManipulator::createForsythOptimizedMesh(const IMesh *mesh) const
|
||||
buf->Vertices.reallocate(vcount);
|
||||
buf->Indices.reallocate(icount);
|
||||
|
||||
core::map<const video::S3DVertexTangents, const u16> sind; // search index for fast operation
|
||||
typedef core::map<const video::S3DVertexTangents, const u16>::Node snode;
|
||||
std::map<const video::S3DVertexTangents, const u16> sind; // search index for fast operation
|
||||
typedef std::map<const video::S3DVertexTangents, const u16>::iterator snode;
|
||||
|
||||
// Main algorithm
|
||||
u32 highest = 0;
|
||||
@ -2045,45 +2045,45 @@ IMesh* CMeshManipulator::createForsythOptimizedMesh(const IMesh *mesh) const
|
||||
// Output the best triangle
|
||||
u16 newind = buf->Vertices.size();
|
||||
|
||||
snode *s = sind.find(v[tc[highest].ind[0]]);
|
||||
snode s = sind.find(v[tc[highest].ind[0]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[0]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[0]], newind);
|
||||
sind.emplace(v[tc[highest].ind[0]], newind);
|
||||
newind++;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
s = sind.find(v[tc[highest].ind[1]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[1]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[1]], newind);
|
||||
sind.emplace(v[tc[highest].ind[1]], newind);
|
||||
newind++;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
s = sind.find(v[tc[highest].ind[2]]);
|
||||
|
||||
if (!s)
|
||||
if (s == sind.end())
|
||||
{
|
||||
buf->Vertices.push_back(v[tc[highest].ind[2]]);
|
||||
buf->Indices.push_back(newind);
|
||||
sind.insert(v[tc[highest].ind[2]], newind);
|
||||
sind.emplace(v[tc[highest].ind[2]], newind);
|
||||
}
|
||||
else
|
||||
{
|
||||
buf->Indices.push_back(s->getValue());
|
||||
buf->Indices.push_back(s->second);
|
||||
}
|
||||
|
||||
vc[tc[highest].ind[0]].NumActiveTris--;
|
||||
|
@ -1307,8 +1307,8 @@ bool CNullDriver::checkPrimitiveCount(u32 prmCount) const
|
||||
|
||||
if (prmCount > m)
|
||||
{
|
||||
char tmp[1024];
|
||||
sprintf(tmp,"Could not draw triangles, too many primitives(%u), maximum is %u.", prmCount, m);
|
||||
char tmp[128];
|
||||
snprintf_irr(tmp, sizeof(tmp), "Could not draw triangles, too many primitives(%u), maximum is %u.", prmCount, m);
|
||||
os::Printer::log(tmp, ELL_ERROR);
|
||||
return false;
|
||||
}
|
||||
@ -1689,9 +1689,9 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer*
|
||||
return 0;
|
||||
|
||||
//search for hardware links
|
||||
core::map< const scene::IMeshBuffer*,SHWBufferLink* >::Node* node = HWBufferMap.find(mb);
|
||||
if (node)
|
||||
return node->getValue();
|
||||
SHWBufferLink *HWBuffer = reinterpret_cast<SHWBufferLink*>(mb->getHWBuffer());
|
||||
if (HWBuffer)
|
||||
return HWBuffer;
|
||||
|
||||
return createHardwareBuffer(mb); //no hardware links, and mesh wants one, create it
|
||||
}
|
||||
@ -1700,20 +1700,13 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer*
|
||||
//! Update all hardware buffers, remove unused ones
|
||||
void CNullDriver::updateAllHardwareBuffers()
|
||||
{
|
||||
core::map<const scene::IMeshBuffer*,SHWBufferLink*>::ParentFirstIterator Iterator=HWBufferMap.getParentFirstIterator();
|
||||
auto it = HWBufferList.begin();
|
||||
while (it != HWBufferList.end()) {
|
||||
SHWBufferLink *Link = *it;
|
||||
++it;
|
||||
|
||||
for (;!Iterator.atEnd();Iterator++)
|
||||
{
|
||||
SHWBufferLink *Link=Iterator.getNode()->getValue();
|
||||
|
||||
Link->LastUsed++;
|
||||
if (Link->LastUsed>20000)
|
||||
{
|
||||
if (!Link->MeshBuffer || Link->MeshBuffer->getReferenceCount() == 1)
|
||||
deleteHardwareBuffer(Link);
|
||||
|
||||
// todo: needs better fix
|
||||
Iterator = HWBufferMap.getParentFirstIterator();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1722,7 +1715,7 @@ void CNullDriver::deleteHardwareBuffer(SHWBufferLink *HWBuffer)
|
||||
{
|
||||
if (!HWBuffer)
|
||||
return;
|
||||
HWBufferMap.remove(HWBuffer->MeshBuffer);
|
||||
HWBufferList.erase(HWBuffer->listPosition);
|
||||
delete HWBuffer;
|
||||
}
|
||||
|
||||
@ -1730,17 +1723,19 @@ void CNullDriver::deleteHardwareBuffer(SHWBufferLink *HWBuffer)
|
||||
//! Remove hardware buffer
|
||||
void CNullDriver::removeHardwareBuffer(const scene::IMeshBuffer* mb)
|
||||
{
|
||||
core::map<const scene::IMeshBuffer*,SHWBufferLink*>::Node* node = HWBufferMap.find(mb);
|
||||
if (node)
|
||||
deleteHardwareBuffer(node->getValue());
|
||||
if (!mb)
|
||||
return;
|
||||
SHWBufferLink *HWBuffer = reinterpret_cast<SHWBufferLink*>(mb->getHWBuffer());
|
||||
if (HWBuffer)
|
||||
deleteHardwareBuffer(HWBuffer);
|
||||
}
|
||||
|
||||
|
||||
//! Remove all hardware buffers
|
||||
void CNullDriver::removeAllHardwareBuffers()
|
||||
{
|
||||
while (HWBufferMap.size())
|
||||
deleteHardwareBuffer(HWBufferMap.getRoot()->getValue());
|
||||
while (!HWBufferList.empty())
|
||||
deleteHardwareBuffer(HWBufferList.front());
|
||||
}
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user