Initial commit
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
## Generic ignorable patterns and files
|
||||
*~
|
||||
.*.swp
|
||||
*bak*
|
||||
tags
|
||||
*.vim
|
42
CMakeLists.txt
Normal file
@ -0,0 +1,42 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
project(samviewer)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
|
||||
set(PROJECT_NAME_CAPITALIZED "SAM-Viewer")
|
||||
set(PROJECT_LINK_URL "https://github.com/stujones11/SAM-Viewer")
|
||||
set(PROJECT_LINK_TEXT "github.com/stujones11/SAM-Viewer")
|
||||
|
||||
set(VERSION_MAJOR 0)
|
||||
set(VERSION_MINOR 1)
|
||||
set(VERSION_PATCH 0)
|
||||
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
|
||||
|
||||
add_definitions(-DUSE_CMAKE_CONFIG_H)
|
||||
|
||||
configure_file (
|
||||
"${PROJECT_SOURCE_DIR}/src/cmake_config.h.in"
|
||||
"${PROJECT_SOURCE_DIR}/src/cmake_config.h"
|
||||
)
|
||||
|
||||
if(NOT IRRLICHT_INCLUDE_DIR)
|
||||
set(IRRLICHT_INCLUDE_DIR "/usr/include/irrlicht")
|
||||
endif()
|
||||
|
||||
if(NOT IRRLICHT_LIBRARY)
|
||||
set(IRRLICHT_LIBRARY "/usr/local/lib/libIrrlicht.so")
|
||||
endif()
|
||||
|
||||
include_directories(
|
||||
${IRRLICHT_INCLUDE_DIR}
|
||||
${PROJECT_SOURCE_DIR}/src
|
||||
)
|
||||
file(GLOB SRCS src/*.cpp)
|
||||
file(MAKE_DIRECTORY "bin")
|
||||
|
||||
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
|
||||
|
||||
add_executable(${PROJECT_NAME} ${SRCS})
|
||||
target_link_libraries(${PROJECT_NAME} ${IRRLICHT_LIBRARY})
|
||||
|
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
57
LICENSE.txt
Normal file
@ -0,0 +1,57 @@
|
||||
SAM-Viewer
|
||||
==========
|
||||
|
||||
License of SAM-Viewer source code
|
||||
---------------------------------
|
||||
|
||||
Copyright (C) 2018, Stuart Jones - (MIT License)
|
||||
|
||||
License of SAM-Viewer media
|
||||
---------------------------
|
||||
|
||||
Includes all textures and models contained in this distribution.
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
|
||||
Minetest media files:
|
||||
|
||||
character.b3d
|
||||
character.png
|
||||
pickaxe.png
|
||||
blank.png
|
||||
|
||||
Copyright (C) 2010-2018 celeron55, Perttu Ahola
|
||||
|
||||
Irrlicht media files:
|
||||
|
||||
fontlucida.png
|
||||
|
||||
All other media files:
|
||||
|
||||
Copyright (C) 2018, Stuart Jones - (CC BY-SA 3.0)
|
||||
|
||||
Irrlicht
|
||||
--------
|
||||
|
||||
This program uses the Irrlicht Engine. http://irrlicht.sourceforge.net/
|
||||
|
||||
The Irrlicht Engine License:
|
||||
|
||||
Copyright (C) 2002-2015 Nikolaus Gebhardt
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgement in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be clearly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
78
README.md
Normal file
@ -0,0 +1,78 @@
|
||||
SAM-Viewer
|
||||
==========
|
||||
|
||||
**Skin & Model Viewer - Version 0.1.0**
|
||||
|
||||
A simple 3d mesh viewer built with Irrlicht rendering engine.
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Wielded item or 'attachment' model support.
|
||||
* Multiple textures, up to 6 material layers.
|
||||
* Mesh debug view. (wire-frame, skeleton and normals)
|
||||
* Animation playback amd frame controls.
|
||||
|
||||
Supported Formats
|
||||
-----------------
|
||||
|
||||
Compatible with all mesh formats supported by Irrlicht engine.
|
||||
|
||||
* B3D files (.b3d)
|
||||
* DirectX (.x)
|
||||
* Alias Wavefront Maya (.obj)
|
||||
* 3D Studio meshes (.3ds)
|
||||
* Lightwave Objects (.lwo)
|
||||
* COLLADA 1.4 (.xml, .dae)
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
For now this assumes you are using some sane linux distro and have
|
||||
a c++11 compliant compiler, although I am pretty sure it could be
|
||||
made to work on any platform or device that meets the requirements.
|
||||
|
||||
**Requirements:** cmake, opengl, Irrlicht
|
||||
```
|
||||
cmake .
|
||||
make -j2
|
||||
```
|
||||
|
||||
**CMake options:** (defaults)
|
||||
```
|
||||
IRRLICHT_INCLUDE_DIR=/usr/include/irrlicht
|
||||
IRRLICHT_LIBRARY="/usr/local/lib/libIrrlicht.so"
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```
|
||||
cmake . -DIRRLICHT_LIBRARY="/usr/lib/libIrrlicht.so"`
|
||||
```
|
||||
|
||||
Controls
|
||||
--------
|
||||
|
||||
| Control | Action |
|
||||
|-------------------------------|----------------------------------------------------------------|
|
||||
| Left mouse button + move | Trackball style rotation |
|
||||
| Mouse wheel | Zoom |
|
||||
| + | Zoom in |
|
||||
| - | Zoom out |
|
||||
| Arrow keys | Rotate around X and Y axes in 15 degree steps |
|
||||
| Z, X | Rotate around Z axis in 15 degree steps |
|
||||
| Home | Reset zoom and rotation |
|
||||
| F5 | Reload textures |
|
||||
| Space | Jump (experimental) |
|
||||
|
||||
To Do
|
||||
-----
|
||||
|
||||
* Improve file-browser.
|
||||
* Basic lighting.
|
||||
* Image capture tools.
|
||||
|
||||
Screenshot
|
||||
----------
|
||||
|
||||
![Imgur](https://i.imgur.com/xIS7pRj.png)
|
||||
|
BIN
assets/browse.png
Normal file
After (image error) Size: 584 B |
BIN
assets/fontlucida.png
Normal file
After (image error) Size: 19 KiB |
BIN
assets/pause.png
Normal file
After (image error) Size: 285 B |
BIN
assets/play_fwd.png
Normal file
After (image error) Size: 410 B |
BIN
assets/play_rev.png
Normal file
After (image error) Size: 395 B |
414
assets/sam_icon.svg
Normal file
@ -0,0 +1,414 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg61"
|
||||
width="682.66669"
|
||||
height="682.66669"
|
||||
viewBox="0 0 682.66669 682.66669"
|
||||
sodipodi:docname="sam_head.svg"
|
||||
inkscape:version="0.92.1 r15371">
|
||||
<metadata
|
||||
id="metadata67">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs65" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1023"
|
||||
id="namedview63"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.86696537"
|
||||
inkscape:cx="341.33334"
|
||||
inkscape:cy="177.24884"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="34"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg61" />
|
||||
<image
|
||||
width="682.66669"
|
||||
height="682.66669"
|
||||
preserveAspectRatio="none"
|
||||
style="image-rendering:optimizeQuality"
|
||||
xlink:href="data:image/png;base64,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
|
||||
YII=
|
||||
"
|
||||
id="image69"
|
||||
x="0"
|
||||
y="0" />
|
||||
<g
|
||||
id="g283">
|
||||
<path
|
||||
style="fill:#fefefe;stroke-width:1.33333337"
|
||||
d="M 0,341.33334 V 0 H 341.33334 682.66669 V 341.33334 682.66669 H 341.33334 0 Z"
|
||||
id="path315"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ccac92;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m -10,-172.50861 v -17.84808 l -4.35333,-2.06578 -4.35334,-2.06579 -2.81029,-3.08614 -2.81029,-3.08613 -0.58183,-1.90303 -0.58183,-1.90302 -8.92121,-3.00938 -8.92121,-3.00936 v 22.25613 22.2561 l 15.66666,5.46698 15.66667,5.46698 1,0.1893 1,0.1893 z m -166.96777,-61.70228 -0.36557,-22.21703 -17,-5.68456 -17,-5.68456 v 22.2749 22.27489 l 16.33333,5.5122 16.33334,5.51219 1.03224,0.11453 1.03224,0.11453 -0.36558,-22.21702 z"
|
||||
id="path313"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#c8a588;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 58.98679,-65.64978 32.32013,-11.01074 0.0133,-22.19069 0.0133,-22.19068 2.33333,-0.90996 2.33334,-0.90996 28.69175,-9.82292 28.69174,-9.82292 2.30826,-0.88576 2.30825,-0.88576 v 22.28531 22.28531 l 1.66667,-0.61338 1.66666,-0.61337 15.04888,-4.98915 15.0489,-4.98913 -0.16156,-23.28265 -0.16156,-23.28264 -2.88734,-1.11603 -2.88757,-1.11603 -3.33333,-3.57884 -3.33334,-3.57882 -0.45469,-13.89598 -0.45471,-13.89596 h -0.91708 -0.91709 l -25.62821,8.56808 -25.62822,8.56808 v -17.3774 -17.3774 l -1.66666,0.59917 -1.66667,0.59919 -45.33334,15.41756 -45.33333,15.41756 -3.66667,0.81799 -3.66667,0.81797 0.003,28.9746 0.003,28.9746 0.87728,33.00001 0.87728,33 0.78649,0.0107 0.78651,0.0107 32.32012,-11.01076 z M 308.00001,482.8186 v -39.84808 l -4.35333,-2.06578 -4.35334,-2.06579 -3.31333,-3.52306 -3.31333,-3.52305 -0.41872,-21.56325 -0.41874,-21.56324 -46.24793,-15.76834 -46.24795,-15.76833 -5.33333,-2.45317 -5.33334,-2.45318 -3.33333,-3.54858 -3.33333,-3.54858 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.82513,3.99092 -3.82512,3.99091 -4.84154,1.14251 -4.84154,1.14249 -0.32934,13.95248 -0.32934,13.95248 0.996,31.15271 0.99601,31.15271 32,11.02078 32,11.02078 66,22.69721 66.00001,22.69721 1.66666,0.12934 1.66667,0.12933 v -39.84808 z m -51.33333,-21.36741 -14.66667,-5.00581 -0.36558,-22.22269 -0.36557,-22.22268 h 1.07653 1.07652 l 15.28905,5.11719 15.28905,5.11719 0.36557,22.21615 0.36558,22.21614 -1.69891,-0.1048 -1.69891,-0.1048 -14.66666,-5.0058 z m -99.00001,-33.85903 -16.33333,-5.5122 V 399.564 377.04804 l 1.66666,0.59327 1.66667,0.59326 15,5.08942 15,5.08941 v 22.45997 22.45998 l -0.33333,-0.11454 -0.33333,-0.11453 -16.33334,-5.51219 z m 338.33335,-53.71263 v -19.21285 l -1.66667,0.0792 -1.66667,0.0793 -8,2.92458 -8,2.92456 -0.36852,19.58306 -0.36852,19.58306 10.03519,-3.37404 10.03519,-3.37404 v -19.21284 z"
|
||||
id="path311"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#c6a184;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36059 27.33334,-9.36057 24.66667,-8.32335 24.66666,-8.32335 0.66667,-22.44454 0.66667,-22.44455 9.66666,-3.21995 9.66667,-3.21996 v -13.96757 -13.96758 l -1.17139,0.72395 -1.17137,0.72396 -4.09931,-2.045 -4.09929,-2.045 -3.06265,-3.62897 -3.06266,-3.62898 -4.68666,-2.21849 -4.68667,-2.21849 -3.31333,-3.52323 -3.31334,-3.52321 -0.44982,-14.50762 -0.44984,-14.5076 -8.70891,3.27803 -8.70892,3.27803 h -1.20683 -1.20682 l 0.36557,-22.22357 0.36557,-22.22354 9.66667,-3.2209 9.66667,-3.22089 v -19.22221 -19.22223 h -1.26364 -1.26364 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.95796 -4,3.95795 -56.66667,19.26044 -56.66667,19.26043 -3.66667,0.82909 -3.66666,0.82909 v 61.9746 61.97461 h -1.2043 -1.20429 l -13.12904,-4.5752 -13.12904,-4.5752 -2.33334,-0.90079 -2.33333,-0.90079 0.044,22.47599 0.044,22.47599 16.28935,5.56832 16.28933,5.56833 0.66667,0.0879 0.66667,0.0879 31.33333,-10.7522 z m -98.66667,-79.3695 v -22.14265 l 2.33333,0.95345 2.33333,0.95344 13.26198,4.52255 13.26198,4.52253 h 1.07135 1.07136 V 482.8186 442.97052 l -4.35333,-2.06578 -4.35334,-2.06579 -3.31333,-3.52306 -3.31333,-3.52305 -0.41875,-21.56535 -0.41876,-21.56534 -46.45847,-15.86854 -46.45847,-15.86853 -5.12277,-2.35087 -5.12279,-2.35088 -3.33333,-3.54858 -3.33333,-3.54858 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.82513,3.99092 -3.82512,3.99091 -4.84154,1.14463 -4.84154,1.14461 -0.35087,44.78624 -0.35087,44.78624 17.01753,5.99931 17.01754,5.99929 0.66667,22.30978 0.66666,22.30978 16.30234,5.7431 16.30232,5.74309 0.36435,-22.23315 0.36433,-22.23313 33,11.1754 33,11.17539 v 22.36088 22.36088 l 15,5.29657 15,5.29658 1.66667,0.1789 1.66667,0.17891 z m -18,-72.40617 -14.66667,-5.00581 -0.36558,-22.22269 -0.36557,-22.22268 h 1.07653 1.07652 l 15.28905,5.11719 15.28905,5.11719 0.36557,22.21615 0.36558,22.21614 -1.69891,-0.1048 -1.69891,-0.1048 -14.66666,-5.0058 z m -99.00001,-33.85903 -16.33333,-5.5122 V 399.564 377.04804 l 1.66666,0.59327 1.66667,0.59326 15,5.08942 15,5.08941 v 22.45997 22.45998 l -0.33333,-0.11454 -0.33333,-0.11453 -16.33334,-5.51219 z m -51,93.18476 v -21.88976 l -15,-4.97285 -15.000001,-4.97285 -1.699609,-0.62602 -1.699609,-0.62601 0.366276,22.37797 0.366276,22.37798 14.666667,5.00581 14.66667,5.0058 1.66666,0.1048 1.66667,0.1049 z"
|
||||
id="path309"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ba9c85;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.17139,0.72395 -1.17137,0.72396 -4.09931,-2.045 -4.09929,-2.045 -3.06265,-3.62897 -3.06266,-3.62898 -4.68666,-2.21849 -4.68667,-2.21849 -3.31333,-3.52323 -3.31334,-3.52321 -0.44816,-14.44443 -0.44814,-14.44443 -9.45206,3.21484 -9.45204,3.21486 h -0.43313 -0.43313 v -21.86474 -21.86472 l 10,-3.6472 10,-3.64721 v -19.15474 -19.15473 h -1.26364 -1.26364 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.93498,1.13493 -4.93497,1.13494 -15.7317,-5.48562 -15.73169,-5.48561 -5.33333,-2.39199 -5.33334,-2.39197 -3.33333,-3.55144 -3.33333,-3.55143 -0.41875,-21.56535 -0.41876,-21.56534 -46.45847,-15.86854 -46.45847,-15.86853 -5.12277,-2.35087 -5.12279,-2.35088 -3.33333,-3.54858 -3.33333,-3.54858 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.79557,3.96007 -3.79557,3.96007 -5.7885,1.45756 -5.78851,1.45756 -3.44099,-1.30827 -3.440985,-1.30825 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66666,0.0801 0.66667,0.0801 31.33334,-10.7522 z m -147.33334,-73.28228 -14.66667,-5.22819 -18.33333,-6.13541 -18.33334,-6.13543 v -21.88943 -21.88944 h 1.29195 1.29195 l 32.04138,10.9 32.04139,10.90002 v 22.43332 22.43333 l -0.33333,-0.0803 -0.33334,-0.0803 -14.66666,-5.22819 z m 30.66667,-78.49339 -14.66667,-5.00581 -0.36558,-22.22269 -0.36557,-22.22268 h 1.07653 1.07652 l 15.28905,5.11719 15.28905,5.11719 0.36557,22.21615 0.36558,22.21614 -1.69891,-0.1048 -1.69891,-0.1048 -14.66666,-5.0058 z m -99.00001,-33.85903 -16.33333,-5.5122 V 399.564 377.04804 l 1.66666,0.59327 1.66667,0.59326 15,5.08942 15,5.08941 v 22.45997 22.45998 l -0.33333,-0.11454 -0.33333,-0.11453 -16.33334,-5.51219 z"
|
||||
id="path307"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#b89478;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.17139,0.72395 -1.17137,0.72396 -4.09931,-2.045 -4.09929,-2.045 -3.06265,-3.62897 -3.06266,-3.62898 -4.68666,-2.21849 -4.68667,-2.21849 -3.31333,-3.52568 -3.31334,-3.52567 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.93498,1.13493 -4.93497,1.13494 -15.7317,-5.48562 -15.73169,-5.48561 -5.33333,-2.39199 -5.33334,-2.39197 -3.33333,-3.55144 -3.33333,-3.55143 -0.41876,-21.56619 -0.41878,-21.56618 -46.24789,-15.81159 -46.24791,-15.81157 -5.33333,-2.40414 -5.33334,-2.40413 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.79557,3.96007 -3.79557,3.96007 -5.7885,1.45756 -5.78851,1.45756 -3.44099,-1.30827 -3.440985,-1.30825 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m -165.66668,-79.52767 -33,-11.39663 v -21.81794 -21.81794 l 1,-0.0237 1,-0.0237 32.33334,10.93474 32.33333,10.93474 v 22.42233 22.42232 l -0.33333,-0.1188 -0.33334,-0.1188 -33,-11.39663 z m 58.33334,-69.12105 -5.33333,-1.90064 -9.66667,-3.47402 -9.66667,-3.47401 v -21.86472 -21.86474 h 1.18963 1.18961 l 15.47706,5.50818 15.47704,5.50817 v 21.82516 21.82516 l -1.66667,-0.094 -1.66667,-0.094 -5.33333,-1.90065 z m -108,-37.00229 L 142,422.00001 l -0.36628,-22.48862 -0.36626,-22.48863 1.6996,0.61893 1.69961,0.61894 14.99283,5.20302 14.99283,5.20303 0.007,22.33333 0.007,22.33334 -0.33333,-0.0908 -0.33334,-0.0908 -16,-5.57586 z"
|
||||
id="path305"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#2f2fd3;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.17139,0.72395 -1.17137,0.72396 -4.09931,-2.045 -4.09929,-2.045 -3.06265,-3.62897 -3.06266,-3.62898 -4.68666,-2.21849 -4.68667,-2.21849 -3.31333,-3.52568 -3.31334,-3.52567 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.93508,1.13496 -4.93507,1.13495 -17.06494,-6.02719 -17.06492,-6.0272 -4.02,-1.8788 -4.02,-1.8788 -3.31333,-3.52306 -3.31333,-3.52305 -0.41891,-21.57743 -0.41892,-21.57742 -46.24775,-15.81456 -46.24776,-15.81456 -5.33333,-2.38992 -5.33334,-2.38991 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.79557,3.96007 -3.79557,3.96007 -5.7885,1.45756 -5.78851,1.45756 -3.44099,-1.30827 -3.440985,-1.30825 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m -107.33334,-148.64872 -5.33333,-1.90064 -9.66667,-3.47402 -9.66667,-3.47401 v -21.86472 -21.86474 h 1.18963 1.18961 l 15.47706,5.50818 15.47704,5.50817 v 21.82516 21.82516 l -1.66667,-0.094 -1.66667,-0.094 -5.33333,-1.90065 z m -108,-37.00229 L 142,422.00001 l -0.36628,-22.48862 -0.36626,-22.48863 1.6996,0.61893 1.69961,0.61894 14.99283,5.20302 14.99283,5.20303 0.007,22.33333 0.007,22.33334 -0.33333,-0.0908 -0.33334,-0.0908 -16,-5.57586 z"
|
||||
id="path303"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#674427;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.17139,0.72395 -1.17137,0.72396 -4.09931,-2.045 -4.09929,-2.045 -3.06265,-3.62897 -3.06266,-3.62898 -4.68666,-2.21849 -4.68667,-2.21849 -3.31333,-3.52568 -3.31334,-3.52567 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.93508,1.13496 -4.93507,1.13495 -17.06494,-6.02719 -17.06492,-6.0272 -4.02,-1.8788 -4.02,-1.8788 -3.31333,-3.52306 -3.31333,-3.52305 -0.41891,-21.57743 -0.41892,-21.57742 -46.24775,-15.81456 -46.24776,-15.81456 -5.33333,-2.38992 -5.33334,-2.38991 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.79557,3.96007 -3.79557,3.96007 -5.7885,1.45756 -5.78851,1.45756 -3.44099,-1.30827 -3.440985,-1.30825 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z"
|
||||
id="path301"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#603e24;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.27909,0.79052 -1.27911,0.79052 -3.05423,-1.71182 -3.05424,-1.71184 -3.66666,-3.24946 -3.66667,-3.24945 v -1.82924 -1.82923 l -1.17139,0.72395 -1.17137,0.72396 -3.8972,-1.94417 -3.89719,-1.94419 -3.26476,-3.47396 -3.26476,-3.47396 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.89055,1.12495 -4.89053,1.12494 -17.10947,-6.03062 -17.10946,-6.03064 -4.02,-1.86536 -4.02,-1.86535 -3.31333,-3.52306 -3.31333,-3.52305 -0.41891,-21.57743 -0.41892,-21.57742 -46.24775,-15.81456 -46.24776,-15.81456 -5.33333,-2.38992 -5.33334,-2.38991 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.85016,4.01706 -3.85017,4.01704 -6.03325,1.28677 -6.03325,1.28677 -3.14165,-1.19445 -3.141645,-1.19445 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m 26.87102,-416.58047 17.57611,-6.02028 18.77643,6.12606 18.77644,6.12604 36.58437,-12.59728 36.58438,-12.59728 -17.58438,-5.80347 -17.58437,-5.80345 v -0.74339 -0.74339 l 17.43101,-5.75285 17.43103,-5.75284 -0.43103,-0.35899 -0.43101,-0.359 -34,-11.66397 -34,-11.66396 -1.78176,-0.96992 -1.78176,-0.96991 17.39311,-5.86054 17.39309,-5.86055 -1.70515,-0.95425 -1.70514,-0.95425 -34.46251,-11.63133 -34.46251,-11.631328 -18.57809,6.158408 -18.5781,6.15841 -18.30016,-6.396653 -18.30016,-6.396652 -16.56544,5.769482 -16.56543,5.769483 -54.66666,18.7199 -54.66667,18.7199 -2,0.75662 -2,0.75663 54,18.52299 54,18.52299 1.85343,0.0328 1.85344,0.0328 17.43534,-6.06559 17.43534,-6.0656 18.41511,6.386 18.41509,6.38599 -18.34831,6.11718 -18.3483,6.11718 5.97776,2.24533 5.97777,2.24533 11.33333,3.88338 11.33334,3.88337 1.64746,0.1004 1.64747,0.1004 17.57609,-6.02028 z m -295.5377,-49.90509 18.66667,-6.46482 -3.33334,-1.2594 -3.33333,-1.2594 -14.22953,-5.01808 -14.22953,-5.01808 -18.997258,6.6192 -18.99726,6.6192 17.893456,6.08145 17.893455,6.08145 v 0.0416 0.0416 l 18.666667,-6.4648 z m 514.5668,-12.25156 -18.52034,-6.46964 -17.02323,5.61826 -17.02321,5.61826 0.0107,0.70502 0.0107,0.70503 17.65643,6.09671 17.65642,6.09671 17.8769,-5.95035 17.87689,-5.95035 -18.52033,-6.46965 z M 361.863,46.428814 l -17.88385,-6.286862 -17.54166,6.189442 -17.54164,6.189441 1.21875,0.428793 1.21874,0.428794 16.6297,5.813544 16.62968,5.813544 17.57707,-6.144919 17.57706,-6.144917 z"
|
||||
id="path299"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#5c3b22;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.27909,0.79052 -1.27911,0.79052 -3.05423,-1.71182 -3.05424,-1.71184 -3.66666,-3.24946 -3.66667,-3.24945 v -1.82924 -1.82923 l -1.17139,0.72395 -1.17137,0.72396 -3.8972,-1.94417 -3.89719,-1.94419 -3.26476,-3.47396 -3.26476,-3.47396 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.89055,1.12495 -4.89053,1.12494 -17.10947,-6.03062 -17.10946,-6.03064 -4.02,-1.86536 -4.02,-1.86535 -3.31333,-3.52306 -3.31333,-3.52305 -0.41891,-21.57743 -0.41892,-21.57742 -46.24775,-15.81456 -46.24776,-15.81456 -5.33333,-2.38992 -5.33334,-2.38991 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.85016,4.01706 -3.85017,4.01704 -6.03325,1.28677 -6.03325,1.28677 -3.14165,-1.19445 -3.141645,-1.19445 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m -11,-378.55984 16.33333,-5.55455 v -1.11246 -1.11247 l -16.8864,-5.62743 -16.8864,-5.62741 18.22157,-6.36528 18.22159,-6.36528 18.33148,6.36684 18.33149,6.36685 46.00001,-15.82348 46,-15.82346 63.70109,-21.51558 63.7011,-21.51556 -0.36776,-0.28589 -0.36776,-0.28588 -73.01544,-24.9712 -73.01545,-24.97119 -18.02105,6.024069 -18.02104,6.024071 -18.27766,-6.425297 -18.27765,-6.425297 -18.15464,6.399847 -18.15463,6.399847 -36.18434,-12.220414 -36.18435,-12.220413 -0.0136,-0.721982 -0.0135,-0.721981 17.75612,-5.809578 17.75613,-5.809576 18.218,6.089904 18.218,6.089906 16.69254,-5.525703 16.69255,-5.525704 V 65.256516 64.447744 L 379.33335,52.372708 344.00001,40.297675 308.63478,52.38361 l -35.36522,12.085934 1.03189,0.932993 1.03189,0.932992 11.33334,3.712996 11.33333,3.712996 4.64857,1.935516 4.64858,1.935516 -71.31525,24.316007 -71.31524,24.31601 -2,0.65546 -2,0.65546 17.66667,5.84057 17.66667,5.84056 v 0.94605 0.94607 l -17.3698,5.73264 -17.3698,5.73264 6.3698,2.2392 6.3698,2.2392 83.33333,28.56667 83.33334,28.56666 1.94932,0.64802 1.94932,0.64801 -19.16131,6.50124 -19.16131,6.50125 18.54532,6.2937 18.54533,6.2937 1.33333,-0.44505 1.33333,-0.44505 z m -57.00001,-7.20835 v -0.54133 l -6.2261,-2.12144 -6.22611,-2.12145 -0.52389,0.52389 -0.5239,0.52389 5.75,2.03363 5.75,2.03363 1,0.1052 1,0.1052 v -0.54134 z m -46.66666,-16.00293 v -0.54425 l -8.23148,-2.77982 -8.23149,-2.77981 -0.51852,0.51852 -0.51852,0.51852 7.75001,2.70029 7.75,2.7003 1,0.1052 1,0.1052 v -0.54427 z m -54.66667,-18.66373 v -0.54134 l -6.22611,-2.12144 -6.22611,-2.12145 -0.52389,0.52389 -0.52389,0.5239 5.75,2.03362 5.75,2.03363 1,0.1052 1,0.1052 v -0.54133 z m -56,-19.33794 -2.00001,-1.13149 -3.33333,-0.81473 -3.33333,-0.81474 4,1.92664 4,1.92664 1.33333,0.0196 1.33334,0.0196 -2,-1.1315 z m -54.666673,-18.7874 -2.000001,-1.29249 H 90.000003 88.66667 l 2,1.29249 2,1.2925 h 1.333333 1.333334 z m 12.333333,-8.0956 17,-5.87724 v -0.73556 -0.73556 L 105,133.52727 l -17.666664,-5.69543 -18.552042,6.56674 -18.552042,6.56673 17.885376,6.07838 17.885375,6.07837 1.333333,-0.33687 1.333334,-0.33686 z"
|
||||
id="path297"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#402915;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.27909,0.79052 -1.27911,0.79052 -3.05423,-1.71182 -3.05424,-1.71184 -3.66666,-3.24946 -3.66667,-3.24945 v -1.82924 -1.82923 l -1.17139,0.72395 -1.17137,0.72396 -3.8972,-1.94417 -3.89719,-1.94419 -3.26476,-3.47396 -3.26476,-3.47396 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.89055,1.12495 -4.89053,1.12494 -17.10947,-6.03062 -17.10946,-6.03064 -4.02,-1.86536 -4.02,-1.86535 -3.31333,-3.52306 -3.31333,-3.52305 -0.41891,-21.57743 -0.41892,-21.57742 -46.24775,-15.81456 -46.24776,-15.81456 -5.33333,-2.38992 -5.33334,-2.38991 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.85016,4.01706 -3.85017,4.01704 -6.03325,1.28677 -6.03325,1.28677 -3.14165,-1.19445 -3.141645,-1.19445 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m 191.62687,-82.04443 -0.47771,-0.47769 -18.56492,6.20587 -18.56492,6.20588 18.65702,6.22342 18.657,6.22344 0.38561,-11.9516 0.38561,-11.95161 z m -144.29354,-316.2273 74.66667,-25.39952 70.57466,-24.13023 70.57465,-24.13024 0.3391,-0.3391 0.33909,-0.33909 L 490.58043,90.460204 344.00001,40.303459 197.41959,90.460204 50.839168,140.61695 l 0.329168,0.32916 0.329168,0.32917 145.917916,49.97273 145.91793,49.9727 1.33333,-0.43302 1.33333,-0.43303 z"
|
||||
id="path295"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#3a2413;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.27909,0.79052 -1.27911,0.79052 -3.05423,-1.71182 -3.05424,-1.71184 -3.66666,-3.24946 -3.66667,-3.24945 v -1.82924 -1.82923 l -1.17139,0.72395 -1.17137,0.72396 -3.8972,-1.94417 -3.89719,-1.94419 -3.26476,-3.47396 -3.26476,-3.47396 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.89055,1.12495 -4.89053,1.12494 -17.10947,-6.03062 -17.10946,-6.03064 -4.02,-1.86536 -4.02,-1.86535 -3.31333,-3.52306 -3.31333,-3.52305 -0.41891,-21.57743 -0.41892,-21.57742 -46.24775,-15.81456 -46.24776,-15.81456 -5.33333,-2.38992 -5.33334,-2.38991 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.85016,4.01706 -3.85017,4.01704 -6.03325,1.28677 -6.03325,1.28677 -3.14165,-1.19445 -3.141645,-1.19445 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m 191.62687,-82.04443 -0.47771,-0.47769 -18.56492,6.20587 -18.56492,6.20588 18.65702,6.22342 18.657,6.22344 0.38561,-11.9516 0.38561,-11.95161 z m -200.68054,-102.14406 17.05367,-5.6283 v -24.51435 -24.51435 l -1.66667,0.60184 -1.66667,0.60183 -16.33333,5.72239 -16.33333,5.7224 v 23.81842 23.81843 h 0.94633 0.94633 z m -93.613,-116.25121 v -48.54618 l -9.66667,-3.28065 -9.66667,-3.28067 -62.83388,-21.50649 -62.83388,-21.5065 h -0.86287 -0.86286 l 0.36341,24.1505 0.36341,24.15049 36,12.28 36,12.27999 0.37042,24.56952 0.37041,24.56951 35.62959,12.24739 35.62959,12.24738 1,0.086 1,0.086 v -48.54619 z m 202,-115.53497 128.00001,-43.8144 0.33333,-0.0523 0.33333,-0.0522 v 24 24 h 0.51846 0.51846 l 15.1482,-5.23515 15.14822,-5.23514 2.33333,-0.90751 2.33334,-0.90751 -10e-4,-24.19068 -10e-4,-24.19068 L 490.66539,90.485064 344.00001,40.303459 197.33463,90.485064 50.669248,140.66667 l -0.0013,24.13563 -0.0013,24.13561 17.000001,5.74588 17.000001,5.74587 1.666666,0.59449 1.666667,0.5945 V 177.6923 153.76595 l 109.666667,37.51098 109.66667,37.51097 0.3627,24.08828 0.3627,24.08828 17.6373,5.99794 17.63731,5.99793 0.66666,-23.94687 0.66667,-23.94687 z"
|
||||
id="path293"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#352010;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.27909,0.79052 -1.27911,0.79052 -3.05423,-1.71182 -3.05424,-1.71184 -3.66666,-3.24946 -3.66667,-3.24945 v -1.82924 -1.82923 l -1.17139,0.72395 -1.17137,0.72396 -3.8972,-1.94417 -3.89719,-1.94419 -3.26476,-3.47396 -3.26476,-3.47396 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.89055,1.12495 -4.89053,1.12494 -17.10947,-6.03062 -17.10946,-6.03064 -4.02,-1.86536 -4.02,-1.86535 -3.31333,-3.52306 -3.31333,-3.52305 -0.41923,-21.6014 -0.41921,-21.6014 -46.24746,-15.78812 -46.24744,-15.78812 -5.33333,-2.39239 -5.33334,-2.39237 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.85016,4.01706 -3.85017,4.01704 -6.03325,1.28677 -6.03325,1.28677 -3.14165,-1.19445 -3.141645,-1.19445 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m 228.16718,-69.48009 35.83283,-12.25326 v -73.08008 -73.08008 l -1.66667,0.0701 -1.66667,0.0701 -16,5.69706 -16,5.69704 -0.66667,24.46564 -0.66666,24.46565 -16,5.69704 -16,5.69706 -1.66667,0.0701 -1.66667,0.0701 V 360.18423 263.0351 l -50.33333,17.06562 -50.33334,17.0656 -60,20.51474 -60,20.51474 -0.34973,48.86895 -0.34972,48.86893 54.89194,-18.63349 54.89195,-18.63351 h 0.42836 0.42836 l 0.36275,-24.82391 0.36276,-24.8239 36.33333,-12.33666 36.33334,-12.33665 v 73.16056 73.16056 h 0.50681 0.50681 l 16.91363,-6 16.91364,-6 h 1.24622 1.24622 v 35.88944 35.88943 l -19,6.33224 -19,6.33223 18.66667,6.34 18.66667,6.34 0.5005,0.10507 0.50051,0.10506 35.83283,-12.25325 z M 308.40529,277.33334 h 0.37243 l 17.94448,6.02436 17.94448,6.02436 18.33333,-6.21456 18.33334,-6.21457 v -24.19425 -24.19426 l 91.66667,-31.36969 91.66667,-31.36971 0.36341,23.75416 0.36341,23.75416 h 1.23967 1.23968 l 16.73025,-5.90028 16.73024,-5.90028 v 24.51951 24.51949 l 18,-6.26952 18.00001,-6.26951 -10e-4,-48.68304 -10e-4,-48.68304 L 490.66539,90.485064 344.00001,40.303459 197.33463,90.485064 50.669248,140.66667 l -0.0013,24.22278 -0.0013,24.22276 18.666668,6.22113 18.666667,6.22113 v 48.92781 48.92778 l 17.053667,5.62831 17.05367,5.62831 H 123.05367 124 V 286.7004 262.73412 l 36.33334,12.39769 36.33333,12.39771 0.37356,24.56857 0.37358,24.56859 54.95976,18.77527 54.95977,18.77526 0.34976,-48.44193 0.34976,-48.44194 z"
|
||||
id="path291"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#331f10;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.27909,0.79052 -1.27911,0.79052 -3.05423,-1.71182 -3.05424,-1.71184 -3.66666,-3.24946 -3.66667,-3.24945 v -1.82924 -1.82923 l -1.17139,0.72395 -1.17137,0.72396 -3.8972,-1.94417 -3.89719,-1.94419 -3.26476,-3.47396 -3.26476,-3.47396 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.89055,1.12495 -4.89053,1.12494 -17.10947,-6.03062 -17.10946,-6.03064 -4.02,-1.86536 -4.02,-1.86535 -3.31333,-3.52306 -3.31333,-3.52305 -0.41923,-21.6014 -0.41921,-21.6014 -46.24746,-15.78812 -46.24744,-15.78812 -5.33333,-2.39239 -5.33334,-2.39237 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.85016,4.01706 -3.85017,4.01704 -6.03325,1.28677 -6.03325,1.28677 -3.14165,-1.19445 -3.141645,-1.19445 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m 228.16718,-69.48009 35.83283,-12.25326 -10e-4,-195.41342 -10e-4,-195.41342 L 490.66539,90.485064 344.00001,40.303459 197.33463,90.485064 50.669248,140.66667 l -0.0013,24.22278 -0.0013,24.22276 18.666668,6.22113 18.666667,6.22113 v 24.49459 24.49458 l -18.666667,-6.36028 -18.666668,-6.36029 v 24.29647 24.29647 l 6.333334,2.22064 6.333333,2.22065 29.223488,9.90468 29.223487,9.9047 H 122.89016 124 v -23.91239 -23.9124 l 9,3.03367 9,3.03366 0.7157,22.54539 0.71569,22.5454 0.28431,-22.29676 0.2843,-22.29676 26.33334,9.10852 26.33333,9.10852 0.3721,24.52157 0.37209,24.52158 50.29458,17.16036 50.29457,17.16037 23,7.98934 23,7.98934 v 24.47823 24.47824 l 54.87556,-18.62795 54.87555,-18.62793 h 0.42836 0.42836 l 0.36275,-24.84929 0.36276,-24.84931 36.33333,-12.2384 36.33334,-12.2384 v 73.08769 73.08771 h 0.57956 0.57954 l 16.91365,-6 16.91362,-6 h 1.17348 1.17348 v 35.17008 35.17007 l -1.66666,1.30763 -1.66667,1.30762 -6.57085,2.18898 -6.57086,2.18896 h -1.06357 -1.06357 l -0.42755,-21.66667 -0.42755,-21.66667 0.062,22.18015 0.062,22.18015 -9.33333,3.02275 -9.33334,3.02276 18.66667,6.35876 18.66667,6.35877 0.50051,0.10507 0.5005,0.10506 35.83283,-12.25325 z m -276.83385,-212.17092 -16,-5.57584 -0.3638,-24.43285 -0.36379,-24.43286 2.36379,0.7508 2.3638,0.7508 15.33333,5.13275 15.33334,5.13275 0.36341,24.21597 0.36341,24.21597 -1.69674,-0.0908 -1.69675,-0.0908 -16,-5.57585 z m 240.66667,-44.79247 v -23.8833 l 18,-6.01703 18,-6.01704 v 24.27203 24.27202 l -17.05366,5.62831 -17.05367,5.62831 h -0.94633 -0.94634 z m -37.33333,-35.95642 v -23.83973 l 17.44712,-6.16028 17.44713,-6.16028 h 1.24962 1.24962 l -0.36341,24.21686 -0.36341,24.21684 -17.29424,5.78316 -17.29425,5.78315 h -1.03909 -1.03909 z m -36,-35.92778 v -23.9472 l 2.33333,-0.95473 2.33333,-0.95475 15.27088,-5.18791 15.27088,-5.18792 h 0.42587 0.42587 l -0.36342,24.21598 -0.36341,24.21597 -15.33333,5.13275 -15.33334,5.13274 -2.33333,0.74114 -2.33333,0.74113 z"
|
||||
id="path289"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#321e0e;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.27909,0.79052 -1.27911,0.79052 -3.05423,-1.71182 -3.05424,-1.71184 -3.66666,-3.24946 -3.66667,-3.24945 v -1.82924 -1.82923 l -1.17139,0.72395 -1.17137,0.72396 -3.8972,-1.94417 -3.89719,-1.94419 -3.26476,-3.47396 -3.26476,-3.47396 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.89055,1.12495 -4.89053,1.12494 -17.10947,-6.03062 -17.10946,-6.03064 -4.02,-1.86536 -4.02,-1.86535 -3.31333,-3.52306 -3.31333,-3.52305 -0.41923,-21.6014 -0.41921,-21.6014 -46.24746,-15.78812 -46.24744,-15.78812 -5.33333,-2.39239 -5.33334,-2.39237 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.85016,4.01706 -3.85017,4.01704 -6.03325,1.28677 -6.03325,1.28677 -3.14165,-1.19445 -3.141645,-1.19445 -7.330806,1.90942 -7.330804,1.90944 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66667,0.0801 0.66666,0.0801 31.33334,-10.7522 z m 228.16718,-69.48009 35.83283,-12.25326 -10e-4,-195.41342 -10e-4,-195.41342 L 490.66539,90.485064 344.00001,40.303459 197.33463,90.485064 50.669248,140.66667 l -0.0013,24.22278 -0.0013,24.22276 18.666668,6.22113 18.666667,6.22113 v 24.52908 24.52909 l -18.666667,-6.56642 -18.666668,-6.56641 v 48.95597 48.95599 l 18.666668,6.18778 18.666667,6.18776 v -23.88365 -23.88365 h 1.062451 1.06245 L 106,305.33334 l 15.8751,5.33334 H 122.93755 124 v -23.91239 -23.9124 l 9,3.03367 9,3.03366 0.7157,22.54539 0.71569,22.5454 0.28431,-22.29676 0.2843,-22.29676 26.33334,9.10852 26.33333,9.10852 0.37356,24.52157 0.37358,24.52158 54.95976,18.7738 54.95977,18.77381 0.36167,24.59814 0.36167,24.59813 18.34585,6.08143 18.34586,6.08141 4.62581,-1.55239 4.62581,-1.5524 50.30447,-17.0522 50.30447,-17.0522 0.3622,-24.71646 0.3622,-24.71647 36.33333,-12.17803 36.33334,-12.17804 v 73.04574 73.04573 h 0.45793 0.45793 l 7.75081,-2.66666 7.7508,-2.66667 h 0.41609 0.41609 l 0.37518,35.84589 0.37517,35.84589 -9.33333,3.02368 -9.33334,3.02368 18.66667,6.35876 18.66667,6.35877 0.5005,0.10507 0.50051,0.10506 35.83283,-12.25325 z m -54.83384,-43.50018 v -35.75343 l 8.33333,-2.92673 8.33333,-2.92673 1,0.0135 1,0.0135 v 35.17008 35.17007 l -1.66666,1.30762 -1.66667,1.30763 -6.57085,2.18897 -6.57086,2.18896 h -1.09581 -1.09581 V 500.24654 Z M 324.66668,331.4447 l -16,-5.74138 -0.3638,-24.28451 -0.36379,-24.28451 2.36379,0.7508 2.3638,0.7508 15.33333,5.13275 15.33334,5.13275 0.36341,24.21597 0.36341,24.21597 -1.69674,-0.0736 -1.69675,-0.0736 -16,-5.74138 z"
|
||||
id="path287"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#000000;stroke-width:1.33333337"
|
||||
d="m 318.00001,633.32721 -18.66667,-6.47002 -40.66666,-13.9282 -40.66667,-13.92818 -75.33334,-25.69238 -75.333334,-25.69238 -4.666667,-4.49672 -4.666667,-4.49674 -0.323152,-90.96621 -0.323153,-90.96622 -7.393739,-2.75893 -7.393739,-2.75894 -3.616442,-3.61644 -3.616442,-3.61644 V 239.32867 134.71795 l 4,-3.86977 4,-3.86977 L 192.05097,76.155871 340.7686,25.333334 h 3.23141 3.23142 l 148.71763,50.822537 148.71763,50.822539 4,3.86977 4,3.86977 v 202.61539 202.6154 l -4,3.91564 -4,3.91564 -37.40423,12.77667 -37.40424,12.77666 -4.59576,-0.10146 -4.59577,-0.10147 -4.47184,-1.61859 -4.47184,-1.61858 -58.19483,19.81686 -58.19483,19.81688 -9.33334,3.08362 -9.33333,3.08361 -35.31601,12.15287 -35.31602,12.15288 -4.68398,-0.10147 -4.68399,-0.10133 -18.66667,-6.47003 z m 55.33334,-20.10035 31.33333,-10.75221 27.33333,-9.36638 27.33334,-9.36637 32.33333,-10.85411 32.33334,-10.8541 v -1.01684 -1.01683 h -1.75055 -1.75055 l -3.91612,-4.08755 -3.91612,-4.08756 v -7.15822 -7.15823 l 3.8866,-4.05674 3.88659,-4.05673 4.44675,-1.46756 4.44673,-1.46755 v -19.30862 -19.30862 l -1.27909,0.79052 -1.27911,0.79052 -3.05423,-1.71182 -3.05424,-1.71184 -3.66666,-3.24946 -3.66667,-3.24945 v -1.82924 -1.82923 l -1.17139,0.72395 -1.17137,0.72396 -3.8972,-1.94417 -3.89719,-1.94419 -3.26476,-3.47396 -3.26476,-3.47396 -0.37534,-55.89379 -0.37534,-55.8938 h -1.22164 -1.22162 l -11.31452,4.09407 -11.31452,4.09408 -0.42184,21.88385 -0.42184,21.88384 -4,3.96017 -4,3.96018 -55.33334,18.91908 -55.33333,18.91908 -4.89055,1.12495 -4.89053,1.12494 -17.10947,-6.03062 -17.10946,-6.03064 -4.02,-1.86536 -4.02,-1.86535 -3.31333,-3.52306 -3.31333,-3.52305 -0.41912,-21.59365 -0.41912,-21.59366 -46.24755,-15.80996 -46.24755,-15.80996 -5.33333,-2.37829 -5.33334,-2.37828 -3.33333,-3.55144 -3.33333,-3.55143 -0.41975,-21.64179 -0.41975,-21.64177 -10.46026,-3.42923 -10.46027,-3.42921 -0.45332,13.08993 -0.45332,13.08992 -3.8474,4.01294 -3.84741,4.01293 -6.40649,1.37395 -6.40648,1.37394 -5.21141,-1.83869 -5.21141,-1.83869 -1.39345,0.8698 -1.39345,0.86981 -0.47459,12.24744 -0.47458,12.24744 -3.85016,4.01706 -3.85017,4.01704 -6.01541,1.28297 -6.01541,1.28296 -2.81189,-1.28119 -2.811896,-1.28118 -7.6784,1.99997 -7.678399,1.99997 -5.32065,-1.87724 -5.320649,-1.87724 0.343183,84.75833 0.343184,84.7583 80.666667,27.60755 80.66667,27.60756 34.66667,11.83802 34.66667,11.83801 18,6.31649 18,6.3165 0.66666,0.0801 0.66667,0.0801 31.33334,-10.7522 z m 228.16718,-69.48009 35.83283,-12.25326 -10e-4,-195.41342 -10e-4,-195.41342 L 490.66539,90.485064 344.00001,40.303459 197.33463,90.485064 50.669248,140.66667 l -0.0013,97.36255 -0.0013,97.36255 18.666668,6.18778 18.666667,6.18776 v -3.88364 -3.88366 h 1.099797 1.099796 l 9.566871,3.25391 9.566873,3.25389 v -19.92056 -19.92057 h 0.42915 0.42914 l 6.38388,2.1752 6.38388,2.17521 1.03889,-1.68096 1.03889,-1.68095 8.40698,2.83908 8.40697,2.83908 H 142.92556 144 v -21.96342 -21.96343 l 26.33334,9.10852 26.33333,9.10852 0.36154,24.52233 0.36153,24.52234 38.9718,13.24477 38.9718,13.24478 16,5.61069 16,5.61068 0.36167,24.51572 0.36167,24.51572 18.3305,6.07633 18.33051,6.07634 9.30783,-3.09907 9.30783,-3.09908 45.6378,-15.49991 45.6378,-15.4999 0.3622,-24.73519 0.3622,-24.73517 27.30869,-9.11413 27.30868,-9.1141 h 1.02466 1.02464 v 64 64 l 1,-6.6e-4 1,-6.8e-4 7,-2.66056 7,-2.66056 v 8.66124 8.66122 h 0.45793 0.45793 l 7.75081,-2.66666 7.7508,-2.66667 h 0.45793 0.45793 v 35.89129 35.8913 l -9,2.99603 -9,2.99602 18.66667,6.34102 18.66667,6.34101 0.5005,0.10507 0.50051,0.10506 35.83283,-12.25325 z"
|
||||
id="path285"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After (image error) Size: 72 KiB |
BIN
assets/sam_icon_128.png
Normal file
After (image error) Size: 8.3 KiB |
BIN
assets/sam_icon_16.png
Normal file
After (image error) Size: 409 B |
BIN
assets/skip_fwd.png
Normal file
After (image error) Size: 433 B |
BIN
assets/skip_rev.png
Normal file
After (image error) Size: 422 B |
BIN
assets/title.png
Normal file
After (image error) Size: 2.7 KiB |
BIN
media/blank.png
Normal file
After (image error) Size: 95 B |
BIN
media/character.b3d
Normal file
BIN
media/character.png
Normal file
After (image error) Size: 2.7 KiB |
881
media/pickaxe.obj
Normal file
@ -0,0 +1,881 @@
|
||||
# Blender v2.78 (sub 0) OBJ File: 'pickaxe.blend'
|
||||
# www.blender.org
|
||||
o Cube
|
||||
v 0.062500 0.353553 1.285178
|
||||
v 0.062500 -0.353554 1.285177
|
||||
v 0.062500 -0.000000 1.638731
|
||||
v 0.062500 0.176777 1.108401
|
||||
v 0.062500 -0.530330 1.461954
|
||||
v 0.062500 0.176777 0.754847
|
||||
v 0.062500 -0.176777 0.754847
|
||||
v 0.062500 -0.176777 1.108401
|
||||
v 0.062500 -0.883883 1.108400
|
||||
v 0.062500 0.883883 1.108401
|
||||
v 0.062500 -0.176776 0.047741
|
||||
v 0.062500 0.176777 0.401294
|
||||
v 0.062500 -0.176776 0.401294
|
||||
v 0.062500 0.176777 0.047741
|
||||
v 0.062500 -0.353554 1.638731
|
||||
v 0.062500 0.088388 1.020012
|
||||
v 0.062500 -0.618719 1.550342
|
||||
v 0.062500 0.088388 0.843236
|
||||
v 0.062500 -0.265165 1.196789
|
||||
v 0.062500 -0.972272 1.196789
|
||||
v 0.062500 0.088388 1.727119
|
||||
v 0.062500 0.441942 1.196789
|
||||
v 0.062500 0.088389 0.312906
|
||||
v 0.062500 0.265165 1.196789
|
||||
v 0.062500 -0.088388 0.843236
|
||||
v 0.062500 -0.088388 1.020012
|
||||
v 0.062500 -0.441942 1.196789
|
||||
v 0.062500 -0.088389 1.727119
|
||||
v 0.062500 0.972272 1.196789
|
||||
v 0.062500 -0.088388 0.136129
|
||||
v 0.062500 -0.088388 0.312906
|
||||
v 0.062500 -0.088388 0.489682
|
||||
v 0.062500 0.088388 0.666459
|
||||
v 0.062500 -0.088388 0.666459
|
||||
v 0.062500 0.088389 0.489682
|
||||
v 0.062500 0.972272 1.020013
|
||||
v 0.062500 0.618718 1.196789
|
||||
v 0.062500 0.795495 1.373566
|
||||
v 0.062500 0.795495 1.196789
|
||||
v 0.062500 0.441941 1.550343
|
||||
v 0.062500 -0.441942 1.550342
|
||||
v 0.062500 -0.265165 1.550342
|
||||
v 0.062500 -0.795495 1.196789
|
||||
v 0.062500 -0.795495 1.373565
|
||||
v 0.062500 -0.618718 1.196789
|
||||
v 0.062500 -0.088388 1.196789
|
||||
v 0.062500 0.088388 1.196789
|
||||
v 0.062500 -0.972272 1.020012
|
||||
v 0.062500 -0.088388 -0.040648
|
||||
v 0.062500 0.088389 -0.217424
|
||||
v 0.062500 0.176777 -0.129036
|
||||
v 0.062500 -0.176776 -0.129036
|
||||
v 0.062500 -1.060660 1.108400
|
||||
v 0.062500 0.176777 1.285177
|
||||
v 0.062500 -0.176777 1.285177
|
||||
v 0.062500 -0.530330 1.285177
|
||||
v 0.062500 -0.707107 1.461954
|
||||
v 0.062500 -0.883884 1.285177
|
||||
v 0.062500 -0.176777 0.931624
|
||||
v 0.062500 -0.176777 1.638731
|
||||
v 0.062500 0.176777 0.931624
|
||||
v 0.062500 0.883883 1.285178
|
||||
v 0.062500 0.530330 1.285178
|
||||
v 0.062500 -0.176776 0.224517
|
||||
v 0.062500 0.176777 0.578071
|
||||
v 0.062500 -0.176776 0.578071
|
||||
v 0.062500 0.707107 1.108401
|
||||
v 0.062500 -0.707107 1.108400
|
||||
v 0.062500 -0.000000 0.931624
|
||||
v 0.062500 0.000000 0.224518
|
||||
v 0.062500 0.530330 1.461954
|
||||
v 0.062500 0.176777 1.461954
|
||||
v 0.062500 -0.176777 1.461954
|
||||
v 0.062500 0.000000 0.578071
|
||||
v 0.062500 0.707107 1.285178
|
||||
v 0.062500 0.353553 1.638731
|
||||
v 0.062500 -0.707107 1.285177
|
||||
v 0.062500 -0.000000 1.285177
|
||||
v 0.062500 0.000000 -0.129036
|
||||
v 0.062500 0.618718 1.550343
|
||||
v 0.062500 -0.441942 1.373566
|
||||
v 0.062500 0.265165 1.373566
|
||||
v 0.062500 -0.088388 1.550342
|
||||
v 0.062500 0.441942 1.373566
|
||||
v 0.062500 0.088388 1.550343
|
||||
v 0.062500 -0.265165 1.373566
|
||||
v 0.062500 0.088388 0.136129
|
||||
v 0.062500 0.618718 1.373566
|
||||
v 0.062500 0.265165 1.550343
|
||||
v 0.062500 -0.618718 1.373566
|
||||
v 0.062500 -0.088388 1.373566
|
||||
v 0.062500 0.088388 1.373566
|
||||
v 0.062500 0.088388 -0.040648
|
||||
v 0.062500 -0.088388 -0.217424
|
||||
v 0.062500 0.000000 0.047741
|
||||
v 0.062500 -0.000000 1.461954
|
||||
v 0.062500 0.176777 1.638731
|
||||
v 0.062500 1.060660 1.108401
|
||||
v 0.062500 0.707107 1.461954
|
||||
v 0.062500 0.176777 0.224517
|
||||
v 0.062500 0.000000 0.754847
|
||||
v 0.062500 0.000000 0.401294
|
||||
v 0.062500 -0.353553 1.461954
|
||||
v 0.062500 0.353553 1.461954
|
||||
v 0.062500 -0.000000 1.108401
|
||||
v 0.062500 0.000000 -0.305812
|
||||
v -0.062500 0.088388 1.020012
|
||||
v -0.062500 -0.000000 0.931624
|
||||
v -0.062500 0.088388 0.843236
|
||||
v -0.062500 0.441941 1.373566
|
||||
v -0.062500 0.353553 1.285178
|
||||
v -0.062500 -0.265165 1.196789
|
||||
v -0.062500 -0.353554 1.285177
|
||||
v -0.062500 -0.265165 1.373566
|
||||
v -0.062500 0.088388 1.727119
|
||||
v -0.062500 -0.000000 1.638731
|
||||
v -0.062500 0.088388 1.550343
|
||||
v -0.062500 0.441942 1.196789
|
||||
v -0.062500 0.088389 0.312906
|
||||
v -0.062500 0.000000 0.224517
|
||||
v -0.062500 0.088389 0.136129
|
||||
v -0.062500 -0.441942 1.373566
|
||||
v -0.062500 -0.530330 1.461954
|
||||
v -0.062500 -0.088388 0.843236
|
||||
v -0.062500 -0.176777 0.754847
|
||||
v -0.062500 0.618718 1.550343
|
||||
v -0.062500 0.530330 1.461954
|
||||
v -0.062500 -0.088388 1.020012
|
||||
v -0.062500 -0.176777 1.108401
|
||||
v -0.062500 -0.088389 1.550342
|
||||
v -0.062500 -0.176777 1.461954
|
||||
v -0.062500 0.265165 1.373566
|
||||
v -0.062500 0.176776 1.461954
|
||||
v -0.062500 0.972272 1.196789
|
||||
v -0.062500 0.883883 1.108401
|
||||
v -0.062500 -0.088388 0.136129
|
||||
v -0.062500 -0.176776 0.047741
|
||||
v -0.062500 -0.088388 0.312906
|
||||
v -0.062500 -0.176776 0.401294
|
||||
v -0.062500 -0.088388 0.489682
|
||||
v -0.062500 0.088388 0.666459
|
||||
v -0.062500 0.000000 0.578071
|
||||
v -0.062500 -0.088388 0.666459
|
||||
v -0.062500 0.088389 0.489682
|
||||
v -0.062500 0.972272 1.020013
|
||||
v -0.062500 0.795495 1.373566
|
||||
v -0.062500 0.707107 1.285178
|
||||
v -0.062500 0.618718 1.373566
|
||||
v -0.062500 0.795495 1.196789
|
||||
v -0.062500 0.265165 1.550343
|
||||
v -0.062500 0.441941 1.550343
|
||||
v -0.062500 0.353553 1.638731
|
||||
v -0.062500 -0.441942 1.550342
|
||||
v -0.062500 -0.265165 1.550342
|
||||
v -0.062500 -0.353554 1.638731
|
||||
v -0.062500 -0.795495 1.196789
|
||||
v -0.062500 -0.883883 1.108400
|
||||
v -0.062500 -0.618719 1.373566
|
||||
v -0.062500 -0.707107 1.285177
|
||||
v -0.062500 -0.618718 1.196789
|
||||
v -0.062500 -0.088388 1.196789
|
||||
v -0.062500 0.088388 1.373566
|
||||
v -0.062500 -0.000000 1.285177
|
||||
v -0.062500 -0.088388 1.373566
|
||||
v -0.062500 0.088388 1.196789
|
||||
v -0.062500 0.088389 -0.040647
|
||||
v -0.062500 0.000000 -0.129036
|
||||
v -0.062500 -0.088388 -0.040648
|
||||
v -0.062500 0.088389 -0.217424
|
||||
v -0.062500 0.176777 1.108401
|
||||
v -0.062500 -0.618719 1.550342
|
||||
v -0.062500 0.176777 0.754847
|
||||
v -0.062500 -0.972272 1.196789
|
||||
v -0.062500 0.176777 0.401294
|
||||
v -0.062500 0.176777 0.047741
|
||||
v -0.062500 0.265165 1.196789
|
||||
v -0.062500 -0.441942 1.196789
|
||||
v -0.062500 -0.088389 1.727119
|
||||
v -0.062500 0.618718 1.196789
|
||||
v -0.062500 -0.795495 1.373565
|
||||
v -0.062500 -0.972272 1.020012
|
||||
v -0.062500 -0.088388 -0.217424
|
||||
v -0.062500 0.176777 -0.129036
|
||||
v -0.062500 0.000000 0.047741
|
||||
v -0.062500 -0.176776 -0.129036
|
||||
v -0.062500 -1.060660 1.108400
|
||||
v -0.062500 0.176777 1.285177
|
||||
v -0.062500 -0.000000 1.461954
|
||||
v -0.062500 -0.176777 1.285177
|
||||
v -0.062500 -0.530330 1.285177
|
||||
v -0.062500 -0.707107 1.461954
|
||||
v -0.062500 -0.883884 1.285177
|
||||
v -0.062500 -0.176777 0.931624
|
||||
v -0.062500 -0.176777 1.638731
|
||||
v -0.062500 0.176776 1.638731
|
||||
v -0.062500 0.176777 0.931624
|
||||
v -0.062500 0.883883 1.285178
|
||||
v -0.062500 0.707107 1.461954
|
||||
v -0.062500 0.530330 1.285178
|
||||
v -0.062500 1.060660 1.108401
|
||||
v -0.062500 -0.176776 0.224517
|
||||
v -0.062500 0.176777 0.578071
|
||||
v -0.062500 0.000000 0.754847
|
||||
v -0.062500 -0.176776 0.578071
|
||||
v -0.062500 0.176777 0.224518
|
||||
v -0.062500 0.000000 0.401294
|
||||
v -0.062500 0.707107 1.108401
|
||||
v -0.062500 0.353553 1.461954
|
||||
v -0.062500 -0.353554 1.461954
|
||||
v -0.062500 -0.707107 1.108401
|
||||
v -0.062500 -0.000000 1.108401
|
||||
v -0.062500 0.000001 -0.305812
|
||||
vt 0.4375 0.7500
|
||||
vt 0.5000 0.7500
|
||||
vt 0.5000 0.8125
|
||||
vt 0.4375 0.8125
|
||||
vt 0.4375 0.8750
|
||||
vt 0.5000 0.8750
|
||||
vt 0.5000 0.9375
|
||||
vt 0.4375 0.9375
|
||||
vt 0.4375 0.7500
|
||||
vt 0.5000 0.7500
|
||||
vt 0.5000 0.8125
|
||||
vt 0.4375 0.8125
|
||||
vt 0.3750 0.8750
|
||||
vt 0.4375 0.8750
|
||||
vt 0.4375 0.9375
|
||||
vt 0.3750 0.9375
|
||||
vt 0.5000 0.4375
|
||||
vt 0.4375 0.4375
|
||||
vt 0.4375 0.3750
|
||||
vt 0.5000 0.3750
|
||||
vt 0.4375 0.3750
|
||||
vt 0.5000 0.3750
|
||||
vt 0.5000 0.4375
|
||||
vt 0.4375 0.4375
|
||||
vt 0.8125 0.3750
|
||||
vt 0.8750 0.3750
|
||||
vt 0.8750 0.4375
|
||||
vt 0.8125 0.4375
|
||||
vt 0.2500 0.8750
|
||||
vt 0.3125 0.8750
|
||||
vt 0.3125 0.9375
|
||||
vt 0.2500 0.9375
|
||||
vt 0.8125 0.5000
|
||||
vt 0.8750 0.5000
|
||||
vt 0.8750 0.5625
|
||||
vt 0.8125 0.5625
|
||||
vt 0.4375 0.8750
|
||||
vt 0.5000 0.8750
|
||||
vt 0.5000 0.9375
|
||||
vt 0.4375 0.9375
|
||||
vt 0.1875 0.2500
|
||||
vt 0.2500 0.2500
|
||||
vt 0.2500 0.3125
|
||||
vt 0.1875 0.3125
|
||||
vt 0.7500 0.6875
|
||||
vt 0.8125 0.6875
|
||||
vt 0.8125 0.7500
|
||||
vt 0.7500 0.7500
|
||||
vt 0.3750 0.3125
|
||||
vt 0.3125 0.3125
|
||||
vt 0.3125 0.2500
|
||||
vt 0.3750 0.2500
|
||||
vt 0.7500 0.6250
|
||||
vt 0.8125 0.6250
|
||||
vt 0.8125 0.6875
|
||||
vt 0.7500 0.6875
|
||||
vt 0.7500 0.6875
|
||||
vt 0.8125 0.6875
|
||||
vt 0.8125 0.7500
|
||||
vt 0.7500 0.7500
|
||||
vt 0.1875 0.2500
|
||||
vt 0.2500 0.2500
|
||||
vt 0.2500 0.3125
|
||||
vt 0.1875 0.3125
|
||||
vt 0.2500 0.8750
|
||||
vt 0.3125 0.8750
|
||||
vt 0.3125 0.9375
|
||||
vt 0.2500 0.9375
|
||||
vt 0.6875 0.7500
|
||||
vt 0.7500 0.7500
|
||||
vt 0.7500 0.8125
|
||||
vt 0.6875 0.8125
|
||||
vt 0.3125 0.8750
|
||||
vt 0.3750 0.8750
|
||||
vt 0.3750 0.9375
|
||||
vt 0.3125 0.9375
|
||||
vt 0.5625 0.8125
|
||||
vt 0.6250 0.8125
|
||||
vt 0.6250 0.8750
|
||||
vt 0.5625 0.8750
|
||||
vt 0.0625 0.1250
|
||||
vt 0.1250 0.1250
|
||||
vt 0.1250 0.1875
|
||||
vt 0.0625 0.1875
|
||||
vt 0.2500 0.1875
|
||||
vt 0.3125 0.1875
|
||||
vt 0.3125 0.2500
|
||||
vt 0.2500 0.2500
|
||||
vt 0.3125 0.8125
|
||||
vt 0.3750 0.8125
|
||||
vt 0.3750 0.8750
|
||||
vt 0.3125 0.8750
|
||||
vt 0.0625 0.1250
|
||||
vt 0.1250 0.1250
|
||||
vt 0.1250 0.1875
|
||||
vt 0.0625 0.1875
|
||||
vt 0.1250 0.1875
|
||||
vt 0.1875 0.1875
|
||||
vt 0.1875 0.2500
|
||||
vt 0.1250 0.2500
|
||||
vt 0.3125 0.2500
|
||||
vt 0.2500 0.2500
|
||||
vt 0.2500 0.1875
|
||||
vt 0.3125 0.1875
|
||||
vt 0.7500 0.4375
|
||||
vt 0.8125 0.4375
|
||||
vt 0.8125 0.5000
|
||||
vt 0.7500 0.5000
|
||||
vt 0.3125 0.2500
|
||||
vt 0.3750 0.2500
|
||||
vt 0.3750 0.3125
|
||||
vt 0.3125 0.3125
|
||||
vt 0.3125 0.8125
|
||||
vt 0.3750 0.8125
|
||||
vt 0.3750 0.8750
|
||||
vt 0.3125 0.8750
|
||||
vt 0.4375 0.5000
|
||||
vt 0.5000 0.5000
|
||||
vt 0.5000 0.5625
|
||||
vt 0.4375 0.5625
|
||||
vt 0.8125 0.3125
|
||||
vt 0.8750 0.3125
|
||||
vt 0.8750 0.3750
|
||||
vt 0.8125 0.3750
|
||||
vt 0.3750 0.4375
|
||||
vt 0.4375 0.4375
|
||||
vt 0.4375 0.5000
|
||||
vt 0.3750 0.5000
|
||||
vt 0.2500 0.3125
|
||||
vt 0.3125 0.3125
|
||||
vt 0.3125 0.3750
|
||||
vt 0.2500 0.3750
|
||||
vt 0.2500 0.1875
|
||||
vt 0.1875 0.1875
|
||||
vt 0.1875 0.1250
|
||||
vt 0.2500 0.1250
|
||||
vt 0.6250 0.5625
|
||||
vt 0.5625 0.5625
|
||||
vt 0.5625 0.5000
|
||||
vt 0.6250 0.5000
|
||||
vt 0.8125 0.3125
|
||||
vt 0.8750 0.3125
|
||||
vt 0.8750 0.3750
|
||||
vt 0.8125 0.3750
|
||||
vt 0.8750 0.4375
|
||||
vt 0.9375 0.4375
|
||||
vt 0.9375 0.5000
|
||||
vt 0.8750 0.5000
|
||||
vt 0.1250 0.1875
|
||||
vt 0.1875 0.1875
|
||||
vt 0.1875 0.2500
|
||||
vt 0.1250 0.2500
|
||||
vt 0.4375 0.5000
|
||||
vt 0.5000 0.5000
|
||||
vt 0.5000 0.5625
|
||||
vt 0.4375 0.5625
|
||||
vt 0.5000 0.4375
|
||||
vt 0.5625 0.4375
|
||||
vt 0.5625 0.5000
|
||||
vt 0.5000 0.5000
|
||||
vt 0.5000 0.5625
|
||||
vt 0.5625 0.5625
|
||||
vt 0.5625 0.6250
|
||||
vt 0.5000 0.6250
|
||||
vt 0.6875 0.5000
|
||||
vt 0.7500 0.5000
|
||||
vt 0.7500 0.5625
|
||||
vt 0.6875 0.5625
|
||||
vt 0.3750 0.3125
|
||||
vt 0.4375 0.3125
|
||||
vt 0.4375 0.3750
|
||||
vt 0.3750 0.3750
|
||||
vt 0.2500 0.3125
|
||||
vt 0.3125 0.3125
|
||||
vt 0.3125 0.3750
|
||||
vt 0.2500 0.3750
|
||||
vt 0.6250 0.5625
|
||||
vt 0.6875 0.5625
|
||||
vt 0.6875 0.6250
|
||||
vt 0.6250 0.6250
|
||||
vt 0.5625 0.5000
|
||||
vt 0.5000 0.5000
|
||||
vt 0.5000 0.4375
|
||||
vt 0.5625 0.4375
|
||||
vt 0.8125 0.5625
|
||||
vt 0.8750 0.5625
|
||||
vt 0.8750 0.6250
|
||||
vt 0.8125 0.6250
|
||||
vt 0.4375 0.3750
|
||||
vt 0.3750 0.3750
|
||||
vt 0.3750 0.3125
|
||||
vt 0.4375 0.3125
|
||||
vt 0.3750 0.4375
|
||||
vt 0.4375 0.4375
|
||||
vt 0.4375 0.5000
|
||||
vt 0.3750 0.5000
|
||||
vt 0.8750 0.1875
|
||||
vt 0.9375 0.1875
|
||||
vt 0.9375 0.2500
|
||||
vt 0.8750 0.2500
|
||||
vt 0.8750 0.1875
|
||||
vt 0.9375 0.1875
|
||||
vt 0.9375 0.2500
|
||||
vt 0.8750 0.2500
|
||||
vt 0.1875 0.8750
|
||||
vt 0.2500 0.8750
|
||||
vt 0.2500 0.9375
|
||||
vt 0.1875 0.9375
|
||||
vt 0.0625 0.0625
|
||||
vt 0.1250 0.0625
|
||||
vt 0.1250 0.1250
|
||||
vt 0.0625 0.1250
|
||||
vt 0.6875 0.5000
|
||||
vt 0.7500 0.5000
|
||||
vt 0.7500 0.5625
|
||||
vt 0.6875 0.5625
|
||||
vt 0.0625 0.0625
|
||||
vt 0.1250 0.0625
|
||||
vt 0.1250 0.1250
|
||||
vt 0.0625 0.1250
|
||||
vt 0.8750 0.1875
|
||||
vt 0.9375 0.1875
|
||||
vt 0.9375 0.2500
|
||||
vt 0.8750 0.2500
|
||||
vt 0.1875 0.8750
|
||||
vt 0.2500 0.8750
|
||||
vt 0.2500 0.9375
|
||||
vt 0.1875 0.9375
|
||||
vt 0.8750 0.3125
|
||||
vt 0.9375 0.3125
|
||||
vt 0.9375 0.3750
|
||||
vt 0.8750 0.3750
|
||||
vt 0.8750 0.2500
|
||||
vt 0.9375 0.2500
|
||||
vt 0.9375 0.3125
|
||||
vt 0.8750 0.3125
|
||||
vt 0.1875 0.8750
|
||||
vt 0.1875 0.9375
|
||||
vt 0.5000 0.8125
|
||||
vt 0.5625 0.8125
|
||||
vt 0.5625 0.8750
|
||||
vt 0.5000 0.8750
|
||||
vt 0.8750 0.2500
|
||||
vt 0.9375 0.2500
|
||||
vt 0.9375 0.3125
|
||||
vt 0.8750 0.3125
|
||||
vt 0.6250 0.7500
|
||||
vt 0.6875 0.7500
|
||||
vt 0.6875 0.8125
|
||||
vt 0.6250 0.8125
|
||||
vt 0.5000 0.5625
|
||||
vt 0.5625 0.5625
|
||||
vt 0.5625 0.6250
|
||||
vt 0.5000 0.6250
|
||||
vt 0.6875 0.7500
|
||||
vt 0.7500 0.7500
|
||||
vt 0.7500 0.8125
|
||||
vt 0.6875 0.8125
|
||||
vt 0.5625 0.5625
|
||||
vt 0.5625 0.5000
|
||||
vt 0.5000 0.5000
|
||||
vt 0.5000 0.5625
|
||||
vt 0.5625 0.8125
|
||||
vt 0.5625 0.7500
|
||||
vt 0.5000 0.8125
|
||||
vt 0.8125 0.5625
|
||||
vt 0.8125 0.5000
|
||||
vt 0.7500 0.5625
|
||||
vt 0.3125 0.3125
|
||||
vt 0.2500 0.2500
|
||||
vt 0.2500 0.3125
|
||||
vt 0.4375 0.4375
|
||||
vt 0.3750 0.3750
|
||||
vt 0.3750 0.4375
|
||||
vt 0.3125 0.9375
|
||||
vt 0.2500 0.9375
|
||||
vt 0.4375 0.9375
|
||||
vt 0.4375 0.8750
|
||||
vt 0.3750 0.8750
|
||||
vt 0.3750 0.9375
|
||||
vt 0.8125 0.6875
|
||||
vt 0.8125 0.6250
|
||||
vt 0.7500 0.6250
|
||||
vt 0.7500 0.6875
|
||||
vt 0.6875 0.8125
|
||||
vt 0.6875 0.7500
|
||||
vt 0.6250 0.7500
|
||||
vt 0.6250 0.8125
|
||||
vt 0.9375 0.4375
|
||||
vt 0.9375 0.3750
|
||||
vt 0.8750 0.3750
|
||||
vt 0.8750 0.4375
|
||||
vt 0.9375 0.3125
|
||||
vt 0.9375 0.2500
|
||||
vt 0.8750 0.2500
|
||||
vt 0.6875 0.6875
|
||||
vt 0.6875 0.6250
|
||||
vt 0.6250 0.6250
|
||||
vt 0.6250 0.6875
|
||||
vt 0.1875 0.1875
|
||||
vt 0.1875 0.1250
|
||||
vt 0.1250 0.1250
|
||||
vt 0.1250 0.1875
|
||||
vt 0.1875 0.0625
|
||||
vt 0.1875 0.2500
|
||||
vt 0.1250 0.2500
|
||||
vt 0.2500 0.1250
|
||||
vt 0.0625 0.1250
|
||||
vt 0.0625 0.1875
|
||||
vt 0.7500 0.7500
|
||||
vt 0.5625 0.6875
|
||||
vt 0.5000 0.6875
|
||||
vt 0.5625 0.6250
|
||||
vt 0.9375 0.5000
|
||||
vt 0.8750 0.5000
|
||||
vt 0.8125 0.4375
|
||||
vt 0.7500 0.4375
|
||||
vt 0.8125 0.3750
|
||||
vt 0.7500 0.8125
|
||||
vt 0.8125 0.7500
|
||||
vt 0.1875 0.9375
|
||||
vt 0.4375 0.8125
|
||||
vt 0.5000 0.8750
|
||||
vt 0.5000 0.9375
|
||||
vt 0.4375 0.5000
|
||||
vt 0.4375 0.5625
|
||||
vt 0.1875 0.3125
|
||||
vt 0.3750 0.5000
|
||||
vt 0.3125 0.3750
|
||||
vt 0.3125 0.4375
|
||||
vt 0.2500 0.3750
|
||||
vt 0.8750 0.6250
|
||||
vt 0.8750 0.5625
|
||||
vt 0.5625 0.8750
|
||||
vt 0.6250 0.8750
|
||||
vt 0.5000 0.6250
|
||||
vt 0.6250 0.5000
|
||||
vt 0.5625 0.5625
|
||||
vt 0.5000 0.5625
|
||||
vt 0.5000 0.5000
|
||||
vt 0.5625 0.5000
|
||||
vt 0.8125 0.5625
|
||||
vt 0.7500 0.5625
|
||||
vt 0.8125 0.5000
|
||||
vt 0.5625 0.8125
|
||||
vt 0.5000 0.8125
|
||||
vt 0.5000 0.7500
|
||||
vt 0.5625 0.7500
|
||||
vt 0.3125 0.3125
|
||||
vt 0.2500 0.3125
|
||||
vt 0.2500 0.2500
|
||||
vt 0.3125 0.2500
|
||||
vt 0.4375 0.4375
|
||||
vt 0.3750 0.4375
|
||||
vt 0.3750 0.3750
|
||||
vt 0.4375 0.3750
|
||||
vt 0.4375 0.9375
|
||||
vt 0.3750 0.9375
|
||||
vt 0.3750 0.8750
|
||||
vt 0.4375 0.8750
|
||||
vt 0.3125 0.9375
|
||||
vt 0.2500 0.9375
|
||||
vt 0.2500 0.8750
|
||||
vt 0.6875 0.8125
|
||||
vt 0.6250 0.8125
|
||||
vt 0.6250 0.7500
|
||||
vt 0.6875 0.7500
|
||||
vt 0.7500 0.6875
|
||||
vt 0.7500 0.6250
|
||||
vt 0.8125 0.6250
|
||||
vt 0.9375 0.4375
|
||||
vt 0.8750 0.4375
|
||||
vt 0.8750 0.3750
|
||||
vt 0.6875 0.6875
|
||||
vt 0.6250 0.6875
|
||||
vt 0.6250 0.6250
|
||||
vt 0.6875 0.6250
|
||||
vt 0.1875 0.1875
|
||||
vt 0.1250 0.1875
|
||||
vt 0.1250 0.1250
|
||||
vt 0.1875 0.1250
|
||||
vt 0.2500 0.1875
|
||||
vt 0.1875 0.2500
|
||||
vt 0.1250 0.0625
|
||||
vt 0.1875 0.0625
|
||||
vt 0.8750 0.1875
|
||||
vt 0.9375 0.1875
|
||||
vt 0.5625 0.6875
|
||||
vt 0.5625 0.6250
|
||||
vt 0.5000 0.6875
|
||||
vt 0.7500 0.7500
|
||||
vt 0.6875 0.5000
|
||||
vt 0.6250 0.5625
|
||||
vt 0.8750 0.5000
|
||||
vt 0.7500 0.4375
|
||||
vt 0.9375 0.5000
|
||||
vt 0.5000 0.4375
|
||||
vt 0.4375 0.5000
|
||||
vt 0.5000 0.8750
|
||||
vt 0.4375 0.7500
|
||||
vt 0.3750 0.8125
|
||||
vt 0.1875 0.8750
|
||||
vt 0.3125 0.4375
|
||||
vt 0.3125 0.3750
|
||||
vt 0.3750 0.3125
|
||||
vt 0.3125 0.8125
|
||||
vt 0.6250 0.8750
|
||||
vt 0.5625 0.8750
|
||||
vt 0.8125 0.3125
|
||||
vt 0.0625 0.0625
|
||||
vt 0.1875 0.1250
|
||||
vt 0.1250 0.1250
|
||||
vt 0.1250 0.0625
|
||||
vt 0.5625 0.6250
|
||||
vt 0.6250 0.6250
|
||||
vt 0.6250 0.6875
|
||||
vt 0.6250 0.5625
|
||||
vt 0.5625 0.5625
|
||||
vt 0.5000 0.6875
|
||||
vt 0.5625 0.6875
|
||||
vt 0.5625 0.7500
|
||||
vt 0.8125 0.5625
|
||||
vt 0.8750 0.5625
|
||||
vt 0.8750 0.6250
|
||||
vt 0.8125 0.6250
|
||||
vt 0.8125 0.5000
|
||||
vt 0.7500 0.5000
|
||||
vt 0.3125 0.3750
|
||||
vt 0.3750 0.3750
|
||||
vt 0.3750 0.4375
|
||||
vt 0.1875 0.1250
|
||||
vt 0.2500 0.1875
|
||||
vt 0.1875 0.1875
|
||||
vt 0.8750 0.3750
|
||||
vt 0.9375 0.3750
|
||||
vt 0.8750 0.4375
|
||||
vt 0.4375 0.8750
|
||||
vt 0.5625 0.8125
|
||||
vt 0.6250 0.8125
|
||||
vt 0.5625 0.8750
|
||||
vt 0.8750 0.4375
|
||||
vt 0.9375 0.4375
|
||||
vt 0.8750 0.5000
|
||||
vt 0.3125 0.3750
|
||||
vt 0.3750 0.3750
|
||||
vt 0.3750 0.4375
|
||||
vt 0.3125 0.4375
|
||||
vt 0.5625 0.7500
|
||||
vt 0.5000 0.7500
|
||||
vn 0.0000 0.7071 -0.7071
|
||||
vn 0.0000 -0.7071 0.7071
|
||||
vn 0.0000 -0.7071 -0.7071
|
||||
vn 0.0000 0.7071 0.7071
|
||||
vn 1.0000 0.0000 -0.0000
|
||||
vn -1.0000 -0.0000 0.0000
|
||||
s off
|
||||
f 63/1/1 22/2/1 118/3/1 199/4/1
|
||||
f 71/5/2 80/6/2 126/7/2 127/8/2
|
||||
f 22/9/3 1/10/3 111/11/3 118/12/3
|
||||
f 99/13/4 38/14/4 146/15/4 198/16/4
|
||||
f 7/17/2 25/18/2 124/19/2 125/20/2
|
||||
f 34/21/3 7/22/3 125/23/3 143/24/3
|
||||
f 56/25/1 45/26/1 160/27/1 190/28/1
|
||||
f 10/29/3 39/30/3 149/31/3 135/32/3
|
||||
f 5/33/2 41/34/2 153/35/2 123/36/2
|
||||
f 80/37/4 99/38/4 198/39/4 126/40/4
|
||||
f 23/41/4 100/42/4 205/43/4 119/44/4
|
||||
f 60/45/2 28/46/2 178/47/2 194/48/2
|
||||
f 13/49/2 32/50/2 140/51/2 139/52/2
|
||||
f 42/53/2 60/54/2 194/55/2 154/56/2
|
||||
f 28/57/4 3/58/4 116/59/4 178/60/4
|
||||
f 100/61/1 87/62/1 121/63/1 205/64/1
|
||||
f 62/65/4 29/66/4 134/67/4 197/68/4
|
||||
f 3/69/2 21/70/2 115/71/2 116/72/2
|
||||
f 38/73/4 62/74/4 197/75/4 146/76/4
|
||||
f 76/77/4 40/78/4 151/79/4 152/80/4
|
||||
f 93/81/4 51/82/4 183/83/4 166/84/4
|
||||
f 30/85/3 64/86/3 201/87/3 136/88/3
|
||||
f 67/89/3 37/90/3 179/91/3 207/92/3
|
||||
f 51/93/1 50/94/1 169/95/1 183/96/1
|
||||
f 87/97/4 14/98/4 175/99/4 121/100/4
|
||||
f 64/101/2 31/102/2 138/103/2 201/104/2
|
||||
f 2/105/1 27/106/1 177/107/1 113/108/1
|
||||
f 31/109/3 13/110/3 139/111/3 138/112/3
|
||||
f 39/113/1 67/114/1 207/115/1 149/116/1
|
||||
f 16/117/4 61/118/4 196/119/4 107/120/4
|
||||
f 68/121/3 43/122/3 156/123/3 210/124/3
|
||||
f 18/125/4 6/126/4 172/127/4 109/128/4
|
||||
f 12/129/1 23/130/1 119/131/1 174/132/1
|
||||
f 11/133/2 30/134/2 136/135/2 137/136/2
|
||||
f 8/137/2 46/138/2 161/139/2 129/140/2
|
||||
f 45/141/1 68/142/1 210/143/1 160/144/1
|
||||
f 17/145/4 5/146/4 123/147/4 171/148/4
|
||||
f 14/149/1 93/150/1 166/151/1 175/152/1
|
||||
f 61/153/1 18/154/1 109/155/1 196/156/1
|
||||
f 25/157/3 59/158/3 193/159/3 124/160/3
|
||||
f 4/161/1 16/162/1 107/163/1 170/164/1
|
||||
f 19/165/3 2/166/3 113/167/3 112/168/3
|
||||
f 32/169/3 66/170/3 204/171/3 140/172/3
|
||||
f 35/173/4 12/174/4 174/175/4 144/176/4
|
||||
f 46/177/3 55/178/3 189/179/3 161/180/3
|
||||
f 59/181/2 26/182/2 128/183/2 193/184/2
|
||||
f 41/185/2 15/186/2 155/187/2 153/188/2
|
||||
f 66/189/2 34/190/2 143/191/2 204/192/2
|
||||
f 6/193/1 33/194/1 141/195/1 172/196/1
|
||||
f 9/197/1 48/198/1 181/199/1 157/200/1
|
||||
f 48/201/3 53/202/3 186/203/3 181/204/3
|
||||
f 29/205/4 98/206/4 200/207/4 134/208/4
|
||||
f 106/209/3 94/210/3 182/211/3 212/212/3
|
||||
f 55/213/1 19/214/1 112/215/1 189/216/1
|
||||
f 50/217/1 106/218/1 212/219/1 169/220/1
|
||||
f 53/221/2 20/222/2 173/223/2 186/224/2
|
||||
f 98/225/1 36/226/1 145/227/1 200/228/1
|
||||
f 58/229/2 44/230/2 180/231/2 192/232/2
|
||||
f 20/233/2 58/234/2 192/235/2 173/236/2
|
||||
f 36/237/3 10/29/3 135/32/3 145/238/3
|
||||
f 40/239/4 71/240/4 127/241/4 151/242/4
|
||||
f 43/243/1 9/244/1 157/245/1 156/246/1
|
||||
f 97/247/4 89/248/4 150/249/4 195/250/4
|
||||
f 47/251/4 4/252/4 170/253/4 165/254/4
|
||||
f 21/255/4 97/256/4 195/257/4 115/258/4
|
||||
f 105/259/5 26/260/5 69/261/5 16/262/5
|
||||
f 104/263/5 82/264/5 1/10/5 84/265/5
|
||||
f 103/266/5 81/267/5 2/166/5 86/268/5
|
||||
f 102/269/5 31/109/5 70/270/5 23/271/5
|
||||
f 101/272/5 34/21/5 74/273/5 33/274/5
|
||||
f 62/275/5 39/30/5 10/29/5 29/276/5
|
||||
f 99/277/5 88/278/5 75/279/5 38/280/5
|
||||
f 60/281/5 42/282/5 73/283/5 83/284/5
|
||||
f 97/285/5 85/286/5 72/287/5 89/288/5
|
||||
f 57/289/5 44/290/5 77/291/5 90/292/5
|
||||
f 58/293/5 20/294/5 9/295/5 43/122/5
|
||||
f 96/296/5 91/297/5 78/298/5 92/299/5
|
||||
f 95/300/5 49/301/5 79/302/5 93/303/5
|
||||
f 49/301/5 52/304/5 94/210/5 79/302/5
|
||||
f 87/305/5 95/300/5 93/303/5 14/306/5
|
||||
f 70/270/5 30/85/5 95/300/5 87/305/5
|
||||
f 30/85/5 11/307/5 49/301/5 95/300/5
|
||||
f 93/303/5 79/302/5 50/308/5 51/309/5
|
||||
f 91/297/5 55/178/5 46/177/5 78/298/5
|
||||
f 73/283/5 86/268/5 55/178/5 91/297/5
|
||||
f 86/268/5 2/166/5 19/165/5 55/178/5
|
||||
f 85/286/5 96/296/5 92/299/5 72/287/5
|
||||
f 3/310/5 83/284/5 96/296/5 85/286/5
|
||||
f 83/284/5 73/283/5 91/297/5 96/296/5
|
||||
f 82/264/5 54/311/5 24/312/5 1/10/5
|
||||
f 72/287/5 92/299/5 54/311/5 82/264/5
|
||||
f 92/299/5 78/298/5 47/313/5 54/311/5
|
||||
f 26/260/5 59/158/5 25/157/5 69/261/5
|
||||
f 44/290/5 58/293/5 43/122/5 77/291/5
|
||||
f 17/314/5 57/289/5 90/292/5 5/315/5
|
||||
f 81/267/5 56/316/5 27/317/5 2/166/5
|
||||
f 5/315/5 90/292/5 56/316/5 81/267/5
|
||||
f 90/292/5 77/291/5 45/318/5 56/316/5
|
||||
f 20/294/5 53/202/5 48/201/5 9/295/5
|
||||
f 21/319/5 3/310/5 85/286/5 97/285/5
|
||||
f 28/320/5 60/281/5 83/284/5 3/310/5
|
||||
f 29/276/5 10/29/5 36/237/5 98/321/5
|
||||
f 88/278/5 63/322/5 37/90/5 75/279/5
|
||||
f 71/323/5 84/265/5 63/322/5 88/278/5
|
||||
f 84/265/5 1/10/5 22/9/5 63/322/5
|
||||
f 80/324/5 71/323/5 88/278/5 99/277/5
|
||||
f 38/280/5 75/279/5 39/30/5 62/275/5
|
||||
f 16/262/5 69/261/5 18/325/5 61/326/5
|
||||
f 23/271/5 70/270/5 87/305/5 100/327/5
|
||||
f 34/21/5 66/170/5 32/169/5 74/273/5
|
||||
f 18/325/5 101/272/5 33/274/5 6/328/5
|
||||
f 69/261/5 25/157/5 101/272/5 18/325/5
|
||||
f 25/157/5 7/22/5 34/21/5 101/272/5
|
||||
f 33/274/5 74/273/5 35/329/5 65/330/5
|
||||
f 31/109/5 64/86/5 30/85/5 70/270/5
|
||||
f 35/329/5 102/269/5 23/271/5 12/331/5
|
||||
f 74/273/5 32/169/5 102/269/5 35/329/5
|
||||
f 32/169/5 13/110/5 31/109/5 102/269/5
|
||||
f 75/279/5 37/90/5 67/89/5 39/30/5
|
||||
f 42/282/5 103/266/5 86/268/5 73/283/5
|
||||
f 15/332/5 41/333/5 103/266/5 42/282/5
|
||||
f 41/333/5 5/315/5 81/267/5 103/266/5
|
||||
f 40/334/5 104/263/5 84/265/5 71/323/5
|
||||
f 76/335/5 89/288/5 104/263/5 40/334/5
|
||||
f 89/288/5 72/287/5 82/264/5 104/263/5
|
||||
f 77/291/5 43/122/5 68/121/5 45/318/5
|
||||
f 47/313/5 105/259/5 16/262/5 4/336/5
|
||||
f 78/298/5 46/177/5 105/259/5 47/313/5
|
||||
f 46/177/5 8/337/5 26/260/5 105/259/5
|
||||
f 79/302/5 94/210/5 106/209/5 50/308/5
|
||||
f 211/338/6 107/339/6 108/340/6 128/341/6
|
||||
f 209/342/6 114/343/6 113/108/6 122/344/6
|
||||
f 208/345/6 110/346/6 111/347/6 132/348/6
|
||||
f 206/349/6 119/350/6 120/351/6 138/352/6
|
||||
f 203/353/6 141/354/6 142/355/6 143/356/6
|
||||
f 198/357/6 146/358/6 147/359/6 148/360/6
|
||||
f 197/361/6 134/362/6 135/363/6 149/116/6
|
||||
f 195/364/6 150/365/6 133/366/6 117/367/6
|
||||
f 194/55/6 130/368/6 131/369/6 154/370/6
|
||||
f 192/235/6 156/246/6 157/200/6 173/223/6
|
||||
f 191/371/6 158/372/6 159/373/6 180/231/6
|
||||
f 188/374/6 162/375/6 163/376/6 164/377/6
|
||||
f 184/378/6 166/379/6 167/380/6 168/381/6
|
||||
f 166/379/6 183/96/6 169/220/6 167/380/6
|
||||
f 136/382/6 184/378/6 168/381/6 137/136/6
|
||||
f 120/351/6 121/383/6 184/378/6 136/382/6
|
||||
f 121/383/6 175/152/6 166/379/6 184/378/6
|
||||
f 168/381/6 167/380/6 182/384/6 185/385/6
|
||||
f 173/223/6 157/200/6 181/386/6 186/387/6
|
||||
f 162/375/6 187/388/6 165/389/6 163/376/6
|
||||
f 133/366/6 132/348/6 187/388/6 162/375/6
|
||||
f 132/348/6 111/347/6 176/390/6 187/388/6
|
||||
f 130/368/6 188/374/6 164/377/6 131/369/6
|
||||
f 116/391/6 117/367/6 188/374/6 130/368/6
|
||||
f 117/367/6 133/366/6 162/375/6 188/374/6
|
||||
f 114/343/6 189/216/6 112/392/6 113/108/6
|
||||
f 131/369/6 164/377/6 189/216/6 114/343/6
|
||||
f 164/377/6 163/376/6 161/393/6 189/216/6
|
||||
f 158/372/6 190/28/6 160/144/6 159/373/6
|
||||
f 123/394/6 122/344/6 190/28/6 158/372/6
|
||||
f 122/344/6 113/108/6 177/395/6 190/28/6
|
||||
f 171/396/6 123/394/6 158/372/6 191/371/6
|
||||
f 180/231/6 159/373/6 156/246/6 192/235/6
|
||||
f 128/341/6 108/340/6 124/397/6 193/184/6
|
||||
f 178/47/6 116/391/6 130/368/6 194/55/6
|
||||
f 115/71/6 195/364/6 117/367/6 116/391/6
|
||||
f 107/339/6 196/156/6 109/398/6 108/340/6
|
||||
f 146/358/6 197/361/6 149/116/6 147/359/6
|
||||
f 126/7/6 198/357/6 148/360/6 127/399/6
|
||||
f 110/346/6 199/4/6 118/400/6 111/347/6
|
||||
f 127/399/6 148/360/6 199/4/6 110/346/6
|
||||
f 148/360/6 147/359/6 179/401/6 199/4/6
|
||||
f 134/362/6 200/228/6 145/402/6 135/363/6
|
||||
f 138/352/6 120/351/6 136/382/6 201/104/6
|
||||
f 141/354/6 202/403/6 144/404/6 142/355/6
|
||||
f 124/397/6 203/353/6 143/356/6 125/20/6
|
||||
f 108/340/6 109/398/6 203/353/6 124/397/6
|
||||
f 109/398/6 172/196/6 141/354/6 203/353/6
|
||||
f 143/356/6 142/355/6 140/405/6 204/192/6
|
||||
f 119/350/6 205/64/6 121/383/6 120/351/6
|
||||
f 140/405/6 206/349/6 138/352/6 139/52/6
|
||||
f 142/355/6 144/404/6 206/349/6 140/405/6
|
||||
f 144/404/6 174/132/6 119/350/6 206/349/6
|
||||
f 147/359/6 149/116/6 207/406/6 179/401/6
|
||||
f 150/365/6 208/345/6 132/348/6 133/366/6
|
||||
f 152/407/6 151/408/6 208/345/6 150/365/6
|
||||
f 151/408/6 127/399/6 110/346/6 208/345/6
|
||||
f 153/35/6 209/342/6 122/344/6 123/394/6
|
||||
f 155/187/6 154/370/6 209/342/6 153/35/6
|
||||
f 154/370/6 131/369/6 114/343/6 209/342/6
|
||||
f 159/373/6 160/144/6 210/409/6 156/246/6
|
||||
f 161/393/6 211/338/6 128/341/6 129/140/6
|
||||
f 163/376/6 165/389/6 211/338/6 161/393/6
|
||||
f 165/389/6 170/164/6 107/339/6 211/338/6
|
||||
f 167/380/6 169/220/6 212/410/6 182/384/6
|
||||
f 52/411/2 49/412/2 168/413/2 185/385/2
|
||||
f 54/414/1 47/415/1 165/416/1 187/388/1
|
||||
f 26/260/3 8/337/3 129/417/3 128/418/3
|
||||
f 1/419/1 24/420/1 176/421/1 111/347/1
|
||||
f 15/422/4 42/423/4 154/424/4 155/425/4
|
||||
f 27/317/3 56/316/3 190/426/3 177/427/3
|
||||
f 65/428/1 35/429/1 144/430/1 202/403/1
|
||||
f 94/210/3 52/304/3 185/431/3 182/211/3
|
||||
f 49/301/3 11/307/3 137/432/3 168/433/3
|
||||
f 44/434/2 57/435/2 191/371/2 180/436/2
|
||||
f 37/90/3 63/322/3 199/437/3 179/91/3
|
||||
f 89/438/2 76/439/2 152/407/2 150/440/2
|
||||
f 57/441/2 17/442/2 171/396/2 191/443/2
|
||||
f 33/444/4 65/445/4 202/446/4 141/447/4
|
||||
f 24/312/3 54/311/3 187/448/3 176/449/3
|
BIN
media/pickaxe.png
Normal file
After (image error) Size: 219 B |
BIN
screenshot.png
Normal file
After (image error) Size: 45 KiB |
5
src/cmake_config.h.in
Normal file
@ -0,0 +1,5 @@
|
||||
// Template for cmake_config.h
|
||||
|
||||
#define D_ABOUT_LINK_URL "@PROJECT_LINK_URL@"
|
||||
#define D_ABOUT_LINK_TEXT "@PROJECT_LINK_TEXT@"
|
||||
#define D_VERSION "@VERSION_STRING@"
|
82
src/config.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
#include <fstream>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
Vector::Vector(const std::string &str)
|
||||
{
|
||||
sscanf(str.c_str(), "%f,%f,%f", &x, &y, &z);
|
||||
}
|
||||
|
||||
bool Config::load()
|
||||
{
|
||||
std::ifstream file(filename.c_str());
|
||||
if (!file)
|
||||
return false;
|
||||
|
||||
std::string line;
|
||||
while (std::getline(file, line))
|
||||
{
|
||||
auto index = line.find("=");
|
||||
std::string key = line.substr(0, index);
|
||||
std::string value = line.substr(index + 1);
|
||||
config[key] = value;
|
||||
}
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Config::save()
|
||||
{
|
||||
std::ofstream file(filename.c_str());
|
||||
if (!file)
|
||||
return false;
|
||||
|
||||
for(std::map<std::string, std::string>::iterator it = config.begin();
|
||||
it != config.end(); it++)
|
||||
{
|
||||
file << it->first << "=" << it->second << "\n";
|
||||
}
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Config::hasKey(const std::string &key) const
|
||||
{
|
||||
return config.find(key) != config.end();
|
||||
}
|
||||
|
||||
void Config::set(const std::string &key, const std::string &value)
|
||||
{
|
||||
config[key] = value;
|
||||
}
|
||||
|
||||
const std::string &Config::get(const std::string &key) const
|
||||
{
|
||||
return config.find(key)->second;
|
||||
}
|
||||
|
||||
const char *Config::getCStr(const std::string &key) const
|
||||
{
|
||||
return get(key).c_str();
|
||||
}
|
||||
|
||||
int Config::getInt(const std::string &key) const
|
||||
{
|
||||
return atoi(getCStr(key));
|
||||
}
|
||||
|
||||
int Config::getHex(const std::string &key) const
|
||||
{
|
||||
return std::stoul(get(key), nullptr, 16);
|
||||
}
|
||||
|
||||
bool Config::getBool(const std::string &key) const
|
||||
{
|
||||
return get(key) == "true";
|
||||
}
|
||||
|
||||
Vector Config::getVector(const std::string &key) const
|
||||
{
|
||||
return Vector(get(key));
|
||||
}
|
37
src/config.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef D_CONFIG_H
|
||||
#define D_CONFIG_H
|
||||
|
||||
#include <map>
|
||||
|
||||
class Vector
|
||||
{
|
||||
public:
|
||||
Vector() : x(0), y(0), z(0) {}
|
||||
Vector(float x, float y, float z) : x(x), y(y), z(z) {}
|
||||
Vector(const std::string &str);
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
};
|
||||
|
||||
class Config
|
||||
{
|
||||
public:
|
||||
Config(const std::string &filename) : filename(filename) {}
|
||||
bool load();
|
||||
bool save();
|
||||
bool hasKey(const std::string &key) const;
|
||||
void set(const std::string &key, const std::string &value);
|
||||
const std::string &get(const std::string &key) const;
|
||||
const char *getCStr(const std::string &key) const;
|
||||
int getInt(const std::string &key) const;
|
||||
int getHex(const std::string &key) const;
|
||||
bool getBool(const std::string &key) const;
|
||||
Vector getVector(const std::string &key) const;
|
||||
|
||||
private:
|
||||
std::map<std::string, std::string> config;
|
||||
std::string filename;
|
||||
};
|
||||
|
||||
#endif // D_CONFIG_H
|
492
src/dialog.cpp
Normal file
@ -0,0 +1,492 @@
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <irrlicht.h>
|
||||
|
||||
#ifdef USE_CMAKE_CONFIG_H
|
||||
#include "cmake_config.h"
|
||||
#else
|
||||
#define D_ABOUT_LINK_URL "https://github.com/stujones11/SAM-Viewer"
|
||||
#define D_ABOUT_LINK_TEXT "github.com/stujones11/SAM-Viewer"
|
||||
#define D_VERSION "0.0.0"
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
#include "scene.h"
|
||||
#include "dialog.h"
|
||||
|
||||
static inline void open_url(std::string url)
|
||||
{
|
||||
system((std::string("xdg-open \"") + url + std::string("\"")).c_str());
|
||||
}
|
||||
|
||||
HyperlinkCtrl::HyperlinkCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, const wchar_t *title, std::string url) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||
url(url),
|
||||
is_active(false)
|
||||
{
|
||||
IGUIStaticText *text = env->addStaticText(title,
|
||||
rect<s32>(0,0,rectangle.getWidth(),20), false, false, this);
|
||||
text->setOverrideColor(SColor(255,0,0,255));
|
||||
text->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
|
||||
}
|
||||
|
||||
void HyperlinkCtrl::draw()
|
||||
{
|
||||
if (is_active)
|
||||
{
|
||||
IVideoDriver *driver = Environment->getVideoDriver();
|
||||
rect<s32> pos = getAbsolutePosition();
|
||||
vector2di end = pos.LowerRightCorner;
|
||||
vector2di start = end - vector2di(pos.getWidth(), 0);
|
||||
driver->draw2DLine(start, end, SColor(255,0,0,255));
|
||||
}
|
||||
IGUIElement::draw();
|
||||
}
|
||||
|
||||
bool HyperlinkCtrl::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT)
|
||||
{
|
||||
if (event.GUIEvent.EventType == EGET_ELEMENT_HOVERED)
|
||||
is_active = true;
|
||||
else if (event.GUIEvent.EventType == EGET_ELEMENT_LEFT)
|
||||
is_active = false;
|
||||
}
|
||||
else if (is_active && event.EventType == EET_MOUSE_INPUT_EVENT &&
|
||||
event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
|
||||
{
|
||||
open_url(url);
|
||||
}
|
||||
return IGUIElement::OnEvent(event);
|
||||
}
|
||||
|
||||
static inline bool isValidHexString(std::string hex)
|
||||
{
|
||||
return (hex.length() == 6 &&
|
||||
hex.find_first_not_of("0123456789abcdefABCDEF") == std::string::npos);
|
||||
}
|
||||
|
||||
ColorCtrl::ColorCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, const wchar_t *label) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle)
|
||||
{
|
||||
IVideoDriver *driver = env->getVideoDriver();
|
||||
IGUIStaticText *text = env->addStaticText(label, rect<s32>(0,0,160,20),
|
||||
false, false, this);
|
||||
IGUIEditBox *edit = env->addEditBox(L"", rect<s32>(180,0,250,20), true,
|
||||
this, E_DIALOG_ID_COLOR_EDIT);
|
||||
edit->setMax(6);
|
||||
edit->setToolTipText(L"Hex color string RRGGBB");
|
||||
|
||||
ITexture *texture = driver->findTexture("color_preview");
|
||||
if (!texture)
|
||||
{
|
||||
IImage *image = driver->createImage(ECF_A8R8G8B8, dimension2du(30,20));
|
||||
image->fill(SColor(255,255,255,255));
|
||||
texture = driver->addTexture("color_preview", image);
|
||||
image->drop();
|
||||
}
|
||||
IGUIImage *preview = env->addImage(rect<s32>(270,0,300,20), this,
|
||||
E_DIALOG_ID_COLOR_PREVIEW);
|
||||
preview->setImage(texture);
|
||||
}
|
||||
|
||||
void ColorCtrl::setColor(const std::string &hex)
|
||||
{
|
||||
if (!isValidHexString(hex))
|
||||
return;
|
||||
|
||||
stringw text = hex.c_str();
|
||||
IGUIEditBox *edit = (IGUIEditBox*)
|
||||
getElementFromId(E_DIALOG_ID_COLOR_EDIT);
|
||||
if (edit)
|
||||
edit->setText(text.c_str());
|
||||
IGUIImage *preview = (IGUIImage*)
|
||||
getElementFromId(E_DIALOG_ID_COLOR_PREVIEW);
|
||||
if (preview)
|
||||
{
|
||||
SColor color;
|
||||
color.color = std::stoul(hex, nullptr, 16);
|
||||
color.setAlpha(255);
|
||||
preview->setColor(color);
|
||||
}
|
||||
}
|
||||
|
||||
std::string ColorCtrl::getColor() const
|
||||
{
|
||||
std::string hex = "";
|
||||
IGUIEditBox *edit = (IGUIEditBox*)
|
||||
getElementFromId(E_DIALOG_ID_COLOR_EDIT);
|
||||
if (edit)
|
||||
hex = stringc(edit->getText()).c_str();
|
||||
return hex;
|
||||
}
|
||||
|
||||
bool ColorCtrl::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT &&
|
||||
event.GUIEvent.EventType == EGET_EDITBOX_CHANGED &&
|
||||
event.GUIEvent.Caller->getID() == E_DIALOG_ID_COLOR_EDIT)
|
||||
{
|
||||
IGUIEditBox *edit = (IGUIEditBox*)event.GUIEvent.Caller;
|
||||
std::string hex = stringc(edit->getText()).c_str();
|
||||
setColor(hex);
|
||||
}
|
||||
return IGUIElement::OnEvent(event);
|
||||
}
|
||||
|
||||
AboutDialog::AboutDialog(IGUIEnvironment *env, IGUIElement *parent,
|
||||
s32 id, const rect<s32> &rectangle) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle)
|
||||
{
|
||||
IVideoDriver *driver = env->getVideoDriver();
|
||||
ITexture *icon = driver->findTexture("sam_icon_128.png");
|
||||
if (!icon)
|
||||
icon = driver->getTexture("sam_icon_128.png");
|
||||
if (icon)
|
||||
{
|
||||
IGUIImage *image = env->addImage(rect<s32>(86,10,214,138), this);
|
||||
image->setImage(icon);
|
||||
|
||||
}
|
||||
ITexture *title = driver->findTexture("title.png");
|
||||
if (!title)
|
||||
title = driver->getTexture("title.png");
|
||||
if (title)
|
||||
{
|
||||
IGUIImage *image = env->addImage(rect<s32>(50,140,250,170), this);
|
||||
image->setImage(title);
|
||||
}
|
||||
stringw desc = stringw("Skin & Model Viewer - Version ") + D_VERSION;
|
||||
IGUIStaticText *text;
|
||||
text = env->addStaticText(desc.c_str(), rect<s32>(20,175,280,195),
|
||||
false, false, this);
|
||||
text->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
|
||||
|
||||
HyperlinkCtrl *link = new HyperlinkCtrl(env, this,
|
||||
E_DIALOG_ID_ABOUT_LINK, rect<s32>(32,200,268,216),
|
||||
stringw(D_ABOUT_LINK_TEXT).c_str(), D_ABOUT_LINK_URL);
|
||||
link->drop();
|
||||
|
||||
IGUIButton *button = env->addButton(rect<s32>(110,235,190,265), this,
|
||||
E_DIALOG_ID_ABOUT_OK, L"OK");
|
||||
}
|
||||
|
||||
|
||||
SettingsDialog::SettingsDialog(IGUIEnvironment *env, IGUIElement *parent,
|
||||
s32 id, const rect<s32> &rectangle, Config *conf) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||
conf(conf)
|
||||
{
|
||||
IGUITabControl *tabs = env->addTabControl(rect<s32>(2,2,398,250),
|
||||
this, true, true);
|
||||
|
||||
IGUITab *tab_general = tabs->addTab(L"General");
|
||||
IGUITab *tab_debug = tabs->addTab(L"Debug");
|
||||
IGUIStaticText *text;
|
||||
IGUIEditBox *edit;
|
||||
IGUISpinBox *spin;
|
||||
IGUICheckBox *check;
|
||||
IGUIButton *button;
|
||||
ColorCtrl *color;
|
||||
|
||||
color = new ColorCtrl(env, tab_general, E_DIALOG_ID_BG_COLOR,
|
||||
rect<s32>(20,20,320,40), L"Background Color:");
|
||||
color->setColor(conf->get("bg_color"));
|
||||
color->drop();
|
||||
|
||||
color = new ColorCtrl(env, tab_general, E_DIALOG_ID_GRID_COLOR,
|
||||
rect<s32>(20,50,320,70), L"Grid Color:");
|
||||
color->setColor(conf->get("grid_color"));
|
||||
color->drop();
|
||||
|
||||
text = env->addStaticText(L"Wield Attachment Bone:", rect<s32>(20,80,180,100),
|
||||
false, false, tab_general, -1);
|
||||
stringw bone_name = conf->getCStr("wield_bone");
|
||||
edit = env->addEditBox(bone_name.c_str(), rect<s32>(200,80,320,100),
|
||||
true, tab_general, E_DIALOG_ID_WIELD_BONE);
|
||||
|
||||
text = env->addStaticText(L"Default Screen Width:",
|
||||
rect<s32>(20,110,180,130), false, false, tab_general, -1);
|
||||
spin = env->addSpinBox(L"", rect<s32>(200,110,270,130),
|
||||
true, tab_general, E_DIALOG_ID_SCREEN_WIDTH);
|
||||
spin->setValue(conf->getInt("screen_width"));
|
||||
spin->setDecimalPlaces(0);
|
||||
|
||||
text = env->addStaticText(L"Default Screen Height:",
|
||||
rect<s32>(20,140,180,160), false, false, tab_general, -1);
|
||||
spin = env->addSpinBox(L"", rect<s32>(200,140,270,160),
|
||||
true, tab_general, E_DIALOG_ID_SCREEN_HEIGHT);
|
||||
spin->setValue(conf->getInt("screen_height"));
|
||||
spin->setDecimalPlaces(0);
|
||||
|
||||
check = env->addCheckBox(false, rect<s32>(20,20,380,40), tab_debug,
|
||||
E_DIALOG_ID_DEBUG_BBOX, L"Show bounding boxes");
|
||||
check->setChecked(conf->getInt("debug_flags") & EDS_BBOX);
|
||||
check = env->addCheckBox(false, rect<s32>(20,50,380,70), tab_debug,
|
||||
E_DIALOG_ID_DEBUG_NORMALS, L"Show vertex normals");
|
||||
check->setChecked(conf->getInt("debug_flags") & EDS_NORMALS);
|
||||
check = env->addCheckBox(false, rect<s32>(20,80,380,100), tab_debug,
|
||||
E_DIALOG_ID_DEBUG_SKELETON, L"Show skeleton");
|
||||
check->setChecked(conf->getInt("debug_flags") & EDS_SKELETON);
|
||||
check = env->addCheckBox(false, rect<s32>(20,110,380,130), tab_debug,
|
||||
E_DIALOG_ID_DEBUG_WIREFRANE, L"Wireframe overaly");
|
||||
check->setChecked(conf->getInt("debug_flags") & EDS_MESH_WIRE_OVERLAY);
|
||||
check = env->addCheckBox(false, rect<s32>(20,140,380,160), tab_debug,
|
||||
E_DIALOG_ID_DEBUG_ALPHA, L"Use transparent material");
|
||||
check->setChecked(conf->getInt("debug_flags") & EDS_HALF_TRANSPARENCY);
|
||||
check = env->addCheckBox(false, rect<s32>(20,170,380,190), tab_debug,
|
||||
E_DIALOG_ID_DEBUG_BUFFERS, L"Show all mesh buffers");
|
||||
check->setChecked(conf->getInt("debug_flags") & EDS_BBOX_BUFFERS);
|
||||
|
||||
button = env->addButton(rect<s32>(315,255,395,285), this,
|
||||
E_DIALOG_ID_SETTINGS_OK, L"OK");
|
||||
button = env->addButton(rect<s32>(230,255,310,285), this,
|
||||
E_DIALOG_ID_SETTINGS_CANCEL, L"Cancel");
|
||||
}
|
||||
|
||||
bool SettingsDialog::isBoxChecked(s32 id) const
|
||||
{
|
||||
IGUICheckBox *check = (IGUICheckBox*)getElementFromId(id, true);
|
||||
if (check)
|
||||
return check->isChecked();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SettingsDialog::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT &&
|
||||
event.GUIEvent.EventType == EGET_BUTTON_CLICKED &&
|
||||
event.GUIEvent.Caller->getID() == E_DIALOG_ID_SETTINGS_OK)
|
||||
{
|
||||
IGUIEditBox *edit;
|
||||
IGUISpinBox *spin;
|
||||
ColorCtrl *color;
|
||||
|
||||
color = (ColorCtrl*)getElementFromId(E_DIALOG_ID_BG_COLOR, true);
|
||||
if (color)
|
||||
{
|
||||
const std::string hex = color->getColor();
|
||||
if (isValidHexString(hex))
|
||||
conf->set("bg_color", hex);
|
||||
}
|
||||
color = (ColorCtrl*)getElementFromId(E_DIALOG_ID_GRID_COLOR, true);
|
||||
if (color)
|
||||
{
|
||||
const std::string hex = color->getColor();
|
||||
if (isValidHexString(hex))
|
||||
conf->set("grid_color", hex);
|
||||
}
|
||||
edit = (IGUIEditBox*)
|
||||
getElementFromId(E_DIALOG_ID_WIELD_BONE, true);
|
||||
std::string bone = stringc(edit->getText()).c_str();
|
||||
conf->set("wield_bone", bone);
|
||||
|
||||
spin = (IGUISpinBox*)
|
||||
getElementFromId(E_DIALOG_ID_SCREEN_WIDTH, true);
|
||||
u32 width = spin->getValue();
|
||||
conf->set("screen_width", std::to_string(width));
|
||||
spin = (IGUISpinBox*)
|
||||
getElementFromId(E_DIALOG_ID_SCREEN_HEIGHT, true);
|
||||
u32 height = spin->getValue();
|
||||
conf->set("screen_height", std::to_string(height));
|
||||
|
||||
u32 flags = 0;
|
||||
if (isBoxChecked(E_DIALOG_ID_DEBUG_BBOX))
|
||||
flags |= EDS_BBOX;
|
||||
if (isBoxChecked(E_DIALOG_ID_DEBUG_NORMALS))
|
||||
flags |= EDS_NORMALS;
|
||||
if (isBoxChecked(E_DIALOG_ID_DEBUG_SKELETON))
|
||||
flags |= EDS_SKELETON;
|
||||
if (isBoxChecked(E_DIALOG_ID_DEBUG_WIREFRANE))
|
||||
flags |= EDS_MESH_WIRE_OVERLAY;
|
||||
if (isBoxChecked(E_DIALOG_ID_DEBUG_ALPHA))
|
||||
flags |= EDS_HALF_TRANSPARENCY;
|
||||
if (isBoxChecked(E_DIALOG_ID_DEBUG_BUFFERS))
|
||||
flags |= EDS_BBOX_BUFFERS;
|
||||
conf->set("debug_flags", std::to_string(flags));
|
||||
}
|
||||
return IGUIElement::OnEvent(event);
|
||||
}
|
||||
|
||||
TexturesDialog::TexturesDialog(IGUIEnvironment *env, IGUIElement *parent,
|
||||
s32 id, const rect<s32> &rectangle, Config *conf, ISceneManager *smgr) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||
conf(conf),
|
||||
smgr(smgr)
|
||||
{
|
||||
IGUITabControl *tabs = env->addTabControl(rect<s32>(2,2,398,250), this,
|
||||
true, true);
|
||||
|
||||
IGUITab *tab_model = tabs->addTab(L"Model");
|
||||
IGUITab *tab_wield = tabs->addTab(L"Wield");
|
||||
IGUIStaticText *text;
|
||||
IGUIEditBox *edit;
|
||||
IGUIButton *button;
|
||||
stringw fn;
|
||||
std::string key;
|
||||
|
||||
ITexture *image = getTexture("browse.png");
|
||||
ISceneNode *model = smgr->getSceneNodeFromId(E_SCENE_ID_MODEL);
|
||||
ISceneNode *wield = smgr->getSceneNodeFromId(E_SCENE_ID_WIELD);
|
||||
u32 mc_model = (model) ? model->getMaterialCount() : 0;
|
||||
u32 mc_wield = (wield) ? wield->getMaterialCount() : 0;
|
||||
|
||||
for (s32 i = 0; i < 6; ++i)
|
||||
{
|
||||
s32 top = i * 30 + 20;
|
||||
stringw num = stringw(i + 1);
|
||||
|
||||
key = "model_texture_" + std::to_string(i + 1);
|
||||
fn = conf->getCStr(key);
|
||||
text = env->addStaticText(num.c_str(), rect<s32>(15,top,25,top+20),
|
||||
false, false, tab_model, -1);
|
||||
edit = env->addEditBox(fn.c_str(), rect<s32>(35,top,350,top+20),
|
||||
true, tab_model, E_TEXTURE_ID_MODEL + i);
|
||||
edit->setEnabled(i < mc_model);
|
||||
edit->setOverrideColor(SColor(255,255,0,0));
|
||||
edit->enableOverrideColor(false);
|
||||
button = env->addButton(rect<s32>(360,top,380,top+20), tab_model,
|
||||
E_BUTTON_ID_MODEL + i);
|
||||
button->setToolTipText(L"Browse");
|
||||
if (image)
|
||||
{
|
||||
button->setImage(image);
|
||||
button->setUseAlphaChannel(true);
|
||||
button->setDrawBorder(false);
|
||||
}
|
||||
button->setEnabled(i < mc_model);
|
||||
|
||||
key = "wield_texture_" + std::to_string(i + 1);
|
||||
fn = conf->getCStr(key);
|
||||
text = env->addStaticText(num.c_str(), rect<s32>(15,top,25,top+20),
|
||||
false, false, tab_wield, -1);
|
||||
edit = env->addEditBox(fn.c_str(), rect<s32>(35,top,350,top+20),
|
||||
true, tab_wield, E_TEXTURE_ID_WIELD + i);
|
||||
edit->setEnabled(i < mc_wield);
|
||||
edit->setOverrideColor(SColor(255,255,0,0));
|
||||
edit->enableOverrideColor(false);
|
||||
button = env->addButton(rect<s32>(360,top,380,top+20), tab_wield,
|
||||
E_BUTTON_ID_WIELD + i);
|
||||
if (image)
|
||||
{
|
||||
button->setImage(image);
|
||||
button->setUseAlphaChannel(true);
|
||||
button->setDrawBorder(false);
|
||||
}
|
||||
button->setEnabled(i < mc_wield);
|
||||
}
|
||||
button = env->addButton(rect<s32>(315,255,395,285), this,
|
||||
E_DIALOG_ID_TEXTURES_OK, L"OK");
|
||||
button = env->addButton(rect<s32>(230,255,310,285), this,
|
||||
E_DIALOG_ID_TEXTURES_CANCEL, L"Cancel");
|
||||
}
|
||||
|
||||
ITexture *TexturesDialog::getTexture(const io::path &filename)
|
||||
{
|
||||
IVideoDriver *driver = Environment->getVideoDriver();
|
||||
ITexture *texture = driver->findTexture(filename);
|
||||
if (!texture)
|
||||
texture = driver->getTexture(filename);
|
||||
return texture;
|
||||
}
|
||||
|
||||
bool TexturesDialog::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT)
|
||||
{
|
||||
s32 id = event.GUIEvent.Caller->getID();
|
||||
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
|
||||
{
|
||||
if (event.GUIEvent.Caller->getType() == EGUIET_EDIT_BOX)
|
||||
{
|
||||
IGUIEditBox *edit = (IGUIEditBox*)event.GUIEvent.Caller;
|
||||
if (edit)
|
||||
{
|
||||
stringc fn = stringc(edit->getText()).c_str();
|
||||
edit->enableOverrideColor(!(getTexture(fn)));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
|
||||
{
|
||||
if (id == E_DIALOG_ID_TEXTURES_OK)
|
||||
{
|
||||
ISceneNode *model = smgr->getSceneNodeFromId(E_SCENE_ID_MODEL);
|
||||
ISceneNode *wield = smgr->getSceneNodeFromId(E_SCENE_ID_WIELD);
|
||||
IGUIEditBox *edit;
|
||||
|
||||
for (s32 i = 0; i < 6; ++i)
|
||||
{
|
||||
std::string idx = std::to_string(i + 1);
|
||||
edit = (IGUIEditBox*)
|
||||
getElementFromId(E_TEXTURE_ID_MODEL + i, true);
|
||||
if (edit && model && i < model->getMaterialCount())
|
||||
{
|
||||
stringc fn = stringc(edit->getText()).c_str();
|
||||
ITexture *texture = getTexture(fn);
|
||||
if (texture)
|
||||
{
|
||||
std::string key = "model_texture_" + idx;
|
||||
conf->set(key, fn.c_str());
|
||||
SMaterial &material = model->getMaterial(i);
|
||||
material.TextureLayer[0].Texture = texture;
|
||||
}
|
||||
}
|
||||
edit = (IGUIEditBox*)
|
||||
getElementFromId(E_TEXTURE_ID_WIELD + i, true);
|
||||
if (edit && wield && i < wield->getMaterialCount())
|
||||
{
|
||||
stringc fn = stringc(edit->getText()).c_str();
|
||||
ITexture *texture = getTexture(fn);
|
||||
if (texture)
|
||||
{
|
||||
std::string key = "wield_texture_" + idx;
|
||||
conf->set(key, fn.c_str());
|
||||
SMaterial &material = wield->getMaterial(i);
|
||||
material.TextureLayer[0].Texture = texture;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (s32 i = 0; i < 6; ++i)
|
||||
{
|
||||
if (id == E_BUTTON_ID_MODEL + i)
|
||||
{
|
||||
Environment->addFileOpenDialog(L"Open Image File",
|
||||
true, this, E_TEXTURE_ID_MODEL + i);
|
||||
break;
|
||||
}
|
||||
else if (id == E_BUTTON_ID_WIELD + i)
|
||||
{
|
||||
Environment->addFileOpenDialog(L"Open Image File",
|
||||
true, this, E_TEXTURE_ID_WIELD + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_FILE_SELECTED)
|
||||
{
|
||||
IGUIFileOpenDialog *dialog =
|
||||
(IGUIFileOpenDialog*)event.GUIEvent.Caller;
|
||||
|
||||
stringw fn = stringw(dialog->getFileName());
|
||||
if (!fn.empty())
|
||||
{
|
||||
s32 id = dialog->getID();
|
||||
IGUIEditBox *edit = (IGUIEditBox*)getElementFromId(id, true);
|
||||
if (edit)
|
||||
{
|
||||
edit->setText(fn.c_str());
|
||||
edit->enableOverrideColor(!(getTexture(fn)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return IGUIElement::OnEvent(event);
|
||||
}
|
109
src/dialog.h
Normal file
@ -0,0 +1,109 @@
|
||||
#ifndef D_DIALOG_H
|
||||
#define D_DIALOG_H
|
||||
|
||||
using namespace irr;
|
||||
using namespace core;
|
||||
using namespace scene;
|
||||
using namespace gui;
|
||||
using namespace video;
|
||||
|
||||
enum
|
||||
{
|
||||
E_DIALOG_ID_ABOUT = 0x1000,
|
||||
E_DIALOG_ID_SETTINGS,
|
||||
E_DIALOG_ID_BG_COLOR,
|
||||
E_DIALOG_ID_GRID_COLOR,
|
||||
E_DIALOG_ID_COLOR_EDIT,
|
||||
E_DIALOG_ID_COLOR_PREVIEW,
|
||||
E_DIALOG_ID_WIELD_BONE,
|
||||
E_DIALOG_ID_SCREEN_WIDTH,
|
||||
E_DIALOG_ID_SCREEN_HEIGHT,
|
||||
E_DIALOG_ID_DEBUG_BBOX,
|
||||
E_DIALOG_ID_DEBUG_NORMALS,
|
||||
E_DIALOG_ID_DEBUG_SKELETON,
|
||||
E_DIALOG_ID_DEBUG_WIREFRANE,
|
||||
E_DIALOG_ID_DEBUG_ALPHA,
|
||||
E_DIALOG_ID_DEBUG_BUFFERS,
|
||||
E_DIALOG_ID_ABOUT_OK,
|
||||
E_DIALOG_ID_ABOUT_LINK,
|
||||
E_DIALOG_ID_SETTINGS_OK,
|
||||
E_DIALOG_ID_SETTINGS_CANCEL,
|
||||
E_DIALOG_ID_TEXTURES,
|
||||
E_DIALOG_ID_TEXTURES_OK,
|
||||
E_DIALOG_ID_TEXTURES_CANCEL
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
E_TEXTURE_ID_MODEL = 0x2000,
|
||||
E_TEXTURE_ID_WIELD = 0x2010,
|
||||
E_BUTTON_ID_MODEL = 0x2020,
|
||||
E_BUTTON_ID_WIELD = 0x2030
|
||||
};
|
||||
|
||||
class Config;
|
||||
|
||||
class HyperlinkCtrl : public IGUIElement
|
||||
{
|
||||
public:
|
||||
HyperlinkCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, const wchar_t *title, std::string url);
|
||||
virtual ~HyperlinkCtrl() {}
|
||||
virtual void draw();
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
|
||||
private:
|
||||
std::string url;
|
||||
bool is_active;
|
||||
};
|
||||
|
||||
class ColorCtrl : public IGUIElement
|
||||
{
|
||||
public:
|
||||
ColorCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, const wchar_t *label);
|
||||
virtual ~ColorCtrl() {}
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
void setColor(const std::string &hex);
|
||||
std::string getColor() const;
|
||||
};
|
||||
|
||||
class AboutDialog : public IGUIElement
|
||||
{
|
||||
public:
|
||||
AboutDialog(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle);
|
||||
virtual ~AboutDialog() {}
|
||||
};
|
||||
|
||||
class SettingsDialog : public IGUIElement
|
||||
{
|
||||
public:
|
||||
SettingsDialog(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, Config *conf);
|
||||
virtual ~SettingsDialog() {}
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
|
||||
private:
|
||||
bool isBoxChecked(s32 id) const;
|
||||
void colorFromHexStr(const std::string &hex);
|
||||
|
||||
Config *conf;
|
||||
};
|
||||
|
||||
class TexturesDialog : public IGUIElement
|
||||
{
|
||||
public:
|
||||
TexturesDialog(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, Config *conf, ISceneManager *smgr);
|
||||
virtual ~TexturesDialog() {}
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
|
||||
private:
|
||||
ITexture *getTexture(const io::path &filename);
|
||||
|
||||
Config *conf;
|
||||
ISceneManager *smgr;
|
||||
};
|
||||
|
||||
#endif // D_DIALOG_H
|
573
src/gui.cpp
Normal file
@ -0,0 +1,573 @@
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <irrlicht.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "scene.h"
|
||||
#include "dialog.h"
|
||||
#include "gui.h"
|
||||
|
||||
VertexCtrl::VertexCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, f32 step, const wchar_t *label) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||
vertex(0)
|
||||
{
|
||||
IGUIStaticText *text = env->addStaticText(label,
|
||||
rect<s32>(0,0,20,20), false, false, this);
|
||||
|
||||
IGUISpinBox *spin = env->addSpinBox(L"", rect<s32>(20,0,120,20),
|
||||
true, this, E_GUI_ID_VERTEX);
|
||||
spin->setDecimalPlaces(2);
|
||||
spin->setValue(0);
|
||||
spin->setStepSize(step);
|
||||
spin->setRange(-1000, 1000);
|
||||
}
|
||||
|
||||
void VertexCtrl::setValue(const f32 &value)
|
||||
{
|
||||
IGUISpinBox *spin = (IGUISpinBox*)getElementFromId(E_GUI_ID_VERTEX);
|
||||
if (spin)
|
||||
{
|
||||
spin->setValue(value);
|
||||
vertex = value;
|
||||
}
|
||||
}
|
||||
|
||||
bool VertexCtrl::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT)
|
||||
{
|
||||
if (event.GUIEvent.EventType == EGET_SPINBOX_CHANGED)
|
||||
{
|
||||
IGUISpinBox *spin = (IGUISpinBox*)event.GUIEvent.Caller;
|
||||
if (spin)
|
||||
vertex = spin->getValue();
|
||||
}
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
|
||||
{
|
||||
setValue(vertex);
|
||||
}
|
||||
return IGUIElement::OnEvent(event);
|
||||
}
|
||||
|
||||
VectorCtrl::VectorCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, f32 step, const wchar_t *label) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||
vector(vector3df(0,0,0))
|
||||
{
|
||||
IGUIStaticText *text = env->addStaticText(label,
|
||||
rect<s32>(10,0,150,20), false, false, this);
|
||||
|
||||
VertexCtrl *x = new VertexCtrl(env, this, E_GUI_ID_VECTOR_X,
|
||||
rect<s32>(10,30,150,50), step, L"X");
|
||||
x->drop();
|
||||
VertexCtrl *y = new VertexCtrl(env, this, E_GUI_ID_VECTOR_Y,
|
||||
rect<s32>(10,60,150,80), step, L"Y");
|
||||
y->drop();
|
||||
VertexCtrl *z = new VertexCtrl(env, this, E_GUI_ID_VECTOR_Z,
|
||||
rect<s32>(10,90,150,110), step, L"Z");
|
||||
z->drop();
|
||||
}
|
||||
|
||||
void VectorCtrl::setVector(const vector3df &vec)
|
||||
{
|
||||
vector = vec;
|
||||
VertexCtrl *vertex;
|
||||
vertex = (VertexCtrl*)getElementFromId(E_GUI_ID_VECTOR_X);
|
||||
if (vertex)
|
||||
vertex->setValue(vector.X);
|
||||
vertex = (VertexCtrl*)getElementFromId(E_GUI_ID_VECTOR_Y);
|
||||
if (vertex)
|
||||
vertex->setValue(vector.Y);
|
||||
vertex = (VertexCtrl*)getElementFromId(E_GUI_ID_VECTOR_Z);
|
||||
if (vertex)
|
||||
vertex->setValue(vector.Z);
|
||||
}
|
||||
|
||||
bool VectorCtrl::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT &&
|
||||
event.GUIEvent.EventType == EGET_SPINBOX_CHANGED)
|
||||
{
|
||||
VertexCtrl *vertex = (VertexCtrl*)event.GUIEvent.Caller->getParent();
|
||||
if (vertex)
|
||||
{
|
||||
switch (vertex->getID())
|
||||
{
|
||||
case E_GUI_ID_VECTOR_X:
|
||||
vector.X = vertex->getValue();
|
||||
break;
|
||||
case E_GUI_ID_VECTOR_Y:
|
||||
vector.Y = vertex->getValue();
|
||||
break;
|
||||
case E_GUI_ID_VECTOR_Z:
|
||||
vector.Z = vertex->getValue();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
SEvent new_event = event;
|
||||
new_event.GUIEvent.Caller = this;
|
||||
return IGUIElement::OnEvent(new_event);
|
||||
}
|
||||
}
|
||||
return IGUIElement::OnEvent(event);
|
||||
}
|
||||
|
||||
AnimCtrl::AnimCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||
button_id(E_GUI_ID_PAUSE)
|
||||
{
|
||||
IVideoDriver *driver = env->getVideoDriver();
|
||||
ITexture *image;
|
||||
IGUIButton *button;
|
||||
|
||||
image = driver->getTexture("skip_rev.png");
|
||||
button = env->addButton(rect<s32>(0,4,23,27), this,
|
||||
E_GUI_ID_SKIP_REV);
|
||||
button->setImage(image);
|
||||
button->setUseAlphaChannel(true);
|
||||
|
||||
image = driver->getTexture("play_rev.png");
|
||||
button = env->addButton(rect<s32>(24,4,47,27), this,
|
||||
E_GUI_ID_PLAY_REV);
|
||||
button->setImage(image);
|
||||
button->setUseAlphaChannel(true);
|
||||
|
||||
image = driver->getTexture("pause.png");
|
||||
button = env->addButton(rect<s32>(48,4,71,27), this,
|
||||
E_GUI_ID_PAUSE);
|
||||
button->setImage(image);
|
||||
button->setUseAlphaChannel(true);
|
||||
|
||||
image = driver->getTexture("play_fwd.png");
|
||||
button = env->addButton(rect<s32>(72,4,95,27), this,
|
||||
E_GUI_ID_PLAY_FWD);
|
||||
button->setImage(image);
|
||||
button->setUseAlphaChannel(true);
|
||||
|
||||
image = driver->getTexture("skip_fwd.png");
|
||||
button = env->addButton(rect<s32>(96,4,119,27), this,
|
||||
E_GUI_ID_SKIP_FWD);
|
||||
button->setImage(image);
|
||||
button->setUseAlphaChannel(true);
|
||||
}
|
||||
|
||||
bool AnimCtrl::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT)
|
||||
{
|
||||
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
|
||||
{
|
||||
reset(true);
|
||||
IGUIButton *button = (IGUIButton*)event.GUIEvent.Caller;
|
||||
button->setEnabled(false);
|
||||
button->setPressed(true);
|
||||
button_id = button->getID();
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
|
||||
{
|
||||
if (button_id == E_GUI_ID_SKIP_FWD ||
|
||||
button_id == E_GUI_ID_SKIP_REV)
|
||||
{
|
||||
reset(true);
|
||||
IGUIButton *button = (IGUIButton*)
|
||||
getElementFromId(E_GUI_ID_PAUSE);
|
||||
if (button)
|
||||
button->setPressed(true);
|
||||
button_id = E_GUI_ID_PAUSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return IGUIElement::OnEvent(event);
|
||||
}
|
||||
|
||||
void AnimCtrl::reset(bool enabled)
|
||||
{
|
||||
const list<IGUIElement*> &children = getChildren();
|
||||
list<IGUIElement*>::ConstIterator iter = children.begin();
|
||||
while (iter != children.end())
|
||||
{
|
||||
if ((*iter)->getType() == EGUIET_BUTTON)
|
||||
{
|
||||
IGUIButton *button = (IGUIButton*)(*iter);
|
||||
button->setEnabled(enabled);
|
||||
button->setPressed(false);
|
||||
}
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
||||
ToolBox::ToolBox(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, ISceneNode *node) :
|
||||
IGUIElement(EGUIET_ELEMENT, env, parent, id, rectangle)
|
||||
{
|
||||
smgr = node->getSceneManager();
|
||||
node_id = node->getID();
|
||||
|
||||
IGUIWindow *dialog = (IGUIWindow*)parent;
|
||||
dialog->setDraggable(false);
|
||||
VectorCtrl *position = new VectorCtrl(env, this, E_GUI_ID_POSITION,
|
||||
rect<s32>(10,0,150,120), 1.0, L"Position:");
|
||||
|
||||
VectorCtrl *rotation = new VectorCtrl(env, this, E_GUI_ID_ROTATION,
|
||||
rect<s32>(10,130,150,250), 15.0, L"Rotation:");
|
||||
|
||||
IGUIStaticText *text;
|
||||
text = env->addStaticText(L"Scale:",
|
||||
rect<s32>(20,260,150,280), false, false, this);
|
||||
|
||||
text = env->addStaticText(L"%",
|
||||
rect<s32>(20,290,40,310), false, false, this);
|
||||
|
||||
IGUISpinBox *scale = env->addSpinBox(L"", rect<s32>(40,290,140,310),
|
||||
true, this, E_GUI_ID_SCALE);
|
||||
|
||||
scale->setDecimalPlaces(0);
|
||||
scale->setStepSize(10.0);
|
||||
scale->setRange(0, 1000);
|
||||
|
||||
position->setVector(node->getPosition());
|
||||
position->drop();
|
||||
rotation->setVector(node->getRotation());
|
||||
rotation->drop();
|
||||
scale->setValue(node->getScale().Y * 100);
|
||||
|
||||
text = env->addStaticText(L"Transparency:",
|
||||
rect<s32>(20,330,150,350), false, false, this);
|
||||
|
||||
IGUIComboBox *combo = env->addComboBox(rect<s32>(20,360,140,380),
|
||||
this, E_GUI_ID_MATERIAL);
|
||||
combo->addItem(L"Opaque");
|
||||
combo->addItem(L"Alpha Channel");
|
||||
combo->addItem(L"Alpha Test");
|
||||
|
||||
switch (node->getMaterial(0).MaterialType)
|
||||
{
|
||||
case EMT_TRANSPARENT_ALPHA_CHANNEL:
|
||||
combo->setSelected(1);
|
||||
break;
|
||||
case EMT_TRANSPARENT_ALPHA_CHANNEL_REF:
|
||||
combo->setSelected(2);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool ToolBox::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT)
|
||||
{
|
||||
s32 id = event.GUIEvent.Caller->getID();
|
||||
if (event.GUIEvent.EventType == EGET_SPINBOX_CHANGED)
|
||||
{
|
||||
ISceneNode *node = smgr->getSceneNodeFromId(node_id);
|
||||
if (node)
|
||||
{
|
||||
IGUIElement *elem = (IGUIElement*)event.GUIEvent.Caller;
|
||||
switch(id)
|
||||
{
|
||||
case E_GUI_ID_POSITION:
|
||||
{
|
||||
VectorCtrl *position = (VectorCtrl*)elem;
|
||||
node->setPosition(position->getVector());
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_ROTATION:
|
||||
{
|
||||
VectorCtrl *rotation = (VectorCtrl*)elem;
|
||||
node->setRotation(rotation->getVector());
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_SCALE:
|
||||
{
|
||||
IGUISpinBox *spin = (IGUISpinBox*)elem;
|
||||
f32 s = spin->getValue() / 100;
|
||||
node->setScale(vector3df(s,s,s));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(event.GUIEvent.EventType == EGET_COMBO_BOX_CHANGED)
|
||||
{
|
||||
ISceneNode *node = smgr->getSceneNodeFromId(node_id);
|
||||
if (node)
|
||||
{
|
||||
IGUIComboBox *combo = (IGUIComboBox*)event.GUIEvent.Caller;
|
||||
switch (combo->getSelected())
|
||||
{
|
||||
case 0:
|
||||
node->setMaterialType(EMT_SOLID);
|
||||
break;
|
||||
case 1:
|
||||
node->setMaterialType(EMT_TRANSPARENT_ALPHA_CHANNEL);
|
||||
break;
|
||||
case 2:
|
||||
node->setMaterialType(EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return IGUIElement::OnEvent(event);
|
||||
}
|
||||
|
||||
GUI::GUI(IrrlichtDevice *device, Config *config) :
|
||||
device(device),
|
||||
conf(config),
|
||||
has_focus(false)
|
||||
{
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
IGUISkin *skin = env->getSkin();
|
||||
IGUIFont *font = env->getFont("fontlucida.png");
|
||||
if (font)
|
||||
skin->setFont(font);
|
||||
|
||||
skin->setColor(EGDC_3D_FACE, SColor(255,232,232,232));
|
||||
skin->setColor(EGDC_3D_DARK_SHADOW, SColor(255,160,160,160));
|
||||
skin->setColor(EGDC_3D_HIGH_LIGHT, SColor(255,248,248,248));
|
||||
skin->setColor(EGDC_3D_LIGHT, SColor(255,255,255,255));
|
||||
skin->setColor(EGDC_3D_SHADOW, SColor(255,196,196,196));
|
||||
skin->setColor(EGDC_ACTIVE_BORDER, SColor(255,232,232,232));
|
||||
skin->setColor(EGDC_INACTIVE_BORDER, SColor(255,232,232,232));
|
||||
skin->setColor(EGDC_GRAY_EDITABLE, SColor(255,172,172,172));
|
||||
skin->setColor(EGDC_GRAY_TEXT, SColor(255,96,96,96));
|
||||
skin->setColor(EGDC_ACTIVE_CAPTION, SColor(255,16,16,16));
|
||||
skin->setColor(EGDC_INACTIVE_CAPTION, SColor(255,64,64,64));
|
||||
|
||||
for (s32 i=0; i < EGDC_COUNT; ++i)
|
||||
{
|
||||
SColor col = skin->getColor((EGUI_DEFAULT_COLOR)i);
|
||||
col.setAlpha(255);
|
||||
skin->setColor((EGUI_DEFAULT_COLOR)i, col);
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::initMenu()
|
||||
{
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
IGUIContextMenu *menu = env->addMenu(0, E_GUI_ID_MENU);
|
||||
menu->addItem(L"File", -1, true, true);
|
||||
menu->addItem(L"Edit", -1, true, true);
|
||||
menu->addItem(L"View", -1, true, true);
|
||||
menu->addItem(L"Help", -1, true, true);
|
||||
|
||||
IGUIContextMenu *submenu;
|
||||
submenu = menu->getSubMenu(0);
|
||||
submenu->addItem(L"Load Model Mesh", E_GUI_ID_LOAD_MODEL_MESH);
|
||||
submenu->addItem(L"Load Wield Mesh", E_GUI_ID_LOAD_WIELD_MESH);
|
||||
submenu->addSeparator();
|
||||
submenu->addItem(L"Save Configuration", E_GUI_ID_SAVE_CONFIG);
|
||||
submenu->addSeparator();
|
||||
submenu->addItem(L"Quit", E_GUI_ID_QUIT);
|
||||
|
||||
submenu = menu->getSubMenu(1);
|
||||
submenu->addItem(L"Textures", E_GUI_ID_TEXTURES_DIALOG);
|
||||
submenu->addSeparator();
|
||||
submenu->addItem(L"Preferences", E_GUI_ID_SETTINGS_DIALOG);
|
||||
|
||||
submenu = menu->getSubMenu(2);
|
||||
submenu->addItem(L"Model Toolbox", E_GUI_ID_TOOLBOX_MODEL, true, false,
|
||||
false, true);
|
||||
submenu->addItem(L"Wield Toolbox", E_GUI_ID_TOOLBOX_WIELD, true, false,
|
||||
false, true);
|
||||
submenu->addSeparator();
|
||||
submenu->addItem(L"Show Grid", E_GUI_ID_SHOW_GRID, true, false,
|
||||
true, true);
|
||||
submenu->addItem(L"Show Axes", E_GUI_ID_SHOW_AXES, true, false,
|
||||
true, true);
|
||||
submenu->addSeparator();
|
||||
submenu->addItem(L"Projection", -1, true, true);
|
||||
submenu->addItem(L"Filters", -1, true, true);
|
||||
submenu->addSeparator();
|
||||
submenu->addItem(L"Show Wield Item", E_GUI_ID_ENABLE_WIELD, true, false,
|
||||
conf->getBool("wield_show"), true);
|
||||
submenu->addItem(L"Backface Culling", E_GUI_ID_BACK_FACE_CULL, true, false,
|
||||
conf->getBool("backface_cull"), true);
|
||||
submenu->addSeparator();
|
||||
submenu->addItem(L"Model Debug Info", E_GUI_ID_DEBUG_INFO, true, false,
|
||||
conf->getBool("debug_info"), true);
|
||||
|
||||
submenu = menu->getSubMenu(2)->getSubMenu(6);
|
||||
submenu->addItem(L"Perspective", E_GUI_ID_PERSPECTIVE, true, false,
|
||||
!conf->getBool("ortho"), true);
|
||||
submenu->addItem(L"Orthogonal", E_GUI_ID_ORTHOGONAL, true, false,
|
||||
conf->getBool("ortho"), true);
|
||||
|
||||
submenu = menu->getSubMenu(2)->getSubMenu(7);
|
||||
submenu->addItem(L"Bilinear", E_GUI_ID_BILINEAR, true, false,
|
||||
conf->getBool("bilinear"), true);
|
||||
submenu->addItem(L"Trilinear", E_GUI_ID_TRILINEAR, true, false,
|
||||
conf->getBool("trilinear"), true);
|
||||
submenu->addItem(L"Anisotropic", E_GUI_ID_ANISOTROPIC, true, false,
|
||||
conf->getBool("anisotropic"), true);
|
||||
|
||||
submenu = menu->getSubMenu(3);
|
||||
submenu->addItem(L"About", E_DIALOG_ID_ABOUT);
|
||||
}
|
||||
|
||||
void GUI::initToolBar()
|
||||
{
|
||||
IVideoDriver *driver = device->getVideoDriver();
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
IGUIStaticText *text;
|
||||
IGUISpinBox *spin;
|
||||
|
||||
IGUIToolBar *toolbar = env->addToolBar(0, E_GUI_ID_TOOLBAR);
|
||||
text = env->addStaticText(L"Animation:",
|
||||
rect<s32>(20,5,120,25), false, false, toolbar);
|
||||
|
||||
text = env->addStaticText(L"Start",
|
||||
rect<s32>(130,5,160,25), false, false, toolbar);
|
||||
spin = env->addSpinBox(L"", rect<s32>(170,5,230,25),
|
||||
true, toolbar, E_GUI_ID_ANIM_START);
|
||||
spin->setDecimalPlaces(0);
|
||||
spin->setRange(0, 10000);
|
||||
|
||||
text = env->addStaticText(L"End",
|
||||
rect<s32>(255,5,280,25), false, false, toolbar);
|
||||
spin = env->addSpinBox(L"", rect<s32>(290,5,350,25),
|
||||
true, toolbar, E_GUI_ID_ANIM_END);
|
||||
spin->setDecimalPlaces(0);
|
||||
spin->setRange(0, 10000);
|
||||
|
||||
text = env->addStaticText(L"Speed",
|
||||
rect<s32>(370,5,410,25), false, false, toolbar);
|
||||
spin = env->addSpinBox(L"", rect<s32>(420,5,480,25),
|
||||
true, toolbar, E_GUI_ID_ANIM_SPEED);
|
||||
spin->setDecimalPlaces(0);
|
||||
spin->setRange(0, 10000);
|
||||
|
||||
text = env->addStaticText(L"Frame",
|
||||
rect<s32>(495,5,535,25), false, false, toolbar);
|
||||
spin = env->addSpinBox(L"", rect<s32>(550,5,610,25),
|
||||
true, toolbar, E_GUI_ID_ANIM_FRAME);
|
||||
spin->setDecimalPlaces(0);
|
||||
spin->setRange(0, 10000);
|
||||
|
||||
s32 w = driver->getScreenSize().Width;
|
||||
AnimCtrl *anim = new AnimCtrl(env, toolbar, E_GUI_ID_ANIM_CTRL,
|
||||
rect<s32>(w-120,0,w,30));
|
||||
anim->drop();
|
||||
}
|
||||
|
||||
void GUI::showToolBox(s32 id)
|
||||
{
|
||||
ISceneManager *smgr = device->getSceneManager();
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
IGUIElement *root = env->getRootGUIElement();
|
||||
if (root->getElementFromId(id, true))
|
||||
return;
|
||||
|
||||
switch (id)
|
||||
{
|
||||
case E_GUI_ID_TOOLBOX_MODEL:
|
||||
{
|
||||
IVideoDriver *driver = device->getVideoDriver();
|
||||
s32 w = driver->getScreenSize().Width;
|
||||
ISceneNode *node = smgr->getSceneNodeFromId(E_SCENE_ID_MODEL);
|
||||
IGUIWindow *window = env->addWindow(rect<s32>(w-160,54,w,490),
|
||||
false, L"Model Properties", root, id);
|
||||
ToolBox *toolbox = new ToolBox(env, window, id,
|
||||
rect<s32>(0,30,160,800), node);
|
||||
toolbox->drop();
|
||||
env->setFocus(window);
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_TOOLBOX_WIELD:
|
||||
{
|
||||
ISceneNode *node = smgr->getSceneNodeFromId(E_SCENE_ID_WIELD);
|
||||
IGUIWindow *window = env->addWindow(rect<s32>(0,54,160,490),
|
||||
false, L"Wield Properties", root, id);
|
||||
ToolBox *toolbox = new ToolBox(env, window, id,
|
||||
rect<s32>(0,30,160,800), node);
|
||||
toolbox->drop();
|
||||
env->setFocus(window);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::closeToolBox(s32 id)
|
||||
{
|
||||
IGUIElement *elem = getElement(id);
|
||||
if (elem)
|
||||
elem->remove();
|
||||
}
|
||||
|
||||
void GUI::reloadToolBox(s32 id)
|
||||
{
|
||||
IGUIElement *elem = getElement(id);
|
||||
if (elem)
|
||||
{
|
||||
elem->remove();
|
||||
showToolBox(id);
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::moveElement(s32 id, const vector2di &move)
|
||||
{
|
||||
IGUIElement *elem = getElement(id);
|
||||
if (elem)
|
||||
{
|
||||
vector2di pos = elem->getRelativePosition().UpperLeftCorner + move;
|
||||
elem->setRelativePosition(position2di(pos.X, pos.Y));
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::showTexturesDialog()
|
||||
{
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
ISceneManager *smgr = device->getSceneManager();
|
||||
IGUIWindow *window = env->addWindow(getWindowRect(400, 310),
|
||||
true, L"Textures");
|
||||
|
||||
TexturesDialog *dialog = new TexturesDialog(env, window,
|
||||
E_DIALOG_ID_TEXTURES, rect<s32>(0,20,400,310), conf, smgr);
|
||||
dialog->drop();
|
||||
}
|
||||
|
||||
void GUI::showSettingsDialog()
|
||||
{
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
IGUIWindow *window = env->addWindow(getWindowRect(400, 310),
|
||||
true, L"Settings");
|
||||
|
||||
SettingsDialog *dialog = new SettingsDialog(env, window,
|
||||
E_DIALOG_ID_SETTINGS, rect<s32>(0,20,400,310), conf);
|
||||
dialog->drop();
|
||||
}
|
||||
|
||||
void GUI::showAboutDialog()
|
||||
{
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
IGUIWindow *window = env->addWindow(getWindowRect(300, 300),
|
||||
true, L"About");
|
||||
|
||||
AboutDialog *dialog = new AboutDialog(env, window,
|
||||
E_DIALOG_ID_ABOUT, rect<s32>(0,20,300,300));
|
||||
dialog->drop();
|
||||
}
|
||||
|
||||
IGUIElement *GUI::getElement(s32 id)
|
||||
{
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
IGUIElement *root = env->getRootGUIElement();
|
||||
return root->getElementFromId(id, true);
|
||||
}
|
||||
|
||||
const rect<s32> GUI::getWindowRect(const u32 &width, const u32 &height) const
|
||||
{
|
||||
IVideoDriver *driver = device->getVideoDriver();
|
||||
dimension2du s = driver->getScreenSize();
|
||||
vector2di pos = vector2di((s.Width - width) / 2, (s.Height - height) / 2);
|
||||
return rect<s32>(pos, pos + vector2di(width, height));
|
||||
}
|
133
src/gui.h
Normal file
@ -0,0 +1,133 @@
|
||||
#ifndef D_GUI_H
|
||||
#define D_GUI_H
|
||||
|
||||
using namespace irr;
|
||||
using namespace core;
|
||||
using namespace scene;
|
||||
using namespace gui;
|
||||
using namespace video;
|
||||
|
||||
enum
|
||||
{
|
||||
E_GUI_ID_MENU,
|
||||
E_GUI_ID_TOOLBAR,
|
||||
E_GUI_ID_LOAD_MODEL_MESH,
|
||||
E_GUI_ID_LOAD_WIELD_MESH,
|
||||
E_GUI_ID_SAVE_CONFIG,
|
||||
E_GUI_ID_QUIT,
|
||||
E_GUI_ID_TEXTURES_DIALOG,
|
||||
E_GUI_ID_SETTINGS_DIALOG,
|
||||
E_GUI_ID_TOOLBOX_MODEL,
|
||||
E_GUI_ID_TOOLBOX_WIELD,
|
||||
E_GUI_ID_SHOW_GRID,
|
||||
E_GUI_ID_SHOW_AXES,
|
||||
E_GUI_ID_ENABLE_WIELD,
|
||||
E_GUI_ID_BACK_FACE_CULL,
|
||||
E_GUI_ID_ORTHOGONAL,
|
||||
E_GUI_ID_PERSPECTIVE,
|
||||
E_GUI_ID_BILINEAR,
|
||||
E_GUI_ID_TRILINEAR,
|
||||
E_GUI_ID_ANISOTROPIC,
|
||||
E_GUI_ID_DEBUG_INFO,
|
||||
E_GUI_ID_VERTEX,
|
||||
E_GUI_ID_VECTOR_X,
|
||||
E_GUI_ID_VECTOR_Y,
|
||||
E_GUI_ID_VECTOR_Z,
|
||||
E_GUI_ID_POSITION,
|
||||
E_GUI_ID_ROTATION,
|
||||
E_GUI_ID_SCALE,
|
||||
E_GUI_ID_MATERIAL,
|
||||
E_GUI_ID_ANIM_CTRL,
|
||||
E_GUI_ID_ANIM_START,
|
||||
E_GUI_ID_ANIM_END,
|
||||
E_GUI_ID_ANIM_FRAME,
|
||||
E_GUI_ID_ANIM_SPEED,
|
||||
E_GUI_ID_SKIP_REV,
|
||||
E_GUI_ID_PLAY_REV,
|
||||
E_GUI_ID_PAUSE,
|
||||
E_GUI_ID_PLAY_FWD,
|
||||
E_GUI_ID_SKIP_FWD
|
||||
};
|
||||
|
||||
class Config;
|
||||
|
||||
class VertexCtrl : public IGUIElement
|
||||
{
|
||||
public:
|
||||
VertexCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, f32 step, const wchar_t *label);
|
||||
virtual ~VertexCtrl() {}
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
f32 getValue() const { return vertex; }
|
||||
void setValue(const f32 &value);
|
||||
|
||||
private:
|
||||
f32 vertex;
|
||||
};
|
||||
|
||||
class VectorCtrl : public IGUIElement
|
||||
{
|
||||
public:
|
||||
VectorCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, f32 step, const wchar_t *label);
|
||||
virtual ~VectorCtrl() {}
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
vector3df getVector() const { return vector; }
|
||||
void setVector(const vector3df &vec);
|
||||
|
||||
private:
|
||||
vector3df vector;
|
||||
};
|
||||
|
||||
class AnimCtrl : public IGUIElement
|
||||
{
|
||||
public:
|
||||
AnimCtrl(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle);
|
||||
virtual ~AnimCtrl() {}
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
void reset(bool enabled);
|
||||
|
||||
private:
|
||||
s32 button_id;
|
||||
};
|
||||
|
||||
class ToolBox : public IGUIElement
|
||||
{
|
||||
public:
|
||||
ToolBox(IGUIEnvironment *env, IGUIElement *parent, s32 id,
|
||||
const rect<s32> &rectangle, ISceneNode *node);
|
||||
virtual ~ToolBox() {}
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
|
||||
private:
|
||||
s32 node_id;
|
||||
ISceneManager *smgr;
|
||||
};
|
||||
|
||||
class GUI
|
||||
{
|
||||
public:
|
||||
GUI(IrrlichtDevice *device, Config *config);
|
||||
void initMenu();
|
||||
void initToolBar();
|
||||
void showToolBox(s32 id);
|
||||
void closeToolBox(s32 id);
|
||||
void reloadToolBox(s32 id);
|
||||
IGUIElement *getElement(s32 id);
|
||||
bool getFocused() const { return has_focus; }
|
||||
void setFocused(const bool &focus) { has_focus = focus; }
|
||||
void moveElement(s32 id, const vector2di &move);
|
||||
void showTexturesDialog();
|
||||
void showSettingsDialog();
|
||||
void showAboutDialog();
|
||||
|
||||
private:
|
||||
const rect<s32> getWindowRect(const u32 &width, const u32 &height) const;
|
||||
|
||||
IrrlichtDevice *device;
|
||||
Config *conf;
|
||||
bool has_focus;
|
||||
};
|
||||
|
||||
#endif // D_GUI_H
|
74
src/main.cpp
Normal file
@ -0,0 +1,74 @@
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <irrlicht.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "viewer.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
Config *conf = new Config("../bin/config.ini");
|
||||
std::map<std::string, std::string> defaults = {
|
||||
{"model_mesh", "character.b3d"},
|
||||
{"model_position", "0,-10,0"},
|
||||
{"model_rotation", "0,0,0"},
|
||||
{"model_scale", "100"},
|
||||
{"model_material", "14"},
|
||||
{"model_texture_1", "character.png"},
|
||||
{"model_texture_2", "blank.png"},
|
||||
{"model_texture_3", "blank.png"},
|
||||
{"model_texture_4", "blank.png"},
|
||||
{"model_texture_5", "blank.png"},
|
||||
{"model_texture_6", "blank.png"},
|
||||
{"wield_mesh", "pickaxe.obj"},
|
||||
{"wield_position", "0,5,0"},
|
||||
{"wield_rotation", "0,0,0"},
|
||||
{"wield_scale", "400"},
|
||||
{"wield_material", "14"},
|
||||
{"wield_show", "true"},
|
||||
{"wield_bone", "Arm_Right"},
|
||||
{"wield_texture_1", "pickaxe.png"},
|
||||
{"wield_texture_2", "blank.png"},
|
||||
{"wield_texture_3", "blank.png"},
|
||||
{"wield_texture_4", "blank.png"},
|
||||
{"wield_texture_5", "blank.png"},
|
||||
{"wield_texture_6", "blank.png"},
|
||||
{"anim_start", "168"},
|
||||
{"anim_end", "187"},
|
||||
{"anim_speed", "15"},
|
||||
{"ortho", "false"},
|
||||
{"bilinear", "false"},
|
||||
{"trilinear", "false"},
|
||||
{"anisotropic", "false"},
|
||||
{"backface_cull", "true"},
|
||||
{"bg_color", "808080"},
|
||||
{"grid_color", "404040"},
|
||||
{"screen_width", "800"},
|
||||
{"screen_height","600"},
|
||||
{"debug_info", "false"},
|
||||
{"debug_flags", "1"},
|
||||
};
|
||||
conf->load();
|
||||
for (std::map<std::string, std::string>::iterator it = defaults.begin();
|
||||
it != defaults.end(); it++)
|
||||
{
|
||||
if (!conf->hasKey(it->first))
|
||||
conf->set(it->first, it->second);
|
||||
}
|
||||
conf->save();
|
||||
|
||||
u32 width = conf->getInt("screen_width");
|
||||
u32 height = conf->getInt("screen_height");
|
||||
IrrlichtDevice *device = createDevice(EDT_OPENGL,
|
||||
dimension2d<u32>(width, height), 16, false, false, false);
|
||||
|
||||
if (device && conf)
|
||||
{
|
||||
Viewer *viewer = new Viewer(conf);
|
||||
viewer->run(device);
|
||||
device->drop();
|
||||
delete viewer;
|
||||
delete conf;
|
||||
}
|
||||
return 1;
|
||||
}
|
320
src/scene.cpp
Normal file
@ -0,0 +1,320 @@
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <irrlicht.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "scene.h"
|
||||
|
||||
Scene::Scene(ISceneNode *parent, ISceneManager *smgr, s32 id) :
|
||||
ISceneNode(parent, smgr, id),
|
||||
conf(0),
|
||||
show_grid(true),
|
||||
show_axes(true)
|
||||
{
|
||||
material.Lighting = false;
|
||||
material.MaterialType = EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||
material.BackfaceCulling = false;
|
||||
grid_color = SColor(64,128,128,128);
|
||||
}
|
||||
|
||||
bool Scene::load(Config *config)
|
||||
{
|
||||
conf = config;
|
||||
if (!loadModelMesh(conf->getCStr("model_mesh")))
|
||||
return false;
|
||||
|
||||
setAttachment();
|
||||
loadWieldMesh(conf->getCStr("wield_mesh"));
|
||||
setBackFaceCulling(conf->getBool("backface_cull"));
|
||||
setGridColor(conf->getHex("grid_color"));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Scene::loadModelMesh(const io::path &filename)
|
||||
{
|
||||
if (!conf)
|
||||
return false;
|
||||
|
||||
IAnimatedMesh *mesh = SceneManager->getMesh(filename);
|
||||
if (!mesh)
|
||||
return false;
|
||||
|
||||
ISceneNode *wield = getNode(E_SCENE_ID_WIELD);
|
||||
if (wield)
|
||||
wield->setParent(this);
|
||||
|
||||
ISceneNode *model = getNode(E_SCENE_ID_MODEL);
|
||||
if (model)
|
||||
{
|
||||
model->remove();
|
||||
model = 0;
|
||||
}
|
||||
model = SceneManager->addAnimatedMeshSceneNode(mesh, this,
|
||||
E_SCENE_ID_MODEL);
|
||||
if (!model)
|
||||
return false;
|
||||
|
||||
Vector pos = conf->getVector("model_position");
|
||||
Vector rot = conf->getVector("model_rotation");
|
||||
f32 s = (f32)conf->getInt("model_scale") / 100;
|
||||
u32 mat = conf->getInt("model_material");
|
||||
|
||||
model->setMaterialFlag(EMF_LIGHTING, false);
|
||||
model->setPosition(vector3df(pos.x, pos.y, pos.z));
|
||||
model->setRotation(vector3df(rot.x, rot.y, rot.z));
|
||||
model->setScale(vector3df(s,s,s));
|
||||
model->setMaterialType((E_MATERIAL_TYPE)mat);
|
||||
model->setMaterialFlag(EMF_BILINEAR_FILTER,
|
||||
conf->getBool("bilinear"));
|
||||
model->setMaterialFlag(EMF_TRILINEAR_FILTER,
|
||||
conf->getBool("trilinear"));
|
||||
model->setMaterialFlag(EMF_ANISOTROPIC_FILTER,
|
||||
conf->getBool("anisotropic"));
|
||||
|
||||
setDebugInfo(conf->getBool("debug_info"));
|
||||
if (wield)
|
||||
setAttachment();
|
||||
|
||||
loadTextures(model, "model");
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Scene::loadWieldMesh(const io::path &filename)
|
||||
{
|
||||
if (!conf)
|
||||
return false;
|
||||
|
||||
IMesh *mesh = SceneManager->getMesh(filename);
|
||||
if (!mesh)
|
||||
return false;
|
||||
|
||||
ISceneNode *wield = getNode(E_SCENE_ID_WIELD);
|
||||
if (wield)
|
||||
{
|
||||
wield->remove();
|
||||
wield = 0;
|
||||
}
|
||||
wield = SceneManager->addMeshSceneNode(mesh, this,
|
||||
E_SCENE_ID_WIELD);
|
||||
|
||||
if (!wield)
|
||||
return false;
|
||||
|
||||
Vector pos = conf->getVector("wield_position");
|
||||
Vector rot = conf->getVector("wield_rotation");
|
||||
f32 s = (f32)conf->getInt("wield_scale") / 100;
|
||||
u32 mat = conf->getInt("wield_material");
|
||||
|
||||
wield->setMaterialFlag(EMF_LIGHTING, false);
|
||||
wield->setPosition(vector3df(pos.x, pos.y, pos.z));
|
||||
wield->setRotation(vector3df(rot.x, rot.y, rot.z));
|
||||
wield->setScale(vector3df(s,s,s));
|
||||
wield->setVisible(conf->getBool("wield_show"));
|
||||
wield->setMaterialType((E_MATERIAL_TYPE)mat);
|
||||
wield->setMaterialFlag(EMF_BILINEAR_FILTER,
|
||||
conf->getBool("bilinear"));
|
||||
wield->setMaterialFlag(EMF_TRILINEAR_FILTER,
|
||||
conf->getBool("trilinear"));
|
||||
wield->setMaterialFlag(EMF_ANISOTROPIC_FILTER,
|
||||
conf->getBool("anisotropic"));
|
||||
wield->setVisible(conf->getBool("wield_show"));
|
||||
|
||||
setAttachment();
|
||||
loadTextures(wield, "wield");
|
||||
return true;
|
||||
}
|
||||
|
||||
void Scene::loadTextures(ISceneNode *node, const std::string &prefix)
|
||||
{
|
||||
IVideoDriver *driver = SceneManager->getVideoDriver();
|
||||
for (u32 i = 0; i < node->getMaterialCount(); ++i)
|
||||
{
|
||||
std::string key = prefix + "_texture_" + std::to_string(i + 1);
|
||||
io::path fn = conf->getCStr(key);
|
||||
ITexture *texture = driver->getTexture(fn);
|
||||
if (texture)
|
||||
driver->removeTexture(texture);
|
||||
texture = driver->getTexture(fn);
|
||||
if (texture)
|
||||
{
|
||||
SMaterial &material = node->getMaterial(i);
|
||||
material.TextureLayer[0].Texture = texture;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ISceneNode *Scene::getNode(s32 id)
|
||||
{
|
||||
return SceneManager->getSceneNodeFromId(id);
|
||||
}
|
||||
|
||||
void Scene::setAttachment()
|
||||
{
|
||||
if (!conf)
|
||||
return;
|
||||
|
||||
IAnimatedMeshSceneNode *model =
|
||||
(IAnimatedMeshSceneNode*)getNode(E_SCENE_ID_MODEL);
|
||||
ISceneNode *wield = getNode(E_SCENE_ID_WIELD);
|
||||
if (!model || !wield)
|
||||
return;
|
||||
|
||||
IBoneSceneNode *bone = 0;
|
||||
if (model->getJointCount() > 0)
|
||||
{
|
||||
stringc wield_bone = conf->getCStr("wield_bone");
|
||||
bone = model->getJointNode(wield_bone.c_str());
|
||||
}
|
||||
if (bone)
|
||||
wield->setParent(bone);
|
||||
else
|
||||
wield->setParent(model);
|
||||
}
|
||||
|
||||
void Scene::setAnimation(const u32 &start, const u32 &end, const s32 &speed)
|
||||
{
|
||||
if (!conf)
|
||||
return;
|
||||
|
||||
IAnimatedMeshSceneNode *model =
|
||||
(IAnimatedMeshSceneNode*)getNode(E_SCENE_ID_MODEL);
|
||||
|
||||
if (model)
|
||||
{
|
||||
model->setFrameLoop(start, end);
|
||||
model->setAnimationSpeed(speed);
|
||||
}
|
||||
}
|
||||
|
||||
void Scene::setFilter(E_MATERIAL_FLAG flag, const bool &is_enabled)
|
||||
{
|
||||
ISceneNode *model = getNode(E_SCENE_ID_MODEL);
|
||||
if (model)
|
||||
model->setMaterialFlag(flag, is_enabled);
|
||||
|
||||
ISceneNode *wield = getNode(E_SCENE_ID_WIELD);
|
||||
if (wield)
|
||||
wield->setMaterialFlag(flag, is_enabled);
|
||||
}
|
||||
|
||||
void Scene::setBackFaceCulling(const bool &is_enabled)
|
||||
{
|
||||
ISceneNode *model = getNode(E_SCENE_ID_MODEL);
|
||||
if (model)
|
||||
model->setMaterialFlag(EMF_BACK_FACE_CULLING, is_enabled);
|
||||
|
||||
ISceneNode *wield = getNode(E_SCENE_ID_WIELD);
|
||||
if (wield)
|
||||
wield->setMaterialFlag(EMF_BACK_FACE_CULLING, is_enabled);
|
||||
}
|
||||
|
||||
void Scene::setDebugInfo(const bool &is_visible)
|
||||
{
|
||||
ISceneNode *model = getNode(E_SCENE_ID_MODEL);
|
||||
if (model)
|
||||
{
|
||||
u32 state = (is_visible) ? conf->getInt("debug_flags") : EDS_OFF;
|
||||
model->setDebugDataVisible(state);
|
||||
}
|
||||
}
|
||||
|
||||
void Scene::rotate(s32 axis, const s32 &step)
|
||||
{
|
||||
vector3df rot = getRotation();
|
||||
switch (axis)
|
||||
{
|
||||
case E_SCENE_AXIS_X:
|
||||
rot.X = int(rot.X / step) * step + step;
|
||||
break;
|
||||
case E_SCENE_AXIS_Y:
|
||||
rot.Y = int(rot.Y / step) * step + step;
|
||||
break;
|
||||
case E_SCENE_AXIS_Z:
|
||||
rot.Z = int(rot.Z / step) * step + step;
|
||||
break;
|
||||
}
|
||||
setRotation(rot);
|
||||
}
|
||||
|
||||
void Scene::refresh()
|
||||
{
|
||||
ISceneNode *model = getNode(E_SCENE_ID_MODEL);
|
||||
if (model)
|
||||
loadTextures(model, "model");
|
||||
ISceneNode *wield = getNode(E_SCENE_ID_WIELD);
|
||||
if (wield)
|
||||
loadTextures(wield, "wield");
|
||||
}
|
||||
|
||||
void Scene::jump()
|
||||
{
|
||||
// quick and dirty jump animation to test attachment inertia
|
||||
// this should eventually be improved or removed
|
||||
ISceneNode *model = getNode(E_SCENE_ID_MODEL);
|
||||
if (!model)
|
||||
return;
|
||||
|
||||
Vector p = conf->getVector("model_position");
|
||||
vector3df start = vector3df(p.x,p.y,p.z);
|
||||
vector3df end = start + vector3df(0,10,0);
|
||||
ISceneNodeAnimator *anim =
|
||||
SceneManager->createFlyStraightAnimator(start, end, 380, false, true);
|
||||
model->removeAnimators();
|
||||
model->addAnimator(anim);
|
||||
anim->drop();
|
||||
}
|
||||
|
||||
void Scene::OnRegisterSceneNode()
|
||||
{
|
||||
if (IsVisible)
|
||||
SceneManager->registerNodeForRendering(this);
|
||||
|
||||
ISceneNode::OnRegisterSceneNode();
|
||||
}
|
||||
|
||||
void Scene::render()
|
||||
{
|
||||
if (!show_grid)
|
||||
return;
|
||||
|
||||
IVideoDriver *driver = SceneManager->getVideoDriver();
|
||||
driver->setMaterial(material);
|
||||
driver->setTransform(ETS_WORLD, AbsoluteTransformation);
|
||||
|
||||
SColor grid = grid_color;
|
||||
grid.setAlpha(64);
|
||||
for (f32 n = -10; n <= 10; n += 2)
|
||||
{
|
||||
driver->draw3DLine(vector3df(n,0,-10), vector3df(n,-0,10), grid);
|
||||
driver->draw3DLine(vector3df(-10,0,n), vector3df(10,-0,n), grid);
|
||||
}
|
||||
if (!show_axes)
|
||||
return;
|
||||
|
||||
SColor red(128,255,0,0);
|
||||
SColor green(128,0,255,0);
|
||||
SColor blue(128,0,0,255);
|
||||
|
||||
driver->draw3DLine(vector3df(-10,0,-10), vector3df(-8,0,-10), red);
|
||||
driver->draw3DLine(vector3df(-8,0,-10), vector3df(-8.5,0,-9.8), red);
|
||||
driver->draw3DLine(vector3df(-8,0,-10), vector3df(-8.5,0,-10.2), red);
|
||||
|
||||
driver->draw3DLine(vector3df(-10,0,-10), vector3df(-10,2,-10), green);
|
||||
driver->draw3DLine(vector3df(-10,2,-10), vector3df(-9.8,1.5,-10), green);
|
||||
driver->draw3DLine(vector3df(-10,2,-10), vector3df(-10.2,1.5,-10), green);
|
||||
|
||||
driver->draw3DLine(vector3df(-10,0,-10), vector3df(-10,0,-8), blue);
|
||||
driver->draw3DLine(vector3df(-10,0,-8), vector3df(-9.8,0,-8.5), blue);
|
||||
driver->draw3DLine(vector3df(-10,0,-8), vector3df(-10.2,0,-8.5), blue);
|
||||
|
||||
IGUIEnvironment *env = SceneManager->getGUIEnvironment();
|
||||
IGUIFont *font = env->getFont("fontlucida.png");
|
||||
if (font)
|
||||
{
|
||||
s32 btm = driver->getScreenSize().Height;
|
||||
s32 top = btm - 20;
|
||||
font->draw(L"X", rect<s32>(5,top,15,btm), red);
|
||||
font->draw(L"Y", rect<s32>(15,top,25,btm), green);
|
||||
font->draw(L"Z", rect<s32>(25,top,35,btm), blue);
|
||||
}
|
||||
}
|
64
src/scene.h
Normal file
@ -0,0 +1,64 @@
|
||||
#ifndef D_SCENE_H
|
||||
#define D_SCENE_H
|
||||
|
||||
enum
|
||||
{
|
||||
E_SCENE_ID,
|
||||
E_SCENE_ID_MODEL,
|
||||
E_SCENE_ID_WIELD
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
E_SCENE_AXIS_X,
|
||||
E_SCENE_AXIS_Y,
|
||||
E_SCENE_AXIS_Z
|
||||
};
|
||||
|
||||
using namespace irr;
|
||||
using namespace core;
|
||||
using namespace scene;
|
||||
using namespace gui;
|
||||
using namespace video;
|
||||
|
||||
class Config;
|
||||
|
||||
class Scene : public ISceneNode
|
||||
{
|
||||
public:
|
||||
Scene(ISceneNode *parent, ISceneManager *mgr, s32 id);
|
||||
~Scene() {}
|
||||
bool load(Config *config);
|
||||
bool loadModelMesh(const io::path &filename);
|
||||
bool loadWieldMesh(const io::path &filename);
|
||||
ISceneNode *getNode(s32 id);
|
||||
void setAttachment();
|
||||
void setAnimation(const u32 &start, const u32 &end, const s32 &speed);
|
||||
void setFilter(E_MATERIAL_FLAG flag, const bool &is_enabled);
|
||||
void setBackFaceCulling(const bool &is_enabled);
|
||||
void setGridColor(SColor color) { grid_color = color; }
|
||||
void setGridVisible(const bool &is_visible) { show_grid = is_visible; }
|
||||
void setAxesVisible(const bool &is_visible) { show_axes = is_visible; }
|
||||
void setDebugInfo(const bool &is_visible);
|
||||
void rotate(s32 axis, const s32 &step);
|
||||
void refresh();
|
||||
void jump();
|
||||
|
||||
virtual void OnRegisterSceneNode();
|
||||
virtual const aabbox3d<f32> &getBoundingBox() const { return box; }
|
||||
virtual SMaterial &getMaterial(u32 i) { return material; }
|
||||
virtual u32 getMaterialCount() const { return 1; }
|
||||
virtual void render();
|
||||
|
||||
private:
|
||||
void loadTextures(ISceneNode *node, const std::string &prefix);
|
||||
|
||||
Config *conf;
|
||||
bool show_grid;
|
||||
bool show_axes;
|
||||
SColor grid_color;
|
||||
aabbox3d<f32> box;
|
||||
SMaterial material;
|
||||
};
|
||||
|
||||
#endif // D_SCENE_H
|
84
src/trackball.cpp
Normal file
@ -0,0 +1,84 @@
|
||||
#include <math.h>
|
||||
#include <irrlicht.h>
|
||||
|
||||
#include "trackball.h"
|
||||
|
||||
Trackball::Trackball(const u32 &width, const u32 &height) :
|
||||
is_clicked(false),
|
||||
is_moving(false)
|
||||
{
|
||||
transform.makeIdentity();
|
||||
setBounds(width, height);
|
||||
}
|
||||
|
||||
vector3df Trackball::getVector(const position2df &pos) const
|
||||
{
|
||||
vector3df vect;
|
||||
vect.X = 1.0 * pos.X / screen.Width * 2 - 1.0;
|
||||
vect.Y = 1.0 * pos.Y / screen.Height * 2 - 1.0;
|
||||
vect.Z = 0;
|
||||
|
||||
f32 len = vect.X * vect.X + vect.Y * vect.Y;
|
||||
if (len > 1.0f)
|
||||
vect.normalize();
|
||||
else
|
||||
vect.Z = -sqrt(1.0f - len);
|
||||
|
||||
return vect;
|
||||
}
|
||||
|
||||
void Trackball::setBounds(const u32 &width, const u32 &height)
|
||||
{
|
||||
screen = dimension2di(width, height);
|
||||
}
|
||||
|
||||
void Trackball::setDragPos(const s32 &x, const s32 &y)
|
||||
{
|
||||
drag_pos = position2df(x, y);
|
||||
}
|
||||
|
||||
void Trackball::animateNode(ISceneNode *node, u32 timeMs)
|
||||
{
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
if (!is_moving)
|
||||
{
|
||||
if (is_clicked)
|
||||
{
|
||||
is_moving = true;
|
||||
transform = node->getAbsoluteTransformation();
|
||||
drag_start = drag_pos;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_clicked)
|
||||
{
|
||||
matrix4 rotation;
|
||||
quaternion quat;
|
||||
vector3df start = getVector(drag_start);
|
||||
vector3df end = getVector(drag_pos);
|
||||
vector3df perp = start.crossProduct(end);
|
||||
if (iszero(perp.getLength()))
|
||||
{
|
||||
quat.makeIdentity();
|
||||
}
|
||||
else
|
||||
{
|
||||
quat.X = perp.X;
|
||||
quat.Y = perp.Y;
|
||||
quat.Z = perp.Z;
|
||||
quat.W = start.dotProduct(end);
|
||||
}
|
||||
quat.getMatrix(rotation);
|
||||
rotation *= transform;
|
||||
node->setRotation(rotation.getRotationDegrees());
|
||||
node->updateAbsolutePosition();
|
||||
}
|
||||
else
|
||||
{
|
||||
is_moving = false;
|
||||
}
|
||||
}
|
||||
}
|
33
src/trackball.h
Normal file
@ -0,0 +1,33 @@
|
||||
#ifndef D_TRACKBALL_H
|
||||
#define D_TRACKBALL_H
|
||||
|
||||
using namespace irr;
|
||||
using namespace core;
|
||||
using namespace scene;
|
||||
|
||||
class Trackball : public ISceneNodeAnimator
|
||||
{
|
||||
public:
|
||||
Trackball(const u32 &width, const u32 &height);
|
||||
~Trackball(void) {}
|
||||
void setBounds(const u32 &width, const u32 &height);
|
||||
void setDragPos(const s32 &x, const s32 &y);
|
||||
void click() { is_clicked = true; }
|
||||
void release() { is_clicked = false; }
|
||||
bool isClicked() const { return is_clicked; }
|
||||
virtual void animateNode(ISceneNode *node, u32 timeMs);
|
||||
virtual ISceneNodeAnimator *createClone(ISceneNode *node,
|
||||
ISceneManager *newManager = 0) { return 0; }
|
||||
|
||||
private:
|
||||
vector3df getVector(const position2df &pos) const;
|
||||
|
||||
bool is_clicked;
|
||||
bool is_moving;
|
||||
position2df drag_start;
|
||||
position2df drag_pos;
|
||||
dimension2di screen;
|
||||
matrix4 transform;
|
||||
};
|
||||
|
||||
#endif // D_TRACKBALL_H
|
640
src/viewer.cpp
Normal file
@ -0,0 +1,640 @@
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <irrlicht.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "scene.h"
|
||||
#include "trackball.h"
|
||||
#include "gui.h"
|
||||
#include "dialog.h"
|
||||
#include "viewer.h"
|
||||
|
||||
#define M_ZOOM_IN(fov) std::max(fov - DEGTORAD * 2, PI * 0.0125f)
|
||||
#define M_ZOOM_OUT(fov) std::min(fov + DEGTORAD * 2, PI * 0.5f)
|
||||
|
||||
Viewer::Viewer(Config *conf) :
|
||||
conf(conf),
|
||||
device(0),
|
||||
camera(0),
|
||||
scene(0),
|
||||
trackball(0),
|
||||
gui(0),
|
||||
animation(0)
|
||||
{}
|
||||
|
||||
Viewer::~Viewer()
|
||||
{
|
||||
if (scene)
|
||||
scene->drop();
|
||||
if (trackball)
|
||||
delete trackball;
|
||||
if (gui)
|
||||
delete gui;
|
||||
if (animation)
|
||||
delete animation;
|
||||
}
|
||||
|
||||
bool Viewer::run(IrrlichtDevice *irr_device)
|
||||
{
|
||||
device = irr_device;
|
||||
device->getFileSystem()->addFileArchive("../assets/");
|
||||
device->getFileSystem()->addFileArchive("../media/");
|
||||
device->getFileSystem()->changeWorkingDirectoryTo("../media/");
|
||||
device->setEventReceiver(this);
|
||||
|
||||
IVideoDriver *driver = device->getVideoDriver();
|
||||
ISceneManager *smgr = device->getSceneManager();
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
|
||||
screen = driver->getScreenSize();
|
||||
trackball = new Trackball(screen.Width, screen.Height);
|
||||
scene = new Scene(smgr->getRootSceneNode(), smgr, E_SCENE_ID);
|
||||
scene->addAnimator(trackball);
|
||||
|
||||
gui = new GUI(device, conf);
|
||||
gui->initMenu();
|
||||
gui->initToolBar();
|
||||
|
||||
if (!scene->load(conf))
|
||||
return false;
|
||||
|
||||
animation = new AnimState(env);
|
||||
animation->load(scene->getNode(E_SCENE_ID_MODEL));
|
||||
animation->setField(E_GUI_ID_ANIM_START, conf->getInt("anim_start"));
|
||||
animation->setField(E_GUI_ID_ANIM_END, conf->getInt("anim_end"));
|
||||
animation->setField(E_GUI_ID_ANIM_SPEED, conf->getInt("anim_speed"));
|
||||
animation->setField(E_GUI_ID_ANIM_FRAME, conf->getInt("anim_start"));
|
||||
scene->setAnimation(conf->getInt("anim_start"),
|
||||
conf->getInt("anim_start"), conf->getInt("anim_speed"));
|
||||
|
||||
camera = smgr->addCameraSceneNode(0, vector3df(0,0,30), vector3df(0,0,0));
|
||||
fov = camera->getFOV();
|
||||
fov_home = fov;
|
||||
jump_time = 0;
|
||||
|
||||
setCaptionFileName(conf->getCStr("model_mesh"));
|
||||
setBackgroundColor(conf->getHex("bg_color"));
|
||||
setProjection();
|
||||
|
||||
while (device->run())
|
||||
{
|
||||
resize();
|
||||
driver->beginScene(true, true, bg_color);
|
||||
smgr->drawAll();
|
||||
env->drawAll();
|
||||
driver->endScene();
|
||||
animation->update(scene->getNode(E_SCENE_ID_MODEL));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void Viewer::resize()
|
||||
{
|
||||
IVideoDriver *driver = device->getVideoDriver();
|
||||
dimension2du dim = driver->getScreenSize();
|
||||
if (screen == dim)
|
||||
return;
|
||||
|
||||
const vector2di move = vector2di(dim.Width - screen.Width, 0);
|
||||
gui->moveElement(E_GUI_ID_TOOLBOX_MODEL, move);
|
||||
gui->moveElement(E_GUI_ID_ANIM_CTRL, move);
|
||||
|
||||
screen = dim;
|
||||
trackball->setBounds(screen.Width, screen.Height);
|
||||
camera->setAspectRatio((f32)screen.Width / (f32)screen.Height);
|
||||
setProjection();
|
||||
}
|
||||
|
||||
void Viewer::setProjection()
|
||||
{
|
||||
f32 width = (f32)screen.Width * fov / 20.0f;
|
||||
f32 height = (f32)screen.Height * fov / 20.0f;
|
||||
ortho.buildProjectionMatrixOrthoLH(width, height, 1.0f, 1000.f);
|
||||
|
||||
if (conf->getBool("ortho"))
|
||||
camera->setProjectionMatrix(ortho, true);
|
||||
else
|
||||
camera->setFOV(fov);
|
||||
}
|
||||
|
||||
void Viewer::setBackgroundColor(const u32 &color)
|
||||
{
|
||||
bg_color.color = color;
|
||||
bg_color.setAlpha(255);
|
||||
}
|
||||
|
||||
void Viewer::setCaptionFileName(const io::path &filename)
|
||||
{
|
||||
io::IFileSystem *fs = device->getFileSystem();
|
||||
stringw caption = fs->getFileBasename(filename) + L" - SAM-Viewer";
|
||||
device->setWindowCaption(caption.c_str());
|
||||
}
|
||||
|
||||
static inline std::string boolToString(bool b)
|
||||
{
|
||||
return (b) ? "true" : "false";
|
||||
}
|
||||
|
||||
static inline std::string vectorToString(vector3df v)
|
||||
{
|
||||
std::ostringstream ss;
|
||||
ss << v.X << "," << v.Y << "," << v.Z;
|
||||
std::string str(ss.str());
|
||||
return str;
|
||||
}
|
||||
|
||||
bool Viewer::OnEvent(const SEvent &event)
|
||||
{
|
||||
if (event.EventType == EET_GUI_EVENT)
|
||||
{
|
||||
if (event.GUIEvent.EventType == EGET_MENU_ITEM_SELECTED)
|
||||
{
|
||||
IGUIContextMenu *menu = (IGUIContextMenu*)event.GUIEvent.Caller;
|
||||
s32 item = menu->getSelectedItem();
|
||||
s32 id = menu->getItemCommandId(item);
|
||||
IGUIEnvironment *env = device->getGUIEnvironment();
|
||||
switch (id)
|
||||
{
|
||||
case E_GUI_ID_LOAD_MODEL_MESH:
|
||||
env->addFileOpenDialog(L"Open main model file", true, 0,
|
||||
E_GUI_ID_LOAD_MODEL_MESH);
|
||||
break;
|
||||
case E_GUI_ID_LOAD_WIELD_MESH:
|
||||
env->addFileOpenDialog(L"Open wield model file", true, 0,
|
||||
E_GUI_ID_LOAD_WIELD_MESH);
|
||||
break;
|
||||
case E_GUI_ID_ENABLE_WIELD:
|
||||
{
|
||||
ISceneNode *wield = scene->getNode(E_SCENE_ID_WIELD);
|
||||
if (wield)
|
||||
{
|
||||
wield->setVisible(menu->isItemChecked(item));
|
||||
conf->set("wield_show",
|
||||
boolToString(menu->isItemChecked(item)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_QUIT:
|
||||
device->closeDevice();
|
||||
break;
|
||||
case E_GUI_ID_TEXTURES_DIALOG:
|
||||
gui->showTexturesDialog();
|
||||
break;
|
||||
case E_GUI_ID_SETTINGS_DIALOG:
|
||||
gui->showSettingsDialog();
|
||||
break;
|
||||
case E_GUI_ID_TOOLBOX_MODEL:
|
||||
{
|
||||
if (menu->isItemChecked(item))
|
||||
gui->showToolBox(E_GUI_ID_TOOLBOX_MODEL);
|
||||
else
|
||||
gui->closeToolBox(E_GUI_ID_TOOLBOX_MODEL);
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_TOOLBOX_WIELD:
|
||||
{
|
||||
if (menu->isItemChecked(item))
|
||||
gui->showToolBox(E_GUI_ID_TOOLBOX_WIELD);
|
||||
else
|
||||
gui->closeToolBox(E_GUI_ID_TOOLBOX_WIELD);
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_SHOW_GRID:
|
||||
scene->setGridVisible(menu->isItemChecked(item));
|
||||
menu->setItemEnabled(item + 1, menu->isItemChecked(item));
|
||||
break;
|
||||
case E_GUI_ID_SHOW_AXES:
|
||||
scene->setAxesVisible(menu->isItemChecked(item));
|
||||
break;
|
||||
case E_GUI_ID_BILINEAR:
|
||||
scene->setFilter(EMF_BILINEAR_FILTER,
|
||||
menu->isItemChecked(item));
|
||||
conf->set("bilinear",
|
||||
boolToString(menu->isItemChecked(item)));
|
||||
break;
|
||||
case E_GUI_ID_TRILINEAR:
|
||||
scene->setFilter(EMF_TRILINEAR_FILTER,
|
||||
menu->isItemChecked(item));
|
||||
conf->set("trilinear",
|
||||
boolToString(menu->isItemChecked(item)));
|
||||
break;
|
||||
case E_GUI_ID_ANISOTROPIC:
|
||||
scene->setFilter(EMF_ANISOTROPIC_FILTER,
|
||||
menu->isItemChecked(item));
|
||||
conf->set("anisotropic",
|
||||
boolToString(menu->isItemChecked(item)));
|
||||
break;
|
||||
case E_GUI_ID_PERSPECTIVE:
|
||||
menu->setItemChecked(item + 1, !menu->isItemChecked(item));
|
||||
conf->set("ortho", boolToString(!menu->isItemChecked(item)));
|
||||
setProjection();
|
||||
break;
|
||||
case E_GUI_ID_ORTHOGONAL:
|
||||
menu->setItemChecked(item - 1, !menu->isItemChecked(item));
|
||||
conf->set("ortho", boolToString(menu->isItemChecked(item)));
|
||||
setProjection();
|
||||
break;
|
||||
case E_GUI_ID_BACK_FACE_CULL:
|
||||
scene->setBackFaceCulling(menu->isItemChecked(item));
|
||||
conf->set("backface_cull",
|
||||
boolToString(menu->isItemChecked(item)));
|
||||
break;
|
||||
case E_GUI_ID_DEBUG_INFO:
|
||||
scene->setDebugInfo(menu->isItemChecked(item));
|
||||
conf->set("debug_info",
|
||||
boolToString(menu->isItemChecked(item)));
|
||||
break;
|
||||
case E_DIALOG_ID_ABOUT:
|
||||
gui->showAboutDialog();
|
||||
break;
|
||||
case E_GUI_ID_SAVE_CONFIG:
|
||||
{
|
||||
ISceneNode *model = scene->getNode(E_SCENE_ID_MODEL);
|
||||
if (model)
|
||||
{
|
||||
conf->set("model_position",
|
||||
vectorToString(model->getPosition()));
|
||||
conf->set("model_rotation",
|
||||
vectorToString(model->getRotation()));
|
||||
conf->set("model_scale",
|
||||
std::to_string(model->getScale().Y * 100));
|
||||
conf->set("model_material",
|
||||
std::to_string(model->getMaterial(0).MaterialType));
|
||||
}
|
||||
ISceneNode *wield = scene->getNode(E_SCENE_ID_WIELD);
|
||||
if (wield)
|
||||
{
|
||||
conf->set("wield_position",
|
||||
vectorToString(wield->getPosition()));
|
||||
conf->set("wield_rotation",
|
||||
vectorToString(wield->getRotation()));
|
||||
conf->set("wield_scale",
|
||||
std::to_string(wield->getScale().Y * 100));
|
||||
conf->set("wield_material",
|
||||
std::to_string(wield->getMaterial(0).MaterialType));
|
||||
}
|
||||
conf->set("anim_start",
|
||||
std::to_string(animation->getField(E_GUI_ID_ANIM_START)));
|
||||
conf->set("anim_end",
|
||||
std::to_string(animation->getField(E_GUI_ID_ANIM_END)));
|
||||
conf->set("anim_speed",
|
||||
std::to_string(animation->getField(E_GUI_ID_ANIM_SPEED)));
|
||||
conf->save();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_FILE_SELECTED)
|
||||
{
|
||||
IGUIFileOpenDialog *dialog =
|
||||
(IGUIFileOpenDialog*)event.GUIEvent.Caller;
|
||||
|
||||
stringc fn = stringc(dialog->getFileName()).c_str();
|
||||
if (!fn.empty())
|
||||
{
|
||||
s32 id = dialog->getID();
|
||||
switch (id)
|
||||
{
|
||||
case E_GUI_ID_LOAD_MODEL_MESH:
|
||||
{
|
||||
if (scene->loadModelMesh(fn))
|
||||
{
|
||||
ISceneNode *model = scene->getNode(E_SCENE_ID_MODEL);
|
||||
if (model)
|
||||
{
|
||||
animation->load(model);
|
||||
setCaptionFileName(fn);
|
||||
gui->reloadToolBox(E_GUI_ID_TOOLBOX_MODEL);
|
||||
conf->set("model_mesh", fn.c_str());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_LOAD_WIELD_MESH:
|
||||
{
|
||||
if (scene->loadWieldMesh(fn))
|
||||
{
|
||||
gui->reloadToolBox(E_GUI_ID_TOOLBOX_WIELD);
|
||||
conf->set("wield_mesh", fn.c_str());
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
gui->setFocused(false);
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_FILE_CHOOSE_DIALOG_CANCELLED)
|
||||
{
|
||||
gui->setFocused(false);
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_ELEMENT_CLOSED)
|
||||
{
|
||||
IGUIContextMenu *menu =
|
||||
(IGUIContextMenu*)gui->getElement(E_GUI_ID_MENU);
|
||||
if (menu)
|
||||
{
|
||||
s32 id = event.GUIEvent.Caller->getID();
|
||||
if (id == E_GUI_ID_TOOLBOX_MODEL)
|
||||
menu->getSubMenu(2)->setItemChecked(0, false);
|
||||
else if (id == E_GUI_ID_TOOLBOX_WIELD)
|
||||
menu->getSubMenu(2)->setItemChecked(1, false);
|
||||
}
|
||||
gui->setFocused(false);
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
|
||||
{
|
||||
s32 id = event.GUIEvent.Caller->getID();
|
||||
switch (id)
|
||||
{
|
||||
case E_GUI_ID_SKIP_REV:
|
||||
scene->setAnimation(
|
||||
animation->getField(E_GUI_ID_ANIM_START),
|
||||
animation->getField(E_GUI_ID_ANIM_START),
|
||||
animation->getField(E_GUI_ID_ANIM_SPEED));
|
||||
animation->setState(E_ANIM_STATE_PAUSED);
|
||||
gui->setFocused(false);
|
||||
break;
|
||||
case E_GUI_ID_PLAY_REV:
|
||||
scene->setAnimation(
|
||||
animation->getField(E_GUI_ID_ANIM_START),
|
||||
animation->getField(E_GUI_ID_ANIM_END),
|
||||
-animation->getField(E_GUI_ID_ANIM_SPEED));
|
||||
animation->setState(E_ANIM_STATE_PLAY_REV);
|
||||
gui->setFocused(false);
|
||||
break;
|
||||
case E_GUI_ID_PAUSE:
|
||||
scene->setAnimation(
|
||||
animation->getFrame(),
|
||||
animation->getFrame(),
|
||||
animation->getField(E_GUI_ID_ANIM_SPEED));
|
||||
animation->setState(E_ANIM_STATE_PAUSED);
|
||||
gui->setFocused(false);
|
||||
break;
|
||||
case E_GUI_ID_PLAY_FWD:
|
||||
scene->setAnimation(
|
||||
animation->getField(E_GUI_ID_ANIM_START),
|
||||
animation->getField(E_GUI_ID_ANIM_END),
|
||||
animation->getField(E_GUI_ID_ANIM_SPEED));
|
||||
animation->setState(E_ANIM_STATE_PLAY_FWD);
|
||||
gui->setFocused(false);
|
||||
break;
|
||||
case E_GUI_ID_SKIP_FWD:
|
||||
scene->setAnimation(
|
||||
animation->getField(E_GUI_ID_ANIM_END),
|
||||
animation->getField(E_GUI_ID_ANIM_END),
|
||||
animation->getField(E_GUI_ID_ANIM_SPEED));
|
||||
animation->setState(E_ANIM_STATE_PAUSED);
|
||||
gui->setFocused(false);
|
||||
break;
|
||||
case E_DIALOG_ID_SETTINGS_OK:
|
||||
event.GUIEvent.Caller->getParent()->getParent()->remove();
|
||||
gui->setFocused(false);
|
||||
setBackgroundColor(conf->getHex("bg_color"));
|
||||
scene->setGridColor(conf->getHex("grid_color"));
|
||||
scene->setAttachment();
|
||||
scene->setDebugInfo(conf->getBool("debug_info"));
|
||||
break;
|
||||
case E_DIALOG_ID_SETTINGS_CANCEL:
|
||||
event.GUIEvent.Caller->getParent()->getParent()->remove();
|
||||
gui->setFocused(false);
|
||||
break;
|
||||
case E_DIALOG_ID_ABOUT_OK:
|
||||
case E_DIALOG_ID_TEXTURES_OK:
|
||||
case E_DIALOG_ID_TEXTURES_CANCEL:
|
||||
event.GUIEvent.Caller->getParent()->getParent()->remove();
|
||||
gui->setFocused(false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_SPINBOX_CHANGED)
|
||||
{
|
||||
s32 id = event.GUIEvent.Caller->getID();
|
||||
switch (id)
|
||||
{
|
||||
case E_GUI_ID_ANIM_START:
|
||||
case E_GUI_ID_ANIM_END:
|
||||
{
|
||||
if (animation->getState() != E_ANIM_STATE_PAUSED)
|
||||
{
|
||||
IAnimatedMeshSceneNode *model = (IAnimatedMeshSceneNode*)
|
||||
scene->getNode(E_SCENE_ID_MODEL);
|
||||
scene->setAnimation(
|
||||
animation->getField(E_GUI_ID_ANIM_START),
|
||||
animation->getField(E_GUI_ID_ANIM_END),
|
||||
model->getAnimationSpeed());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_ANIM_SPEED:
|
||||
{
|
||||
IAnimatedMeshSceneNode *model = (IAnimatedMeshSceneNode*)
|
||||
scene->getNode(E_SCENE_ID_MODEL);
|
||||
s32 speed = animation->getField(E_GUI_ID_ANIM_SPEED);
|
||||
if (animation->getState() == E_ANIM_STATE_PLAY_REV)
|
||||
speed = -speed;
|
||||
|
||||
model->setAnimationSpeed(speed);
|
||||
break;
|
||||
}
|
||||
case E_GUI_ID_ANIM_FRAME:
|
||||
{
|
||||
if (animation->getState() == E_ANIM_STATE_PAUSED)
|
||||
{
|
||||
u32 frame = animation->getField(E_GUI_ID_ANIM_FRAME);
|
||||
scene->setAnimation(frame, frame,
|
||||
animation->getField(E_GUI_ID_ANIM_SPEED));
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
|
||||
{
|
||||
gui->setFocused(false);
|
||||
}
|
||||
else if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUSED)
|
||||
{
|
||||
gui->setFocused(true);
|
||||
trackball->release();
|
||||
}
|
||||
}
|
||||
else if (event.EventType == EET_KEY_INPUT_EVENT &&
|
||||
event.KeyInput.PressedDown)
|
||||
{
|
||||
switch (event.KeyInput.Key)
|
||||
{
|
||||
case KEY_HOME:
|
||||
{
|
||||
scene->setRotation(vector3df(0,0,0));
|
||||
fov = fov_home;
|
||||
setProjection();
|
||||
break;
|
||||
}
|
||||
case KEY_SPACE:
|
||||
{
|
||||
u32 now_time = device->getTimer()->getTime() + 1000;
|
||||
if (jump_time + 800 < now_time)
|
||||
{
|
||||
jump_time = now_time;
|
||||
scene->jump();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case KEY_LEFT:
|
||||
scene->rotate(E_SCENE_AXIS_Y, 15);
|
||||
break;
|
||||
case KEY_RIGHT:
|
||||
scene->rotate(E_SCENE_AXIS_Y, -15);
|
||||
break;
|
||||
case KEY_UP:
|
||||
scene->rotate(E_SCENE_AXIS_X, -15);
|
||||
break;
|
||||
case KEY_DOWN:
|
||||
scene->rotate(E_SCENE_AXIS_X, 15);
|
||||
break;
|
||||
case KEY_KEY_Z:
|
||||
scene->rotate(E_SCENE_AXIS_Z, -15);
|
||||
break;
|
||||
case KEY_KEY_X:
|
||||
scene->rotate(E_SCENE_AXIS_Z, 15);
|
||||
break;
|
||||
case KEY_PLUS:
|
||||
fov = M_ZOOM_IN(fov);
|
||||
setProjection();
|
||||
break;
|
||||
case KEY_MINUS:
|
||||
fov = M_ZOOM_OUT(fov);
|
||||
setProjection();
|
||||
break;
|
||||
case KEY_F5:
|
||||
scene->refresh();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (event.EventType == EET_MOUSE_INPUT_EVENT && !gui->getFocused())
|
||||
{
|
||||
switch (event.MouseInput.Event)
|
||||
{
|
||||
case EMIE_LMOUSE_LEFT_UP:
|
||||
trackball->release();
|
||||
break;
|
||||
case EMIE_MOUSE_MOVED:
|
||||
{
|
||||
if (event.MouseInput.isLeftPressed() && !trackball->isClicked())
|
||||
trackball->click();
|
||||
|
||||
trackball->setDragPos(event.MouseInput.X, event.MouseInput.Y);
|
||||
break;
|
||||
|
||||
}
|
||||
case EMIE_MOUSE_WHEEL:
|
||||
{
|
||||
if (event.MouseInput.Wheel < 0)
|
||||
fov = M_ZOOM_OUT(fov);
|
||||
else
|
||||
fov = M_ZOOM_IN(fov);
|
||||
setProjection();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
AnimState::AnimState(IGUIEnvironment *env) :
|
||||
env(env),
|
||||
frame(0),
|
||||
max(0),
|
||||
state(E_ANIM_STATE_PAUSED)
|
||||
{}
|
||||
|
||||
void AnimState::load(ISceneNode *node)
|
||||
{
|
||||
IAnimatedMeshSceneNode *model = (IAnimatedMeshSceneNode*)node;
|
||||
if (!model)
|
||||
return;
|
||||
|
||||
IGUIToolBar *toolbar = getToolBar();
|
||||
if (!toolbar)
|
||||
return;
|
||||
|
||||
max = model->getEndFrame();
|
||||
model->setFrameLoop(0, 0);
|
||||
state = E_ANIM_STATE_PAUSED;
|
||||
|
||||
setField(E_GUI_ID_ANIM_START, 0);
|
||||
setField(E_GUI_ID_ANIM_END, max);
|
||||
setField(E_GUI_ID_ANIM_FRAME, 0);
|
||||
|
||||
bool enabled = (max > 0);
|
||||
const list<IGUIElement*> &children = toolbar->getChildren();
|
||||
list<IGUIElement*>::ConstIterator iter = children.begin();
|
||||
while (iter != children.end())
|
||||
{
|
||||
if ((*iter)->getID() == E_GUI_ID_ANIM_CTRL)
|
||||
{
|
||||
AnimCtrl *anim = (AnimCtrl*)(*iter);
|
||||
anim->reset(enabled);
|
||||
if (enabled)
|
||||
{
|
||||
IGUIButton *button =
|
||||
(IGUIButton*)anim->getElementFromId(E_GUI_ID_PAUSE, true);
|
||||
button->setPressed(true);
|
||||
}
|
||||
}
|
||||
else if ((*iter)->getType() != EGUIET_STATIC_TEXT)
|
||||
{
|
||||
(*iter)->setEnabled(enabled);
|
||||
}
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
||||
void AnimState::update(ISceneNode *node)
|
||||
{
|
||||
IAnimatedMeshSceneNode *model = (IAnimatedMeshSceneNode*)node;
|
||||
frame = model->getFrameNr();
|
||||
setField(E_GUI_ID_ANIM_FRAME, frame);
|
||||
}
|
||||
|
||||
IGUIToolBar *AnimState::getToolBar()
|
||||
{
|
||||
IGUIElement *root = env->getRootGUIElement();
|
||||
return (IGUIToolBar*)root->getElementFromId(E_GUI_ID_TOOLBAR, true);
|
||||
}
|
||||
|
||||
u32 AnimState::getField(s32 id)
|
||||
{
|
||||
IGUIToolBar *toolbar = getToolBar();
|
||||
if (!toolbar)
|
||||
return 0;
|
||||
|
||||
IGUISpinBox *spin;
|
||||
spin = (IGUISpinBox*)toolbar->getElementFromId(id, true);
|
||||
return spin->getValue();
|
||||
}
|
||||
|
||||
void AnimState::setField(s32 id, const u32 &value)
|
||||
{
|
||||
IGUIToolBar *toolbar = getToolBar();
|
||||
if (!toolbar)
|
||||
return;
|
||||
|
||||
IGUISpinBox *spin;
|
||||
spin = (IGUISpinBox*)toolbar->getElementFromId(id, true);
|
||||
spin->setRange(0, max);
|
||||
spin->setValue(std::min(value, max));
|
||||
}
|
78
src/viewer.h
Normal file
@ -0,0 +1,78 @@
|
||||
#ifndef D_VIEWER_H
|
||||
#define D_VIEWER_H
|
||||
|
||||
using namespace irr;
|
||||
using namespace core;
|
||||
using namespace scene;
|
||||
using namespace gui;
|
||||
using namespace video;
|
||||
|
||||
class Config;
|
||||
class Scene;
|
||||
class Trackball;
|
||||
class GUI;
|
||||
|
||||
enum
|
||||
{
|
||||
E_ANIM_STATE_PLAY_FWD,
|
||||
E_ANIM_STATE_PLAY_REV,
|
||||
E_ANIM_STATE_PAUSED
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
E_PROJECTION_PERSPECTIVE,
|
||||
E_PROJECTION_ORTHOGRAPHIC
|
||||
};
|
||||
|
||||
class AnimState
|
||||
{
|
||||
public:
|
||||
AnimState(IGUIEnvironment *env);
|
||||
void load(ISceneNode *node);
|
||||
void update(ISceneNode *node);
|
||||
void setField(s32 id, const u32 &value);
|
||||
void setState(s32 id) { state = id; }
|
||||
u32 getField(s32 id);
|
||||
u32 getFrame() { return frame; }
|
||||
s32 getState() { return state; }
|
||||
|
||||
private:
|
||||
IGUIToolBar *getToolBar();
|
||||
|
||||
IGUIEnvironment *env;
|
||||
u32 frame;
|
||||
u32 max;
|
||||
s32 state;
|
||||
};
|
||||
|
||||
class Viewer : public IEventReceiver
|
||||
{
|
||||
public:
|
||||
Viewer(Config *conf);
|
||||
~Viewer();
|
||||
bool run(IrrlichtDevice *irr_device);
|
||||
virtual bool OnEvent(const SEvent &event);
|
||||
|
||||
private:
|
||||
void resize();
|
||||
void setProjection();
|
||||
void setBackgroundColor(const u32 &color);
|
||||
void setCaptionFileName(const io::path &filename);
|
||||
|
||||
Config *conf;
|
||||
IrrlichtDevice *device;
|
||||
ICameraSceneNode *camera;
|
||||
Scene *scene;
|
||||
Trackball *trackball;
|
||||
GUI *gui;
|
||||
AnimState *animation;
|
||||
matrix4 ortho;
|
||||
f32 fov;
|
||||
f32 fov_home;
|
||||
dimension2du screen;
|
||||
SColor bg_color;
|
||||
u32 jump_time;
|
||||
};
|
||||
|
||||
#endif // D_VIEWER_H
|