From 7028cbe09c688437910a25623098762bf0fa592d Mon Sep 17 00:00:00 2001
From: David Walter Seikel
Date: Mon, 28 Mar 2016 22:28:34 +1000
Subject: Move Irrlicht to src/others.
---
.../examples/23.SMeshHandling/Makefile | 38 ++
.../examples/23.SMeshHandling/SMeshHandling.cbp | 44 +++
.../examples/23.SMeshHandling/SMeshHandling.dev | 59 +++
.../examples/23.SMeshHandling/SMeshHandling.vcproj | 132 +++++++
.../23.SMeshHandling/SMeshHandling_vc10.vcxproj | 188 +++++++++
.../23.SMeshHandling/SMeshHandling_vc11.vcxproj | 192 ++++++++++
.../23.SMeshHandling/SMeshHandling_vc8.vcproj | 190 +++++++++
.../23.SMeshHandling/SMeshHandling_vc9.vcproj | 187 +++++++++
.../examples/23.SMeshHandling/main.cpp | 426 +++++++++++++++++++++
9 files changed, 1456 insertions(+)
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/Makefile
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.cbp
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.dev
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.vcproj
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc10.vcxproj
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc11.vcxproj
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc8.vcproj
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc9.vcproj
create mode 100644 src/others/irrlicht-1.8.1/examples/23.SMeshHandling/main.cpp
(limited to 'src/others/irrlicht-1.8.1/examples/23.SMeshHandling')
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/Makefile b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/Makefile
new file mode 100644
index 0000000..eab5060
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/Makefile
@@ -0,0 +1,38 @@
+# Makefile for Irrlicht Examples
+# It's usually sufficient to change just the target name and source file list
+# and be sure that CXX is set to a valid compiler
+Target = 23.SMeshHandling
+Sources = main.cpp
+
+# general compiler settings
+CPPFLAGS = -I../../include -I/usr/X11R6/include
+CXXFLAGS = -O3 -ffast-math
+#CXXFLAGS = -g -Wall
+
+#default target is Linux
+all: all_linux
+
+ifeq ($(HOSTTYPE), x86_64)
+LIBSELECT=64
+endif
+
+# target specific settings
+all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/Linux -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor
+all_linux clean_linux: SYSTEM=Linux
+all_win32: LDFLAGS = -L../../lib/Win32-gcc -lIrrlicht -lopengl32 -lm
+all_win32 clean_win32: SYSTEM=Win32-gcc
+all_win32 clean_win32: SUF=.exe
+# name of the binary - only valid for targets which set SYSTEM
+DESTPATH = ../../bin/$(SYSTEM)/$(Target)$(SUF)
+
+all_linux all_win32:
+ $(warning Building...)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS)
+
+clean: clean_linux clean_win32
+ $(warning Cleaning...)
+
+clean_linux clean_win32:
+ @$(RM) $(DESTPATH)
+
+.PHONY: all all_win32 clean clean_linux clean_win32
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.cbp b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.cbp
new file mode 100644
index 0000000..2fbcfe2
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.cbp
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.dev b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.dev
new file mode 100644
index 0000000..94043f3
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.dev
@@ -0,0 +1,59 @@
+[Project]
+FileName=example.dev
+Name=Irrlicht Example 23 SMeshHandling
+UnitCount=1
+Type=1
+Ver=1
+ObjFiles=
+Includes=..\..\include
+Libs=
+PrivateResource=
+ResourceIncludes=
+MakeIncludes=
+Compiler=
+CppCompiler=
+Linker=../../lib/Win32-gcc/libIrrlicht.a_@@_
+IsCpp=1
+Icon=
+ExeOutput=../../bin/Win32-gcc
+ObjectOutput=obj
+OverrideOutput=1
+OverrideOutputName=23.SMeshHandling.exe
+HostApplication=
+Folders=
+CommandLine=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=0
+CompilerSettings=0000000000000000000000
+UseCustomMakefile=0
+CustomMakefile=
+
+[Unit1]
+FileName=main.cpp
+CompileCpp=1
+Folder=Projekt1
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=Irrlicht Engine example compiled using DevCpp and gcc
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNr=0
+
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.vcproj b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.vcproj
new file mode 100644
index 0000000..a63d583
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling.vcproj
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc10.vcxproj b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc10.vcxproj
new file mode 100644
index 0000000..51a6f9e
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc10.vcxproj
@@ -0,0 +1,188 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ 23.SMeshHandling
+ {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}
+ 23.SMeshHandling
+ Win32Proj
+
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ true
+ true
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ false
+ false
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+
+
+
+ Disabled
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ EditAndContinue
+
+
+ ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ $(OutDir)SMeshHandling.pdb
+ Console
+
+
+
+
+
+
+ Disabled
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ ProgramDatabase
+
+
+ ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe
+ ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ $(OutDir)SMeshHandling.pdb
+ Console
+
+
+
+
+
+
+ true
+ Speed
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ Sync
+
+
+ Level3
+
+
+ Cdecl
+
+
+ ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+
+
+
+
+
+
+ true
+ Speed
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ Sync
+
+
+ Level3
+
+
+ Cdecl
+
+
+ ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe
+ ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc11.vcxproj b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc11.vcxproj
new file mode 100644
index 0000000..7f2a781
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc11.vcxproj
@@ -0,0 +1,192 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ 23.SMeshHandling
+ {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}
+ 23.SMeshHandling
+ Win32Proj
+
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ true
+ true
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ false
+ false
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+
+
+
+ Disabled
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ EditAndContinue
+
+
+ ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ $(OutDir)SMeshHandling.pdb
+ Console
+
+
+
+
+
+
+ Disabled
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ ProgramDatabase
+
+
+ ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe
+ ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ $(OutDir)SMeshHandling.pdb
+ Console
+
+
+
+
+
+
+ true
+ Speed
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ Sync
+
+
+ Level3
+
+
+ Cdecl
+
+
+ ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+
+
+
+
+
+
+ true
+ Speed
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ Sync
+
+
+ Level3
+
+
+ Cdecl
+
+
+ ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe
+ ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc8.vcproj b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc8.vcproj
new file mode 100644
index 0000000..ecc9135
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc8.vcproj
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc9.vcproj b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc9.vcproj
new file mode 100644
index 0000000..b1b921e
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/SMeshHandling_vc9.vcproj
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/main.cpp b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/main.cpp
new file mode 100644
index 0000000..c3c2ccf
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/23.SMeshHandling/main.cpp
@@ -0,0 +1,426 @@
+/** Example 023 SMeshBufferHandling
+
+A tutorial by geoff.
+
+In this tutorial we'll learn how to create custom meshes and deal with them
+with Irrlicht. We'll create an interesting heightmap with some lighting effects.
+With keys 1,2,3 you can choose a different mesh layout, which is put into the
+mesh buffers as desired. All positions, normals, etc. are updated accordingly.
+
+Ok, let's start with the headers (I think there's nothing to say about it)
+*/
+
+#include
+#include "driverChoice.h"
+
+#ifdef _MSC_VER
+#pragma comment(lib, "Irrlicht.lib")
+#endif
+
+//Namespaces for the engine
+using namespace irr;
+using namespace video;
+using namespace core;
+using namespace scene;
+using namespace io;
+using namespace gui;
+
+/* This is the type of the functions which work out the colour. */
+typedef SColor colour_func(f32 x, f32 y, f32 z);
+
+/* Here comes a set of functions which can be used for coloring the nodes while
+creating the mesh. */
+
+// Greyscale, based on the height.
+SColor grey(f32, f32, f32 z)
+{
+ u32 n = (u32)(255.f * z);
+ return SColor(255, n, n, n);
+}
+
+// Interpolation between blue and white, with red added in one
+// direction and green in the other.
+SColor yellow(f32 x, f32 y, f32)
+{
+ return SColor(255, 128 + (u32)(127.f * x), 128 + (u32)(127.f * y), 255);
+}
+
+// Pure white.
+SColor white(f32, f32, f32) { return SColor(255, 255, 255, 255); }
+
+/* The type of the functions which generate the heightmap. x and y
+range between -0.5 and 0.5, and s is the scale of the heightmap. */
+
+typedef f32 generate_func(s16 x, s16 y, f32 s);
+
+// An interesting sample function :-)
+f32 eggbox(s16 x, s16 y, f32 s)
+{
+ const f32 r = 4.f*sqrtf((f32)(x*x + y*y))/s;
+ const f32 z = expf(-r * 2) * (cosf(0.2f * x) + cosf(0.2f * y));
+ return 0.25f+0.25f*z;
+}
+
+// A rather dumb sine function :-/
+f32 moresine(s16 x, s16 y, f32 s)
+{
+ const f32 xx=0.3f*(f32)x/s;
+ const f32 yy=12*y/s;
+ const f32 z = sinf(xx*xx+yy)*sinf(xx+yy*yy);
+ return 0.25f + 0.25f * z;
+}
+
+// A simple function
+f32 justexp(s16 x, s16 y, f32 s)
+{
+ const f32 xx=6*x/s;
+ const f32 yy=6*y/s;
+ const f32 z = (xx*xx+yy*yy);
+ return 0.3f*z*cosf(xx*yy);
+}
+
+/* A simple class for representing heightmaps. Most of this should be obvious. */
+
+class HeightMap
+{
+private:
+ const u16 Width;
+ const u16 Height;
+ f32 s;
+ core::array data;
+public:
+ HeightMap(u16 _w, u16 _h) : Width(_w), Height(_h), s(0.f), data(0)
+ {
+ s = sqrtf((f32)(Width * Width + Height * Height));
+ data.set_used(Width * Height);
+ }
+
+ // Fill the heightmap with values generated from f.
+ void generate(generate_func f)
+ {
+ u32 i=0;
+ for(u16 y = 0; y < Height; ++y)
+ for(u16 x = 0; x < Width; ++x)
+ set(i++, calc(f, x, y));
+ }
+
+ u16 height() const { return Height; }
+ u16 width() const { return Width; }
+
+ f32 calc(generate_func f, u16 x, u16 y) const
+ {
+ const f32 xx = (f32)x - Width*0.5f;
+ const f32 yy = (f32)y - Height*0.5f;
+ return f((u16)xx, (u16)yy, s);
+ }
+
+ // The height at (x, y) is at position y * Width + x.
+
+ void set(u16 x, u16 y, f32 z) { data[y * Width + x] = z; }
+ void set(u32 i, f32 z) { data[i] = z; }
+ f32 get(u16 x, u16 y) const { return data[y * Width + x]; }
+
+ /* The only difficult part. This considers the normal at (x, y) to
+ be the cross product of the vectors between the adjacent points
+ in the horizontal and vertical directions.
+
+ s is a scaling factor, which is necessary if the height units are
+ different from the coordinate units; for example, if your map has
+ heights in metres and the coordinates are in units of a
+ kilometer. */
+
+ vector3df getnormal(u16 x, u16 y, f32 s) const
+ {
+ const f32 zc = get(x, y);
+ f32 zl, zr, zu, zd;
+
+ if (x == 0)
+ {
+ zr = get(x + 1, y);
+ zl = zc + zc - zr;
+ }
+ else if (x == Width - 1)
+ {
+ zl = get(x - 1, y);
+ zr = zc + zc - zl;
+ }
+ else
+ {
+ zr = get(x + 1, y);
+ zl = get(x - 1, y);
+ }
+
+ if (y == 0)
+ {
+ zd = get(x, y + 1);
+ zu = zc + zc - zd;
+ }
+ else if (y == Height - 1)
+ {
+ zu = get(x, y - 1);
+ zd = zc + zc - zu;
+ }
+ else
+ {
+ zd = get(x, y + 1);
+ zu = get(x, y - 1);
+ }
+
+ return vector3df(s * 2 * (zl - zr), 4, s * 2 * (zd - zu)).normalize();
+ }
+};
+
+/* A class which generates a mesh from a heightmap. */
+class TMesh
+{
+private:
+ u16 Width;
+ u16 Height;
+ f32 Scale;
+public:
+ SMesh* Mesh;
+
+ TMesh() : Mesh(0), Width(0), Height(0), Scale(1.f)
+ {
+ Mesh = new SMesh();
+ }
+
+ ~TMesh()
+ {
+ Mesh->drop();
+ }
+
+ // Unless the heightmap is small, it won't all fit into a single
+ // SMeshBuffer. This function chops it into pieces and generates a
+ // buffer from each one.
+
+ void init(const HeightMap &hm, f32 scale, colour_func cf, IVideoDriver *driver)
+ {
+ Scale = scale;
+
+ const u32 mp = driver -> getMaximalPrimitiveCount();
+ Width = hm.width();
+ Height = hm.height();
+
+ const u32 sw = mp / (6 * Height); // the width of each piece
+
+ u32 i=0;
+ for(u32 y0 = 0; y0 < Height; y0 += sw)
+ {
+ u16 y1 = y0 + sw;
+ if (y1 >= Height)
+ y1 = Height - 1; // the last one might be narrower
+ addstrip(hm, cf, y0, y1, i);
+ ++i;
+ }
+ if (igetMeshBufferCount())
+ {
+ // clear the rest
+ for (u32 j=i; jgetMeshBufferCount(); ++j)
+ {
+ Mesh->getMeshBuffer(j)->drop();
+ }
+ Mesh->MeshBuffers.erase(i,Mesh->getMeshBufferCount()-i);
+ }
+ // set dirty flag to make sure that hardware copies of this
+ // buffer are also updated, see IMesh::setHardwareMappingHint
+ Mesh->setDirty();
+ Mesh->recalculateBoundingBox();
+ }
+
+ // Generate a SMeshBuffer which represents all the vertices and
+ // indices for values of y between y0 and y1, and add it to the
+ // mesh.
+
+ void addstrip(const HeightMap &hm, colour_func cf, u16 y0, u16 y1, u32 bufNum)
+ {
+ SMeshBuffer *buf = 0;
+ if (bufNumgetMeshBufferCount())
+ {
+ buf = (SMeshBuffer*)Mesh->getMeshBuffer(bufNum);
+ }
+ else
+ {
+ // create new buffer
+ buf = new SMeshBuffer();
+ Mesh->addMeshBuffer(buf);
+ // to simplify things we drop here but continue using buf
+ buf->drop();
+ }
+ buf->Vertices.set_used((1 + y1 - y0) * Width);
+
+ u32 i=0;
+ for (u16 y = y0; y <= y1; ++y)
+ {
+ for (u16 x = 0; x < Width; ++x)
+ {
+ const f32 z = hm.get(x, y);
+ const f32 xx = (f32)x/(f32)Width;
+ const f32 yy = (f32)y/(f32)Height;
+
+ S3DVertex& v = buf->Vertices[i++];
+ v.Pos.set(x, Scale * z, y);
+ v.Normal.set(hm.getnormal(x, y, Scale));
+ v.Color=cf(xx, yy, z);
+ v.TCoords.set(xx, yy);
+ }
+ }
+
+ buf->Indices.set_used(6 * (Width - 1) * (y1 - y0));
+ i=0;
+ for(u16 y = y0; y < y1; ++y)
+ {
+ for(u16 x = 0; x < Width - 1; ++x)
+ {
+ const u16 n = (y-y0) * Width + x;
+ buf->Indices[i]=n;
+ buf->Indices[++i]=n + Width;
+ buf->Indices[++i]=n + Width + 1;
+ buf->Indices[++i]=n + Width + 1;
+ buf->Indices[++i]=n + 1;
+ buf->Indices[++i]=n;
+ ++i;
+ }
+ }
+
+ buf->recalculateBoundingBox();
+ }
+};
+
+/*
+Our event receiver implementation, taken from tutorial 4.
+*/
+class MyEventReceiver : public IEventReceiver
+{
+public:
+ // This is the one method that we have to implement
+ virtual bool OnEvent(const SEvent& event)
+ {
+ // Remember whether each key is down or up
+ if (event.EventType == irr::EET_KEY_INPUT_EVENT)
+ KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;
+
+ return false;
+ }
+
+ // This is used to check whether a key is being held down
+ virtual bool IsKeyDown(EKEY_CODE keyCode) const
+ {
+ return KeyIsDown[keyCode];
+ }
+
+ MyEventReceiver()
+ {
+ for (u32 i=0; igetVideoDriver();
+ ISceneManager *smgr = device->getSceneManager();
+ device->setWindowCaption(L"Irrlicht Example for SMesh usage.");
+
+ /*
+ Create the custom mesh and initialize with a heightmap
+ */
+ TMesh mesh;
+ HeightMap hm = HeightMap(255, 255);
+ hm.generate(eggbox);
+ mesh.init(hm, 50.f, grey, driver);
+
+ // Add the mesh to the scene graph
+ IMeshSceneNode* meshnode = smgr -> addMeshSceneNode(mesh.Mesh);
+ meshnode->setMaterialFlag(video::EMF_BACK_FACE_CULLING, false);
+
+ // light is just for nice effects
+ ILightSceneNode *node = smgr->addLightSceneNode(0, vector3df(0,100,0),
+ SColorf(1.0f, 0.6f, 0.7f, 1.0f), 500.0f);
+ if (node)
+ {
+ node->getLightData().Attenuation.set(0.f, 1.f/500.f, 0.f);
+ ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(vector3df(0,150,0),250.0f);
+ if (anim)
+ {
+ node->addAnimator(anim);
+ anim->drop();
+ }
+ }
+
+ ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();
+ if (camera)
+ {
+ camera->setPosition(vector3df(-20.f, 150.f, -20.f));
+ camera->setTarget(vector3df(200.f, -80.f, 150.f));
+ camera->setFarValue(20000.0f);
+ }
+
+ /*
+ Just a usual render loop with event handling. The custom mesh is
+ a usual part of the scene graph which gets rendered by drawAll.
+ */
+ while(device->run())
+ {
+ if(!device->isWindowActive())
+ {
+ device->sleep(100);
+ continue;
+ }
+
+ if(receiver.IsKeyDown(irr::KEY_KEY_W))
+ {
+ meshnode->setMaterialFlag(video::EMF_WIREFRAME, !meshnode->getMaterial(0).Wireframe);
+ }
+ else if(receiver.IsKeyDown(irr::KEY_KEY_1))
+ {
+ hm.generate(eggbox);
+ mesh.init(hm, 50.f, grey, driver);
+ }
+ else if(receiver.IsKeyDown(irr::KEY_KEY_2))
+ {
+ hm.generate(moresine);
+ mesh.init(hm, 50.f, yellow, driver);
+ }
+ else if(receiver.IsKeyDown(irr::KEY_KEY_3))
+ {
+ hm.generate(justexp);
+ mesh.init(hm, 50.f, yellow, driver);
+ }
+
+ driver->beginScene(true, true, SColor(0xff000000));
+ smgr->drawAll();
+ driver->endScene();
+ }
+
+ device->drop();
+
+ return 0;
+}
+
+/*
+That's it! Just compile and play around with the program.
+**/
--
cgit v1.1