diff --git a/.gitignore b/.gitignore index 6ce2a223bf..e9beea1666 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,4 @@ Makefile.in /tools/msvc/x64 /tools/msvc/packages /install/*.testdurations +*.ilk diff --git a/include/ibrush.h b/include/ibrush.h index d772c8f7a7..10c04069bd 100644 --- a/include/ibrush.h +++ b/include/ibrush.h @@ -231,6 +231,9 @@ class IBrush // Add a new face to this brush, using the given plane, texdef matrix and shader name virtual IFace& addFace(const Plane3& plane, const Matrix4& texDef, const std::string& shader) = 0; + // Removes all faces from this brush + virtual void clear() = 0; + // Returns true when this brush has no faces virtual bool empty() const = 0; diff --git a/include/iglrender.h b/include/iglrender.h index 1ec271106c..2a06dcc9e4 100644 --- a/include/iglrender.h +++ b/include/iglrender.h @@ -3,8 +3,7 @@ #include "igl.h" #include "imodule.h" #include "ishaders.h" - -#include "ShaderLayer.h" +#include "ishaderlayer.h" #include "math/Vector4.h" @@ -173,11 +172,11 @@ class OpenGLState * which hold the actual values of many parameters, some of them * time-dependent or depending on entity parameters. */ - ShaderLayerPtr stage0; - ShaderLayerPtr stage1; - ShaderLayerPtr stage2; - ShaderLayerPtr stage3; - ShaderLayerPtr stage4; + IShaderLayer::Ptr stage0; + IShaderLayer::Ptr stage1; + IShaderLayer::Ptr stage2; + IShaderLayer::Ptr stage3; + IShaderLayer::Ptr stage4; /** * \brief @@ -212,7 +211,7 @@ class OpenGLState * \brief * The cube-map texgen mode for rendering. */ - ShaderLayer::CubeMapMode cubeMapMode; + IShaderLayer::CubeMapMode cubeMapMode; /// Default constructor OpenGLState() @@ -236,6 +235,6 @@ class OpenGLState m_linestipple_factor(1), m_linestipple_pattern(0xAAAA), glProgram(NULL), - cubeMapMode(ShaderLayer::CUBE_MAP_NONE) + cubeMapMode(IShaderLayer::CUBE_MAP_NONE) { } }; diff --git a/include/imodel.h b/include/imodel.h index 474febafa1..0e9e74e38f 100644 --- a/include/imodel.h +++ b/include/imodel.h @@ -165,7 +165,7 @@ class IModelExporter /** * Importer interface for models. An importer must be able - * to load a model (node) from the VFS. + * to load a model (node) from the VFS and from an absolute path. * The importer instance shouldn't maintain an internal state, * such that the same instance can be used to load several models, * from different client code. @@ -186,10 +186,10 @@ class IModelImporter virtual scene::INodePtr loadModel(const std::string& modelName) = 0; /** - * Load a model from the VFS, and return the IModel subclass for it. + * Load a model from the given (maybe be VFS or absolute), and return the IModel subclass for it. * * @returns: the IModelPtr containing the renderable model or - * NULL if the model loader could not load the file. + * an empty IModelPtr if the model loader could not load the file. */ virtual model::IModelPtr loadModelFromPath(const std::string& path) = 0; }; diff --git a/include/imodelcache.h b/include/imodelcache.h index 1b1ab78cf7..6da633fbb7 100644 --- a/include/imodelcache.h +++ b/include/imodelcache.h @@ -16,23 +16,26 @@ class IModelCache : public: /** * greebo: This method returns the readily fabricated scene::Node - * containing the suitable model node. The modelPath is analysed - * and the correct ModelLoader is invoked to create the node. + * containing the suitable model node. The modelPath is analysed + * and the correct ModelLoader is invoked to create the node. * * @returns: a valid scene::INodePtr, which is never NULL. If the model - * could not be loaded, the fallback "NullModel" is returned. + * could not be loaded, the fallback "NullModel" is returned. */ virtual scene::INodePtr getModelNode(const std::string& modelPath) = 0; /** * greebo: Get the IModel object for the given VFS path. The request is cached, - * so calling this with the same path twice will return the same - * IModelPtr to save memory. + * so calling this with the same path twice will return the same + * IModelPtr to save memory. * * This method is primarily used by the ModelLoaders to acquire their model data. */ virtual IModelPtr getModel(const std::string& modelPath) = 0; + // Loads a model from the static resources in DarkRadiant's runtime data/resources folder + virtual scene::INodePtr getModelNodeForStaticResource(const std::string& resourcePath) = 0; + // This reloads all models in the map virtual void refreshModels(bool blockScreenUpdates = true) = 0; diff --git a/include/irender.h b/include/irender.h index 3da395b6ba..fe4ae39d13 100644 --- a/include/irender.h +++ b/include/irender.h @@ -6,7 +6,7 @@ #include "math/Vector3.h" #include "math/AABB.h" -#include "ShaderLayer.h" +#include "ishaderlayer.h" #include /** @@ -305,14 +305,14 @@ class RenderInfo Vector3 _viewerLocation; // Cube map mode - ShaderLayer::CubeMapMode _cubeMapMode; + IShaderLayer::CubeMapMode _cubeMapMode; public: /// Default constructor RenderInfo(RenderStateFlags flags = RENDER_DEFAULT, const Vector3& viewer = Vector3(0, 0, 0), - ShaderLayer::CubeMapMode cubeMode = ShaderLayer::CUBE_MAP_NONE) + IShaderLayer::CubeMapMode cubeMode = IShaderLayer::CUBE_MAP_NONE) : _flags(flags), _viewerLocation(viewer), _cubeMapMode(cubeMode) @@ -337,7 +337,7 @@ class RenderInfo } /// Get the cube map mode. - ShaderLayer::CubeMapMode getCubeMapMode() const + IShaderLayer::CubeMapMode getCubeMapMode() const { return _cubeMapMode; } @@ -562,6 +562,9 @@ class RenderSystem // Subscription to get notified as soon as the openGL extensions have been initialised virtual sigc::signal signal_extensionsInitialised() = 0; + + // Notification about a material change, tries to refresh any constructed shaders basing on it + virtual void onMaterialChanged(const std::string& materialName) = 0; }; typedef std::shared_ptr RenderSystemPtr; typedef std::weak_ptr RenderSystemWeakPtr; diff --git a/include/ishaderexpression.h b/include/ishaderexpression.h index 04857a73fd..a781057574 100644 --- a/include/ishaderexpression.h +++ b/include/ishaderexpression.h @@ -38,6 +38,8 @@ enum ReservedRegisters class IShaderExpression { public: + using Ptr = std::shared_ptr; + /** * Retrieve the floating point value of this expression. DEPRECATED */ @@ -68,10 +70,23 @@ class IShaderExpression */ virtual std::size_t linkToRegister(Registers& registers) = 0; + // Link this expression to the given Registers vector, using the specified index + // instead of allocating a new register + virtual void linkToSpecificRegister(Registers& registers, std::size_t index) = 0; + + // True if this expression is linked to a register + virtual bool isLinked() const = 0; + + // Returns any previously used register position (for possible re-use) + virtual std::size_t unlinkFromRegisters() = 0; + // Returns the string this expression has been parsed from virtual std::string getExpressionString() = 0; + + // Clone this expression and all possible sub-expressions + // The cloned expression will not be linked to any register + virtual IShaderExpression::Ptr clone() const = 0; }; -typedef std::shared_ptr IShaderExpressionPtr; // Interface of a material expression used to specify a map image // It can either represent a texture path to a file on disk or diff --git a/include/ShaderLayer.h b/include/ishaderlayer.h similarity index 54% rename from include/ShaderLayer.h rename to include/ishaderlayer.h index 9a2da44b3b..756040a97a 100644 --- a/include/ShaderLayer.h +++ b/include/ishaderlayer.h @@ -9,6 +9,7 @@ #include "math/Vector2.h" #include "math/Vector4.h" +#include "math/Matrix4.h" #include "render/Colour4.h" class IRenderEntity; @@ -51,9 +52,10 @@ class BlendFunc * Each shader layer contains an image texture, a blend mode (e.g. add, * modulate) and various other data. */ -class ShaderLayer +class IShaderLayer { public: + using Ptr = std::shared_ptr; /// Enumeration of layer types. enum Type @@ -78,8 +80,7 @@ class ShaderLayer FLAG_MASK_BLUE = 1 << 8, FLAG_MASK_ALPHA = 1 << 9, FLAG_MASK_DEPTH = 1 << 10, - FLAG_CENTERSCALE = 1 << 11, // whether to translate -0.5, scale and translate +0.5 - FLAG_IGNORE_DEPTH = 1 << 12, // use depthfunc always + FLAG_IGNORE_DEPTH = 1 << 11, // use depthfunc always }; enum TexGenType @@ -98,11 +99,53 @@ class ShaderLayer PF_HasColoredKeyword = 1 << 3, // colored has been specified }; + // Expression slot selector + struct Expression + { + enum Slot + { + AlphaTest = 0, + Condition, + TexGenParam1, + TexGenParam2, + TexGenParam3, + ColourRed, + ColourGreen, + ColourBlue, + ColourAlpha, + TextureMatrixRow0Col0, + TextureMatrixRow0Col1, + TextureMatrixRow0Col2, + TextureMatrixRow1Col0, + TextureMatrixRow1Col1, + TextureMatrixRow1Col2, + NumExpressionSlots + }; + }; + + // The various texture transformations + enum class TransformType + { + Translate, + Scale, + CenterScale, + Shear, + Rotate, + }; + + // A texture transformation consists of a type and two arguments at most + struct Transformation + { + TransformType type; + shaders::IShaderExpression::Ptr expression1; + shaders::IShaderExpression::Ptr expression2; + }; + /** * \brief * Destructor */ - virtual ~ShaderLayer() {} + virtual ~IShaderLayer() {} /// Return the layer type. virtual Type getType() const = 0; @@ -125,6 +168,9 @@ class ShaderLayer */ virtual void evaluateExpressions(std::size_t time, const IRenderEntity& entity) = 0; + // Returns the requested expression + virtual shaders::IShaderExpression::Ptr getExpression(Expression::Slot slot) = 0; + /** * The flags set on this stage. */ @@ -146,8 +192,8 @@ class ShaderLayer */ virtual float getTexGenParam(std::size_t index) const = 0; - // The expressions used to calcualte the tex gen params. Index in [0..2] - virtual shaders::IShaderExpressionPtr getTexGenExpression(std::size_t index) const = 0; + // The expressions used to calculate the tex gen params. Index in [0..2] + virtual shaders::IShaderExpression::Ptr getTexGenExpression(std::size_t index) const = 0; /** * \brief @@ -179,7 +225,7 @@ class ShaderLayer }; // Returns the expression to calculate the RGBA vertex colour values - virtual const shaders::IShaderExpressionPtr& getColourExpression(ColourComponentSelector component) = 0; + virtual const shaders::IShaderExpression::Ptr& getColourExpression(ColourComponentSelector component) const = 0; /** * \brief @@ -233,48 +279,18 @@ class ShaderLayer * Returns the dimensions specifying the map size for * stages using the "mirrorRenderMap", "remoteRenderMap" keywords. */ - virtual const Vector2& getRenderMapSize() = 0; - - /** - * Returns the value of the scale expressions of this stage. - */ - virtual Vector2 getScale() = 0; + virtual const Vector2& getRenderMapSize() const = 0; - // Returns the expression of the given scale component (0 == x, 1 == y) - virtual const shaders::IShaderExpressionPtr& getScaleExpression(std::size_t index) = 0; + // Adds a transformation at the end of the list of existing transforms in this stage + virtual void appendTransformation(const Transformation& transform) = 0; - // Workaround: the shader layer is storing the centerscale expression in the same location as scale expressions, - // making them mutually exclusive - which is not the way the idTech4 materials work. - // These stage transforms need to be redesigned to support an arbitrary number of transforms respecting their order. - // Texture Matrix calculation needs to be performed by the stage itself, not in OpenGLShaderPass - // I need to go ahead with the material editor, so I'm not changing it immediately - virtual const shaders::IShaderExpressionPtr& getCenterScaleExpression(std::size_t index) = 0; + // The list of transformations defined in this stage, in the order they appear in the declaration + virtual const std::vector& getTransformations() = 0; - /** - * Returns the value of the translate expressions of this stage. - */ - virtual Vector2 getTranslation() = 0; - - // Returns the expression of the given translation component (0 == x, 1 == y) - virtual const shaders::IShaderExpressionPtr& getTranslationExpression(std::size_t index) = 0; - - /** - * Returns the value of the rotate expression of this stage. - */ - virtual float getRotation() = 0; - - // Returns the expression used to calculate the rotation value - virtual const shaders::IShaderExpressionPtr& getRotationExpression() = 0; + // Returns the current texture matrix + virtual Matrix4 getTextureTransform() = 0; - /** - * Returns the value of the 'shear' expressions of this stage. - */ - virtual Vector2 getShear() = 0; - - // Returns the expression of the given shear component (0 == x, 1 == y) - virtual const shaders::IShaderExpressionPtr& getShearExpression(std::size_t index) = 0; - - // Returns true if this layer has an alphatest expression defined + // Returns true if this layer has an alphatest expression defined virtual bool hasAlphaTest() const = 0; /** @@ -287,32 +303,39 @@ class ShaderLayer */ virtual float getAlphaTest() const = 0; + // Returns the expression used to calculate the alpha test value + virtual const shaders::IShaderExpression::Ptr& getAlphaTestExpression() const = 0; + /** * Whether this stage is active. Unconditional stages always return true, * conditional ones return the result of the most recent condition expression evaluation. */ virtual bool isVisible() const = 0; + // Stages can be enabled/disabled programmatically (used when editing materials) + // This returns true if the stage is enabled + virtual bool isEnabled() const = 0; + // Returns the if-expression used to evaluate this stage's visibility, or null if none defined - virtual const shaders::IShaderExpressionPtr& getConditionExpression() = 0; + virtual const shaders::IShaderExpression::Ptr& getConditionExpression() const = 0; /** * Returns the name of this stage's fragment program. */ - virtual const std::string& getVertexProgram() = 0; + virtual const std::string& getVertexProgram()const = 0; /** * Returns the name of this stage's fragment program. */ - virtual const std::string& getFragmentProgram() = 0; + virtual const std::string& getFragmentProgram() const = 0; // The number of defined vertex parameters - virtual int getNumVertexParms() = 0; + virtual int getNumVertexParms() const = 0; /** * Returns the 4 parameter values for the vertexParm index . */ - virtual Vector4 getVertexParmValue(int parm) = 0; + virtual Vector4 getVertexParmValue(int parm) const = 0; // A vertex parm has an index and 4 expressions at most struct VertexParm @@ -322,16 +345,16 @@ class ShaderLayer {} int index; - shaders::IShaderExpressionPtr expressions[4]; + shaders::IShaderExpression::Ptr expressions[4]; }; - // Returns the - virtual const VertexParm& getVertexParm(int index) = 0; + // Returns the vertex parameter with the given index [0..3] + virtual const VertexParm& getVertexParm(int index) const = 0; /** * Returns the number of fragment maps in this stage. */ - virtual std::size_t getNumFragmentMaps() = 0; + virtual std::size_t getNumFragmentMaps() const = 0; struct FragmentMap { @@ -344,39 +367,104 @@ class ShaderLayer shaders::IMapExpression::Ptr map; }; - virtual const FragmentMap& getFragmentMap(int index) = 0; + virtual const FragmentMap& getFragmentMap(int index) const = 0; /** * Returns the fragment map image with the given index. */ - virtual TexturePtr getFragmentMapTexture(int index) = 0; + virtual TexturePtr getFragmentMapTexture(int index) const = 0; /** * Stage-specific polygon offset, overriding the "global" one defined on the material. */ - virtual float getPrivatePolygonOffset() = 0; + virtual float getPrivatePolygonOffset() const = 0; // If this stage is referring to a single image file, this will return // the VFS path to it with the file extension removed. // If this layer doesn't refer to a single image file, an empty string is returned - virtual std::string getMapImageFilename() = 0; + virtual std::string getMapImageFilename() const = 0; // The map expression used to generate/define the texture of this stage - virtual shaders::IMapExpression::Ptr getMapExpression() = 0; + virtual shaders::IMapExpression::Ptr getMapExpression() const = 0; // Parser information, to reconstruct the use of certain keywords - virtual int getParseFlags() = 0; + virtual int getParseFlags() const = 0; }; /** * \brief - * Shader pointer for ShaderLayer, + * Vector of IShaderLayer pointers. */ -typedef std::shared_ptr ShaderLayerPtr; +typedef std::vector IShaderLayerVector; -/** - * \brief - * Vector of ShaderLayer pointers. - */ -typedef std::vector ShaderLayerVector; +// Interface extension to IShaderLayer, offering editing functions +class IEditableShaderLayer : + public IShaderLayer +{ +public: + using Ptr = std::shared_ptr; + + virtual ~IEditableShaderLayer() {} + + // Enable/disable this stage - a disabled stage will return false to isVisible() + virtual void setEnabled(bool enabled) = 0; + + // Set the given stage flag(s) + virtual void setStageFlag(IShaderLayer::Flags flag) = 0; + + // Clears the given stage flag(s) + virtual void clearStageFlag(IShaderLayer::Flags flag) = 0; + + // Set the map type to use by this stage (map, cameraCubeMap, etc.) + virtual void setMapType(MapType mapType) = 0; + + // Set the blend func from the given pair of strings + virtual void setBlendFuncStrings(const std::pair& pair) = 0; + + // Set the alpha test expression from the given string + virtual void setAlphaTestExpressionFromString(const std::string& expression) = 0; + + // Update the "map" expression of this stage + virtual void setMapExpressionFromString(const std::string& expression) = 0; + // Adds a empty transformation to this layer, returning its new index + virtual std::size_t addTransformation(TransformType type, const std::string& expression1, const std::string& expression2) = 0; + + // Removes the indexed transformation + virtual void removeTransformation(std::size_t index) = 0; + + // Set the type and expressions of the indexed transformation. The transformation index must not be + // out of bounds, use appendTransformation() to add new ones + virtual void updateTransformation(std::size_t index, TransformType type, + const std::string& expression1, const std::string& expression2) = 0; + + // Set the colour expression from the given string + virtual void setColourExpressionFromString(ColourComponentSelector component, const std::string& expression) = 0; + + // Set the stage condition expression + virtual void setConditionExpressionFromString(const std::string& expression) = 0; + + // Sets the texgen type of this stage + virtual void setTexGenType(TexGenType type) = 0; + + // Set the texgen expression (used for wobblesky) + virtual void setTexGenExpressionFromString(std::size_t index, const std::string& expression) = 0; + + // Set the vertex colour mode of this stage + virtual void setVertexColourMode(VertexColourMode mode) = 0; + + // Set the clamp type of this stage + virtual void setClampType(ClampType clampType) = 0; + + // Sets the privatePolygonOffset value of this stage + virtual void setPrivatePolygonOffset(double offset) = 0; + + // Sets width and height of the mirrorRenderMap/remoteRenderMap images + virtual void setRenderMapSize(const Vector2& size) = 0; + + // For stages with map type SoundMap, this is used to set the waveform flag + virtual void setSoundMapWaveForm(bool waveForm) = 0; + + // For stages with map type VideoMap, this is used to update the properties + virtual void setVideoMapProperties(const std::string& filePath, bool looping) = 0; +}; diff --git a/include/ishaders.h b/include/ishaders.h index cc212936db..69f4e28fc3 100644 --- a/include/ishaders.h +++ b/include/ishaders.h @@ -12,7 +12,7 @@ #include #include "Texture.h" -#include "ShaderLayer.h" +#include "ishaderlayer.h" #include "ishaderexpression.h" class Image; @@ -55,6 +55,7 @@ class Material FLAG_MIRROR = 1 << 10, // mirror FLAG_POLYGONOFFSET = 1 << 11, // has polygonOffset FLAG_ISLIGHTGEMSURF = 1 << 12, // is used by the TDM lightgem + FLAG_HAS_SORT_DEFINED = 1 << 13, // whether a sort value has been defined }; // Parser flags, used to give some hints to the material editor GUI @@ -206,42 +207,72 @@ class Material /** * \brief Return the requested sort position of this material. - * - * greebo: D3 is using floating points for the sort value but - * as far as I can see only rounded numbers have been used. */ - virtual int getSortRequest() const = 0; + virtual float getSortRequest() const = 0; + + // Set the sort value for this material, see the SortRequest enum for predefined values + virtual void setSortRequest(float sortRequest) = 0; + + // Resets the sort request to the default value + virtual void resetSortReqest() = 0; /// Return a polygon offset if one is defined. The default is 0. virtual float getPolygonOffset() const = 0; + // Set the polygon offset of this material. Clear the FLAG_POLYGONOFFSET to disable the offset altogether. + virtual void setPolygonOffset(float offset) = 0; + /// Get the desired texture repeat behaviour. virtual ClampType getClampType() const = 0; + // Set the clamp type for this material + virtual void setClampType(ClampType type) = 0; + /// Get the cull type (none, back, front) virtual CullType getCullType() const = 0; + // Set the cull type + virtual void setCullType(CullType type) = 0; + /// Get the global material flags (translucent, noshadows, etc.) virtual int getMaterialFlags() const = 0; + // Set the given material flag + virtual void setMaterialFlag(Flags flag) = 0; + + // Clear the given material flags + virtual void clearMaterialFlag(Flags flag) = 0; + /// Surface flags (areaportal, nonsolid, etc.) virtual int getSurfaceFlags() const = 0; + // Set the given surface flag + virtual void setSurfaceFlag(Material::SurfaceFlags flag) = 0; + + // Clear the given surface flag + virtual void clearSurfaceFlag(Material::SurfaceFlags flag) = 0; + /// Surface Type (wood, stone, surfType15, ...) virtual SurfaceType getSurfaceType() const = 0; + // Set the surface type of this material + virtual void setSurfaceType(SurfaceType type) = 0; + /// Get the deform type of this material virtual DeformType getDeformType() const = 0; // Returns the shader expression used to define the deform parameters (valid indices in [0..2]) - virtual shaders::IShaderExpressionPtr getDeformExpression(std::size_t index) = 0; + virtual shaders::IShaderExpression::Ptr getDeformExpression(std::size_t index) = 0; // Used for Deform_Particle/Particle2 defines the name of the particle def virtual std::string getDeformDeclName() = 0; - /// Returns the spectrum of this shader, 0 is the default value (even witout keyword in the material) + /// Returns the spectrum of this shader, 0 is the default value (even without keyword in the material) virtual int getSpectrum() const = 0; + // Sets the spectrum of this material. + virtual void setSpectrum(int spectrum) = 0; + /// Retrieves the decal info structure of this material. virtual DecalInfo getDecalInfo() const = 0; @@ -274,6 +305,11 @@ class Material */ virtual bool isCubicLight() const = 0; + virtual void setIsAmbientLight(bool newValue) = 0; + virtual void setIsBlendLight(bool newValue) = 0; + virtual void setIsFogLight(bool newValue) = 0; + virtual void setIsCubicLight(bool newValue) = 0; + /** * For light shaders: implicitly no-shadows lights (ambients, fogs, etc) * will never cast shadows but individual light entities can also override this value. @@ -300,7 +336,7 @@ class Material virtual bool isDiscrete() const = 0; /// Return the first material layer, if any - virtual ShaderLayer* firstLayer() const = 0; + virtual IShaderLayer* firstLayer() const = 0; /** * \brief Return a std::vector containing all layers in this material @@ -308,20 +344,47 @@ class Material * * This includes all diffuse, bump, specular or blend layers. */ - virtual const ShaderLayerVector& getAllLayers() const = 0; + virtual const IShaderLayerVector& getAllLayers() const = 0; + + // Add a new (typed) layer to this material, returning the index of the new layer + virtual std::size_t addLayer(IShaderLayer::Type type) = 0; + + // Removes the indexed layer from this material + virtual void removeLayer(std::size_t index) = 0; + + // Duplicates the given layer and returns the index to the copied one + virtual std::size_t duplicateLayer(std::size_t index) = 0; + + // Swaps the position of the two layers + virtual void swapLayerPosition(std::size_t first, std::size_t second) = 0; - /// Return the 2D light falloff texture, if this is a light shader + // Returns the edit interface for the given shader layer. Calling this method + // will immediately mark this Material as modified. + virtual IEditableShaderLayer::Ptr getEditableLayer(std::size_t index) = 0; + + /// Return the light falloff texture, if this is a light shader virtual TexturePtr lightFalloffImage() = 0; - // Return the expression of the light falloff texture for use with this shader. + // Return the expression of the light falloff map for use with this shader. virtual shaders::IMapExpression::Ptr getLightFalloffExpression() = 0; - // Return the expression of the light falloff cubemap for use with this shader. - virtual shaders::IMapExpression::Ptr getLightFalloffCubeMapExpression() = 0; + // Set the lightFallOff expression to define the image/cubemap to use + virtual void setLightFalloffExpressionFromString(const std::string& expressionString) = 0; + + // Return the type of the light fall off image + // (can be MapType::Map (lightFalloffImage or MapType::CameraCubeMap for lightFalloffCubeMap) + virtual IShaderLayer::MapType getLightFalloffCubeMapType() = 0; + + // Set the type of the light fall off image + // (can be MapType::Map (lightFalloffImage or MapType::CameraCubeMap for lightFalloffCubeMap) + virtual void setLightFalloffCubeMapType(IShaderLayer::MapType type) = 0; // greebo: Returns the description as defined in the material virtual std::string getDescription() const = 0; + // Set the description text of this material + virtual void setDescription(const std::string& description) = 0; + /// Return TRUE if the shader is visible, FALSE if it is filtered or /// disabled in any other way. virtual bool isVisible() const = 0; @@ -341,6 +404,9 @@ class Material // The argument to the "guisurf" keyword, if not entity[2]3]. // In case entity[2]3] is set, the corresponding surface flags are enabled virtual const std::string& getGuiSurfArgument() = 0; + + // True if this mateiral has been altered from its original definition + virtual bool isModified() = 0; }; typedef std::shared_ptr MaterialPtr; @@ -451,7 +517,7 @@ class MaterialManager * \param type * The type of interaction layer whose default texture is required. */ - virtual TexturePtr getDefaultInteractionTexture(ShaderLayer::Type type) = 0; + virtual TexturePtr getDefaultInteractionTexture(IShaderLayer::Type type) = 0; /** * greebo: This is a substitution for the "old" TexturesCache method @@ -470,7 +536,7 @@ class MaterialManager * Creates a new shader expression for the given string. This can be used to create standalone * expression objects for unit testing purposes. */ - virtual shaders::IShaderExpressionPtr createShaderExpressionFromString(const std::string& exprStr) = 0; + virtual shaders::IShaderExpression::Ptr createShaderExpressionFromString(const std::string& exprStr) = 0; // Creates a named, internal material for debug/testing etc. // Used by shaders without corresponding material declaration, like entity wireframe shaders diff --git a/include/modelskin.h b/include/modelskin.h index 954e0def19..9fb227ffec 100644 --- a/include/modelskin.h +++ b/include/modelskin.h @@ -23,6 +23,9 @@ class ModelSkin * empty string. */ virtual std::string getRemap(const std::string& name) const = 0; + + // Returns the file name this skin has been defined in + virtual std::string getSkinFileName() const = 0; }; typedef std::shared_ptr ModelSkinPtr; @@ -77,6 +80,13 @@ class ModelSkinCache : */ virtual const StringList& getAllSkins() = 0; + // Adds a runtime-generated skin to the collection, it will be resolvable by capture(). + // Note that this skin is not going to survive a refresh() call + virtual void addNamedSkin(const ModelSkinPtr& modelSkin) = 0; + + // Removes a named skin from the cache + virtual void removeSkin(const std::string& name) = 0; + /** * greebo: Reloads all skins from the definition files. */ diff --git a/include/precompiled_interfaces.h b/include/precompiled_interfaces.h index 69b7bf10c9..46caf60ab5 100644 --- a/include/precompiled_interfaces.h +++ b/include/precompiled_interfaces.h @@ -95,7 +95,7 @@ #include "mapfile.h" #include "modelskin.h" #include "ModResource.h" -#include "ShaderLayer.h" +#include "ishaderlayer.h" #include "StringSerialisable.h" #include "Texture.h" #include "VolumeIntersectionValue.h" diff --git a/install/bitmaps/cube.png b/install/bitmaps/cube.png new file mode 100644 index 0000000000..9ae2d0f110 Binary files /dev/null and b/install/bitmaps/cube.png differ diff --git a/install/bitmaps/invisible.png b/install/bitmaps/invisible.png new file mode 100644 index 0000000000..8615c750bc Binary files /dev/null and b/install/bitmaps/invisible.png differ diff --git a/install/bitmaps/sphere.png b/install/bitmaps/sphere.png new file mode 100644 index 0000000000..09c784ba48 Binary files /dev/null and b/install/bitmaps/sphere.png differ diff --git a/install/bitmaps/tiles.png b/install/bitmaps/tiles.png new file mode 100644 index 0000000000..44b024bc03 Binary files /dev/null and b/install/bitmaps/tiles.png differ diff --git a/install/bitmaps/visible.png b/install/bitmaps/visible.png new file mode 100644 index 0000000000..3dfcc38f19 Binary files /dev/null and b/install/bitmaps/visible.png differ diff --git a/install/games/darkmod.game b/install/games/darkmod.game index d52ed40ece..79be7aed52 100644 --- a/install/games/darkmod.game +++ b/install/games/darkmod.game @@ -347,4 +347,8 @@ Difficult + + + + diff --git a/install/resources/preview/cube.ase b/install/resources/preview/cube.ase new file mode 100644 index 0000000000..49f1c65a0a --- /dev/null +++ b/install/resources/preview/cube.ase @@ -0,0 +1,416 @@ +*3DSMAX_ASCIIEXPORT 200 +*COMMENT "Ascii Scene Exporter v2.52" +*SCENE { + *SCENE_FILENAME "cube.blend" + *SCENE_FIRSTFRAME 0 + *SCENE_LASTFRAME 100 + *SCENE_FRAMESPEED 30 + *SCENE_TICKSPERFRAME 160 + *SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000 + *SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000 +} +*MATERIAL_LIST { + *MATERIAL_COUNT 1 + *MATERIAL 0 { + *MATERIAL_NAME "material" + *MATERIAL_CLASS "Standard" + *MATERIAL_AMBIENT 0.0000 0.0000 0.0000 + *MATERIAL_DIFFUSE 0.9071 0.9071 0.9071 1.0000 + *MATERIAL_SPECULAR 1.0000 1.0000 1.0000 + *MATERIAL_SHINE 2.5000 + *MATERIAL_SHINESTRENGTH 0.5000 + *MATERIAL_TRANSPARENCY 0.0000 + *MATERIAL_WIRESIZE 1.0000 + *MATERIAL_SHADING Blinn + *MATERIAL_XP_FALLOFF 0.0000 + *MATERIAL_SELFILLUM 0.0000 + *MATERIAL_FALLOFF In + *MATERIAL_XP_TYPE Filter + *MAP_DIFFUSE { + *MAP_NAME "material" + *MAP_CLASS "Bitmap" + *MAP_SUBNO 1 + *MAP_AMOUNT 1.0000 + *BITMAP "\\base\material" + *MAP_TYPE Screen + *UVW_U_OFFSET 0.0000 + *UVW_V_OFFSET 0.0000 + *UVW_U_TILING 1.0000 + *UVW_V_TILING 1.0000 + *UVW_ANGLE 0.0000 + *UVW_BLUR 1.0000 + *UVW_BLUR_OFFSET 0.0000 + *UVW_NOISE_AMT 1.0000 + *UVW_NOISE_SIZE 1.0000 + *UVW_NOISE_LEVEL 1 + *UVW_NOISE_PHASE 0.0000 + *BITMAP_FILTER Pyramidal + } + } +} +*GEOMOBJECT { + *NODE_NAME "Cube" + *NODE_TM { + *NODE_NAME "Cube" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 4 + *MESH_NUMFACES 2 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 -16.0000 -16.0000 16.0000 + *MESH_VERTEX 1 -16.0000 -16.0000 -16.0000 + *MESH_VERTEX 2 16.0000 -16.0000 16.0000 + *MESH_VERTEX 3 16.0000 -16.0000 -16.0000 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 3 B: 0 C: 1 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 1: A: 3 B: 2 C: 0 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 4 + *MESH_TVERTLIST { + *MESH_TVERT 0 1.0000 0.0000 0.0000 + *MESH_TVERT 1 0.0000 1.0000 0.0000 + *MESH_TVERT 2 0.0000 0.0000 0.0000 + *MESH_TVERT 3 1.0000 1.0000 0.0000 + } + *MESH_NUMTVFACES 2 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 0 3 1 + } + *MESH_NUMCVERTEX 0 + *MESH_NORMALS { + *MESH_FACENORMAL 0 0.0000 -1.0000 -0.0000 + *MESH_VERTEXNORMAL 3 0.0000 -1.0000 -0.0000 + *MESH_VERTEXNORMAL 0 0.0000 -1.0000 -0.0000 + *MESH_VERTEXNORMAL 1 0.0000 -1.0000 -0.0000 + *MESH_FACENORMAL 1 0.0000 -1.0000 -0.0000 + *MESH_VERTEXNORMAL 3 0.0000 -1.0000 -0.0000 + *MESH_VERTEXNORMAL 2 0.0000 -1.0000 -0.0000 + *MESH_VERTEXNORMAL 0 0.0000 -1.0000 -0.0000 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} +*GEOMOBJECT { + *NODE_NAME "Cube.001" + *NODE_TM { + *NODE_NAME "Cube.001" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 4 + *MESH_NUMFACES 2 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 -16.0000 16.0000 16.0000 + *MESH_VERTEX 1 -16.0000 16.0000 -16.0000 + *MESH_VERTEX 2 16.0000 16.0000 16.0000 + *MESH_VERTEX 3 16.0000 16.0000 -16.0000 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 1 B: 2 C: 3 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 1: A: 1 B: 0 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 4 + *MESH_TVERTLIST { + *MESH_TVERT 0 1.0000 0.0000 0.0000 + *MESH_TVERT 1 0.0000 1.0000 0.0000 + *MESH_TVERT 2 0.0000 0.0000 0.0000 + *MESH_TVERT 3 1.0000 1.0000 0.0000 + } + *MESH_NUMTVFACES 2 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 0 3 1 + } + *MESH_NUMCVERTEX 0 + *MESH_NORMALS { + *MESH_FACENORMAL 0 0.0000 1.0000 0.0000 + *MESH_VERTEXNORMAL 1 0.0000 1.0000 0.0000 + *MESH_VERTEXNORMAL 2 0.0000 1.0000 0.0000 + *MESH_VERTEXNORMAL 3 0.0000 1.0000 0.0000 + *MESH_FACENORMAL 1 0.0000 1.0000 0.0000 + *MESH_VERTEXNORMAL 1 0.0000 1.0000 0.0000 + *MESH_VERTEXNORMAL 0 0.0000 1.0000 0.0000 + *MESH_VERTEXNORMAL 2 0.0000 1.0000 0.0000 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} +*GEOMOBJECT { + *NODE_NAME "Cube.002" + *NODE_TM { + *NODE_NAME "Cube.002" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 4 + *MESH_NUMFACES 2 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 -16.0000 -16.0000 -16.0000 + *MESH_VERTEX 1 -16.0000 16.0000 -16.0000 + *MESH_VERTEX 2 16.0000 -16.0000 -16.0000 + *MESH_VERTEX 3 16.0000 16.0000 -16.0000 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 1 B: 2 C: 0 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 1: A: 1 B: 3 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 4 + *MESH_TVERTLIST { + *MESH_TVERT 0 1.0000 0.0000 0.0000 + *MESH_TVERT 1 0.0000 1.0000 0.0000 + *MESH_TVERT 2 0.0000 0.0000 0.0000 + *MESH_TVERT 3 1.0000 1.0000 0.0000 + } + *MESH_NUMTVFACES 2 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 0 3 1 + } + *MESH_NUMCVERTEX 0 + *MESH_NORMALS { + *MESH_FACENORMAL 0 0.0000 0.0000 -1.0000 + *MESH_VERTEXNORMAL 1 0.0000 0.0000 -1.0000 + *MESH_VERTEXNORMAL 2 0.0000 0.0000 -1.0000 + *MESH_VERTEXNORMAL 0 0.0000 0.0000 -1.0000 + *MESH_FACENORMAL 1 0.0000 0.0000 -1.0000 + *MESH_VERTEXNORMAL 1 0.0000 0.0000 -1.0000 + *MESH_VERTEXNORMAL 3 0.0000 0.0000 -1.0000 + *MESH_VERTEXNORMAL 2 0.0000 0.0000 -1.0000 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} +*GEOMOBJECT { + *NODE_NAME "Cube.003" + *NODE_TM { + *NODE_NAME "Cube.003" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 4 + *MESH_NUMFACES 2 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 -16.0000 -16.0000 16.0000 + *MESH_VERTEX 1 -16.0000 16.0000 16.0000 + *MESH_VERTEX 2 -16.0000 -16.0000 -16.0000 + *MESH_VERTEX 3 -16.0000 16.0000 -16.0000 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 1 B: 2 C: 0 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 1: A: 1 B: 3 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 4 + *MESH_TVERTLIST { + *MESH_TVERT 0 1.0000 0.0000 0.0000 + *MESH_TVERT 1 0.0000 1.0000 0.0000 + *MESH_TVERT 2 0.0000 0.0000 0.0000 + *MESH_TVERT 3 1.0000 1.0000 0.0000 + } + *MESH_NUMTVFACES 2 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 0 3 1 + } + *MESH_NUMCVERTEX 0 + *MESH_NORMALS { + *MESH_FACENORMAL 0 -1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 1 -1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 2 -1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 0 -1.0000 0.0000 0.0000 + *MESH_FACENORMAL 1 -1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 1 -1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 3 -1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 2 -1.0000 0.0000 0.0000 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} +*GEOMOBJECT { + *NODE_NAME "Cube.004" + *NODE_TM { + *NODE_NAME "Cube.004" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 4 + *MESH_NUMFACES 2 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 -16.0000 -16.0000 16.0000 + *MESH_VERTEX 1 -16.0000 16.0000 16.0000 + *MESH_VERTEX 2 16.0000 -16.0000 16.0000 + *MESH_VERTEX 3 16.0000 16.0000 16.0000 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 1: A: 3 B: 1 C: 0 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 4 + *MESH_TVERTLIST { + *MESH_TVERT 0 1.0000 0.0000 0.0000 + *MESH_TVERT 1 0.0000 1.0000 0.0000 + *MESH_TVERT 2 0.0000 0.0000 0.0000 + *MESH_TVERT 3 1.0000 1.0000 0.0000 + } + *MESH_NUMTVFACES 2 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 0 3 1 + } + *MESH_NUMCVERTEX 0 + *MESH_NORMALS { + *MESH_FACENORMAL 0 0.0000 -0.0000 1.0000 + *MESH_VERTEXNORMAL 3 0.0000 -0.0000 1.0000 + *MESH_VERTEXNORMAL 0 0.0000 -0.0000 1.0000 + *MESH_VERTEXNORMAL 2 0.0000 -0.0000 1.0000 + *MESH_FACENORMAL 1 0.0000 -0.0000 1.0000 + *MESH_VERTEXNORMAL 3 0.0000 -0.0000 1.0000 + *MESH_VERTEXNORMAL 1 0.0000 -0.0000 1.0000 + *MESH_VERTEXNORMAL 0 0.0000 -0.0000 1.0000 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} +*GEOMOBJECT { + *NODE_NAME "Cube.005" + *NODE_TM { + *NODE_NAME "Cube.005" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 4 + *MESH_NUMFACES 2 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 16.0000 -16.0000 16.0000 + *MESH_VERTEX 1 16.0000 16.0000 16.0000 + *MESH_VERTEX 2 16.0000 -16.0000 -16.0000 + *MESH_VERTEX 3 16.0000 16.0000 -16.0000 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 1: A: 3 B: 1 C: 0 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 4 + *MESH_TVERTLIST { + *MESH_TVERT 0 1.0000 0.0000 0.0000 + *MESH_TVERT 1 0.0000 1.0000 0.0000 + *MESH_TVERT 2 0.0000 0.0000 0.0000 + *MESH_TVERT 3 1.0000 1.0000 0.0000 + } + *MESH_NUMTVFACES 2 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 0 3 1 + } + *MESH_NUMCVERTEX 0 + *MESH_NORMALS { + *MESH_FACENORMAL 0 1.0000 -0.0000 -0.0000 + *MESH_VERTEXNORMAL 3 1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 0 1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 2 1.0000 0.0000 0.0000 + *MESH_FACENORMAL 1 1.0000 -0.0000 0.0000 + *MESH_VERTEXNORMAL 3 1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 1 1.0000 0.0000 0.0000 + *MESH_VERTEXNORMAL 0 1.0000 0.0000 0.0000 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} \ No newline at end of file diff --git a/install/resources/preview/room_cuboid.ase b/install/resources/preview/room_cuboid.ase new file mode 100644 index 0000000000..f955216cc3 --- /dev/null +++ b/install/resources/preview/room_cuboid.ase @@ -0,0 +1,288 @@ +*3DSMAX_ASCIIEXPORT 200 +*COMMENT "DarkRadiant ASCII Scene Export(*.ase)" +*SCENE { + *SCENE_FILENAME "maps/room_cuboid.map" + *SCENE_FIRSTFRAME 0 + *SCENE_LASTFRAME 100 + *SCENE_FRAMESPEED 30 + *SCENE_TICKSPERFRAME 160 + *SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000 + *SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000 +} +*MATERIAL_LIST { + *MATERIAL_COUNT 1 + *MATERIAL 0 { + *MATERIAL_NAME "Room" + *MATERIAL_CLASS "Standard" + *MATERIAL_AMBIENT 0.5882 0.5882 0.5882 + *MATERIAL_DIFFUSE 0.5882 0.5882 0.5882 + *MATERIAL_SPECULAR 0.9000 0.9000 0.9000 + *MATERIAL_SHINE 0.1000 + *MATERIAL_SHINESTRENGTH 0.0000 + *MATERIAL_TRANSPARENCY 0.0000 + *MATERIAL_WIRESIZE 1.0000 + *MATERIAL_SHADING Blinn + *MATERIAL_XP_FALLOFF 0.0000 + *MATERIAL_SELFILLUM 0.0000 + *MATERIAL_FALLOFF In + *MATERIAL_XP_TYPE Filter + *MAP_DIFFUSE { + *MAP_NAME "Room" + *MAP_CLASS "Bitmap" + *MAP_SUBNO 1 + *MAP_AMOUNT 1.0000 + *BITMAP "\\base\material" + *MAP_TYPE Screen + *UVW_U_OFFSET 0.0000 + *UVW_V_OFFSET 0.0000 + *UVW_U_TILING 1.0000 + *UVW_V_TILING 1.0000 + *UVW_ANGLE 0.0000 + *UVW_BLUR 1.0000 + *UVW_BLUR_OFFSET 0.0000 + *UVW_NOUSE_AMT 1.0000 + *UVW_NOISE_SIZE 1.0000 + *UVW_NOISE_LEVEL 1 + *UVW_NOISE_PHASE 0.0000 + *BITMAP_FILTER Pyramidal + } + } +} +*GEOMOBJECT { + *NODE_NAME "mesh0" + *NODE_TM { + *NODE_NAME "mesh0" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 36 + *MESH_NUMFACES 12 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 160 160 256 + *MESH_VERTEX 1 160 -160 256 + *MESH_VERTEX 2 -160 -160 256 + *MESH_VERTEX 3 -160 160 256 + *MESH_VERTEX 4 160 160 256 + *MESH_VERTEX 5 -160 -160 256 + *MESH_VERTEX 6 160 160 -96 + *MESH_VERTEX 7 160 160 256 + *MESH_VERTEX 8 -160 160 256 + *MESH_VERTEX 9 -160 160 -96 + *MESH_VERTEX 10 160 160 -96 + *MESH_VERTEX 11 -160 160 256 + *MESH_VERTEX 12 160 -160 256 + *MESH_VERTEX 13 160 160 256 + *MESH_VERTEX 14 160 160 -96 + *MESH_VERTEX 15 160 -160 -96 + *MESH_VERTEX 16 160 -160 256 + *MESH_VERTEX 17 160 160 -96 + *MESH_VERTEX 18 -160 160 -96 + *MESH_VERTEX 19 -160 -160 -96 + *MESH_VERTEX 20 160 -160 -96 + *MESH_VERTEX 21 160 160 -96 + *MESH_VERTEX 22 -160 160 -96 + *MESH_VERTEX 23 160 -160 -96 + *MESH_VERTEX 24 -160 -160 256 + *MESH_VERTEX 25 160 -160 256 + *MESH_VERTEX 26 160 -160 -96 + *MESH_VERTEX 27 -160 -160 -96 + *MESH_VERTEX 28 -160 -160 256 + *MESH_VERTEX 29 160 -160 -96 + *MESH_VERTEX 30 -160 160 256 + *MESH_VERTEX 31 -160 -160 256 + *MESH_VERTEX 32 -160 -160 -96 + *MESH_VERTEX 33 -160 160 -96 + *MESH_VERTEX 34 -160 160 256 + *MESH_VERTEX 35 -160 -160 -96 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 0 B: 1 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 1: A: 3 B: 4 C: 5 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 2: A: 6 B: 7 C: 8 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 3: A: 9 B: 10 C: 11 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 4: A: 12 B: 13 C: 14 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 5: A: 15 B: 16 C: 17 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 6: A: 18 B: 19 C: 20 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 7: A: 21 B: 22 C: 23 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 8: A: 24 B: 25 C: 26 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 9: A: 27 B: 28 C: 29 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 10: A: 30 B: 31 C: 32 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 11: A: 33 B: 34 C: 35 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 36 + *MESH_TVERTLIST { + *MESH_TVERT 0 2 -4.36364 0.0000 + *MESH_TVERT 1 0 -4.36364 0.0000 + *MESH_TVERT 2 0 -7.09091 0.0000 + *MESH_TVERT 3 2 -7.09091 0.0000 + *MESH_TVERT 4 2 -4.36364 0.0000 + *MESH_TVERT 5 0 -7.09091 0.0000 + *MESH_TVERT 6 4 -3 0.0000 + *MESH_TVERT 7 4 -6.50232e-08 0.0000 + *MESH_TVERT 8 2 -6.50232e-08 0.0000 + *MESH_TVERT 9 2 -3 0.0000 + *MESH_TVERT 10 4 -3 0.0000 + *MESH_TVERT 11 2 -6.50232e-08 0.0000 + *MESH_TVERT 12 2 -6.50232e-08 0.0000 + *MESH_TVERT 13 0 -6.50232e-08 0.0000 + *MESH_TVERT 14 0 -3 0.0000 + *MESH_TVERT 15 2 -3 0.0000 + *MESH_TVERT 16 2 -6.50232e-08 0.0000 + *MESH_TVERT 17 0 -3 0.0000 + *MESH_TVERT 18 2 1.36364 0.0000 + *MESH_TVERT 19 0 1.36364 0.0000 + *MESH_TVERT 20 0 -1.36364 0.0000 + *MESH_TVERT 21 2 -1.36364 0.0000 + *MESH_TVERT 22 2 1.36364 0.0000 + *MESH_TVERT 23 0 -1.36364 0.0000 + *MESH_TVERT 24 0 -6.50232e-08 0.0000 + *MESH_TVERT 25 -2 -6.50232e-08 0.0000 + *MESH_TVERT 26 -2 -3 0.0000 + *MESH_TVERT 27 0 -3 0.0000 + *MESH_TVERT 28 0 -6.50232e-08 0.0000 + *MESH_TVERT 29 -2 -3 0.0000 + *MESH_TVERT 30 2 -6.50232e-08 0.0000 + *MESH_TVERT 31 0 -6.50232e-08 0.0000 + *MESH_TVERT 32 0 -3 0.0000 + *MESH_TVERT 33 2 -3 0.0000 + *MESH_TVERT 34 2 -6.50232e-08 0.0000 + *MESH_TVERT 35 0 -3 0.0000 + } + *MESH_NUMTVFACES 12 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 3 4 5 + *MESH_TFACE 2 6 7 8 + *MESH_TFACE 3 9 10 11 + *MESH_TFACE 4 12 13 14 + *MESH_TFACE 5 15 16 17 + *MESH_TFACE 6 18 19 20 + *MESH_TFACE 7 21 22 23 + *MESH_TFACE 8 24 25 26 + *MESH_TFACE 9 27 28 29 + *MESH_TFACE 10 30 31 32 + *MESH_TFACE 11 33 34 35 + } + *MESH_NUMCVERTEX 36 + *MESH_CVERTLIST { + *MESH_VERTCOL 0 1 1 1 + *MESH_VERTCOL 1 1 1 1 + *MESH_VERTCOL 2 1 1 1 + *MESH_VERTCOL 3 1 1 1 + *MESH_VERTCOL 4 1 1 1 + *MESH_VERTCOL 5 1 1 1 + *MESH_VERTCOL 6 1 1 1 + *MESH_VERTCOL 7 1 1 1 + *MESH_VERTCOL 8 1 1 1 + *MESH_VERTCOL 9 1 1 1 + *MESH_VERTCOL 10 1 1 1 + *MESH_VERTCOL 11 1 1 1 + *MESH_VERTCOL 12 1 1 1 + *MESH_VERTCOL 13 1 1 1 + *MESH_VERTCOL 14 1 1 1 + *MESH_VERTCOL 15 1 1 1 + *MESH_VERTCOL 16 1 1 1 + *MESH_VERTCOL 17 1 1 1 + *MESH_VERTCOL 18 1 1 1 + *MESH_VERTCOL 19 1 1 1 + *MESH_VERTCOL 20 1 1 1 + *MESH_VERTCOL 21 1 1 1 + *MESH_VERTCOL 22 1 1 1 + *MESH_VERTCOL 23 1 1 1 + *MESH_VERTCOL 24 1 1 1 + *MESH_VERTCOL 25 1 1 1 + *MESH_VERTCOL 26 1 1 1 + *MESH_VERTCOL 27 1 1 1 + *MESH_VERTCOL 28 1 1 1 + *MESH_VERTCOL 29 1 1 1 + *MESH_VERTCOL 30 1 1 1 + *MESH_VERTCOL 31 1 1 1 + *MESH_VERTCOL 32 1 1 1 + *MESH_VERTCOL 33 1 1 1 + *MESH_VERTCOL 34 1 1 1 + *MESH_VERTCOL 35 1 1 1 + } + *MESH_NUMCVFACES 12 + *MESH_CFACELIST { + *MESH_CFACE 0 0 1 2 + *MESH_CFACE 1 3 4 5 + *MESH_CFACE 2 6 7 8 + *MESH_CFACE 3 9 10 11 + *MESH_CFACE 4 12 13 14 + *MESH_CFACE 5 15 16 17 + *MESH_CFACE 6 18 19 20 + *MESH_CFACE 7 21 22 23 + *MESH_CFACE 8 24 25 26 + *MESH_CFACE 9 27 28 29 + *MESH_CFACE 10 30 31 32 + *MESH_CFACE 11 33 34 35 + } + *MESH_NORMALS { + *MESH_FACENORMAL 0 -0 -0 -1 + *MESH_VERTEXNORMAL 0 -0 -0 -1 + *MESH_VERTEXNORMAL 1 -0 -0 -1 + *MESH_VERTEXNORMAL 2 -0 -0 -1 + *MESH_FACENORMAL 1 -0 -0 -1 + *MESH_VERTEXNORMAL 3 -0 -0 -1 + *MESH_VERTEXNORMAL 4 -0 -0 -1 + *MESH_VERTEXNORMAL 5 -0 -0 -1 + *MESH_FACENORMAL 2 -0 -1 0 + *MESH_VERTEXNORMAL 6 -0 -1 0 + *MESH_VERTEXNORMAL 7 -0 -1 0 + *MESH_VERTEXNORMAL 8 -0 -1 0 + *MESH_FACENORMAL 3 -0 -1 0 + *MESH_VERTEXNORMAL 9 -0 -1 0 + *MESH_VERTEXNORMAL 10 -0 -1 0 + *MESH_VERTEXNORMAL 11 -0 -1 0 + *MESH_FACENORMAL 4 -1 -0 -0 + *MESH_VERTEXNORMAL 12 -1 -0 -0 + *MESH_VERTEXNORMAL 13 -1 -0 -0 + *MESH_VERTEXNORMAL 14 -1 -0 -0 + *MESH_FACENORMAL 5 -1 -0 -0 + *MESH_VERTEXNORMAL 15 -1 -0 -0 + *MESH_VERTEXNORMAL 16 -1 -0 -0 + *MESH_VERTEXNORMAL 17 -1 -0 -0 + *MESH_FACENORMAL 6 -0 -0 1 + *MESH_VERTEXNORMAL 18 -0 -0 1 + *MESH_VERTEXNORMAL 19 -0 -0 1 + *MESH_VERTEXNORMAL 20 -0 -0 1 + *MESH_FACENORMAL 7 -0 -0 1 + *MESH_VERTEXNORMAL 21 -0 -0 1 + *MESH_VERTEXNORMAL 22 -0 -0 1 + *MESH_VERTEXNORMAL 23 -0 -0 1 + *MESH_FACENORMAL 8 -0 1 -0 + *MESH_VERTEXNORMAL 24 -0 1 -0 + *MESH_VERTEXNORMAL 25 -0 1 -0 + *MESH_VERTEXNORMAL 26 -0 1 -0 + *MESH_FACENORMAL 9 -0 1 -0 + *MESH_VERTEXNORMAL 27 -0 1 -0 + *MESH_VERTEXNORMAL 28 -0 1 -0 + *MESH_VERTEXNORMAL 29 -0 1 -0 + *MESH_FACENORMAL 10 1 -0 -0 + *MESH_VERTEXNORMAL 30 1 -0 -0 + *MESH_VERTEXNORMAL 31 1 -0 -0 + *MESH_VERTEXNORMAL 32 1 -0 -0 + *MESH_FACENORMAL 11 1 -0 -0 + *MESH_VERTEXNORMAL 33 1 -0 -0 + *MESH_VERTEXNORMAL 34 1 -0 -0 + *MESH_VERTEXNORMAL 35 1 -0 -0 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} diff --git a/install/resources/preview/sphere.ase b/install/resources/preview/sphere.ase new file mode 100644 index 0000000000..d6bbda2d60 --- /dev/null +++ b/install/resources/preview/sphere.ase @@ -0,0 +1,6892 @@ +*3DSMAX_ASCIIEXPORT 200 +*COMMENT "Ascii Scene Exporter v2.52" +*SCENE { + *SCENE_FILENAME "cube.blend" + *SCENE_FIRSTFRAME 0 + *SCENE_LASTFRAME 100 + *SCENE_FRAMESPEED 30 + *SCENE_TICKSPERFRAME 160 + *SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000 + *SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000 +} +*MATERIAL_LIST { + *MATERIAL_COUNT 1 + *MATERIAL 0 { + *MATERIAL_NAME "material" + *MATERIAL_CLASS "Standard" + *MATERIAL_AMBIENT 0.0000 0.0000 0.0000 + *MATERIAL_DIFFUSE 0.9071 0.9071 0.9071 1.0000 + *MATERIAL_SPECULAR 1.0000 1.0000 1.0000 + *MATERIAL_SHINE 2.5000 + *MATERIAL_SHINESTRENGTH 0.5000 + *MATERIAL_TRANSPARENCY 0.0000 + *MATERIAL_WIRESIZE 1.0000 + *MATERIAL_SHADING Blinn + *MATERIAL_XP_FALLOFF 0.0000 + *MATERIAL_SELFILLUM 0.0000 + *MATERIAL_FALLOFF In + *MATERIAL_XP_TYPE Filter + *MAP_DIFFUSE { + *MAP_NAME "material" + *MAP_CLASS "Bitmap" + *MAP_SUBNO 1 + *MAP_AMOUNT 1.0000 + *BITMAP "\\base\material" + *MAP_TYPE Screen + *UVW_U_OFFSET 0.0000 + *UVW_V_OFFSET 0.0000 + *UVW_U_TILING 1.0000 + *UVW_V_TILING 1.0000 + *UVW_ANGLE 0.0000 + *UVW_BLUR 1.0000 + *UVW_BLUR_OFFSET 0.0000 + *UVW_NOISE_AMT 1.0000 + *UVW_NOISE_SIZE 1.0000 + *UVW_NOISE_LEVEL 1 + *UVW_NOISE_PHASE 0.0000 + *BITMAP_FILTER Pyramidal + } + } +} +*GEOMOBJECT { + *NODE_NAME "Sphere" + *NODE_TM { + *NODE_NAME "Sphere" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 482 + *MESH_NUMFACES 960 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 0.0000 5.3584 26.9360 + *MESH_VERTEX 1 0.0000 10.5104 25.3728 + *MESH_VERTEX 2 0.0000 15.2576 22.8352 + *MESH_VERTEX 3 0.0000 19.4192 19.4192 + *MESH_VERTEX 4 0.0000 22.8352 15.2576 + *MESH_VERTEX 5 0.0000 25.3728 10.5104 + *MESH_VERTEX 6 0.0000 26.9360 5.3584 + *MESH_VERTEX 7 0.0000 27.4640 0.0000 + *MESH_VERTEX 8 0.0000 26.9360 -5.3584 + *MESH_VERTEX 9 0.0000 15.2576 -22.8352 + *MESH_VERTEX 10 1.0448 5.2544 26.9360 + *MESH_VERTEX 11 2.0496 10.3072 25.3728 + *MESH_VERTEX 12 2.9760 14.9648 22.8352 + *MESH_VERTEX 13 3.7888 19.0464 19.4192 + *MESH_VERTEX 14 4.4544 22.3968 15.2576 + *MESH_VERTEX 15 4.9504 24.8848 10.5104 + *MESH_VERTEX 16 5.2544 26.4176 5.3584 + *MESH_VERTEX 17 5.3584 26.9360 0.0000 + *MESH_VERTEX 18 5.2544 26.4176 -5.3584 + *MESH_VERTEX 19 4.9504 24.8848 -10.5104 + *MESH_VERTEX 20 4.4544 22.3968 -15.2576 + *MESH_VERTEX 21 3.7888 19.0464 -19.4192 + *MESH_VERTEX 22 2.9760 14.9648 -22.8352 + *MESH_VERTEX 23 2.0496 10.3072 -25.3728 + *MESH_VERTEX 24 1.0448 5.2544 -26.9360 + *MESH_VERTEX 25 2.0496 4.9504 26.9360 + *MESH_VERTEX 26 4.0224 9.7104 25.3728 + *MESH_VERTEX 27 5.8384 14.0960 22.8352 + *MESH_VERTEX 28 7.4320 17.9408 19.4192 + *MESH_VERTEX 29 8.7392 21.0960 15.2576 + *MESH_VERTEX 30 9.7104 23.4416 10.5104 + *MESH_VERTEX 31 10.3072 24.8848 5.3584 + *MESH_VERTEX 32 10.5104 25.3728 0.0000 + *MESH_VERTEX 33 10.3072 24.8848 -5.3584 + *MESH_VERTEX 34 9.7104 23.4416 -10.5104 + *MESH_VERTEX 35 8.7392 21.0960 -15.2576 + *MESH_VERTEX 36 7.4320 17.9408 -19.4192 + *MESH_VERTEX 37 5.8384 14.0960 -22.8352 + *MESH_VERTEX 38 4.0224 9.7104 -25.3728 + *MESH_VERTEX 39 2.0496 4.9504 -26.9360 + *MESH_VERTEX 40 2.9760 4.4544 26.9360 + *MESH_VERTEX 41 5.8384 8.7392 25.3728 + *MESH_VERTEX 42 8.4768 12.6864 22.8352 + *MESH_VERTEX 43 10.7888 16.1472 19.4192 + *MESH_VERTEX 44 12.6864 18.9872 15.2576 + *MESH_VERTEX 45 14.0960 21.0960 10.5104 + *MESH_VERTEX 46 14.9648 22.3968 5.3584 + *MESH_VERTEX 47 15.2576 22.8352 0.0000 + *MESH_VERTEX 48 14.9648 22.3968 -5.3584 + *MESH_VERTEX 49 14.0960 21.0960 -10.5104 + *MESH_VERTEX 50 12.6864 18.9872 -15.2576 + *MESH_VERTEX 51 10.7888 16.1472 -19.4192 + *MESH_VERTEX 52 8.4768 12.6864 -22.8352 + *MESH_VERTEX 53 5.8384 8.7392 -25.3728 + *MESH_VERTEX 54 2.9760 4.4544 -26.9360 + *MESH_VERTEX 55 3.7888 3.7888 26.9360 + *MESH_VERTEX 56 7.4320 7.4320 25.3728 + *MESH_VERTEX 57 10.7888 10.7888 22.8352 + *MESH_VERTEX 58 13.7312 13.7312 19.4192 + *MESH_VERTEX 59 16.1472 16.1472 15.2576 + *MESH_VERTEX 60 17.9408 17.9408 10.5104 + *MESH_VERTEX 61 19.0464 19.0464 5.3584 + *MESH_VERTEX 62 19.4192 19.4192 0.0000 + *MESH_VERTEX 63 19.0464 19.0464 -5.3584 + *MESH_VERTEX 64 17.9408 17.9408 -10.5104 + *MESH_VERTEX 65 16.1472 16.1472 -15.2576 + *MESH_VERTEX 66 13.7312 13.7312 -19.4192 + *MESH_VERTEX 67 10.7888 10.7888 -22.8352 + *MESH_VERTEX 68 7.4320 7.4320 -25.3728 + *MESH_VERTEX 69 3.7888 3.7888 -26.9360 + *MESH_VERTEX 70 4.4544 2.9760 26.9360 + *MESH_VERTEX 71 8.7392 5.8384 25.3728 + *MESH_VERTEX 72 12.6864 8.4768 22.8352 + *MESH_VERTEX 73 16.1472 10.7888 19.4192 + *MESH_VERTEX 74 18.9872 12.6864 15.2576 + *MESH_VERTEX 75 21.0960 14.0960 10.5104 + *MESH_VERTEX 76 22.3968 14.9648 5.3584 + *MESH_VERTEX 77 22.8352 15.2576 0.0000 + *MESH_VERTEX 78 22.3968 14.9648 -5.3584 + *MESH_VERTEX 79 21.0960 14.0960 -10.5104 + *MESH_VERTEX 80 18.9872 12.6864 -15.2576 + *MESH_VERTEX 81 16.1472 10.7888 -19.4192 + *MESH_VERTEX 82 12.6864 8.4768 -22.8352 + *MESH_VERTEX 83 8.7392 5.8384 -25.3728 + *MESH_VERTEX 84 4.4544 2.9760 -26.9360 + *MESH_VERTEX 85 4.9504 2.0496 26.9360 + *MESH_VERTEX 86 9.7104 4.0224 25.3728 + *MESH_VERTEX 87 14.0960 5.8384 22.8352 + *MESH_VERTEX 88 17.9408 7.4320 19.4192 + *MESH_VERTEX 89 21.0960 8.7392 15.2576 + *MESH_VERTEX 90 23.4416 9.7104 10.5104 + *MESH_VERTEX 91 24.8848 10.3072 5.3584 + *MESH_VERTEX 92 25.3728 10.5104 0.0000 + *MESH_VERTEX 93 24.8848 10.3072 -5.3584 + *MESH_VERTEX 94 23.4416 9.7104 -10.5104 + *MESH_VERTEX 95 21.0960 8.7392 -15.2576 + *MESH_VERTEX 96 17.9408 7.4320 -19.4192 + *MESH_VERTEX 97 14.0960 5.8384 -22.8352 + *MESH_VERTEX 98 9.7104 4.0224 -25.3728 + *MESH_VERTEX 99 4.9504 2.0496 -26.9360 + *MESH_VERTEX 100 5.2544 1.0448 26.9360 + *MESH_VERTEX 101 10.3072 2.0496 25.3728 + *MESH_VERTEX 102 14.9648 2.9760 22.8352 + *MESH_VERTEX 103 19.0464 3.7888 19.4192 + *MESH_VERTEX 104 22.3968 4.4544 15.2576 + *MESH_VERTEX 105 24.8848 4.9504 10.5104 + *MESH_VERTEX 106 26.4176 5.2544 5.3584 + *MESH_VERTEX 107 26.9360 5.3584 0.0000 + *MESH_VERTEX 108 26.4176 5.2544 -5.3584 + *MESH_VERTEX 109 24.8848 4.9504 -10.5104 + *MESH_VERTEX 110 22.3968 4.4544 -15.2576 + *MESH_VERTEX 111 19.0464 3.7888 -19.4192 + *MESH_VERTEX 112 14.9648 2.9760 -22.8352 + *MESH_VERTEX 113 10.3072 2.0496 -25.3728 + *MESH_VERTEX 114 5.2544 1.0448 -26.9360 + *MESH_VERTEX 115 5.3584 -0.0000 26.9360 + *MESH_VERTEX 116 10.5104 -0.0000 25.3728 + *MESH_VERTEX 117 15.2576 -0.0000 22.8352 + *MESH_VERTEX 118 19.4192 -0.0000 19.4192 + *MESH_VERTEX 119 22.8352 -0.0000 15.2576 + *MESH_VERTEX 120 25.3728 -0.0000 10.5104 + *MESH_VERTEX 121 26.9360 -0.0000 5.3584 + *MESH_VERTEX 122 27.4640 -0.0000 0.0000 + *MESH_VERTEX 123 26.9360 -0.0000 -5.3584 + *MESH_VERTEX 124 25.3728 -0.0000 -10.5104 + *MESH_VERTEX 125 22.8352 -0.0000 -15.2576 + *MESH_VERTEX 126 19.4192 -0.0000 -19.4192 + *MESH_VERTEX 127 15.2576 -0.0000 -22.8352 + *MESH_VERTEX 128 10.5104 -0.0000 -25.3728 + *MESH_VERTEX 129 5.3584 -0.0000 -26.9360 + *MESH_VERTEX 130 5.2544 -1.0448 26.9360 + *MESH_VERTEX 131 10.3072 -2.0496 25.3728 + *MESH_VERTEX 132 14.9648 -2.9760 22.8352 + *MESH_VERTEX 133 19.0464 -3.7888 19.4192 + *MESH_VERTEX 134 22.3968 -4.4544 15.2576 + *MESH_VERTEX 135 24.8848 -4.9504 10.5104 + *MESH_VERTEX 136 26.4176 -5.2544 5.3584 + *MESH_VERTEX 137 26.9360 -5.3584 0.0000 + *MESH_VERTEX 138 26.4176 -5.2544 -5.3584 + *MESH_VERTEX 139 24.8848 -4.9504 -10.5104 + *MESH_VERTEX 140 22.3968 -4.4544 -15.2576 + *MESH_VERTEX 141 19.0464 -3.7888 -19.4192 + *MESH_VERTEX 142 14.9648 -2.9760 -22.8352 + *MESH_VERTEX 143 10.3072 -2.0496 -25.3728 + *MESH_VERTEX 144 5.2544 -1.0448 -26.9360 + *MESH_VERTEX 145 4.9504 -2.0496 26.9360 + *MESH_VERTEX 146 9.7104 -4.0224 25.3728 + *MESH_VERTEX 147 14.0960 -5.8384 22.8352 + *MESH_VERTEX 148 17.9408 -7.4320 19.4192 + *MESH_VERTEX 149 21.0960 -8.7392 15.2576 + *MESH_VERTEX 150 23.4416 -9.7104 10.5104 + *MESH_VERTEX 151 24.8848 -10.3072 5.3584 + *MESH_VERTEX 152 25.3728 -10.5104 0.0000 + *MESH_VERTEX 153 24.8848 -10.3072 -5.3584 + *MESH_VERTEX 154 23.4416 -9.7104 -10.5104 + *MESH_VERTEX 155 21.0960 -8.7392 -15.2576 + *MESH_VERTEX 156 17.9408 -7.4320 -19.4192 + *MESH_VERTEX 157 14.0960 -5.8384 -22.8352 + *MESH_VERTEX 158 9.7104 -4.0224 -25.3728 + *MESH_VERTEX 159 4.9504 -2.0496 -26.9360 + *MESH_VERTEX 160 4.4544 -2.9760 26.9360 + *MESH_VERTEX 161 8.7392 -5.8384 25.3728 + *MESH_VERTEX 162 12.6864 -8.4768 22.8352 + *MESH_VERTEX 163 16.1472 -10.7888 19.4192 + *MESH_VERTEX 164 18.9872 -12.6864 15.2576 + *MESH_VERTEX 165 21.0960 -14.0960 10.5104 + *MESH_VERTEX 166 22.3968 -14.9648 5.3584 + *MESH_VERTEX 167 22.8352 -15.2576 0.0000 + *MESH_VERTEX 168 22.3968 -14.9648 -5.3584 + *MESH_VERTEX 169 21.0960 -14.0960 -10.5104 + *MESH_VERTEX 170 18.9872 -12.6864 -15.2576 + *MESH_VERTEX 171 16.1472 -10.7888 -19.4192 + *MESH_VERTEX 172 12.6864 -8.4768 -22.8352 + *MESH_VERTEX 173 8.7392 -5.8384 -25.3728 + *MESH_VERTEX 174 4.4544 -2.9760 -26.9360 + *MESH_VERTEX 175 3.7888 -3.7888 26.9360 + *MESH_VERTEX 176 7.4320 -7.4320 25.3728 + *MESH_VERTEX 177 10.7888 -10.7888 22.8352 + *MESH_VERTEX 178 13.7312 -13.7312 19.4192 + *MESH_VERTEX 179 16.1472 -16.1472 15.2576 + *MESH_VERTEX 180 17.9408 -17.9408 10.5104 + *MESH_VERTEX 181 19.0464 -19.0464 5.3584 + *MESH_VERTEX 182 19.4192 -19.4192 0.0000 + *MESH_VERTEX 183 19.0464 -19.0464 -5.3584 + *MESH_VERTEX 184 17.9408 -17.9408 -10.5104 + *MESH_VERTEX 185 16.1472 -16.1472 -15.2576 + *MESH_VERTEX 186 13.7312 -13.7312 -19.4192 + *MESH_VERTEX 187 10.7888 -10.7888 -22.8352 + *MESH_VERTEX 188 7.4320 -7.4320 -25.3728 + *MESH_VERTEX 189 3.7888 -3.7888 -26.9360 + *MESH_VERTEX 190 2.9760 -4.4544 26.9360 + *MESH_VERTEX 191 5.8384 -8.7392 25.3728 + *MESH_VERTEX 192 8.4768 -12.6864 22.8352 + *MESH_VERTEX 193 10.7888 -16.1472 19.4192 + *MESH_VERTEX 194 12.6864 -18.9872 15.2576 + *MESH_VERTEX 195 14.0960 -21.0960 10.5104 + *MESH_VERTEX 196 14.9648 -22.3968 5.3584 + *MESH_VERTEX 197 15.2576 -22.8352 0.0000 + *MESH_VERTEX 198 14.9648 -22.3968 -5.3584 + *MESH_VERTEX 199 14.0960 -21.0960 -10.5104 + *MESH_VERTEX 200 12.6864 -18.9872 -15.2576 + *MESH_VERTEX 201 10.7888 -16.1472 -19.4192 + *MESH_VERTEX 202 8.4768 -12.6864 -22.8352 + *MESH_VERTEX 203 5.8384 -8.7392 -25.3728 + *MESH_VERTEX 204 2.9760 -4.4544 -26.9360 + *MESH_VERTEX 205 0.0000 -0.0000 -27.4640 + *MESH_VERTEX 206 2.0496 -4.9504 26.9360 + *MESH_VERTEX 207 4.0224 -9.7104 25.3728 + *MESH_VERTEX 208 5.8384 -14.0960 22.8352 + *MESH_VERTEX 209 7.4320 -17.9408 19.4192 + *MESH_VERTEX 210 8.7392 -21.0960 15.2576 + *MESH_VERTEX 211 9.7104 -23.4416 10.5104 + *MESH_VERTEX 212 10.3072 -24.8848 5.3584 + *MESH_VERTEX 213 10.5104 -25.3728 0.0000 + *MESH_VERTEX 214 10.3072 -24.8848 -5.3584 + *MESH_VERTEX 215 9.7104 -23.4416 -10.5104 + *MESH_VERTEX 216 8.7392 -21.0960 -15.2576 + *MESH_VERTEX 217 7.4320 -17.9408 -19.4192 + *MESH_VERTEX 218 5.8384 -14.0960 -22.8352 + *MESH_VERTEX 219 4.0224 -9.7104 -25.3728 + *MESH_VERTEX 220 2.0496 -4.9504 -26.9360 + *MESH_VERTEX 221 1.0448 -5.2544 26.9360 + *MESH_VERTEX 222 2.0496 -10.3072 25.3728 + *MESH_VERTEX 223 2.9760 -14.9648 22.8352 + *MESH_VERTEX 224 3.7888 -19.0464 19.4192 + *MESH_VERTEX 225 4.4544 -22.3968 15.2576 + *MESH_VERTEX 226 4.9504 -24.8848 10.5104 + *MESH_VERTEX 227 5.2544 -26.4176 5.3584 + *MESH_VERTEX 228 5.3584 -26.9360 0.0000 + *MESH_VERTEX 229 5.2544 -26.4176 -5.3584 + *MESH_VERTEX 230 4.9504 -24.8848 -10.5104 + *MESH_VERTEX 231 4.4544 -22.3968 -15.2576 + *MESH_VERTEX 232 3.7888 -19.0464 -19.4192 + *MESH_VERTEX 233 2.9760 -14.9648 -22.8352 + *MESH_VERTEX 234 2.0496 -10.3072 -25.3728 + *MESH_VERTEX 235 1.0448 -5.2544 -26.9360 + *MESH_VERTEX 236 -0.0000 -5.3584 26.9360 + *MESH_VERTEX 237 0.0000 -10.5104 25.3728 + *MESH_VERTEX 238 0.0000 -15.2576 22.8352 + *MESH_VERTEX 239 -0.0000 -19.4192 19.4192 + *MESH_VERTEX 240 -0.0000 -22.8352 15.2576 + *MESH_VERTEX 241 0.0000 -25.3728 10.5104 + *MESH_VERTEX 242 -0.0000 -26.9360 5.3584 + *MESH_VERTEX 243 -0.0000 -27.4640 0.0000 + *MESH_VERTEX 244 -0.0000 -26.9360 -5.3584 + *MESH_VERTEX 245 0.0000 -25.3728 -10.5104 + *MESH_VERTEX 246 -0.0000 -22.8352 -15.2576 + *MESH_VERTEX 247 -0.0000 -19.4192 -19.4192 + *MESH_VERTEX 248 -0.0000 -15.2576 -22.8352 + *MESH_VERTEX 249 0.0000 -10.5104 -25.3728 + *MESH_VERTEX 250 0.0000 -5.3584 -26.9360 + *MESH_VERTEX 251 -1.0448 -5.2544 26.9360 + *MESH_VERTEX 252 -2.0496 -10.3072 25.3728 + *MESH_VERTEX 253 -2.9760 -14.9648 22.8352 + *MESH_VERTEX 254 -3.7888 -19.0464 19.4192 + *MESH_VERTEX 255 -4.4544 -22.3968 15.2576 + *MESH_VERTEX 256 -4.9504 -24.8848 10.5104 + *MESH_VERTEX 257 -5.2544 -26.4176 5.3584 + *MESH_VERTEX 258 -5.3584 -26.9360 0.0000 + *MESH_VERTEX 259 -5.2544 -26.4176 -5.3584 + *MESH_VERTEX 260 -4.9504 -24.8848 -10.5104 + *MESH_VERTEX 261 -4.4544 -22.3968 -15.2576 + *MESH_VERTEX 262 -3.7888 -19.0464 -19.4192 + *MESH_VERTEX 263 -2.9760 -14.9648 -22.8352 + *MESH_VERTEX 264 -2.0496 -10.3072 -25.3728 + *MESH_VERTEX 265 -1.0448 -5.2544 -26.9360 + *MESH_VERTEX 266 -2.0496 -4.9504 26.9360 + *MESH_VERTEX 267 -4.0224 -9.7104 25.3728 + *MESH_VERTEX 268 -5.8384 -14.0960 22.8352 + *MESH_VERTEX 269 -7.4320 -17.9408 19.4192 + *MESH_VERTEX 270 -8.7392 -21.0960 15.2576 + *MESH_VERTEX 271 -9.7104 -23.4416 10.5104 + *MESH_VERTEX 272 -10.3072 -24.8848 5.3584 + *MESH_VERTEX 273 -10.5104 -25.3728 0.0000 + *MESH_VERTEX 274 -10.3072 -24.8848 -5.3584 + *MESH_VERTEX 275 -9.7104 -23.4416 -10.5104 + *MESH_VERTEX 276 -8.7392 -21.0960 -15.2576 + *MESH_VERTEX 277 -7.4320 -17.9408 -19.4192 + *MESH_VERTEX 278 -5.8384 -14.0960 -22.8352 + *MESH_VERTEX 279 -4.0224 -9.7104 -25.3728 + *MESH_VERTEX 280 -2.0496 -4.9504 -26.9360 + *MESH_VERTEX 281 -2.9760 -4.4544 26.9360 + *MESH_VERTEX 282 -5.8384 -8.7392 25.3728 + *MESH_VERTEX 283 -8.4768 -12.6864 22.8352 + *MESH_VERTEX 284 -10.7888 -16.1472 19.4192 + *MESH_VERTEX 285 -12.6864 -18.9872 15.2576 + *MESH_VERTEX 286 -14.0960 -21.0960 10.5104 + *MESH_VERTEX 287 -14.9648 -22.3968 5.3584 + *MESH_VERTEX 288 -15.2576 -22.8352 0.0000 + *MESH_VERTEX 289 -14.9648 -22.3968 -5.3584 + *MESH_VERTEX 290 -14.0960 -21.0960 -10.5104 + *MESH_VERTEX 291 -12.6864 -18.9872 -15.2576 + *MESH_VERTEX 292 -10.7888 -16.1472 -19.4192 + *MESH_VERTEX 293 -8.4768 -12.6864 -22.8352 + *MESH_VERTEX 294 -5.8384 -8.7392 -25.3728 + *MESH_VERTEX 295 -2.9760 -4.4544 -26.9360 + *MESH_VERTEX 296 -0.0000 -0.0000 27.4640 + *MESH_VERTEX 297 -3.7888 -3.7888 26.9360 + *MESH_VERTEX 298 -7.4320 -7.4320 25.3728 + *MESH_VERTEX 299 -10.7888 -10.7888 22.8352 + *MESH_VERTEX 300 -13.7312 -13.7312 19.4192 + *MESH_VERTEX 301 -16.1472 -16.1472 15.2576 + *MESH_VERTEX 302 -17.9408 -17.9408 10.5104 + *MESH_VERTEX 303 -19.0464 -19.0464 5.3584 + *MESH_VERTEX 304 -19.4192 -19.4192 0.0000 + *MESH_VERTEX 305 -19.0464 -19.0464 -5.3584 + *MESH_VERTEX 306 -17.9408 -17.9408 -10.5104 + *MESH_VERTEX 307 -16.1472 -16.1472 -15.2576 + *MESH_VERTEX 308 -13.7312 -13.7312 -19.4192 + *MESH_VERTEX 309 -10.7888 -10.7888 -22.8352 + *MESH_VERTEX 310 -7.4320 -7.4320 -25.3728 + *MESH_VERTEX 311 -3.7888 -3.7888 -26.9360 + *MESH_VERTEX 312 -4.4544 -2.9760 26.9360 + *MESH_VERTEX 313 -8.7392 -5.8384 25.3728 + *MESH_VERTEX 314 -12.6864 -8.4768 22.8352 + *MESH_VERTEX 315 -16.1472 -10.7888 19.4192 + *MESH_VERTEX 316 -18.9872 -12.6864 15.2576 + *MESH_VERTEX 317 -21.0960 -14.0960 10.5104 + *MESH_VERTEX 318 -22.3968 -14.9648 5.3584 + *MESH_VERTEX 319 -22.8352 -15.2576 0.0000 + *MESH_VERTEX 320 -22.3968 -14.9648 -5.3584 + *MESH_VERTEX 321 -21.0960 -14.0960 -10.5104 + *MESH_VERTEX 322 -18.9872 -12.6864 -15.2576 + *MESH_VERTEX 323 -16.1472 -10.7888 -19.4192 + *MESH_VERTEX 324 -12.6864 -8.4768 -22.8352 + *MESH_VERTEX 325 -8.7392 -5.8384 -25.3728 + *MESH_VERTEX 326 -4.4544 -2.9760 -26.9360 + *MESH_VERTEX 327 -4.9504 -2.0496 26.9360 + *MESH_VERTEX 328 -9.7104 -4.0224 25.3728 + *MESH_VERTEX 329 -14.0960 -5.8384 22.8352 + *MESH_VERTEX 330 -17.9408 -7.4320 19.4192 + *MESH_VERTEX 331 -21.0960 -8.7392 15.2576 + *MESH_VERTEX 332 -23.4416 -9.7104 10.5104 + *MESH_VERTEX 333 -24.8848 -10.3072 5.3584 + *MESH_VERTEX 334 -25.3728 -10.5104 0.0000 + *MESH_VERTEX 335 -24.8848 -10.3072 -5.3584 + *MESH_VERTEX 336 -23.4416 -9.7104 -10.5104 + *MESH_VERTEX 337 -21.0960 -8.7392 -15.2576 + *MESH_VERTEX 338 -17.9408 -7.4320 -19.4192 + *MESH_VERTEX 339 -14.0960 -5.8384 -22.8352 + *MESH_VERTEX 340 -9.7104 -4.0224 -25.3728 + *MESH_VERTEX 341 -4.9504 -2.0496 -26.9360 + *MESH_VERTEX 342 -5.2544 -1.0448 26.9360 + *MESH_VERTEX 343 -10.3072 -2.0496 25.3728 + *MESH_VERTEX 344 -14.9648 -2.9760 22.8352 + *MESH_VERTEX 345 -19.0464 -3.7888 19.4192 + *MESH_VERTEX 346 -22.3968 -4.4544 15.2576 + *MESH_VERTEX 347 -24.8848 -4.9504 10.5104 + *MESH_VERTEX 348 -26.4176 -5.2544 5.3584 + *MESH_VERTEX 349 -26.9360 -5.3584 0.0000 + *MESH_VERTEX 350 -26.4176 -5.2544 -5.3584 + *MESH_VERTEX 351 -24.8848 -4.9504 -10.5104 + *MESH_VERTEX 352 -22.3968 -4.4544 -15.2576 + *MESH_VERTEX 353 -19.0464 -3.7888 -19.4192 + *MESH_VERTEX 354 -14.9648 -2.9760 -22.8352 + *MESH_VERTEX 355 -10.3072 -2.0496 -25.3728 + *MESH_VERTEX 356 -5.2544 -1.0448 -26.9360 + *MESH_VERTEX 357 -5.3584 -0.0000 26.9360 + *MESH_VERTEX 358 -10.5104 -0.0000 25.3728 + *MESH_VERTEX 359 -15.2576 -0.0000 22.8352 + *MESH_VERTEX 360 -19.4192 -0.0000 19.4192 + *MESH_VERTEX 361 -22.8352 -0.0000 15.2576 + *MESH_VERTEX 362 -25.3728 -0.0000 10.5104 + *MESH_VERTEX 363 -26.9360 -0.0000 5.3584 + *MESH_VERTEX 364 -27.4640 -0.0000 0.0000 + *MESH_VERTEX 365 -26.9360 -0.0000 -5.3584 + *MESH_VERTEX 366 -25.3728 -0.0000 -10.5104 + *MESH_VERTEX 367 -22.8352 -0.0000 -15.2576 + *MESH_VERTEX 368 -19.4192 -0.0000 -19.4192 + *MESH_VERTEX 369 -15.2576 -0.0000 -22.8352 + *MESH_VERTEX 370 -10.5104 -0.0000 -25.3728 + *MESH_VERTEX 371 -5.3584 -0.0000 -26.9360 + *MESH_VERTEX 372 -5.2544 1.0448 26.9360 + *MESH_VERTEX 373 -10.3072 2.0496 25.3728 + *MESH_VERTEX 374 -14.9648 2.9760 22.8352 + *MESH_VERTEX 375 -19.0464 3.7888 19.4192 + *MESH_VERTEX 376 -22.3968 4.4544 15.2576 + *MESH_VERTEX 377 -24.8848 4.9504 10.5104 + *MESH_VERTEX 378 -26.4176 5.2544 5.3584 + *MESH_VERTEX 379 -26.9360 5.3584 0.0000 + *MESH_VERTEX 380 -26.4176 5.2544 -5.3584 + *MESH_VERTEX 381 -24.8848 4.9504 -10.5104 + *MESH_VERTEX 382 -22.3968 4.4544 -15.2576 + *MESH_VERTEX 383 -19.0464 3.7888 -19.4192 + *MESH_VERTEX 384 -14.9648 2.9760 -22.8352 + *MESH_VERTEX 385 -10.3072 2.0496 -25.3728 + *MESH_VERTEX 386 -5.2544 1.0448 -26.9360 + *MESH_VERTEX 387 -4.9504 2.0496 26.9360 + *MESH_VERTEX 388 -9.7104 4.0224 25.3728 + *MESH_VERTEX 389 -14.0960 5.8384 22.8352 + *MESH_VERTEX 390 -17.9408 7.4320 19.4192 + *MESH_VERTEX 391 -21.0960 8.7392 15.2576 + *MESH_VERTEX 392 -23.4416 9.7104 10.5104 + *MESH_VERTEX 393 -24.8848 10.3072 5.3584 + *MESH_VERTEX 394 -25.3728 10.5104 0.0000 + *MESH_VERTEX 395 -24.8848 10.3072 -5.3584 + *MESH_VERTEX 396 -23.4416 9.7104 -10.5104 + *MESH_VERTEX 397 -21.0960 8.7392 -15.2576 + *MESH_VERTEX 398 -17.9408 7.4320 -19.4192 + *MESH_VERTEX 399 -14.0960 5.8384 -22.8352 + *MESH_VERTEX 400 -9.7104 4.0224 -25.3728 + *MESH_VERTEX 401 -4.9504 2.0496 -26.9360 + *MESH_VERTEX 402 -4.4544 2.9760 26.9360 + *MESH_VERTEX 403 -8.7392 5.8384 25.3728 + *MESH_VERTEX 404 -12.6864 8.4768 22.8352 + *MESH_VERTEX 405 -16.1472 10.7888 19.4192 + *MESH_VERTEX 406 -18.9872 12.6864 15.2576 + *MESH_VERTEX 407 -21.0960 14.0960 10.5104 + *MESH_VERTEX 408 -22.3968 14.9648 5.3584 + *MESH_VERTEX 409 -22.8352 15.2576 0.0000 + *MESH_VERTEX 410 -22.3968 14.9648 -5.3584 + *MESH_VERTEX 411 -21.0960 14.0960 -10.5104 + *MESH_VERTEX 412 -18.9872 12.6864 -15.2576 + *MESH_VERTEX 413 -16.1472 10.7888 -19.4192 + *MESH_VERTEX 414 -12.6864 8.4768 -22.8352 + *MESH_VERTEX 415 -8.7392 5.8384 -25.3728 + *MESH_VERTEX 416 -4.4544 2.9760 -26.9360 + *MESH_VERTEX 417 -3.7888 3.7888 26.9360 + *MESH_VERTEX 418 -7.4320 7.4320 25.3728 + *MESH_VERTEX 419 -10.7888 10.7888 22.8352 + *MESH_VERTEX 420 -13.7312 13.7312 19.4192 + *MESH_VERTEX 421 -16.1472 16.1472 15.2576 + *MESH_VERTEX 422 -17.9408 17.9408 10.5104 + *MESH_VERTEX 423 -19.0464 19.0464 5.3584 + *MESH_VERTEX 424 -19.4192 19.4192 0.0000 + *MESH_VERTEX 425 -19.0464 19.0464 -5.3584 + *MESH_VERTEX 426 -17.9408 17.9408 -10.5104 + *MESH_VERTEX 427 -16.1472 16.1472 -15.2576 + *MESH_VERTEX 428 -13.7312 13.7312 -19.4192 + *MESH_VERTEX 429 -10.7888 10.7888 -22.8352 + *MESH_VERTEX 430 -7.4320 7.4320 -25.3728 + *MESH_VERTEX 431 -3.7888 3.7888 -26.9360 + *MESH_VERTEX 432 -2.9760 4.4544 26.9360 + *MESH_VERTEX 433 -5.8384 8.7392 25.3728 + *MESH_VERTEX 434 -8.4768 12.6864 22.8352 + *MESH_VERTEX 435 -10.7888 16.1472 19.4192 + *MESH_VERTEX 436 -12.6864 18.9872 15.2576 + *MESH_VERTEX 437 -14.0960 21.0960 10.5104 + *MESH_VERTEX 438 -14.9648 22.3968 5.3584 + *MESH_VERTEX 439 -15.2576 22.8352 0.0000 + *MESH_VERTEX 440 -14.9648 22.3968 -5.3584 + *MESH_VERTEX 441 -14.0960 21.0960 -10.5104 + *MESH_VERTEX 442 -12.6864 18.9872 -15.2576 + *MESH_VERTEX 443 -10.7888 16.1472 -19.4192 + *MESH_VERTEX 444 -8.4768 12.6864 -22.8352 + *MESH_VERTEX 445 -5.8384 8.7392 -25.3728 + *MESH_VERTEX 446 -2.9760 4.4544 -26.9360 + *MESH_VERTEX 447 -2.0496 4.9504 26.9360 + *MESH_VERTEX 448 -4.0224 9.7104 25.3728 + *MESH_VERTEX 449 -5.8384 14.0960 22.8352 + *MESH_VERTEX 450 -7.4320 17.9408 19.4192 + *MESH_VERTEX 451 -8.7392 21.0960 15.2576 + *MESH_VERTEX 452 -9.7104 23.4416 10.5104 + *MESH_VERTEX 453 -10.3072 24.8848 5.3584 + *MESH_VERTEX 454 -10.5104 25.3728 0.0000 + *MESH_VERTEX 455 -10.3072 24.8848 -5.3584 + *MESH_VERTEX 456 -9.7104 23.4416 -10.5104 + *MESH_VERTEX 457 -8.7392 21.0960 -15.2576 + *MESH_VERTEX 458 -7.4320 17.9408 -19.4192 + *MESH_VERTEX 459 -5.8384 14.0960 -22.8352 + *MESH_VERTEX 460 -4.0224 9.7104 -25.3728 + *MESH_VERTEX 461 -2.0496 4.9504 -26.9360 + *MESH_VERTEX 462 -1.0448 5.2544 26.9360 + *MESH_VERTEX 463 -2.0496 10.3072 25.3728 + *MESH_VERTEX 464 -2.9760 14.9648 22.8352 + *MESH_VERTEX 465 -3.7888 19.0464 19.4192 + *MESH_VERTEX 466 -4.4544 22.3968 15.2576 + *MESH_VERTEX 467 -4.9504 24.8848 10.5104 + *MESH_VERTEX 468 -5.2544 26.4176 5.3584 + *MESH_VERTEX 469 -5.3584 26.9360 0.0000 + *MESH_VERTEX 470 -5.2544 26.4176 -5.3584 + *MESH_VERTEX 471 -4.9504 24.8848 -10.5104 + *MESH_VERTEX 472 -4.4544 22.3968 -15.2576 + *MESH_VERTEX 473 -3.7888 19.0464 -19.4192 + *MESH_VERTEX 474 -2.9760 14.9648 -22.8352 + *MESH_VERTEX 475 -2.0496 10.3072 -25.3728 + *MESH_VERTEX 476 -1.0448 5.2544 -26.9360 + *MESH_VERTEX 477 0.0000 25.3728 -10.5104 + *MESH_VERTEX 478 0.0000 22.8352 -15.2576 + *MESH_VERTEX 479 0.0000 19.4192 -19.4192 + *MESH_VERTEX 480 0.0000 10.5104 -25.3728 + *MESH_VERTEX 481 0.0000 5.3584 -26.9360 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 477 B: 20 C: 478 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 1: A: 2 B: 13 C: 3 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 2: A: 478 B: 21 C: 479 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 3: A: 3 B: 14 C: 4 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 4: A: 479 B: 22 C: 9 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 5: A: 4 B: 15 C: 5 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 6: A: 9 B: 23 C: 480 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 7: A: 5 B: 16 C: 6 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 8: A: 480 B: 24 C: 481 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 9: A: 6 B: 17 C: 7 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 10: A: 0 B: 296 C: 10 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 11: A: 205 B: 481 C: 24 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 12: A: 7 B: 18 C: 8 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 13: A: 0 B: 11 C: 1 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 14: A: 8 B: 19 C: 477 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 15: A: 2 B: 11 C: 12 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 16: A: 19 B: 33 C: 34 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 17: A: 11 B: 27 C: 12 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 18: A: 19 B: 35 C: 20 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 19: A: 12 B: 28 C: 13 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 20: A: 21 B: 35 C: 36 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 21: A: 13 B: 29 C: 14 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 22: A: 21 B: 37 C: 22 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 23: A: 14 B: 30 C: 15 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 24: A: 22 B: 38 C: 23 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 25: A: 15 B: 31 C: 16 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 26: A: 23 B: 39 C: 24 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 27: A: 16 B: 32 C: 17 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 28: A: 10 B: 296 C: 25 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 29: A: 205 B: 24 C: 39 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 30: A: 18 B: 32 C: 33 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 31: A: 10 B: 26 C: 11 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 32: A: 37 B: 53 C: 38 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 33: A: 31 B: 45 C: 46 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 34: A: 38 B: 54 C: 39 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 35: A: 31 B: 47 C: 32 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 36: A: 25 B: 296 C: 40 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 37: A: 205 B: 39 C: 54 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 38: A: 32 B: 48 C: 33 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 39: A: 25 B: 41 C: 26 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 40: A: 33 B: 49 C: 34 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 41: A: 26 B: 42 C: 27 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 42: A: 35 B: 49 C: 50 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 43: A: 27 B: 43 C: 28 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 44: A: 36 B: 50 C: 51 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 45: A: 28 B: 44 C: 29 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 46: A: 36 B: 52 C: 37 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 47: A: 29 B: 45 C: 30 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 48: A: 41 B: 57 C: 42 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 49: A: 50 B: 64 C: 65 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 50: A: 42 B: 58 C: 43 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 51: A: 50 B: 66 C: 51 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 52: A: 43 B: 59 C: 44 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 53: A: 51 B: 67 C: 52 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 54: A: 44 B: 60 C: 45 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 55: A: 52 B: 68 C: 53 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 56: A: 45 B: 61 C: 46 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 57: A: 53 B: 69 C: 54 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 58: A: 47 B: 61 C: 62 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 59: A: 40 B: 296 C: 55 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 60: A: 205 B: 54 C: 69 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 61: A: 47 B: 63 C: 48 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 62: A: 40 B: 56 C: 41 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 63: A: 48 B: 64 C: 49 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 64: A: 60 B: 76 C: 61 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 65: A: 68 B: 84 C: 69 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 66: A: 62 B: 76 C: 77 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 67: A: 55 B: 296 C: 70 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 68: A: 205 B: 69 C: 84 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 69: A: 62 B: 78 C: 63 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 70: A: 55 B: 71 C: 56 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 71: A: 63 B: 79 C: 64 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 72: A: 56 B: 72 C: 57 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 73: A: 65 B: 79 C: 80 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 74: A: 57 B: 73 C: 58 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 75: A: 65 B: 81 C: 66 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 76: A: 59 B: 73 C: 74 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 77: A: 67 B: 81 C: 82 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 78: A: 59 B: 75 C: 60 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 79: A: 68 B: 82 C: 83 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 80: A: 80 B: 94 C: 95 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 81: A: 72 B: 88 C: 73 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 82: A: 81 B: 95 C: 96 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 83: A: 74 B: 88 C: 89 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 84: A: 81 B: 97 C: 82 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 85: A: 74 B: 90 C: 75 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 86: A: 83 B: 97 C: 98 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 87: A: 76 B: 90 C: 91 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 88: A: 83 B: 99 C: 84 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 89: A: 76 B: 92 C: 77 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 90: A: 70 B: 296 C: 85 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 91: A: 205 B: 84 C: 99 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 92: A: 77 B: 93 C: 78 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 93: A: 70 B: 86 C: 71 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 94: A: 78 B: 94 C: 79 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 95: A: 71 B: 87 C: 72 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 96: A: 99 B: 113 C: 114 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 97: A: 91 B: 107 C: 92 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 98: A: 85 B: 296 C: 100 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 99: A: 205 B: 99 C: 114 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 100: A: 92 B: 108 C: 93 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 101: A: 85 B: 101 C: 86 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 102: A: 93 B: 109 C: 94 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 103: A: 86 B: 102 C: 87 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 104: A: 95 B: 109 C: 110 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 105: A: 88 B: 102 C: 103 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 106: A: 96 B: 110 C: 111 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 107: A: 88 B: 104 C: 89 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 108: A: 96 B: 112 C: 97 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 109: A: 89 B: 105 C: 90 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 110: A: 97 B: 113 C: 98 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 111: A: 91 B: 105 C: 106 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 112: A: 110 B: 126 C: 111 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 113: A: 103 B: 119 C: 104 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 114: A: 112 B: 126 C: 127 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 115: A: 104 B: 120 C: 105 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 116: A: 113 B: 127 C: 128 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 117: A: 106 B: 120 C: 121 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 118: A: 114 B: 128 C: 129 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 119: A: 106 B: 122 C: 107 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 120: A: 100 B: 296 C: 115 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 121: A: 205 B: 114 C: 129 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 122: A: 108 B: 122 C: 123 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 123: A: 100 B: 116 C: 101 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 124: A: 108 B: 124 C: 109 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 125: A: 101 B: 117 C: 102 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 126: A: 110 B: 124 C: 125 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 127: A: 102 B: 118 C: 103 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 128: A: 115 B: 296 C: 130 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 129: A: 205 B: 129 C: 144 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 130: A: 122 B: 138 C: 123 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 131: A: 116 B: 130 C: 131 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 132: A: 123 B: 139 C: 124 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 133: A: 116 B: 132 C: 117 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 134: A: 125 B: 139 C: 140 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 135: A: 117 B: 133 C: 118 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 136: A: 125 B: 141 C: 126 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 137: A: 119 B: 133 C: 134 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 138: A: 127 B: 141 C: 142 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 139: A: 119 B: 135 C: 120 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 140: A: 127 B: 143 C: 128 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 141: A: 121 B: 135 C: 136 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 142: A: 129 B: 143 C: 144 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 143: A: 121 B: 137 C: 122 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 144: A: 133 B: 149 C: 134 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 145: A: 141 B: 157 C: 142 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 146: A: 134 B: 150 C: 135 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 147: A: 143 B: 157 C: 158 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 148: A: 136 B: 150 C: 151 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 149: A: 143 B: 159 C: 144 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 150: A: 136 B: 152 C: 137 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 151: A: 130 B: 296 C: 145 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 152: A: 205 B: 144 C: 159 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 153: A: 137 B: 153 C: 138 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 154: A: 130 B: 146 C: 131 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 155: A: 138 B: 154 C: 139 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 156: A: 132 B: 146 C: 147 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 157: A: 140 B: 154 C: 155 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 158: A: 132 B: 148 C: 133 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 159: A: 140 B: 156 C: 141 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 160: A: 153 B: 167 C: 168 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 161: A: 145 B: 161 C: 146 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 162: A: 153 B: 169 C: 154 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 163: A: 146 B: 162 C: 147 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 164: A: 155 B: 169 C: 170 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 165: A: 147 B: 163 C: 148 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 166: A: 155 B: 171 C: 156 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 167: A: 149 B: 163 C: 164 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 168: A: 157 B: 171 C: 172 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 169: A: 149 B: 165 C: 150 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 170: A: 157 B: 173 C: 158 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 171: A: 151 B: 165 C: 166 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 172: A: 158 B: 174 C: 159 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 173: A: 151 B: 167 C: 152 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 174: A: 145 B: 296 C: 160 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 175: A: 205 B: 159 C: 174 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 176: A: 172 B: 186 C: 187 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 177: A: 164 B: 180 C: 165 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 178: A: 172 B: 188 C: 173 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 179: A: 166 B: 180 C: 181 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 180: A: 174 B: 188 C: 189 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 181: A: 166 B: 182 C: 167 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 182: A: 160 B: 296 C: 175 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 183: A: 205 B: 174 C: 189 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 184: A: 167 B: 183 C: 168 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 185: A: 160 B: 176 C: 161 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 186: A: 168 B: 184 C: 169 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 187: A: 161 B: 177 C: 162 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 188: A: 169 B: 185 C: 170 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 189: A: 162 B: 178 C: 163 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 190: A: 170 B: 186 C: 171 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 191: A: 163 B: 179 C: 164 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 192: A: 175 B: 191 C: 176 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 193: A: 183 B: 199 C: 184 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 194: A: 176 B: 192 C: 177 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 195: A: 185 B: 199 C: 200 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 196: A: 178 B: 192 C: 193 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 197: A: 185 B: 201 C: 186 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 198: A: 179 B: 193 C: 194 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 199: A: 187 B: 201 C: 202 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 200: A: 179 B: 195 C: 180 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 201: A: 187 B: 203 C: 188 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 202: A: 181 B: 195 C: 196 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 203: A: 189 B: 203 C: 204 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 204: A: 181 B: 197 C: 182 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 205: A: 175 B: 296 C: 190 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 206: A: 205 B: 189 C: 204 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 207: A: 183 B: 197 C: 198 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 208: A: 194 B: 211 C: 195 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 209: A: 202 B: 219 C: 203 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 210: A: 196 B: 211 C: 212 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 211: A: 203 B: 220 C: 204 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 212: A: 196 B: 213 C: 197 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 213: A: 190 B: 296 C: 206 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 214: A: 205 B: 204 C: 220 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 215: A: 197 B: 214 C: 198 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 216: A: 190 B: 207 C: 191 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 217: A: 198 B: 215 C: 199 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 218: A: 192 B: 207 C: 208 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 219: A: 200 B: 215 C: 216 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 220: A: 192 B: 209 C: 193 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 221: A: 200 B: 217 C: 201 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 222: A: 193 B: 210 C: 194 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 223: A: 202 B: 217 C: 218 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 224: A: 214 B: 230 C: 215 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 225: A: 207 B: 223 C: 208 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 226: A: 216 B: 230 C: 231 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 227: A: 208 B: 224 C: 209 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 228: A: 216 B: 232 C: 217 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 229: A: 209 B: 225 C: 210 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 230: A: 217 B: 233 C: 218 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 231: A: 210 B: 226 C: 211 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 232: A: 218 B: 234 C: 219 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 233: A: 212 B: 226 C: 227 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 234: A: 220 B: 234 C: 235 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 235: A: 212 B: 228 C: 213 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 236: A: 206 B: 296 C: 221 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 237: A: 205 B: 220 C: 235 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 238: A: 213 B: 229 C: 214 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 239: A: 206 B: 222 C: 207 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 240: A: 233 B: 249 C: 234 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 241: A: 227 B: 241 C: 242 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 242: A: 235 B: 249 C: 250 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 243: A: 227 B: 243 C: 228 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 244: A: 221 B: 296 C: 236 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 245: A: 205 B: 235 C: 250 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 246: A: 228 B: 244 C: 229 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 247: A: 221 B: 237 C: 222 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 248: A: 229 B: 245 C: 230 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 249: A: 223 B: 237 C: 238 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 250: A: 231 B: 245 C: 246 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 251: A: 224 B: 238 C: 239 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 252: A: 231 B: 247 C: 232 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 253: A: 224 B: 240 C: 225 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 254: A: 233 B: 247 C: 248 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 255: A: 225 B: 241 C: 226 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 256: A: 246 B: 260 C: 261 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 257: A: 239 B: 253 C: 254 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 258: A: 246 B: 262 C: 247 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 259: A: 240 B: 254 C: 255 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 260: A: 247 B: 263 C: 248 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 261: A: 240 B: 256 C: 241 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 262: A: 248 B: 264 C: 249 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 263: A: 242 B: 256 C: 257 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 264: A: 249 B: 265 C: 250 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 265: A: 242 B: 258 C: 243 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 266: A: 236 B: 296 C: 251 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 267: A: 205 B: 250 C: 265 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 268: A: 243 B: 259 C: 244 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 269: A: 236 B: 252 C: 237 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 270: A: 244 B: 260 C: 245 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 271: A: 237 B: 253 C: 238 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 272: A: 265 B: 279 C: 280 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 273: A: 257 B: 273 C: 258 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 274: A: 251 B: 296 C: 266 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 275: A: 205 B: 265 C: 280 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 276: A: 259 B: 273 C: 274 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 277: A: 251 B: 267 C: 252 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 278: A: 259 B: 275 C: 260 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 279: A: 252 B: 268 C: 253 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 280: A: 261 B: 275 C: 276 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 281: A: 254 B: 268 C: 269 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 282: A: 261 B: 277 C: 262 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 283: A: 255 B: 269 C: 270 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 284: A: 262 B: 278 C: 263 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 285: A: 255 B: 271 C: 256 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 286: A: 264 B: 278 C: 279 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 287: A: 257 B: 271 C: 272 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 288: A: 268 B: 284 C: 269 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 289: A: 276 B: 292 C: 277 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 290: A: 270 B: 284 C: 285 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 291: A: 278 B: 292 C: 293 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 292: A: 270 B: 286 C: 271 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 293: A: 278 B: 294 C: 279 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 294: A: 272 B: 286 C: 287 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 295: A: 280 B: 294 C: 295 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 296: A: 272 B: 288 C: 273 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 297: A: 266 B: 296 C: 281 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 298: A: 205 B: 280 C: 295 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 299: A: 273 B: 289 C: 274 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 300: A: 266 B: 282 C: 267 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 301: A: 274 B: 290 C: 275 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 302: A: 267 B: 283 C: 268 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 303: A: 276 B: 290 C: 291 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 304: A: 288 B: 303 C: 304 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 305: A: 281 B: 296 C: 297 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 306: A: 205 B: 295 C: 311 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 307: A: 288 B: 305 C: 289 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 308: A: 281 B: 298 C: 282 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 309: A: 289 B: 306 C: 290 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 310: A: 282 B: 299 C: 283 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 311: A: 291 B: 306 C: 307 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 312: A: 284 B: 299 C: 300 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 313: A: 291 B: 308 C: 292 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 314: A: 285 B: 300 C: 301 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 315: A: 292 B: 309 C: 293 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 316: A: 285 B: 302 C: 286 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 317: A: 293 B: 310 C: 294 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 318: A: 287 B: 302 C: 303 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 319: A: 294 B: 311 C: 295 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 320: A: 307 B: 323 C: 308 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 321: A: 301 B: 315 C: 316 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 322: A: 308 B: 324 C: 309 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 323: A: 301 B: 317 C: 302 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 324: A: 310 B: 324 C: 325 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 325: A: 303 B: 317 C: 318 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 326: A: 310 B: 326 C: 311 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 327: A: 303 B: 319 C: 304 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 328: A: 297 B: 296 C: 312 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 329: A: 205 B: 311 C: 326 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 330: A: 304 B: 320 C: 305 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 331: A: 297 B: 313 C: 298 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 332: A: 305 B: 321 C: 306 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 333: A: 298 B: 314 C: 299 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 334: A: 307 B: 321 C: 322 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 335: A: 300 B: 314 C: 315 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 336: A: 312 B: 296 C: 327 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 337: A: 205 B: 326 C: 341 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 338: A: 319 B: 335 C: 320 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 339: A: 312 B: 328 C: 313 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 340: A: 320 B: 336 C: 321 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 341: A: 313 B: 329 C: 314 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 342: A: 322 B: 336 C: 337 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 343: A: 315 B: 329 C: 330 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 344: A: 323 B: 337 C: 338 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 345: A: 316 B: 330 C: 331 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 346: A: 323 B: 339 C: 324 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 347: A: 316 B: 332 C: 317 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 348: A: 325 B: 339 C: 340 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 349: A: 318 B: 332 C: 333 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 350: A: 326 B: 340 C: 341 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 351: A: 318 B: 334 C: 319 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 352: A: 331 B: 345 C: 346 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 353: A: 338 B: 354 C: 339 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 354: A: 331 B: 347 C: 332 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 355: A: 340 B: 354 C: 355 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 356: A: 333 B: 347 C: 348 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 357: A: 340 B: 356 C: 341 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 358: A: 333 B: 349 C: 334 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 359: A: 327 B: 296 C: 342 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 360: A: 205 B: 341 C: 356 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 361: A: 334 B: 350 C: 335 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 362: A: 328 B: 342 C: 343 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 363: A: 335 B: 351 C: 336 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 364: A: 328 B: 344 C: 329 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 365: A: 337 B: 351 C: 352 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 366: A: 330 B: 344 C: 345 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 367: A: 337 B: 353 C: 338 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 368: A: 350 B: 364 C: 365 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 369: A: 343 B: 357 C: 358 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 370: A: 350 B: 366 C: 351 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 371: A: 343 B: 359 C: 344 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 372: A: 352 B: 366 C: 367 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 373: A: 345 B: 359 C: 360 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 374: A: 352 B: 368 C: 353 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 375: A: 345 B: 361 C: 346 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 376: A: 354 B: 368 C: 369 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 377: A: 346 B: 362 C: 347 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 378: A: 355 B: 369 C: 370 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 379: A: 348 B: 362 C: 363 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 380: A: 355 B: 371 C: 356 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 381: A: 348 B: 364 C: 349 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 382: A: 342 B: 296 C: 357 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 383: A: 205 B: 356 C: 371 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 384: A: 368 B: 384 C: 369 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 385: A: 361 B: 377 C: 362 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 386: A: 370 B: 384 C: 385 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 387: A: 363 B: 377 C: 378 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 388: A: 370 B: 386 C: 371 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 389: A: 363 B: 379 C: 364 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 390: A: 357 B: 296 C: 372 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 391: A: 205 B: 371 C: 386 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 392: A: 365 B: 379 C: 380 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 393: A: 358 B: 372 C: 373 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 394: A: 365 B: 381 C: 366 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 395: A: 358 B: 374 C: 359 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 396: A: 367 B: 381 C: 382 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 397: A: 360 B: 374 C: 375 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 398: A: 367 B: 383 C: 368 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 399: A: 361 B: 375 C: 376 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 400: A: 380 B: 396 C: 381 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 401: A: 373 B: 389 C: 374 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 402: A: 382 B: 396 C: 397 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 403: A: 375 B: 389 C: 390 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 404: A: 382 B: 398 C: 383 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 405: A: 375 B: 391 C: 376 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 406: A: 383 B: 399 C: 384 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 407: A: 376 B: 392 C: 377 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 408: A: 385 B: 399 C: 400 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 409: A: 378 B: 392 C: 393 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 410: A: 385 B: 401 C: 386 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 411: A: 378 B: 394 C: 379 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 412: A: 372 B: 296 C: 387 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 413: A: 205 B: 386 C: 401 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 414: A: 379 B: 395 C: 380 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 415: A: 372 B: 388 C: 373 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 416: A: 400 B: 414 C: 415 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 417: A: 393 B: 407 C: 408 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 418: A: 400 B: 416 C: 401 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 419: A: 393 B: 409 C: 394 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 420: A: 387 B: 296 C: 402 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 421: A: 205 B: 401 C: 416 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 422: A: 395 B: 409 C: 410 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 423: A: 387 B: 403 C: 388 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 424: A: 395 B: 411 C: 396 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 425: A: 389 B: 403 C: 404 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 426: A: 397 B: 411 C: 412 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 427: A: 390 B: 404 C: 405 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 428: A: 397 B: 413 C: 398 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 429: A: 391 B: 405 C: 406 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 430: A: 398 B: 414 C: 399 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 431: A: 391 B: 407 C: 392 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 432: A: 403 B: 419 C: 404 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 433: A: 412 B: 426 C: 427 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 434: A: 404 B: 420 C: 405 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 435: A: 412 B: 428 C: 413 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 436: A: 406 B: 420 C: 421 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 437: A: 413 B: 429 C: 414 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 438: A: 406 B: 422 C: 407 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 439: A: 414 B: 430 C: 415 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 440: A: 408 B: 422 C: 423 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 441: A: 415 B: 431 C: 416 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 442: A: 408 B: 424 C: 409 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 443: A: 402 B: 296 C: 417 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 444: A: 205 B: 416 C: 431 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 445: A: 410 B: 424 C: 425 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 446: A: 402 B: 418 C: 403 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 447: A: 410 B: 426 C: 411 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 448: A: 423 B: 437 C: 438 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 449: A: 430 B: 446 C: 431 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 450: A: 424 B: 438 C: 439 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 451: A: 417 B: 296 C: 432 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 452: A: 205 B: 431 C: 446 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 453: A: 424 B: 440 C: 425 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 454: A: 417 B: 433 C: 418 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 455: A: 425 B: 441 C: 426 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 456: A: 418 B: 434 C: 419 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 457: A: 427 B: 441 C: 442 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 458: A: 419 B: 435 C: 420 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 459: A: 427 B: 443 C: 428 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 460: A: 421 B: 435 C: 436 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 461: A: 429 B: 443 C: 444 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 462: A: 421 B: 437 C: 422 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 463: A: 429 B: 445 C: 430 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 464: A: 442 B: 456 C: 457 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 465: A: 435 B: 449 C: 450 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 466: A: 442 B: 458 C: 443 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 467: A: 436 B: 450 C: 451 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 468: A: 443 B: 459 C: 444 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 469: A: 436 B: 452 C: 437 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 470: A: 444 B: 460 C: 445 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 471: A: 438 B: 452 C: 453 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 472: A: 445 B: 461 C: 446 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 473: A: 438 B: 454 C: 439 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 474: A: 432 B: 296 C: 447 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 475: A: 205 B: 446 C: 461 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 476: A: 439 B: 455 C: 440 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 477: A: 433 B: 447 C: 448 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 478: A: 440 B: 456 C: 441 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 479: A: 434 B: 448 C: 449 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 480: A: 461 B: 475 C: 476 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 481: A: 453 B: 469 C: 454 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 482: A: 447 B: 296 C: 462 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 483: A: 205 B: 461 C: 476 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 484: A: 454 B: 470 C: 455 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 485: A: 447 B: 463 C: 448 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 486: A: 455 B: 471 C: 456 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 487: A: 448 B: 464 C: 449 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 488: A: 457 B: 471 C: 472 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 489: A: 449 B: 465 C: 450 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 490: A: 457 B: 473 C: 458 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 491: A: 451 B: 465 C: 466 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 492: A: 458 B: 474 C: 459 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 493: A: 451 B: 467 C: 452 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 494: A: 459 B: 475 C: 460 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 495: A: 453 B: 467 C: 468 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 496: A: 465 B: 2 C: 3 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 497: A: 472 B: 479 C: 473 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 498: A: 466 B: 3 C: 4 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 499: A: 473 B: 9 C: 474 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 500: A: 467 B: 4 C: 5 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 501: A: 474 B: 480 C: 475 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 502: A: 468 B: 5 C: 6 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 503: A: 475 B: 481 C: 476 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 504: A: 469 B: 6 C: 7 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 505: A: 462 B: 296 C: 0 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 506: A: 205 B: 476 C: 481 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 507: A: 469 B: 8 C: 470 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 508: A: 463 B: 0 C: 1 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 509: A: 470 B: 477 C: 471 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 510: A: 464 B: 1 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 511: A: 472 B: 477 C: 478 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 512: A: 477 B: 19 C: 20 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 513: A: 2 B: 12 C: 13 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 514: A: 478 B: 20 C: 21 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 515: A: 3 B: 13 C: 14 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 516: A: 479 B: 21 C: 22 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 517: A: 4 B: 14 C: 15 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 518: A: 9 B: 22 C: 23 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 519: A: 5 B: 15 C: 16 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 520: A: 480 B: 23 C: 24 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 521: A: 6 B: 16 C: 17 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 522: A: 7 B: 17 C: 18 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 523: A: 0 B: 10 C: 11 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 524: A: 8 B: 18 C: 19 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 525: A: 2 B: 1 C: 11 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 526: A: 19 B: 18 C: 33 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 527: A: 11 B: 26 C: 27 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 528: A: 19 B: 34 C: 35 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 529: A: 12 B: 27 C: 28 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 530: A: 21 B: 20 C: 35 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 531: A: 13 B: 28 C: 29 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 532: A: 21 B: 36 C: 37 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 533: A: 14 B: 29 C: 30 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 534: A: 22 B: 37 C: 38 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 535: A: 15 B: 30 C: 31 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 536: A: 23 B: 38 C: 39 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 537: A: 16 B: 31 C: 32 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 538: A: 18 B: 17 C: 32 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 539: A: 10 B: 25 C: 26 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 540: A: 37 B: 52 C: 53 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 541: A: 31 B: 30 C: 45 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 542: A: 38 B: 53 C: 54 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 543: A: 31 B: 46 C: 47 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 544: A: 32 B: 47 C: 48 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 545: A: 25 B: 40 C: 41 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 546: A: 33 B: 48 C: 49 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 547: A: 26 B: 41 C: 42 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 548: A: 35 B: 34 C: 49 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 549: A: 27 B: 42 C: 43 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 550: A: 36 B: 35 C: 50 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 551: A: 28 B: 43 C: 44 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 552: A: 36 B: 51 C: 52 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 553: A: 29 B: 44 C: 45 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 554: A: 41 B: 56 C: 57 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 555: A: 50 B: 49 C: 64 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 556: A: 42 B: 57 C: 58 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 557: A: 50 B: 65 C: 66 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 558: A: 43 B: 58 C: 59 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 559: A: 51 B: 66 C: 67 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 560: A: 44 B: 59 C: 60 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 561: A: 52 B: 67 C: 68 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 562: A: 45 B: 60 C: 61 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 563: A: 53 B: 68 C: 69 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 564: A: 47 B: 46 C: 61 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 565: A: 47 B: 62 C: 63 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 566: A: 40 B: 55 C: 56 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 567: A: 48 B: 63 C: 64 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 568: A: 60 B: 75 C: 76 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 569: A: 68 B: 83 C: 84 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 570: A: 62 B: 61 C: 76 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 571: A: 62 B: 77 C: 78 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 572: A: 55 B: 70 C: 71 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 573: A: 63 B: 78 C: 79 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 574: A: 56 B: 71 C: 72 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 575: A: 65 B: 64 C: 79 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 576: A: 57 B: 72 C: 73 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 577: A: 65 B: 80 C: 81 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 578: A: 59 B: 58 C: 73 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 579: A: 67 B: 66 C: 81 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 580: A: 59 B: 74 C: 75 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 581: A: 68 B: 67 C: 82 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 582: A: 80 B: 79 C: 94 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 583: A: 72 B: 87 C: 88 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 584: A: 81 B: 80 C: 95 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 585: A: 74 B: 73 C: 88 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 586: A: 81 B: 96 C: 97 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 587: A: 74 B: 89 C: 90 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 588: A: 83 B: 82 C: 97 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 589: A: 76 B: 75 C: 90 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 590: A: 83 B: 98 C: 99 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 591: A: 76 B: 91 C: 92 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 592: A: 77 B: 92 C: 93 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 593: A: 70 B: 85 C: 86 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 594: A: 78 B: 93 C: 94 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 595: A: 71 B: 86 C: 87 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 596: A: 99 B: 98 C: 113 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 597: A: 91 B: 106 C: 107 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 598: A: 92 B: 107 C: 108 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 599: A: 85 B: 100 C: 101 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 600: A: 93 B: 108 C: 109 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 601: A: 86 B: 101 C: 102 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 602: A: 95 B: 94 C: 109 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 603: A: 88 B: 87 C: 102 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 604: A: 96 B: 95 C: 110 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 605: A: 88 B: 103 C: 104 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 606: A: 96 B: 111 C: 112 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 607: A: 89 B: 104 C: 105 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 608: A: 97 B: 112 C: 113 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 609: A: 91 B: 90 C: 105 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 610: A: 110 B: 125 C: 126 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 611: A: 103 B: 118 C: 119 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 612: A: 112 B: 111 C: 126 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 613: A: 104 B: 119 C: 120 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 614: A: 113 B: 112 C: 127 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 615: A: 106 B: 105 C: 120 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 616: A: 114 B: 113 C: 128 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 617: A: 106 B: 121 C: 122 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 618: A: 108 B: 107 C: 122 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 619: A: 100 B: 115 C: 116 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 620: A: 108 B: 123 C: 124 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 621: A: 101 B: 116 C: 117 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 622: A: 110 B: 109 C: 124 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 623: A: 102 B: 117 C: 118 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 624: A: 122 B: 137 C: 138 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 625: A: 116 B: 115 C: 130 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 626: A: 123 B: 138 C: 139 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 627: A: 116 B: 131 C: 132 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 628: A: 125 B: 124 C: 139 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 629: A: 117 B: 132 C: 133 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 630: A: 125 B: 140 C: 141 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 631: A: 119 B: 118 C: 133 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 632: A: 127 B: 126 C: 141 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 633: A: 119 B: 134 C: 135 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 634: A: 127 B: 142 C: 143 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 635: A: 121 B: 120 C: 135 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 636: A: 129 B: 128 C: 143 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 637: A: 121 B: 136 C: 137 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 638: A: 133 B: 148 C: 149 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 639: A: 141 B: 156 C: 157 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 640: A: 134 B: 149 C: 150 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 641: A: 143 B: 142 C: 157 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 642: A: 136 B: 135 C: 150 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 643: A: 143 B: 158 C: 159 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 644: A: 136 B: 151 C: 152 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 645: A: 137 B: 152 C: 153 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 646: A: 130 B: 145 C: 146 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 647: A: 138 B: 153 C: 154 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 648: A: 132 B: 131 C: 146 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 649: A: 140 B: 139 C: 154 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 650: A: 132 B: 147 C: 148 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 651: A: 140 B: 155 C: 156 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 652: A: 153 B: 152 C: 167 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 653: A: 145 B: 160 C: 161 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 654: A: 153 B: 168 C: 169 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 655: A: 146 B: 161 C: 162 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 656: A: 155 B: 154 C: 169 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 657: A: 147 B: 162 C: 163 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 658: A: 155 B: 170 C: 171 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 659: A: 149 B: 148 C: 163 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 660: A: 157 B: 156 C: 171 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 661: A: 149 B: 164 C: 165 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 662: A: 157 B: 172 C: 173 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 663: A: 151 B: 150 C: 165 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 664: A: 158 B: 173 C: 174 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 665: A: 151 B: 166 C: 167 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 666: A: 172 B: 171 C: 186 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 667: A: 164 B: 179 C: 180 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 668: A: 172 B: 187 C: 188 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 669: A: 166 B: 165 C: 180 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 670: A: 174 B: 173 C: 188 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 671: A: 166 B: 181 C: 182 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 672: A: 167 B: 182 C: 183 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 673: A: 160 B: 175 C: 176 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 674: A: 168 B: 183 C: 184 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 675: A: 161 B: 176 C: 177 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 676: A: 169 B: 184 C: 185 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 677: A: 162 B: 177 C: 178 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 678: A: 170 B: 185 C: 186 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 679: A: 163 B: 178 C: 179 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 680: A: 175 B: 190 C: 191 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 681: A: 183 B: 198 C: 199 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 682: A: 176 B: 191 C: 192 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 683: A: 185 B: 184 C: 199 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 684: A: 178 B: 177 C: 192 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 685: A: 185 B: 200 C: 201 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 686: A: 179 B: 178 C: 193 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 687: A: 187 B: 186 C: 201 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 688: A: 179 B: 194 C: 195 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 689: A: 187 B: 202 C: 203 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 690: A: 181 B: 180 C: 195 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 691: A: 189 B: 188 C: 203 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 692: A: 181 B: 196 C: 197 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 693: A: 183 B: 182 C: 197 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 694: A: 194 B: 210 C: 211 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 695: A: 202 B: 218 C: 219 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 696: A: 196 B: 195 C: 211 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 697: A: 203 B: 219 C: 220 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 698: A: 196 B: 212 C: 213 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 699: A: 197 B: 213 C: 214 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 700: A: 190 B: 206 C: 207 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 701: A: 198 B: 214 C: 215 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 702: A: 192 B: 191 C: 207 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 703: A: 200 B: 199 C: 215 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 704: A: 192 B: 208 C: 209 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 705: A: 200 B: 216 C: 217 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 706: A: 193 B: 209 C: 210 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 707: A: 202 B: 201 C: 217 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 708: A: 214 B: 229 C: 230 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 709: A: 207 B: 222 C: 223 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 710: A: 216 B: 215 C: 230 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 711: A: 208 B: 223 C: 224 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 712: A: 216 B: 231 C: 232 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 713: A: 209 B: 224 C: 225 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 714: A: 217 B: 232 C: 233 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 715: A: 210 B: 225 C: 226 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 716: A: 218 B: 233 C: 234 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 717: A: 212 B: 211 C: 226 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 718: A: 220 B: 219 C: 234 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 719: A: 212 B: 227 C: 228 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 720: A: 213 B: 228 C: 229 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 721: A: 206 B: 221 C: 222 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 722: A: 233 B: 248 C: 249 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 723: A: 227 B: 226 C: 241 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 724: A: 235 B: 234 C: 249 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 725: A: 227 B: 242 C: 243 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 726: A: 228 B: 243 C: 244 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 727: A: 221 B: 236 C: 237 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 728: A: 229 B: 244 C: 245 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 729: A: 223 B: 222 C: 237 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 730: A: 231 B: 230 C: 245 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 731: A: 224 B: 223 C: 238 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 732: A: 231 B: 246 C: 247 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 733: A: 224 B: 239 C: 240 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 734: A: 233 B: 232 C: 247 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 735: A: 225 B: 240 C: 241 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 736: A: 246 B: 245 C: 260 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 737: A: 239 B: 238 C: 253 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 738: A: 246 B: 261 C: 262 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 739: A: 240 B: 239 C: 254 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 740: A: 247 B: 262 C: 263 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 741: A: 240 B: 255 C: 256 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 742: A: 248 B: 263 C: 264 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 743: A: 242 B: 241 C: 256 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 744: A: 249 B: 264 C: 265 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 745: A: 242 B: 257 C: 258 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 746: A: 243 B: 258 C: 259 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 747: A: 236 B: 251 C: 252 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 748: A: 244 B: 259 C: 260 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 749: A: 237 B: 252 C: 253 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 750: A: 265 B: 264 C: 279 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 751: A: 257 B: 272 C: 273 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 752: A: 259 B: 258 C: 273 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 753: A: 251 B: 266 C: 267 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 754: A: 259 B: 274 C: 275 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 755: A: 252 B: 267 C: 268 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 756: A: 261 B: 260 C: 275 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 757: A: 254 B: 253 C: 268 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 758: A: 261 B: 276 C: 277 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 759: A: 255 B: 254 C: 269 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 760: A: 262 B: 277 C: 278 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 761: A: 255 B: 270 C: 271 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 762: A: 264 B: 263 C: 278 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 763: A: 257 B: 256 C: 271 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 764: A: 268 B: 283 C: 284 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 765: A: 276 B: 291 C: 292 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 766: A: 270 B: 269 C: 284 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 767: A: 278 B: 277 C: 292 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 768: A: 270 B: 285 C: 286 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 769: A: 278 B: 293 C: 294 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 770: A: 272 B: 271 C: 286 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 771: A: 280 B: 279 C: 294 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 772: A: 272 B: 287 C: 288 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 773: A: 273 B: 288 C: 289 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 774: A: 266 B: 281 C: 282 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 775: A: 274 B: 289 C: 290 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 776: A: 267 B: 282 C: 283 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 777: A: 276 B: 275 C: 290 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 778: A: 288 B: 287 C: 303 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 779: A: 288 B: 304 C: 305 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 780: A: 281 B: 297 C: 298 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 781: A: 289 B: 305 C: 306 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 782: A: 282 B: 298 C: 299 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 783: A: 291 B: 290 C: 306 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 784: A: 284 B: 283 C: 299 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 785: A: 291 B: 307 C: 308 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 786: A: 285 B: 284 C: 300 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 787: A: 292 B: 308 C: 309 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 788: A: 285 B: 301 C: 302 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 789: A: 293 B: 309 C: 310 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 790: A: 287 B: 286 C: 302 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 791: A: 294 B: 310 C: 311 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 792: A: 307 B: 322 C: 323 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 793: A: 301 B: 300 C: 315 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 794: A: 308 B: 323 C: 324 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 795: A: 301 B: 316 C: 317 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 796: A: 310 B: 309 C: 324 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 797: A: 303 B: 302 C: 317 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 798: A: 310 B: 325 C: 326 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 799: A: 303 B: 318 C: 319 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 800: A: 304 B: 319 C: 320 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 801: A: 297 B: 312 C: 313 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 802: A: 305 B: 320 C: 321 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 803: A: 298 B: 313 C: 314 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 804: A: 307 B: 306 C: 321 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 805: A: 300 B: 299 C: 314 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 806: A: 319 B: 334 C: 335 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 807: A: 312 B: 327 C: 328 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 808: A: 320 B: 335 C: 336 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 809: A: 313 B: 328 C: 329 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 810: A: 322 B: 321 C: 336 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 811: A: 315 B: 314 C: 329 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 812: A: 323 B: 322 C: 337 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 813: A: 316 B: 315 C: 330 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 814: A: 323 B: 338 C: 339 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 815: A: 316 B: 331 C: 332 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 816: A: 325 B: 324 C: 339 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 817: A: 318 B: 317 C: 332 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 818: A: 326 B: 325 C: 340 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 819: A: 318 B: 333 C: 334 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 820: A: 331 B: 330 C: 345 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 821: A: 338 B: 353 C: 354 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 822: A: 331 B: 346 C: 347 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 823: A: 340 B: 339 C: 354 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 824: A: 333 B: 332 C: 347 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 825: A: 340 B: 355 C: 356 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 826: A: 333 B: 348 C: 349 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 827: A: 334 B: 349 C: 350 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 828: A: 328 B: 327 C: 342 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 829: A: 335 B: 350 C: 351 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 830: A: 328 B: 343 C: 344 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 831: A: 337 B: 336 C: 351 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 832: A: 330 B: 329 C: 344 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 833: A: 337 B: 352 C: 353 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 834: A: 350 B: 349 C: 364 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 835: A: 343 B: 342 C: 357 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 836: A: 350 B: 365 C: 366 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 837: A: 343 B: 358 C: 359 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 838: A: 352 B: 351 C: 366 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 839: A: 345 B: 344 C: 359 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 840: A: 352 B: 367 C: 368 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 841: A: 345 B: 360 C: 361 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 842: A: 354 B: 353 C: 368 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 843: A: 346 B: 361 C: 362 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 844: A: 355 B: 354 C: 369 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 845: A: 348 B: 347 C: 362 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 846: A: 355 B: 370 C: 371 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 847: A: 348 B: 363 C: 364 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 848: A: 368 B: 383 C: 384 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 849: A: 361 B: 376 C: 377 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 850: A: 370 B: 369 C: 384 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 851: A: 363 B: 362 C: 377 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 852: A: 370 B: 385 C: 386 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 853: A: 363 B: 378 C: 379 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 854: A: 365 B: 364 C: 379 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 855: A: 358 B: 357 C: 372 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 856: A: 365 B: 380 C: 381 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 857: A: 358 B: 373 C: 374 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 858: A: 367 B: 366 C: 381 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 859: A: 360 B: 359 C: 374 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 860: A: 367 B: 382 C: 383 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 861: A: 361 B: 360 C: 375 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 862: A: 380 B: 395 C: 396 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 863: A: 373 B: 388 C: 389 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 864: A: 382 B: 381 C: 396 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 865: A: 375 B: 374 C: 389 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 866: A: 382 B: 397 C: 398 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 867: A: 375 B: 390 C: 391 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 868: A: 383 B: 398 C: 399 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 869: A: 376 B: 391 C: 392 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 870: A: 385 B: 384 C: 399 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 871: A: 378 B: 377 C: 392 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 872: A: 385 B: 400 C: 401 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 873: A: 378 B: 393 C: 394 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 874: A: 379 B: 394 C: 395 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 875: A: 372 B: 387 C: 388 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 876: A: 400 B: 399 C: 414 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 877: A: 393 B: 392 C: 407 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 878: A: 400 B: 415 C: 416 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 879: A: 393 B: 408 C: 409 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 880: A: 395 B: 394 C: 409 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 881: A: 387 B: 402 C: 403 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 882: A: 395 B: 410 C: 411 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 883: A: 389 B: 388 C: 403 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 884: A: 397 B: 396 C: 411 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 885: A: 390 B: 389 C: 404 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 886: A: 397 B: 412 C: 413 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 887: A: 391 B: 390 C: 405 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 888: A: 398 B: 413 C: 414 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 889: A: 391 B: 406 C: 407 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 890: A: 403 B: 418 C: 419 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 891: A: 412 B: 411 C: 426 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 892: A: 404 B: 419 C: 420 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 893: A: 412 B: 427 C: 428 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 894: A: 406 B: 405 C: 420 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 895: A: 413 B: 428 C: 429 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 896: A: 406 B: 421 C: 422 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 897: A: 414 B: 429 C: 430 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 898: A: 408 B: 407 C: 422 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 899: A: 415 B: 430 C: 431 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 900: A: 408 B: 423 C: 424 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 901: A: 410 B: 409 C: 424 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 902: A: 402 B: 417 C: 418 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 903: A: 410 B: 425 C: 426 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 904: A: 423 B: 422 C: 437 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 905: A: 430 B: 445 C: 446 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 906: A: 424 B: 423 C: 438 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 907: A: 424 B: 439 C: 440 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 908: A: 417 B: 432 C: 433 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 909: A: 425 B: 440 C: 441 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 910: A: 418 B: 433 C: 434 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 911: A: 427 B: 426 C: 441 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 912: A: 419 B: 434 C: 435 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 913: A: 427 B: 442 C: 443 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 914: A: 421 B: 420 C: 435 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 915: A: 429 B: 428 C: 443 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 916: A: 421 B: 436 C: 437 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 917: A: 429 B: 444 C: 445 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 918: A: 442 B: 441 C: 456 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 919: A: 435 B: 434 C: 449 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 920: A: 442 B: 457 C: 458 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 921: A: 436 B: 435 C: 450 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 922: A: 443 B: 458 C: 459 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 923: A: 436 B: 451 C: 452 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 924: A: 444 B: 459 C: 460 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 925: A: 438 B: 437 C: 452 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 926: A: 445 B: 460 C: 461 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 927: A: 438 B: 453 C: 454 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 928: A: 439 B: 454 C: 455 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 929: A: 433 B: 432 C: 447 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 930: A: 440 B: 455 C: 456 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 931: A: 434 B: 433 C: 448 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 932: A: 461 B: 460 C: 475 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 933: A: 453 B: 468 C: 469 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 934: A: 454 B: 469 C: 470 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 935: A: 447 B: 462 C: 463 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 936: A: 455 B: 470 C: 471 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 937: A: 448 B: 463 C: 464 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 938: A: 457 B: 456 C: 471 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 939: A: 449 B: 464 C: 465 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 940: A: 457 B: 472 C: 473 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 941: A: 451 B: 450 C: 465 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 942: A: 458 B: 473 C: 474 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 943: A: 451 B: 466 C: 467 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 944: A: 459 B: 474 C: 475 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 945: A: 453 B: 452 C: 467 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 946: A: 465 B: 464 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 947: A: 472 B: 478 C: 479 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 948: A: 466 B: 465 C: 3 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 949: A: 473 B: 479 C: 9 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 950: A: 467 B: 466 C: 4 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 951: A: 474 B: 9 C: 480 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 952: A: 468 B: 467 C: 5 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 953: A: 475 B: 480 C: 481 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 954: A: 469 B: 468 C: 6 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 955: A: 469 B: 7 C: 8 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 956: A: 463 B: 462 C: 0 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 957: A: 470 B: 8 C: 477 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 958: A: 464 B: 463 C: 1 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + *MESH_FACE 959: A: 472 B: 471 C: 477 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 0 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 559 + *MESH_TVERTLIST { + *MESH_TVERT 0 0.7500 0.3750 0.0000 + *MESH_TVERT 1 0.7188 0.3125 0.0000 + *MESH_TVERT 2 0.7500 0.3125 0.0000 + *MESH_TVERT 3 0.7500 0.8125 0.0000 + *MESH_TVERT 4 0.7188 0.7500 0.0000 + *MESH_TVERT 5 0.7500 0.7500 0.0000 + *MESH_TVERT 6 0.7188 0.2500 0.0000 + *MESH_TVERT 7 0.7500 0.2500 0.0000 + *MESH_TVERT 8 0.7188 0.6875 0.0000 + *MESH_TVERT 9 0.7500 0.6875 0.0000 + *MESH_TVERT 10 0.7188 0.1875 0.0000 + *MESH_TVERT 11 0.7500 0.1875 0.0000 + *MESH_TVERT 12 0.7188 0.6250 0.0000 + *MESH_TVERT 13 0.7500 0.6250 0.0000 + *MESH_TVERT 14 0.7188 0.1250 0.0000 + *MESH_TVERT 15 0.7500 0.1250 0.0000 + *MESH_TVERT 16 0.7188 0.5625 0.0000 + *MESH_TVERT 17 0.7500 0.5625 0.0000 + *MESH_TVERT 18 0.7187 0.0625 0.0000 + *MESH_TVERT 19 0.7500 0.0625 0.0000 + *MESH_TVERT 20 0.7188 0.5000 0.0000 + *MESH_TVERT 21 0.7500 0.5000 0.0000 + *MESH_TVERT 22 0.7500 0.9375 0.0000 + *MESH_TVERT 23 0.7344 1.0000 0.0000 + *MESH_TVERT 24 0.7187 0.9375 0.0000 + *MESH_TVERT 25 0.7344 0.0000 0.0000 + *MESH_TVERT 26 0.7188 0.4375 0.0000 + *MESH_TVERT 27 0.7500 0.4375 0.0000 + *MESH_TVERT 28 0.7188 0.8750 0.0000 + *MESH_TVERT 29 0.7500 0.8750 0.0000 + *MESH_TVERT 30 0.7188 0.3750 0.0000 + *MESH_TVERT 31 0.7188 0.8125 0.0000 + *MESH_TVERT 32 0.6875 0.4375 0.0000 + *MESH_TVERT 33 0.6875 0.3750 0.0000 + *MESH_TVERT 34 0.6875 0.8125 0.0000 + *MESH_TVERT 35 0.6875 0.3125 0.0000 + *MESH_TVERT 36 0.6875 0.7500 0.0000 + *MESH_TVERT 37 0.6875 0.2500 0.0000 + *MESH_TVERT 38 0.6875 0.6875 0.0000 + *MESH_TVERT 39 0.6875 0.1875 0.0000 + *MESH_TVERT 40 0.6875 0.6250 0.0000 + *MESH_TVERT 41 0.6875 0.1250 0.0000 + *MESH_TVERT 42 0.6875 0.5625 0.0000 + *MESH_TVERT 43 0.6875 0.0625 0.0000 + *MESH_TVERT 44 0.6875 0.5000 0.0000 + *MESH_TVERT 45 0.7031 1.0000 0.0000 + *MESH_TVERT 46 0.6875 0.9375 0.0000 + *MESH_TVERT 47 0.7031 0.0000 0.0000 + *MESH_TVERT 48 0.6875 0.8750 0.0000 + *MESH_TVERT 49 0.6562 0.1250 0.0000 + *MESH_TVERT 50 0.6562 0.6250 0.0000 + *MESH_TVERT 51 0.6562 0.5625 0.0000 + *MESH_TVERT 52 0.6562 0.0625 0.0000 + *MESH_TVERT 53 0.6562 0.5000 0.0000 + *MESH_TVERT 54 0.6719 1.0000 0.0000 + *MESH_TVERT 55 0.6562 0.9375 0.0000 + *MESH_TVERT 56 0.6719 0.0000 0.0000 + *MESH_TVERT 57 0.6562 0.4375 0.0000 + *MESH_TVERT 58 0.6562 0.8750 0.0000 + *MESH_TVERT 59 0.6562 0.3750 0.0000 + *MESH_TVERT 60 0.6562 0.8125 0.0000 + *MESH_TVERT 61 0.6562 0.3125 0.0000 + *MESH_TVERT 62 0.6562 0.7500 0.0000 + *MESH_TVERT 63 0.6562 0.2500 0.0000 + *MESH_TVERT 64 0.6562 0.6875 0.0000 + *MESH_TVERT 65 0.6562 0.1875 0.0000 + *MESH_TVERT 66 0.6250 0.8125 0.0000 + *MESH_TVERT 67 0.6250 0.3750 0.0000 + *MESH_TVERT 68 0.6250 0.3125 0.0000 + *MESH_TVERT 69 0.6250 0.7500 0.0000 + *MESH_TVERT 70 0.6250 0.2500 0.0000 + *MESH_TVERT 71 0.6250 0.6875 0.0000 + *MESH_TVERT 72 0.6250 0.1875 0.0000 + *MESH_TVERT 73 0.6250 0.6250 0.0000 + *MESH_TVERT 74 0.6250 0.1250 0.0000 + *MESH_TVERT 75 0.6250 0.5625 0.0000 + *MESH_TVERT 76 0.6250 0.0625 0.0000 + *MESH_TVERT 77 0.6250 0.5000 0.0000 + *MESH_TVERT 78 0.6406 1.0000 0.0000 + *MESH_TVERT 79 0.6250 0.9375 0.0000 + *MESH_TVERT 80 0.6406 0.0000 0.0000 + *MESH_TVERT 81 0.6250 0.4375 0.0000 + *MESH_TVERT 82 0.6250 0.8750 0.0000 + *MESH_TVERT 83 0.5937 0.5625 0.0000 + *MESH_TVERT 84 0.5937 0.0625 0.0000 + *MESH_TVERT 85 0.5937 0.5000 0.0000 + *MESH_TVERT 86 0.6094 1.0000 0.0000 + *MESH_TVERT 87 0.5937 0.9375 0.0000 + *MESH_TVERT 88 0.6094 0.0000 0.0000 + *MESH_TVERT 89 0.5937 0.4375 0.0000 + *MESH_TVERT 90 0.5937 0.8750 0.0000 + *MESH_TVERT 91 0.5938 0.3750 0.0000 + *MESH_TVERT 92 0.5937 0.8125 0.0000 + *MESH_TVERT 93 0.5937 0.3125 0.0000 + *MESH_TVERT 94 0.5937 0.7500 0.0000 + *MESH_TVERT 95 0.5937 0.2500 0.0000 + *MESH_TVERT 96 0.5937 0.6875 0.0000 + *MESH_TVERT 97 0.5937 0.1875 0.0000 + *MESH_TVERT 98 0.5937 0.6250 0.0000 + *MESH_TVERT 99 0.5937 0.1250 0.0000 + *MESH_TVERT 100 0.5625 0.3750 0.0000 + *MESH_TVERT 101 0.5625 0.3125 0.0000 + *MESH_TVERT 102 0.5625 0.7500 0.0000 + *MESH_TVERT 103 0.5625 0.2500 0.0000 + *MESH_TVERT 104 0.5625 0.6875 0.0000 + *MESH_TVERT 105 0.5625 0.1875 0.0000 + *MESH_TVERT 106 0.5625 0.6250 0.0000 + *MESH_TVERT 107 0.5625 0.1250 0.0000 + *MESH_TVERT 108 0.5625 0.5625 0.0000 + *MESH_TVERT 109 0.5625 0.0625 0.0000 + *MESH_TVERT 110 0.5625 0.5000 0.0000 + *MESH_TVERT 111 0.5781 1.0000 0.0000 + *MESH_TVERT 112 0.5625 0.9375 0.0000 + *MESH_TVERT 113 0.5781 0.0000 0.0000 + *MESH_TVERT 114 0.5625 0.4375 0.0000 + *MESH_TVERT 115 0.5625 0.8750 0.0000 + *MESH_TVERT 116 0.5625 0.8125 0.0000 + *MESH_TVERT 117 0.5312 0.1250 0.0000 + *MESH_TVERT 118 0.5312 0.0625 0.0000 + *MESH_TVERT 119 0.5312 0.5000 0.0000 + *MESH_TVERT 120 0.5469 1.0000 0.0000 + *MESH_TVERT 121 0.5312 0.9375 0.0000 + *MESH_TVERT 122 0.5469 0.0000 0.0000 + *MESH_TVERT 123 0.5312 0.4375 0.0000 + *MESH_TVERT 124 0.5312 0.8750 0.0000 + *MESH_TVERT 125 0.5312 0.3750 0.0000 + *MESH_TVERT 126 0.5312 0.8125 0.0000 + *MESH_TVERT 127 0.5312 0.3125 0.0000 + *MESH_TVERT 128 0.5312 0.7500 0.0000 + *MESH_TVERT 129 0.5312 0.2500 0.0000 + *MESH_TVERT 130 0.5312 0.6875 0.0000 + *MESH_TVERT 131 0.5312 0.1875 0.0000 + *MESH_TVERT 132 0.5312 0.6250 0.0000 + *MESH_TVERT 133 0.5312 0.5625 0.0000 + *MESH_TVERT 134 0.5000 0.2500 0.0000 + *MESH_TVERT 135 0.5000 0.6875 0.0000 + *MESH_TVERT 136 0.5000 0.1875 0.0000 + *MESH_TVERT 137 0.5000 0.6250 0.0000 + *MESH_TVERT 138 0.5000 0.1250 0.0000 + *MESH_TVERT 139 0.5000 0.5625 0.0000 + *MESH_TVERT 140 0.5000 0.0625 0.0000 + *MESH_TVERT 141 0.5000 0.5000 0.0000 + *MESH_TVERT 142 0.5156 1.0000 0.0000 + *MESH_TVERT 143 0.5000 0.9375 0.0000 + *MESH_TVERT 144 0.5156 0.0000 0.0000 + *MESH_TVERT 145 0.5000 0.4375 0.0000 + *MESH_TVERT 146 0.5000 0.8750 0.0000 + *MESH_TVERT 147 0.5000 0.3750 0.0000 + *MESH_TVERT 148 0.5000 0.8125 0.0000 + *MESH_TVERT 149 0.5000 0.3125 0.0000 + *MESH_TVERT 150 0.5000 0.7500 0.0000 + *MESH_TVERT 151 0.4844 1.0000 0.0000 + *MESH_TVERT 152 0.4687 0.9375 0.0000 + *MESH_TVERT 153 0.4844 0.0000 0.0000 + *MESH_TVERT 154 0.4687 0.0625 0.0000 + *MESH_TVERT 155 0.4687 0.4375 0.0000 + *MESH_TVERT 156 0.4687 0.8750 0.0000 + *MESH_TVERT 157 0.4687 0.3750 0.0000 + *MESH_TVERT 158 0.4687 0.8125 0.0000 + *MESH_TVERT 159 0.4687 0.3125 0.0000 + *MESH_TVERT 160 0.4687 0.7500 0.0000 + *MESH_TVERT 161 0.4687 0.2500 0.0000 + *MESH_TVERT 162 0.4687 0.6875 0.0000 + *MESH_TVERT 163 0.4687 0.1875 0.0000 + *MESH_TVERT 164 0.4687 0.6250 0.0000 + *MESH_TVERT 165 0.4687 0.1250 0.0000 + *MESH_TVERT 166 0.4687 0.5625 0.0000 + *MESH_TVERT 167 0.4687 0.5000 0.0000 + *MESH_TVERT 168 0.4375 0.6875 0.0000 + *MESH_TVERT 169 0.4375 0.1875 0.0000 + *MESH_TVERT 170 0.4375 0.6250 0.0000 + *MESH_TVERT 171 0.4375 0.1250 0.0000 + *MESH_TVERT 172 0.4375 0.5625 0.0000 + *MESH_TVERT 173 0.4375 0.0625 0.0000 + *MESH_TVERT 174 0.4375 0.5000 0.0000 + *MESH_TVERT 175 0.4531 1.0000 0.0000 + *MESH_TVERT 176 0.4375 0.9375 0.0000 + *MESH_TVERT 177 0.4531 0.0000 0.0000 + *MESH_TVERT 178 0.4375 0.4375 0.0000 + *MESH_TVERT 179 0.4375 0.8750 0.0000 + *MESH_TVERT 180 0.4375 0.3750 0.0000 + *MESH_TVERT 181 0.4375 0.8125 0.0000 + *MESH_TVERT 182 0.4375 0.3125 0.0000 + *MESH_TVERT 183 0.4375 0.7500 0.0000 + *MESH_TVERT 184 0.4375 0.2500 0.0000 + *MESH_TVERT 185 0.4062 0.5000 0.0000 + *MESH_TVERT 186 0.4062 0.4375 0.0000 + *MESH_TVERT 187 0.4062 0.8750 0.0000 + *MESH_TVERT 188 0.4062 0.3750 0.0000 + *MESH_TVERT 189 0.4062 0.8125 0.0000 + *MESH_TVERT 190 0.4062 0.3125 0.0000 + *MESH_TVERT 191 0.4062 0.7500 0.0000 + *MESH_TVERT 192 0.4062 0.2500 0.0000 + *MESH_TVERT 193 0.4062 0.6875 0.0000 + *MESH_TVERT 194 0.4062 0.1875 0.0000 + *MESH_TVERT 195 0.4062 0.6250 0.0000 + *MESH_TVERT 196 0.4062 0.1250 0.0000 + *MESH_TVERT 197 0.4062 0.5625 0.0000 + *MESH_TVERT 198 0.4062 0.0625 0.0000 + *MESH_TVERT 199 0.4219 1.0000 0.0000 + *MESH_TVERT 200 0.4062 0.9375 0.0000 + *MESH_TVERT 201 0.4219 0.0000 0.0000 + *MESH_TVERT 202 0.3750 0.2500 0.0000 + *MESH_TVERT 203 0.3750 0.1875 0.0000 + *MESH_TVERT 204 0.3750 0.6250 0.0000 + *MESH_TVERT 205 0.3750 0.1250 0.0000 + *MESH_TVERT 206 0.3750 0.5625 0.0000 + *MESH_TVERT 207 0.3750 0.0625 0.0000 + *MESH_TVERT 208 0.3750 0.5000 0.0000 + *MESH_TVERT 209 0.3906 1.0000 0.0000 + *MESH_TVERT 210 0.3750 0.9375 0.0000 + *MESH_TVERT 211 0.3906 0.0000 0.0000 + *MESH_TVERT 212 0.3750 0.4375 0.0000 + *MESH_TVERT 213 0.3750 0.8750 0.0000 + *MESH_TVERT 214 0.3750 0.3750 0.0000 + *MESH_TVERT 215 0.3750 0.8125 0.0000 + *MESH_TVERT 216 0.3750 0.3125 0.0000 + *MESH_TVERT 217 0.3750 0.7500 0.0000 + *MESH_TVERT 218 0.3750 0.6875 0.0000 + *MESH_TVERT 219 0.3437 0.8750 0.0000 + *MESH_TVERT 220 0.3437 0.3750 0.0000 + *MESH_TVERT 221 0.3437 0.8125 0.0000 + *MESH_TVERT 222 0.3437 0.3125 0.0000 + *MESH_TVERT 223 0.3437 0.7500 0.0000 + *MESH_TVERT 224 0.3437 0.2500 0.0000 + *MESH_TVERT 225 0.3437 0.6875 0.0000 + *MESH_TVERT 226 0.3437 0.1875 0.0000 + *MESH_TVERT 227 0.3437 0.6250 0.0000 + *MESH_TVERT 228 0.3437 0.1250 0.0000 + *MESH_TVERT 229 0.3437 0.5625 0.0000 + *MESH_TVERT 230 0.3437 0.0625 0.0000 + *MESH_TVERT 231 0.3437 0.5000 0.0000 + *MESH_TVERT 232 0.3594 1.0000 0.0000 + *MESH_TVERT 233 0.3437 0.9375 0.0000 + *MESH_TVERT 234 0.3594 0.0000 0.0000 + *MESH_TVERT 235 0.3437 0.4375 0.0000 + *MESH_TVERT 236 0.3125 0.6250 0.0000 + *MESH_TVERT 237 0.3125 0.1250 0.0000 + *MESH_TVERT 238 0.3125 0.5625 0.0000 + *MESH_TVERT 239 0.3125 0.0625 0.0000 + *MESH_TVERT 240 0.3125 0.5000 0.0000 + *MESH_TVERT 241 0.3281 1.0000 0.0000 + *MESH_TVERT 242 0.3125 0.9375 0.0000 + *MESH_TVERT 243 0.3281 0.0000 0.0000 + *MESH_TVERT 244 0.3125 0.4375 0.0000 + *MESH_TVERT 245 0.3125 0.8750 0.0000 + *MESH_TVERT 246 0.3125 0.3750 0.0000 + *MESH_TVERT 247 0.3125 0.8125 0.0000 + *MESH_TVERT 248 0.3125 0.3125 0.0000 + *MESH_TVERT 249 0.3125 0.7500 0.0000 + *MESH_TVERT 250 0.3125 0.2500 0.0000 + *MESH_TVERT 251 0.3125 0.6875 0.0000 + *MESH_TVERT 252 0.3125 0.1875 0.0000 + *MESH_TVERT 253 0.2812 0.3750 0.0000 + *MESH_TVERT 254 0.2812 0.8125 0.0000 + *MESH_TVERT 255 0.2812 0.3125 0.0000 + *MESH_TVERT 256 0.2812 0.7500 0.0000 + *MESH_TVERT 257 0.2812 0.2500 0.0000 + *MESH_TVERT 258 0.2812 0.6875 0.0000 + *MESH_TVERT 259 0.2812 0.1875 0.0000 + *MESH_TVERT 260 0.2812 0.6250 0.0000 + *MESH_TVERT 261 0.2812 0.1250 0.0000 + *MESH_TVERT 262 0.2812 0.5625 0.0000 + *MESH_TVERT 263 0.2812 0.0625 0.0000 + *MESH_TVERT 264 0.2812 0.5000 0.0000 + *MESH_TVERT 265 0.2969 1.0000 0.0000 + *MESH_TVERT 266 0.2812 0.9375 0.0000 + *MESH_TVERT 267 0.2969 0.0000 0.0000 + *MESH_TVERT 268 0.2812 0.4375 0.0000 + *MESH_TVERT 269 0.2812 0.8750 0.0000 + *MESH_TVERT 270 0.2500 0.1250 0.0000 + *MESH_TVERT 271 0.2500 0.6250 0.0000 + *MESH_TVERT 272 0.2500 0.5625 0.0000 + *MESH_TVERT 273 0.2500 0.0625 0.0000 + *MESH_TVERT 274 0.2500 0.5000 0.0000 + *MESH_TVERT 275 0.2656 1.0000 0.0000 + *MESH_TVERT 276 0.2500 0.9375 0.0000 + *MESH_TVERT 277 0.2656 0.0000 0.0000 + *MESH_TVERT 278 0.2500 0.4375 0.0000 + *MESH_TVERT 279 0.2500 0.8750 0.0000 + *MESH_TVERT 280 0.2500 0.3750 0.0000 + *MESH_TVERT 281 0.2500 0.8125 0.0000 + *MESH_TVERT 282 0.2500 0.3125 0.0000 + *MESH_TVERT 283 0.2500 0.7500 0.0000 + *MESH_TVERT 284 0.2500 0.2500 0.0000 + *MESH_TVERT 285 0.2500 0.6875 0.0000 + *MESH_TVERT 286 0.2500 0.1875 0.0000 + *MESH_TVERT 287 0.2188 0.3750 0.0000 + *MESH_TVERT 288 0.2187 0.3125 0.0000 + *MESH_TVERT 289 0.2188 0.8125 0.0000 + *MESH_TVERT 290 0.2187 0.7500 0.0000 + *MESH_TVERT 291 0.2187 0.2500 0.0000 + *MESH_TVERT 292 0.2187 0.6875 0.0000 + *MESH_TVERT 293 0.2188 0.1875 0.0000 + *MESH_TVERT 294 0.2188 0.6250 0.0000 + *MESH_TVERT 295 0.2188 0.1250 0.0000 + *MESH_TVERT 296 0.2187 0.5625 0.0000 + *MESH_TVERT 297 0.2188 0.0625 0.0000 + *MESH_TVERT 298 0.2187 0.5000 0.0000 + *MESH_TVERT 299 0.2344 1.0000 0.0000 + *MESH_TVERT 300 0.2188 0.9375 0.0000 + *MESH_TVERT 301 0.2344 0.0000 0.0000 + *MESH_TVERT 302 0.2187 0.4375 0.0000 + *MESH_TVERT 303 0.2188 0.8750 0.0000 + *MESH_TVERT 304 0.1875 0.1250 0.0000 + *MESH_TVERT 305 0.1875 0.0625 0.0000 + *MESH_TVERT 306 0.1875 0.5000 0.0000 + *MESH_TVERT 307 0.2031 1.0000 0.0000 + *MESH_TVERT 308 0.1875 0.9375 0.0000 + *MESH_TVERT 309 0.2031 0.0000 0.0000 + *MESH_TVERT 310 0.1875 0.4375 0.0000 + *MESH_TVERT 311 0.1875 0.8750 0.0000 + *MESH_TVERT 312 0.1875 0.3750 0.0000 + *MESH_TVERT 313 0.1875 0.8125 0.0000 + *MESH_TVERT 314 0.1875 0.3125 0.0000 + *MESH_TVERT 315 0.1875 0.7500 0.0000 + *MESH_TVERT 316 0.1875 0.2500 0.0000 + *MESH_TVERT 317 0.1875 0.6875 0.0000 + *MESH_TVERT 318 0.1875 0.1875 0.0000 + *MESH_TVERT 319 0.1875 0.6250 0.0000 + *MESH_TVERT 320 0.1875 0.5625 0.0000 + *MESH_TVERT 321 0.1563 0.7500 0.0000 + *MESH_TVERT 322 0.1563 0.2500 0.0000 + *MESH_TVERT 323 0.1562 0.6875 0.0000 + *MESH_TVERT 324 0.1563 0.1875 0.0000 + *MESH_TVERT 325 0.1563 0.6250 0.0000 + *MESH_TVERT 326 0.1563 0.1250 0.0000 + *MESH_TVERT 327 0.1562 0.5625 0.0000 + *MESH_TVERT 328 0.1563 0.0625 0.0000 + *MESH_TVERT 329 0.1562 0.5000 0.0000 + *MESH_TVERT 330 0.1719 1.0000 0.0000 + *MESH_TVERT 331 0.1563 0.9375 0.0000 + *MESH_TVERT 332 0.1719 0.0000 0.0000 + *MESH_TVERT 333 0.1562 0.4375 0.0000 + *MESH_TVERT 334 0.1563 0.8750 0.0000 + *MESH_TVERT 335 0.1563 0.3750 0.0000 + *MESH_TVERT 336 0.1563 0.8125 0.0000 + *MESH_TVERT 337 0.1562 0.3125 0.0000 + *MESH_TVERT 338 0.1250 0.5625 0.0000 + *MESH_TVERT 339 0.1250 0.5000 0.0000 + *MESH_TVERT 340 0.1406 1.0000 0.0000 + *MESH_TVERT 341 0.1250 0.9375 0.0000 + *MESH_TVERT 342 0.1406 0.0000 0.0000 + *MESH_TVERT 343 0.1250 0.0625 0.0000 + *MESH_TVERT 344 0.1250 0.4375 0.0000 + *MESH_TVERT 345 0.1250 0.8750 0.0000 + *MESH_TVERT 346 0.1250 0.3750 0.0000 + *MESH_TVERT 347 0.1250 0.8125 0.0000 + *MESH_TVERT 348 0.1250 0.3125 0.0000 + *MESH_TVERT 349 0.1250 0.7500 0.0000 + *MESH_TVERT 350 0.1250 0.2500 0.0000 + *MESH_TVERT 351 0.1250 0.6875 0.0000 + *MESH_TVERT 352 0.1250 0.1875 0.0000 + *MESH_TVERT 353 0.1250 0.6250 0.0000 + *MESH_TVERT 354 0.1250 0.1250 0.0000 + *MESH_TVERT 355 0.0938 0.2500 0.0000 + *MESH_TVERT 356 0.0938 0.7500 0.0000 + *MESH_TVERT 357 0.0938 0.6875 0.0000 + *MESH_TVERT 358 0.0938 0.1875 0.0000 + *MESH_TVERT 359 0.0938 0.6250 0.0000 + *MESH_TVERT 360 0.0938 0.1250 0.0000 + *MESH_TVERT 361 0.0938 0.5625 0.0000 + *MESH_TVERT 362 0.0938 0.0625 0.0000 + *MESH_TVERT 363 0.0938 0.5000 0.0000 + *MESH_TVERT 364 0.1094 1.0000 0.0000 + *MESH_TVERT 365 0.0938 0.9375 0.0000 + *MESH_TVERT 366 0.1094 0.0000 0.0000 + *MESH_TVERT 367 0.0938 0.4375 0.0000 + *MESH_TVERT 368 0.0938 0.8750 0.0000 + *MESH_TVERT 369 0.0938 0.3750 0.0000 + *MESH_TVERT 370 0.0938 0.8125 0.0000 + *MESH_TVERT 371 0.0938 0.3125 0.0000 + *MESH_TVERT 372 0.0781 1.0000 0.0000 + *MESH_TVERT 373 0.0625 0.9375 0.0000 + *MESH_TVERT 374 0.0781 0.0000 0.0000 + *MESH_TVERT 375 0.0625 0.0625 0.0000 + *MESH_TVERT 376 0.0625 0.4375 0.0000 + *MESH_TVERT 377 0.0625 0.8750 0.0000 + *MESH_TVERT 378 0.0625 0.3750 0.0000 + *MESH_TVERT 379 0.0625 0.8125 0.0000 + *MESH_TVERT 380 0.0625 0.3125 0.0000 + *MESH_TVERT 381 0.0625 0.7500 0.0000 + *MESH_TVERT 382 0.0625 0.2500 0.0000 + *MESH_TVERT 383 0.0625 0.6875 0.0000 + *MESH_TVERT 384 0.0625 0.1875 0.0000 + *MESH_TVERT 385 0.0625 0.6250 0.0000 + *MESH_TVERT 386 0.0625 0.1250 0.0000 + *MESH_TVERT 387 0.0625 0.5625 0.0000 + *MESH_TVERT 388 0.0625 0.5000 0.0000 + *MESH_TVERT 389 0.0313 0.7500 0.0000 + *MESH_TVERT 390 0.0313 0.6875 0.0000 + *MESH_TVERT 391 0.0313 0.1875 0.0000 + *MESH_TVERT 392 0.0313 0.6250 0.0000 + *MESH_TVERT 393 0.0313 0.1250 0.0000 + *MESH_TVERT 394 0.0312 0.5625 0.0000 + *MESH_TVERT 395 0.0313 0.0625 0.0000 + *MESH_TVERT 396 0.0313 0.5000 0.0000 + *MESH_TVERT 397 0.0469 1.0000 0.0000 + *MESH_TVERT 398 0.0313 0.9375 0.0000 + *MESH_TVERT 399 0.0469 0.0000 0.0000 + *MESH_TVERT 400 0.0312 0.4375 0.0000 + *MESH_TVERT 401 0.0313 0.8750 0.0000 + *MESH_TVERT 402 0.0313 0.3750 0.0000 + *MESH_TVERT 403 0.0313 0.8125 0.0000 + *MESH_TVERT 404 0.0313 0.3125 0.0000 + *MESH_TVERT 405 0.0313 0.2500 0.0000 + *MESH_TVERT 406 0.0000 0.5000 0.0000 + *MESH_TVERT 407 0.0000 0.4375 0.0000 + *MESH_TVERT 408 0.0000 0.9375 0.0000 + *MESH_TVERT 409 0.0000 0.8750 0.0000 + *MESH_TVERT 410 0.0000 0.3750 0.0000 + *MESH_TVERT 411 0.0000 0.8125 0.0000 + *MESH_TVERT 412 0.0000 0.3125 0.0000 + *MESH_TVERT 413 0.0000 0.7500 0.0000 + *MESH_TVERT 414 0.0000 0.2500 0.0000 + *MESH_TVERT 415 0.0000 0.6875 0.0000 + *MESH_TVERT 416 0.0000 0.1875 0.0000 + *MESH_TVERT 417 0.0000 0.6250 0.0000 + *MESH_TVERT 418 0.0000 0.1250 0.0000 + *MESH_TVERT 419 0.0000 0.5625 0.0000 + *MESH_TVERT 420 0.0000 0.0625 0.0000 + *MESH_TVERT 421 0.0156 1.0000 0.0000 + *MESH_TVERT 422 0.0156 0.0000 0.0000 + *MESH_TVERT 423 1.0000 0.2500 0.0000 + *MESH_TVERT 424 0.9688 0.1875 0.0000 + *MESH_TVERT 425 1.0000 0.1875 0.0000 + *MESH_TVERT 426 1.0000 0.6875 0.0000 + *MESH_TVERT 427 0.9688 0.6250 0.0000 + *MESH_TVERT 428 1.0000 0.6250 0.0000 + *MESH_TVERT 429 1.0000 0.1250 0.0000 + *MESH_TVERT 430 0.9688 0.1250 0.0000 + *MESH_TVERT 431 1.0000 0.5625 0.0000 + *MESH_TVERT 432 0.9688 0.5625 0.0000 + *MESH_TVERT 433 0.9688 0.0625 0.0000 + *MESH_TVERT 434 1.0000 0.0625 0.0000 + *MESH_TVERT 435 0.9688 0.5000 0.0000 + *MESH_TVERT 436 1.0000 0.5000 0.0000 + *MESH_TVERT 437 1.0000 0.9375 0.0000 + *MESH_TVERT 438 0.9844 1.0000 0.0000 + *MESH_TVERT 439 0.9688 0.9375 0.0000 + *MESH_TVERT 440 0.9844 0.0000 0.0000 + *MESH_TVERT 441 1.0000 0.4375 0.0000 + *MESH_TVERT 442 0.9688 0.4375 0.0000 + *MESH_TVERT 443 1.0000 0.8750 0.0000 + *MESH_TVERT 444 0.9688 0.8750 0.0000 + *MESH_TVERT 445 0.9688 0.3750 0.0000 + *MESH_TVERT 446 1.0000 0.3750 0.0000 + *MESH_TVERT 447 0.9688 0.8125 0.0000 + *MESH_TVERT 448 1.0000 0.8125 0.0000 + *MESH_TVERT 449 1.0000 0.3125 0.0000 + *MESH_TVERT 450 0.9688 0.3125 0.0000 + *MESH_TVERT 451 1.0000 0.7500 0.0000 + *MESH_TVERT 452 0.9688 0.7500 0.0000 + *MESH_TVERT 453 0.9688 0.2500 0.0000 + *MESH_TVERT 454 0.9688 0.6875 0.0000 + *MESH_TVERT 455 0.9375 0.3750 0.0000 + *MESH_TVERT 456 0.9375 0.8125 0.0000 + *MESH_TVERT 457 0.9375 0.3125 0.0000 + *MESH_TVERT 458 0.9375 0.7500 0.0000 + *MESH_TVERT 459 0.9375 0.2500 0.0000 + *MESH_TVERT 460 0.9375 0.6875 0.0000 + *MESH_TVERT 461 0.9375 0.1875 0.0000 + *MESH_TVERT 462 0.9375 0.6250 0.0000 + *MESH_TVERT 463 0.9375 0.1250 0.0000 + *MESH_TVERT 464 0.9375 0.5625 0.0000 + *MESH_TVERT 465 0.9375 0.0625 0.0000 + *MESH_TVERT 466 0.9375 0.5000 0.0000 + *MESH_TVERT 467 0.9531 1.0000 0.0000 + *MESH_TVERT 468 0.9375 0.9375 0.0000 + *MESH_TVERT 469 0.9531 0.0000 0.0000 + *MESH_TVERT 470 0.9375 0.4375 0.0000 + *MESH_TVERT 471 0.9375 0.8750 0.0000 + *MESH_TVERT 472 0.9062 0.1875 0.0000 + *MESH_TVERT 473 0.9063 0.1250 0.0000 + *MESH_TVERT 474 0.9062 0.6250 0.0000 + *MESH_TVERT 475 0.9062 0.5625 0.0000 + *MESH_TVERT 476 0.9063 0.0625 0.0000 + *MESH_TVERT 477 0.9062 0.5000 0.0000 + *MESH_TVERT 478 0.9219 1.0000 0.0000 + *MESH_TVERT 479 0.9063 0.9375 0.0000 + *MESH_TVERT 480 0.9219 0.0000 0.0000 + *MESH_TVERT 481 0.9062 0.4375 0.0000 + *MESH_TVERT 482 0.9063 0.8750 0.0000 + *MESH_TVERT 483 0.9062 0.3750 0.0000 + *MESH_TVERT 484 0.9062 0.8125 0.0000 + *MESH_TVERT 485 0.9062 0.3125 0.0000 + *MESH_TVERT 486 0.9062 0.7500 0.0000 + *MESH_TVERT 487 0.9062 0.2500 0.0000 + *MESH_TVERT 488 0.9062 0.6875 0.0000 + *MESH_TVERT 489 0.8750 0.8125 0.0000 + *MESH_TVERT 490 0.8750 0.3750 0.0000 + *MESH_TVERT 491 0.8750 0.3125 0.0000 + *MESH_TVERT 492 0.8750 0.7500 0.0000 + *MESH_TVERT 493 0.8750 0.2500 0.0000 + *MESH_TVERT 494 0.8750 0.6875 0.0000 + *MESH_TVERT 495 0.8750 0.1875 0.0000 + *MESH_TVERT 496 0.8750 0.6250 0.0000 + *MESH_TVERT 497 0.8750 0.1250 0.0000 + *MESH_TVERT 498 0.8750 0.5625 0.0000 + *MESH_TVERT 499 0.8750 0.0625 0.0000 + *MESH_TVERT 500 0.8750 0.5000 0.0000 + *MESH_TVERT 501 0.8906 1.0000 0.0000 + *MESH_TVERT 502 0.8750 0.9375 0.0000 + *MESH_TVERT 503 0.8906 0.0000 0.0000 + *MESH_TVERT 504 0.8750 0.4375 0.0000 + *MESH_TVERT 505 0.8750 0.8750 0.0000 + *MESH_TVERT 506 0.8438 0.6250 0.0000 + *MESH_TVERT 507 0.8438 0.5625 0.0000 + *MESH_TVERT 508 0.8438 0.0625 0.0000 + *MESH_TVERT 509 0.8438 0.5000 0.0000 + *MESH_TVERT 510 0.8594 1.0000 0.0000 + *MESH_TVERT 511 0.8438 0.9375 0.0000 + *MESH_TVERT 512 0.8594 0.0000 0.0000 + *MESH_TVERT 513 0.8438 0.4375 0.0000 + *MESH_TVERT 514 0.8438 0.8750 0.0000 + *MESH_TVERT 515 0.8438 0.3750 0.0000 + *MESH_TVERT 516 0.8438 0.8125 0.0000 + *MESH_TVERT 517 0.8438 0.3125 0.0000 + *MESH_TVERT 518 0.8438 0.7500 0.0000 + *MESH_TVERT 519 0.8438 0.2500 0.0000 + *MESH_TVERT 520 0.8438 0.6875 0.0000 + *MESH_TVERT 521 0.8438 0.1875 0.0000 + *MESH_TVERT 522 0.8438 0.1250 0.0000 + *MESH_TVERT 523 0.8125 0.3750 0.0000 + *MESH_TVERT 524 0.8125 0.3125 0.0000 + *MESH_TVERT 525 0.8125 0.8125 0.0000 + *MESH_TVERT 526 0.8125 0.7500 0.0000 + *MESH_TVERT 527 0.8125 0.2500 0.0000 + *MESH_TVERT 528 0.8125 0.6875 0.0000 + *MESH_TVERT 529 0.8125 0.1875 0.0000 + *MESH_TVERT 530 0.8125 0.6250 0.0000 + *MESH_TVERT 531 0.8125 0.1250 0.0000 + *MESH_TVERT 532 0.8125 0.5625 0.0000 + *MESH_TVERT 533 0.8125 0.0625 0.0000 + *MESH_TVERT 534 0.8125 0.5000 0.0000 + *MESH_TVERT 535 0.8281 1.0000 0.0000 + *MESH_TVERT 536 0.8125 0.9375 0.0000 + *MESH_TVERT 537 0.8281 0.0000 0.0000 + *MESH_TVERT 538 0.8125 0.4375 0.0000 + *MESH_TVERT 539 0.8125 0.8750 0.0000 + *MESH_TVERT 540 0.7812 0.1250 0.0000 + *MESH_TVERT 541 0.7812 0.0625 0.0000 + *MESH_TVERT 542 0.7812 0.5000 0.0000 + *MESH_TVERT 543 0.7969 1.0000 0.0000 + *MESH_TVERT 544 0.7812 0.9375 0.0000 + *MESH_TVERT 545 0.7969 0.0000 0.0000 + *MESH_TVERT 546 0.7812 0.4375 0.0000 + *MESH_TVERT 547 0.7812 0.8750 0.0000 + *MESH_TVERT 548 0.7812 0.3750 0.0000 + *MESH_TVERT 549 0.7812 0.8125 0.0000 + *MESH_TVERT 550 0.7812 0.3125 0.0000 + *MESH_TVERT 551 0.7812 0.7500 0.0000 + *MESH_TVERT 552 0.7812 0.2500 0.0000 + *MESH_TVERT 553 0.7812 0.6875 0.0000 + *MESH_TVERT 554 0.7812 0.1875 0.0000 + *MESH_TVERT 555 0.7812 0.6250 0.0000 + *MESH_TVERT 556 0.7812 0.5625 0.0000 + *MESH_TVERT 557 0.7656 1.0000 0.0000 + *MESH_TVERT 558 0.7656 0.0000 0.0000 + } + *MESH_NUMTVFACES 960 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 3 4 5 + *MESH_TFACE 2 2 6 7 + *MESH_TFACE 3 5 8 9 + *MESH_TFACE 4 7 10 11 + *MESH_TFACE 5 9 12 13 + *MESH_TFACE 6 11 14 15 + *MESH_TFACE 7 13 16 17 + *MESH_TFACE 8 15 18 19 + *MESH_TFACE 9 17 20 21 + *MESH_TFACE 10 22 23 24 + *MESH_TFACE 11 25 19 18 + *MESH_TFACE 12 21 26 27 + *MESH_TFACE 13 22 28 29 + *MESH_TFACE 14 27 30 0 + *MESH_TFACE 15 3 28 31 + *MESH_TFACE 16 30 32 33 + *MESH_TFACE 17 28 34 31 + *MESH_TFACE 18 30 35 1 + *MESH_TFACE 19 31 36 4 + *MESH_TFACE 20 6 35 37 + *MESH_TFACE 21 4 38 8 + *MESH_TFACE 22 6 39 10 + *MESH_TFACE 23 8 40 12 + *MESH_TFACE 24 10 41 14 + *MESH_TFACE 25 12 42 16 + *MESH_TFACE 26 14 43 18 + *MESH_TFACE 27 16 44 20 + *MESH_TFACE 28 24 45 46 + *MESH_TFACE 29 47 18 43 + *MESH_TFACE 30 26 44 32 + *MESH_TFACE 31 24 48 28 + *MESH_TFACE 32 39 49 41 + *MESH_TFACE 33 42 50 51 + *MESH_TFACE 34 41 52 43 + *MESH_TFACE 35 42 53 44 + *MESH_TFACE 36 46 54 55 + *MESH_TFACE 37 56 43 52 + *MESH_TFACE 38 44 57 32 + *MESH_TFACE 39 46 58 48 + *MESH_TFACE 40 32 59 33 + *MESH_TFACE 41 48 60 34 + *MESH_TFACE 42 35 59 61 + *MESH_TFACE 43 34 62 36 + *MESH_TFACE 44 37 61 63 + *MESH_TFACE 45 36 64 38 + *MESH_TFACE 46 37 65 39 + *MESH_TFACE 47 38 50 40 + *MESH_TFACE 48 58 66 60 + *MESH_TFACE 49 61 67 68 + *MESH_TFACE 50 60 69 62 + *MESH_TFACE 51 61 70 63 + *MESH_TFACE 52 62 71 64 + *MESH_TFACE 53 63 72 65 + *MESH_TFACE 54 64 73 50 + *MESH_TFACE 55 65 74 49 + *MESH_TFACE 56 50 75 51 + *MESH_TFACE 57 49 76 52 + *MESH_TFACE 58 53 75 77 + *MESH_TFACE 59 55 78 79 + *MESH_TFACE 60 80 52 76 + *MESH_TFACE 61 53 81 57 + *MESH_TFACE 62 55 82 58 + *MESH_TFACE 63 57 67 59 + *MESH_TFACE 64 73 83 75 + *MESH_TFACE 65 74 84 76 + *MESH_TFACE 66 77 83 85 + *MESH_TFACE 67 79 86 87 + *MESH_TFACE 68 88 76 84 + *MESH_TFACE 69 77 89 81 + *MESH_TFACE 70 79 90 82 + *MESH_TFACE 71 81 91 67 + *MESH_TFACE 72 82 92 66 + *MESH_TFACE 73 68 91 93 + *MESH_TFACE 74 66 94 69 + *MESH_TFACE 75 68 95 70 + *MESH_TFACE 76 71 94 96 + *MESH_TFACE 77 72 95 97 + *MESH_TFACE 78 71 98 73 + *MESH_TFACE 79 74 97 99 + *MESH_TFACE 80 93 100 101 + *MESH_TFACE 81 92 102 94 + *MESH_TFACE 82 95 101 103 + *MESH_TFACE 83 96 102 104 + *MESH_TFACE 84 95 105 97 + *MESH_TFACE 85 96 106 98 + *MESH_TFACE 86 99 105 107 + *MESH_TFACE 87 83 106 108 + *MESH_TFACE 88 99 109 84 + *MESH_TFACE 89 83 110 85 + *MESH_TFACE 90 87 111 112 + *MESH_TFACE 91 113 84 109 + *MESH_TFACE 92 85 114 89 + *MESH_TFACE 93 87 115 90 + *MESH_TFACE 94 89 100 91 + *MESH_TFACE 95 90 116 92 + *MESH_TFACE 96 109 117 118 + *MESH_TFACE 97 108 119 110 + *MESH_TFACE 98 112 120 121 + *MESH_TFACE 99 122 109 118 + *MESH_TFACE 100 110 123 114 + *MESH_TFACE 101 112 124 115 + *MESH_TFACE 102 114 125 100 + *MESH_TFACE 103 115 126 116 + *MESH_TFACE 104 101 125 127 + *MESH_TFACE 105 102 126 128 + *MESH_TFACE 106 103 127 129 + *MESH_TFACE 107 102 130 104 + *MESH_TFACE 108 103 131 105 + *MESH_TFACE 109 104 132 106 + *MESH_TFACE 110 105 117 107 + *MESH_TFACE 111 108 132 133 + *MESH_TFACE 112 127 134 129 + *MESH_TFACE 113 128 135 130 + *MESH_TFACE 114 131 134 136 + *MESH_TFACE 115 130 137 132 + *MESH_TFACE 116 117 136 138 + *MESH_TFACE 117 133 137 139 + *MESH_TFACE 118 118 138 140 + *MESH_TFACE 119 133 141 119 + *MESH_TFACE 120 121 142 143 + *MESH_TFACE 121 144 118 140 + *MESH_TFACE 122 123 141 145 + *MESH_TFACE 123 121 146 124 + *MESH_TFACE 124 123 147 125 + *MESH_TFACE 125 124 148 126 + *MESH_TFACE 126 127 147 149 + *MESH_TFACE 127 126 150 128 + *MESH_TFACE 128 143 151 152 + *MESH_TFACE 129 153 140 154 + *MESH_TFACE 130 141 155 145 + *MESH_TFACE 131 146 152 156 + *MESH_TFACE 132 145 157 147 + *MESH_TFACE 133 146 158 148 + *MESH_TFACE 134 149 157 159 + *MESH_TFACE 135 148 160 150 + *MESH_TFACE 136 149 161 134 + *MESH_TFACE 137 135 160 162 + *MESH_TFACE 138 136 161 163 + *MESH_TFACE 139 135 164 137 + *MESH_TFACE 140 136 165 138 + *MESH_TFACE 141 139 164 166 + *MESH_TFACE 142 140 165 154 + *MESH_TFACE 143 139 167 141 + *MESH_TFACE 144 160 168 162 + *MESH_TFACE 145 161 169 163 + *MESH_TFACE 146 162 170 164 + *MESH_TFACE 147 165 169 171 + *MESH_TFACE 148 166 170 172 + *MESH_TFACE 149 165 173 154 + *MESH_TFACE 150 166 174 167 + *MESH_TFACE 151 152 175 176 + *MESH_TFACE 152 177 154 173 + *MESH_TFACE 153 167 178 155 + *MESH_TFACE 154 152 179 156 + *MESH_TFACE 155 155 180 157 + *MESH_TFACE 156 158 179 181 + *MESH_TFACE 157 159 180 182 + *MESH_TFACE 158 158 183 160 + *MESH_TFACE 159 159 184 161 + *MESH_TFACE 160 178 185 186 + *MESH_TFACE 161 176 187 179 + *MESH_TFACE 162 178 188 180 + *MESH_TFACE 163 179 189 181 + *MESH_TFACE 164 182 188 190 + *MESH_TFACE 165 181 191 183 + *MESH_TFACE 166 182 192 184 + *MESH_TFACE 167 168 191 193 + *MESH_TFACE 168 169 192 194 + *MESH_TFACE 169 168 195 170 + *MESH_TFACE 170 169 196 171 + *MESH_TFACE 171 172 195 197 + *MESH_TFACE 172 171 198 173 + *MESH_TFACE 173 172 185 174 + *MESH_TFACE 174 176 199 200 + *MESH_TFACE 175 201 173 198 + *MESH_TFACE 176 194 202 203 + *MESH_TFACE 177 193 204 195 + *MESH_TFACE 178 194 205 196 + *MESH_TFACE 179 197 204 206 + *MESH_TFACE 180 198 205 207 + *MESH_TFACE 181 197 208 185 + *MESH_TFACE 182 200 209 210 + *MESH_TFACE 183 211 198 207 + *MESH_TFACE 184 185 212 186 + *MESH_TFACE 185 200 213 187 + *MESH_TFACE 186 186 214 188 + *MESH_TFACE 187 187 215 189 + *MESH_TFACE 188 188 216 190 + *MESH_TFACE 189 189 217 191 + *MESH_TFACE 190 190 202 192 + *MESH_TFACE 191 191 218 193 + *MESH_TFACE 192 210 219 213 + *MESH_TFACE 193 212 220 214 + *MESH_TFACE 194 213 221 215 + *MESH_TFACE 195 216 220 222 + *MESH_TFACE 196 217 221 223 + *MESH_TFACE 197 216 224 202 + *MESH_TFACE 198 218 223 225 + *MESH_TFACE 199 203 224 226 + *MESH_TFACE 200 218 227 204 + *MESH_TFACE 201 203 228 205 + *MESH_TFACE 202 206 227 229 + *MESH_TFACE 203 207 228 230 + *MESH_TFACE 204 206 231 208 + *MESH_TFACE 205 210 232 233 + *MESH_TFACE 206 234 207 230 + *MESH_TFACE 207 212 231 235 + *MESH_TFACE 208 225 236 227 + *MESH_TFACE 209 226 237 228 + *MESH_TFACE 210 229 236 238 + *MESH_TFACE 211 228 239 230 + *MESH_TFACE 212 229 240 231 + *MESH_TFACE 213 233 241 242 + *MESH_TFACE 214 243 230 239 + *MESH_TFACE 215 231 244 235 + *MESH_TFACE 216 233 245 219 + *MESH_TFACE 217 235 246 220 + *MESH_TFACE 218 221 245 247 + *MESH_TFACE 219 222 246 248 + *MESH_TFACE 220 221 249 223 + *MESH_TFACE 221 222 250 224 + *MESH_TFACE 222 223 251 225 + *MESH_TFACE 223 226 250 252 + *MESH_TFACE 224 244 253 246 + *MESH_TFACE 225 245 254 247 + *MESH_TFACE 226 248 253 255 + *MESH_TFACE 227 247 256 249 + *MESH_TFACE 228 248 257 250 + *MESH_TFACE 229 249 258 251 + *MESH_TFACE 230 250 259 252 + *MESH_TFACE 231 251 260 236 + *MESH_TFACE 232 252 261 237 + *MESH_TFACE 233 238 260 262 + *MESH_TFACE 234 239 261 263 + *MESH_TFACE 235 238 264 240 + *MESH_TFACE 236 242 265 266 + *MESH_TFACE 237 267 239 263 + *MESH_TFACE 238 240 268 244 + *MESH_TFACE 239 242 269 245 + *MESH_TFACE 240 259 270 261 + *MESH_TFACE 241 262 271 272 + *MESH_TFACE 242 263 270 273 + *MESH_TFACE 243 262 274 264 + *MESH_TFACE 244 266 275 276 + *MESH_TFACE 245 277 263 273 + *MESH_TFACE 246 264 278 268 + *MESH_TFACE 247 266 279 269 + *MESH_TFACE 248 268 280 253 + *MESH_TFACE 249 254 279 281 + *MESH_TFACE 250 255 280 282 + *MESH_TFACE 251 256 281 283 + *MESH_TFACE 252 255 284 257 + *MESH_TFACE 253 256 285 258 + *MESH_TFACE 254 259 284 286 + *MESH_TFACE 255 258 271 260 + *MESH_TFACE 256 282 287 288 + *MESH_TFACE 257 283 289 290 + *MESH_TFACE 258 282 291 284 + *MESH_TFACE 259 285 290 292 + *MESH_TFACE 260 284 293 286 + *MESH_TFACE 261 285 294 271 + *MESH_TFACE 262 286 295 270 + *MESH_TFACE 263 272 294 296 + *MESH_TFACE 264 270 297 273 + *MESH_TFACE 265 272 298 274 + *MESH_TFACE 266 276 299 300 + *MESH_TFACE 267 301 273 297 + *MESH_TFACE 268 274 302 278 + *MESH_TFACE 269 276 303 279 + *MESH_TFACE 270 278 287 280 + *MESH_TFACE 271 279 289 281 + *MESH_TFACE 272 297 304 305 + *MESH_TFACE 273 296 306 298 + *MESH_TFACE 274 300 307 308 + *MESH_TFACE 275 309 297 305 + *MESH_TFACE 276 302 306 310 + *MESH_TFACE 277 300 311 303 + *MESH_TFACE 278 302 312 287 + *MESH_TFACE 279 303 313 289 + *MESH_TFACE 280 288 312 314 + *MESH_TFACE 281 290 313 315 + *MESH_TFACE 282 288 316 291 + *MESH_TFACE 283 292 315 317 + *MESH_TFACE 284 291 318 293 + *MESH_TFACE 285 292 319 294 + *MESH_TFACE 286 295 318 304 + *MESH_TFACE 287 296 319 320 + *MESH_TFACE 288 313 321 315 + *MESH_TFACE 289 314 322 316 + *MESH_TFACE 290 317 321 323 + *MESH_TFACE 291 318 322 324 + *MESH_TFACE 292 317 325 319 + *MESH_TFACE 293 318 326 304 + *MESH_TFACE 294 320 325 327 + *MESH_TFACE 295 305 326 328 + *MESH_TFACE 296 320 329 306 + *MESH_TFACE 297 308 330 331 + *MESH_TFACE 298 332 305 328 + *MESH_TFACE 299 306 333 310 + *MESH_TFACE 300 308 334 311 + *MESH_TFACE 301 310 335 312 + *MESH_TFACE 302 311 336 313 + *MESH_TFACE 303 314 335 337 + *MESH_TFACE 304 329 338 339 + *MESH_TFACE 305 331 340 341 + *MESH_TFACE 306 342 328 343 + *MESH_TFACE 307 329 344 333 + *MESH_TFACE 308 331 345 334 + *MESH_TFACE 309 333 346 335 + *MESH_TFACE 310 334 347 336 + *MESH_TFACE 311 337 346 348 + *MESH_TFACE 312 321 347 349 + *MESH_TFACE 313 337 350 322 + *MESH_TFACE 314 323 349 351 + *MESH_TFACE 315 322 352 324 + *MESH_TFACE 316 323 353 325 + *MESH_TFACE 317 324 354 326 + *MESH_TFACE 318 327 353 338 + *MESH_TFACE 319 326 343 328 + *MESH_TFACE 320 348 355 350 + *MESH_TFACE 321 351 356 357 + *MESH_TFACE 322 350 358 352 + *MESH_TFACE 323 351 359 353 + *MESH_TFACE 324 354 358 360 + *MESH_TFACE 325 338 359 361 + *MESH_TFACE 326 354 362 343 + *MESH_TFACE 327 338 363 339 + *MESH_TFACE 328 341 364 365 + *MESH_TFACE 329 366 343 362 + *MESH_TFACE 330 339 367 344 + *MESH_TFACE 331 341 368 345 + *MESH_TFACE 332 344 369 346 + *MESH_TFACE 333 345 370 347 + *MESH_TFACE 334 348 369 371 + *MESH_TFACE 335 349 370 356 + *MESH_TFACE 336 365 372 373 + *MESH_TFACE 337 374 362 375 + *MESH_TFACE 338 363 376 367 + *MESH_TFACE 339 365 377 368 + *MESH_TFACE 340 367 378 369 + *MESH_TFACE 341 368 379 370 + *MESH_TFACE 342 371 378 380 + *MESH_TFACE 343 356 379 381 + *MESH_TFACE 344 355 380 382 + *MESH_TFACE 345 357 381 383 + *MESH_TFACE 346 355 384 358 + *MESH_TFACE 347 357 385 359 + *MESH_TFACE 348 360 384 386 + *MESH_TFACE 349 361 385 387 + *MESH_TFACE 350 362 386 375 + *MESH_TFACE 351 361 388 363 + *MESH_TFACE 352 383 389 390 + *MESH_TFACE 353 382 391 384 + *MESH_TFACE 354 383 392 385 + *MESH_TFACE 355 386 391 393 + *MESH_TFACE 356 387 392 394 + *MESH_TFACE 357 386 395 375 + *MESH_TFACE 358 387 396 388 + *MESH_TFACE 359 373 397 398 + *MESH_TFACE 360 399 375 395 + *MESH_TFACE 361 388 400 376 + *MESH_TFACE 362 377 398 401 + *MESH_TFACE 363 376 402 378 + *MESH_TFACE 364 377 403 379 + *MESH_TFACE 365 380 402 404 + *MESH_TFACE 366 381 403 389 + *MESH_TFACE 367 380 405 382 + *MESH_TFACE 368 400 406 407 + *MESH_TFACE 369 401 408 409 + *MESH_TFACE 370 400 410 402 + *MESH_TFACE 371 401 411 403 + *MESH_TFACE 372 404 410 412 + *MESH_TFACE 373 389 411 413 + *MESH_TFACE 374 404 414 405 + *MESH_TFACE 375 389 415 390 + *MESH_TFACE 376 391 414 416 + *MESH_TFACE 377 390 417 392 + *MESH_TFACE 378 393 416 418 + *MESH_TFACE 379 394 417 419 + *MESH_TFACE 380 393 420 395 + *MESH_TFACE 381 394 406 396 + *MESH_TFACE 382 398 421 408 + *MESH_TFACE 383 422 395 420 + *MESH_TFACE 384 423 424 425 + *MESH_TFACE 385 426 427 428 + *MESH_TFACE 386 429 424 430 + *MESH_TFACE 387 431 427 432 + *MESH_TFACE 388 429 433 434 + *MESH_TFACE 389 431 435 436 + *MESH_TFACE 390 437 438 439 + *MESH_TFACE 391 440 434 433 + *MESH_TFACE 392 441 435 442 + *MESH_TFACE 393 443 439 444 + *MESH_TFACE 394 441 445 446 + *MESH_TFACE 395 443 447 448 + *MESH_TFACE 396 449 445 450 + *MESH_TFACE 397 451 447 452 + *MESH_TFACE 398 449 453 423 + *MESH_TFACE 399 426 452 454 + *MESH_TFACE 400 442 455 445 + *MESH_TFACE 401 444 456 447 + *MESH_TFACE 402 450 455 457 + *MESH_TFACE 403 452 456 458 + *MESH_TFACE 404 450 459 453 + *MESH_TFACE 405 452 460 454 + *MESH_TFACE 406 453 461 424 + *MESH_TFACE 407 454 462 427 + *MESH_TFACE 408 430 461 463 + *MESH_TFACE 409 432 462 464 + *MESH_TFACE 410 430 465 433 + *MESH_TFACE 411 432 466 435 + *MESH_TFACE 412 439 467 468 + *MESH_TFACE 413 469 433 465 + *MESH_TFACE 414 435 470 442 + *MESH_TFACE 415 439 471 444 + *MESH_TFACE 416 463 472 473 + *MESH_TFACE 417 464 474 475 + *MESH_TFACE 418 463 476 465 + *MESH_TFACE 419 464 477 466 + *MESH_TFACE 420 468 478 479 + *MESH_TFACE 421 480 465 476 + *MESH_TFACE 422 470 477 481 + *MESH_TFACE 423 468 482 471 + *MESH_TFACE 424 470 483 455 + *MESH_TFACE 425 456 482 484 + *MESH_TFACE 426 457 483 485 + *MESH_TFACE 427 458 484 486 + *MESH_TFACE 428 457 487 459 + *MESH_TFACE 429 460 486 488 + *MESH_TFACE 430 459 472 461 + *MESH_TFACE 431 460 474 462 + *MESH_TFACE 432 482 489 484 + *MESH_TFACE 433 485 490 491 + *MESH_TFACE 434 484 492 486 + *MESH_TFACE 435 485 493 487 + *MESH_TFACE 436 488 492 494 + *MESH_TFACE 437 487 495 472 + *MESH_TFACE 438 488 496 474 + *MESH_TFACE 439 472 497 473 + *MESH_TFACE 440 475 496 498 + *MESH_TFACE 441 473 499 476 + *MESH_TFACE 442 475 500 477 + *MESH_TFACE 443 479 501 502 + *MESH_TFACE 444 503 476 499 + *MESH_TFACE 445 481 500 504 + *MESH_TFACE 446 479 505 482 + *MESH_TFACE 447 481 490 483 + *MESH_TFACE 448 498 506 507 + *MESH_TFACE 449 497 508 499 + *MESH_TFACE 450 500 507 509 + *MESH_TFACE 451 502 510 511 + *MESH_TFACE 452 512 499 508 + *MESH_TFACE 453 500 513 504 + *MESH_TFACE 454 502 514 505 + *MESH_TFACE 455 504 515 490 + *MESH_TFACE 456 505 516 489 + *MESH_TFACE 457 491 515 517 + *MESH_TFACE 458 489 518 492 + *MESH_TFACE 459 491 519 493 + *MESH_TFACE 460 494 518 520 + *MESH_TFACE 461 495 519 521 + *MESH_TFACE 462 494 506 496 + *MESH_TFACE 463 495 522 497 + *MESH_TFACE 464 517 523 524 + *MESH_TFACE 465 518 525 526 + *MESH_TFACE 466 517 527 519 + *MESH_TFACE 467 520 526 528 + *MESH_TFACE 468 519 529 521 + *MESH_TFACE 469 520 530 506 + *MESH_TFACE 470 521 531 522 + *MESH_TFACE 471 507 530 532 + *MESH_TFACE 472 522 533 508 + *MESH_TFACE 473 507 534 509 + *MESH_TFACE 474 511 535 536 + *MESH_TFACE 475 537 508 533 + *MESH_TFACE 476 509 538 513 + *MESH_TFACE 477 514 536 539 + *MESH_TFACE 478 513 523 515 + *MESH_TFACE 479 516 539 525 + *MESH_TFACE 480 533 540 541 + *MESH_TFACE 481 532 542 534 + *MESH_TFACE 482 536 543 544 + *MESH_TFACE 483 545 533 541 + *MESH_TFACE 484 534 546 538 + *MESH_TFACE 485 536 547 539 + *MESH_TFACE 486 538 548 523 + *MESH_TFACE 487 539 549 525 + *MESH_TFACE 488 524 548 550 + *MESH_TFACE 489 525 551 526 + *MESH_TFACE 490 524 552 527 + *MESH_TFACE 491 528 551 553 + *MESH_TFACE 492 527 554 529 + *MESH_TFACE 493 528 555 530 + *MESH_TFACE 494 529 540 531 + *MESH_TFACE 495 532 555 556 + *MESH_TFACE 496 551 3 5 + *MESH_TFACE 497 550 7 552 + *MESH_TFACE 498 553 5 9 + *MESH_TFACE 499 552 11 554 + *MESH_TFACE 500 555 9 13 + *MESH_TFACE 501 554 15 540 + *MESH_TFACE 502 556 13 17 + *MESH_TFACE 503 540 19 541 + *MESH_TFACE 504 542 17 21 + *MESH_TFACE 505 544 557 22 + *MESH_TFACE 506 558 541 19 + *MESH_TFACE 507 542 27 546 + *MESH_TFACE 508 547 22 29 + *MESH_TFACE 509 546 0 548 + *MESH_TFACE 510 549 29 3 + *MESH_TFACE 511 550 0 2 + *MESH_TFACE 512 0 30 1 + *MESH_TFACE 513 3 31 4 + *MESH_TFACE 514 2 1 6 + *MESH_TFACE 515 5 4 8 + *MESH_TFACE 516 7 6 10 + *MESH_TFACE 517 9 8 12 + *MESH_TFACE 518 11 10 14 + *MESH_TFACE 519 13 12 16 + *MESH_TFACE 520 15 14 18 + *MESH_TFACE 521 17 16 20 + *MESH_TFACE 522 21 20 26 + *MESH_TFACE 523 22 24 28 + *MESH_TFACE 524 27 26 30 + *MESH_TFACE 525 3 29 28 + *MESH_TFACE 526 30 26 32 + *MESH_TFACE 527 28 48 34 + *MESH_TFACE 528 30 33 35 + *MESH_TFACE 529 31 34 36 + *MESH_TFACE 530 6 1 35 + *MESH_TFACE 531 4 36 38 + *MESH_TFACE 532 6 37 39 + *MESH_TFACE 533 8 38 40 + *MESH_TFACE 534 10 39 41 + *MESH_TFACE 535 12 40 42 + *MESH_TFACE 536 14 41 43 + *MESH_TFACE 537 16 42 44 + *MESH_TFACE 538 26 20 44 + *MESH_TFACE 539 24 46 48 + *MESH_TFACE 540 39 65 49 + *MESH_TFACE 541 42 40 50 + *MESH_TFACE 542 41 49 52 + *MESH_TFACE 543 42 51 53 + *MESH_TFACE 544 44 53 57 + *MESH_TFACE 545 46 55 58 + *MESH_TFACE 546 32 57 59 + *MESH_TFACE 547 48 58 60 + *MESH_TFACE 548 35 33 59 + *MESH_TFACE 549 34 60 62 + *MESH_TFACE 550 37 35 61 + *MESH_TFACE 551 36 62 64 + *MESH_TFACE 552 37 63 65 + *MESH_TFACE 553 38 64 50 + *MESH_TFACE 554 58 82 66 + *MESH_TFACE 555 61 59 67 + *MESH_TFACE 556 60 66 69 + *MESH_TFACE 557 61 68 70 + *MESH_TFACE 558 62 69 71 + *MESH_TFACE 559 63 70 72 + *MESH_TFACE 560 64 71 73 + *MESH_TFACE 561 65 72 74 + *MESH_TFACE 562 50 73 75 + *MESH_TFACE 563 49 74 76 + *MESH_TFACE 564 53 51 75 + *MESH_TFACE 565 53 77 81 + *MESH_TFACE 566 55 79 82 + *MESH_TFACE 567 57 81 67 + *MESH_TFACE 568 73 98 83 + *MESH_TFACE 569 74 99 84 + *MESH_TFACE 570 77 75 83 + *MESH_TFACE 571 77 85 89 + *MESH_TFACE 572 79 87 90 + *MESH_TFACE 573 81 89 91 + *MESH_TFACE 574 82 90 92 + *MESH_TFACE 575 68 67 91 + *MESH_TFACE 576 66 92 94 + *MESH_TFACE 577 68 93 95 + *MESH_TFACE 578 71 69 94 + *MESH_TFACE 579 72 70 95 + *MESH_TFACE 580 71 96 98 + *MESH_TFACE 581 74 72 97 + *MESH_TFACE 582 93 91 100 + *MESH_TFACE 583 92 116 102 + *MESH_TFACE 584 95 93 101 + *MESH_TFACE 585 96 94 102 + *MESH_TFACE 586 95 103 105 + *MESH_TFACE 587 96 104 106 + *MESH_TFACE 588 99 97 105 + *MESH_TFACE 589 83 98 106 + *MESH_TFACE 590 99 107 109 + *MESH_TFACE 591 83 108 110 + *MESH_TFACE 592 85 110 114 + *MESH_TFACE 593 87 112 115 + *MESH_TFACE 594 89 114 100 + *MESH_TFACE 595 90 115 116 + *MESH_TFACE 596 109 107 117 + *MESH_TFACE 597 108 133 119 + *MESH_TFACE 598 110 119 123 + *MESH_TFACE 599 112 121 124 + *MESH_TFACE 600 114 123 125 + *MESH_TFACE 601 115 124 126 + *MESH_TFACE 602 101 100 125 + *MESH_TFACE 603 102 116 126 + *MESH_TFACE 604 103 101 127 + *MESH_TFACE 605 102 128 130 + *MESH_TFACE 606 103 129 131 + *MESH_TFACE 607 104 130 132 + *MESH_TFACE 608 105 131 117 + *MESH_TFACE 609 108 106 132 + *MESH_TFACE 610 127 149 134 + *MESH_TFACE 611 128 150 135 + *MESH_TFACE 612 131 129 134 + *MESH_TFACE 613 130 135 137 + *MESH_TFACE 614 117 131 136 + *MESH_TFACE 615 133 132 137 + *MESH_TFACE 616 118 117 138 + *MESH_TFACE 617 133 139 141 + *MESH_TFACE 618 123 119 141 + *MESH_TFACE 619 121 143 146 + *MESH_TFACE 620 123 145 147 + *MESH_TFACE 621 124 146 148 + *MESH_TFACE 622 127 125 147 + *MESH_TFACE 623 126 148 150 + *MESH_TFACE 624 141 167 155 + *MESH_TFACE 625 146 143 152 + *MESH_TFACE 626 145 155 157 + *MESH_TFACE 627 146 156 158 + *MESH_TFACE 628 149 147 157 + *MESH_TFACE 629 148 158 160 + *MESH_TFACE 630 149 159 161 + *MESH_TFACE 631 135 150 160 + *MESH_TFACE 632 136 134 161 + *MESH_TFACE 633 135 162 164 + *MESH_TFACE 634 136 163 165 + *MESH_TFACE 635 139 137 164 + *MESH_TFACE 636 140 138 165 + *MESH_TFACE 637 139 166 167 + *MESH_TFACE 638 160 183 168 + *MESH_TFACE 639 161 184 169 + *MESH_TFACE 640 162 168 170 + *MESH_TFACE 641 165 163 169 + *MESH_TFACE 642 166 164 170 + *MESH_TFACE 643 165 171 173 + *MESH_TFACE 644 166 172 174 + *MESH_TFACE 645 167 174 178 + *MESH_TFACE 646 152 176 179 + *MESH_TFACE 647 155 178 180 + *MESH_TFACE 648 158 156 179 + *MESH_TFACE 649 159 157 180 + *MESH_TFACE 650 158 181 183 + *MESH_TFACE 651 159 182 184 + *MESH_TFACE 652 178 174 185 + *MESH_TFACE 653 176 200 187 + *MESH_TFACE 654 178 186 188 + *MESH_TFACE 655 179 187 189 + *MESH_TFACE 656 182 180 188 + *MESH_TFACE 657 181 189 191 + *MESH_TFACE 658 182 190 192 + *MESH_TFACE 659 168 183 191 + *MESH_TFACE 660 169 184 192 + *MESH_TFACE 661 168 193 195 + *MESH_TFACE 662 169 194 196 + *MESH_TFACE 663 172 170 195 + *MESH_TFACE 664 171 196 198 + *MESH_TFACE 665 172 197 185 + *MESH_TFACE 666 194 192 202 + *MESH_TFACE 667 193 218 204 + *MESH_TFACE 668 194 203 205 + *MESH_TFACE 669 197 195 204 + *MESH_TFACE 670 198 196 205 + *MESH_TFACE 671 197 206 208 + *MESH_TFACE 672 185 208 212 + *MESH_TFACE 673 200 210 213 + *MESH_TFACE 674 186 212 214 + *MESH_TFACE 675 187 213 215 + *MESH_TFACE 676 188 214 216 + *MESH_TFACE 677 189 215 217 + *MESH_TFACE 678 190 216 202 + *MESH_TFACE 679 191 217 218 + *MESH_TFACE 680 210 233 219 + *MESH_TFACE 681 212 235 220 + *MESH_TFACE 682 213 219 221 + *MESH_TFACE 683 216 214 220 + *MESH_TFACE 684 217 215 221 + *MESH_TFACE 685 216 222 224 + *MESH_TFACE 686 218 217 223 + *MESH_TFACE 687 203 202 224 + *MESH_TFACE 688 218 225 227 + *MESH_TFACE 689 203 226 228 + *MESH_TFACE 690 206 204 227 + *MESH_TFACE 691 207 205 228 + *MESH_TFACE 692 206 229 231 + *MESH_TFACE 693 212 208 231 + *MESH_TFACE 694 225 251 236 + *MESH_TFACE 695 226 252 237 + *MESH_TFACE 696 229 227 236 + *MESH_TFACE 697 228 237 239 + *MESH_TFACE 698 229 238 240 + *MESH_TFACE 699 231 240 244 + *MESH_TFACE 700 233 242 245 + *MESH_TFACE 701 235 244 246 + *MESH_TFACE 702 221 219 245 + *MESH_TFACE 703 222 220 246 + *MESH_TFACE 704 221 247 249 + *MESH_TFACE 705 222 248 250 + *MESH_TFACE 706 223 249 251 + *MESH_TFACE 707 226 224 250 + *MESH_TFACE 708 244 268 253 + *MESH_TFACE 709 245 269 254 + *MESH_TFACE 710 248 246 253 + *MESH_TFACE 711 247 254 256 + *MESH_TFACE 712 248 255 257 + *MESH_TFACE 713 249 256 258 + *MESH_TFACE 714 250 257 259 + *MESH_TFACE 715 251 258 260 + *MESH_TFACE 716 252 259 261 + *MESH_TFACE 717 238 236 260 + *MESH_TFACE 718 239 237 261 + *MESH_TFACE 719 238 262 264 + *MESH_TFACE 720 240 264 268 + *MESH_TFACE 721 242 266 269 + *MESH_TFACE 722 259 286 270 + *MESH_TFACE 723 262 260 271 + *MESH_TFACE 724 263 261 270 + *MESH_TFACE 725 262 272 274 + *MESH_TFACE 726 264 274 278 + *MESH_TFACE 727 266 276 279 + *MESH_TFACE 728 268 278 280 + *MESH_TFACE 729 254 269 279 + *MESH_TFACE 730 255 253 280 + *MESH_TFACE 731 256 254 281 + *MESH_TFACE 732 255 282 284 + *MESH_TFACE 733 256 283 285 + *MESH_TFACE 734 259 257 284 + *MESH_TFACE 735 258 285 271 + *MESH_TFACE 736 282 280 287 + *MESH_TFACE 737 283 281 289 + *MESH_TFACE 738 282 288 291 + *MESH_TFACE 739 285 283 290 + *MESH_TFACE 740 284 291 293 + *MESH_TFACE 741 285 292 294 + *MESH_TFACE 742 286 293 295 + *MESH_TFACE 743 272 271 294 + *MESH_TFACE 744 270 295 297 + *MESH_TFACE 745 272 296 298 + *MESH_TFACE 746 274 298 302 + *MESH_TFACE 747 276 300 303 + *MESH_TFACE 748 278 302 287 + *MESH_TFACE 749 279 303 289 + *MESH_TFACE 750 297 295 304 + *MESH_TFACE 751 296 320 306 + *MESH_TFACE 752 302 298 306 + *MESH_TFACE 753 300 308 311 + *MESH_TFACE 754 302 310 312 + *MESH_TFACE 755 303 311 313 + *MESH_TFACE 756 288 287 312 + *MESH_TFACE 757 290 289 313 + *MESH_TFACE 758 288 314 316 + *MESH_TFACE 759 292 290 315 + *MESH_TFACE 760 291 316 318 + *MESH_TFACE 761 292 317 319 + *MESH_TFACE 762 295 293 318 + *MESH_TFACE 763 296 294 319 + *MESH_TFACE 764 313 336 321 + *MESH_TFACE 765 314 337 322 + *MESH_TFACE 766 317 315 321 + *MESH_TFACE 767 318 316 322 + *MESH_TFACE 768 317 323 325 + *MESH_TFACE 769 318 324 326 + *MESH_TFACE 770 320 319 325 + *MESH_TFACE 771 305 304 326 + *MESH_TFACE 772 320 327 329 + *MESH_TFACE 773 306 329 333 + *MESH_TFACE 774 308 331 334 + *MESH_TFACE 775 310 333 335 + *MESH_TFACE 776 311 334 336 + *MESH_TFACE 777 314 312 335 + *MESH_TFACE 778 329 327 338 + *MESH_TFACE 779 329 339 344 + *MESH_TFACE 780 331 341 345 + *MESH_TFACE 781 333 344 346 + *MESH_TFACE 782 334 345 347 + *MESH_TFACE 783 337 335 346 + *MESH_TFACE 784 321 336 347 + *MESH_TFACE 785 337 348 350 + *MESH_TFACE 786 323 321 349 + *MESH_TFACE 787 322 350 352 + *MESH_TFACE 788 323 351 353 + *MESH_TFACE 789 324 352 354 + *MESH_TFACE 790 327 325 353 + *MESH_TFACE 791 326 354 343 + *MESH_TFACE 792 348 371 355 + *MESH_TFACE 793 351 349 356 + *MESH_TFACE 794 350 355 358 + *MESH_TFACE 795 351 357 359 + *MESH_TFACE 796 354 352 358 + *MESH_TFACE 797 338 353 359 + *MESH_TFACE 798 354 360 362 + *MESH_TFACE 799 338 361 363 + *MESH_TFACE 800 339 363 367 + *MESH_TFACE 801 341 365 368 + *MESH_TFACE 802 344 367 369 + *MESH_TFACE 803 345 368 370 + *MESH_TFACE 804 348 346 369 + *MESH_TFACE 805 349 347 370 + *MESH_TFACE 806 363 388 376 + *MESH_TFACE 807 365 373 377 + *MESH_TFACE 808 367 376 378 + *MESH_TFACE 809 368 377 379 + *MESH_TFACE 810 371 369 378 + *MESH_TFACE 811 356 370 379 + *MESH_TFACE 812 355 371 380 + *MESH_TFACE 813 357 356 381 + *MESH_TFACE 814 355 382 384 + *MESH_TFACE 815 357 383 385 + *MESH_TFACE 816 360 358 384 + *MESH_TFACE 817 361 359 385 + *MESH_TFACE 818 362 360 386 + *MESH_TFACE 819 361 387 388 + *MESH_TFACE 820 383 381 389 + *MESH_TFACE 821 382 405 391 + *MESH_TFACE 822 383 390 392 + *MESH_TFACE 823 386 384 391 + *MESH_TFACE 824 387 385 392 + *MESH_TFACE 825 386 393 395 + *MESH_TFACE 826 387 394 396 + *MESH_TFACE 827 388 396 400 + *MESH_TFACE 828 377 373 398 + *MESH_TFACE 829 376 400 402 + *MESH_TFACE 830 377 401 403 + *MESH_TFACE 831 380 378 402 + *MESH_TFACE 832 381 379 403 + *MESH_TFACE 833 380 404 405 + *MESH_TFACE 834 400 396 406 + *MESH_TFACE 835 401 398 408 + *MESH_TFACE 836 400 407 410 + *MESH_TFACE 837 401 409 411 + *MESH_TFACE 838 404 402 410 + *MESH_TFACE 839 389 403 411 + *MESH_TFACE 840 404 412 414 + *MESH_TFACE 841 389 413 415 + *MESH_TFACE 842 391 405 414 + *MESH_TFACE 843 390 415 417 + *MESH_TFACE 844 393 391 416 + *MESH_TFACE 845 394 392 417 + *MESH_TFACE 846 393 418 420 + *MESH_TFACE 847 394 419 406 + *MESH_TFACE 848 423 453 424 + *MESH_TFACE 849 426 454 427 + *MESH_TFACE 850 429 425 424 + *MESH_TFACE 851 431 428 427 + *MESH_TFACE 852 429 430 433 + *MESH_TFACE 853 431 432 435 + *MESH_TFACE 854 441 436 435 + *MESH_TFACE 855 443 437 439 + *MESH_TFACE 856 441 442 445 + *MESH_TFACE 857 443 444 447 + *MESH_TFACE 858 449 446 445 + *MESH_TFACE 859 451 448 447 + *MESH_TFACE 860 449 450 453 + *MESH_TFACE 861 426 451 452 + *MESH_TFACE 862 442 470 455 + *MESH_TFACE 863 444 471 456 + *MESH_TFACE 864 450 445 455 + *MESH_TFACE 865 452 447 456 + *MESH_TFACE 866 450 457 459 + *MESH_TFACE 867 452 458 460 + *MESH_TFACE 868 453 459 461 + *MESH_TFACE 869 454 460 462 + *MESH_TFACE 870 430 424 461 + *MESH_TFACE 871 432 427 462 + *MESH_TFACE 872 430 463 465 + *MESH_TFACE 873 432 464 466 + *MESH_TFACE 874 435 466 470 + *MESH_TFACE 875 439 468 471 + *MESH_TFACE 876 463 461 472 + *MESH_TFACE 877 464 462 474 + *MESH_TFACE 878 463 473 476 + *MESH_TFACE 879 464 475 477 + *MESH_TFACE 880 470 466 477 + *MESH_TFACE 881 468 479 482 + *MESH_TFACE 882 470 481 483 + *MESH_TFACE 883 456 471 482 + *MESH_TFACE 884 457 455 483 + *MESH_TFACE 885 458 456 484 + *MESH_TFACE 886 457 485 487 + *MESH_TFACE 887 460 458 486 + *MESH_TFACE 888 459 487 472 + *MESH_TFACE 889 460 488 474 + *MESH_TFACE 890 482 505 489 + *MESH_TFACE 891 485 483 490 + *MESH_TFACE 892 484 489 492 + *MESH_TFACE 893 485 491 493 + *MESH_TFACE 894 488 486 492 + *MESH_TFACE 895 487 493 495 + *MESH_TFACE 896 488 494 496 + *MESH_TFACE 897 472 495 497 + *MESH_TFACE 898 475 474 496 + *MESH_TFACE 899 473 497 499 + *MESH_TFACE 900 475 498 500 + *MESH_TFACE 901 481 477 500 + *MESH_TFACE 902 479 502 505 + *MESH_TFACE 903 481 504 490 + *MESH_TFACE 904 498 496 506 + *MESH_TFACE 905 497 522 508 + *MESH_TFACE 906 500 498 507 + *MESH_TFACE 907 500 509 513 + *MESH_TFACE 908 502 511 514 + *MESH_TFACE 909 504 513 515 + *MESH_TFACE 910 505 514 516 + *MESH_TFACE 911 491 490 515 + *MESH_TFACE 912 489 516 518 + *MESH_TFACE 913 491 517 519 + *MESH_TFACE 914 494 492 518 + *MESH_TFACE 915 495 493 519 + *MESH_TFACE 916 494 520 506 + *MESH_TFACE 917 495 521 522 + *MESH_TFACE 918 517 515 523 + *MESH_TFACE 919 518 516 525 + *MESH_TFACE 920 517 524 527 + *MESH_TFACE 921 520 518 526 + *MESH_TFACE 922 519 527 529 + *MESH_TFACE 923 520 528 530 + *MESH_TFACE 924 521 529 531 + *MESH_TFACE 925 507 506 530 + *MESH_TFACE 926 522 531 533 + *MESH_TFACE 927 507 532 534 + *MESH_TFACE 928 509 534 538 + *MESH_TFACE 929 514 511 536 + *MESH_TFACE 930 513 538 523 + *MESH_TFACE 931 516 514 539 + *MESH_TFACE 932 533 531 540 + *MESH_TFACE 933 532 556 542 + *MESH_TFACE 934 534 542 546 + *MESH_TFACE 935 536 544 547 + *MESH_TFACE 936 538 546 548 + *MESH_TFACE 937 539 547 549 + *MESH_TFACE 938 524 523 548 + *MESH_TFACE 939 525 549 551 + *MESH_TFACE 940 524 550 552 + *MESH_TFACE 941 528 526 551 + *MESH_TFACE 942 527 552 554 + *MESH_TFACE 943 528 553 555 + *MESH_TFACE 944 529 554 540 + *MESH_TFACE 945 532 530 555 + *MESH_TFACE 946 551 549 3 + *MESH_TFACE 947 550 2 7 + *MESH_TFACE 948 553 551 5 + *MESH_TFACE 949 552 7 11 + *MESH_TFACE 950 555 553 9 + *MESH_TFACE 951 554 11 15 + *MESH_TFACE 952 556 555 13 + *MESH_TFACE 953 540 15 19 + *MESH_TFACE 954 542 556 17 + *MESH_TFACE 955 542 21 27 + *MESH_TFACE 956 547 544 22 + *MESH_TFACE 957 546 27 0 + *MESH_TFACE 958 549 547 29 + *MESH_TFACE 959 550 548 0 + } + *MESH_NUMCVERTEX 0 + *MESH_NORMALS { + *MESH_FACENORMAL 0 0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 477 0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 20 0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 478 0.0865 0.8786 -0.4696 + *MESH_FACENORMAL 1 0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 2 0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 13 0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 3 0.0624 0.6332 0.7715 + *MESH_FACENORMAL 2 0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 478 0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 21 0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 479 0.0759 0.7708 -0.6326 + *MESH_FACENORMAL 3 0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 3 0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 14 0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 4 0.0759 0.7708 0.6326 + *MESH_FACENORMAL 4 0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 479 0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 22 0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 9 0.0624 0.6332 -0.7715 + *MESH_FACENORMAL 5 0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 4 0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 15 0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 5 0.0865 0.8786 0.4696 + *MESH_FACENORMAL 6 0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 9 0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 23 0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 480 0.0464 0.4709 -0.8810 + *MESH_FACENORMAL 7 0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 5 0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 16 0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 6 0.0938 0.9527 0.2890 + *MESH_FACENORMAL 8 0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 480 0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 24 0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 481 0.0286 0.2902 -0.9565 + *MESH_FACENORMAL 9 0.0975 0.9904 0.0975 + *MESH_VERTEXNORMAL 6 0.0975 0.9904 0.0975 + *MESH_VERTEXNORMAL 17 0.0975 0.9904 0.0975 + *MESH_VERTEXNORMAL 7 0.0975 0.9904 0.0975 + *MESH_FACENORMAL 10 0.0097 0.0980 0.9951 + *MESH_VERTEXNORMAL 0 0.0097 0.0980 0.9951 + *MESH_VERTEXNORMAL 296 0.0097 0.0980 0.9951 + *MESH_VERTEXNORMAL 10 0.0097 0.0980 0.9951 + *MESH_FACENORMAL 11 0.0097 0.0980 -0.9951 + *MESH_VERTEXNORMAL 205 0.0097 0.0980 -0.9951 + *MESH_VERTEXNORMAL 481 0.0097 0.0980 -0.9951 + *MESH_VERTEXNORMAL 24 0.0097 0.0980 -0.9951 + *MESH_FACENORMAL 12 0.0975 0.9904 -0.0975 + *MESH_VERTEXNORMAL 7 0.0975 0.9904 -0.0975 + *MESH_VERTEXNORMAL 18 0.0975 0.9904 -0.0975 + *MESH_VERTEXNORMAL 8 0.0975 0.9904 -0.0975 + *MESH_FACENORMAL 13 0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 0 0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 11 0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 1 0.0286 0.2902 0.9565 + *MESH_FACENORMAL 14 0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 8 0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 19 0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 477 0.0938 0.9527 -0.2890 + *MESH_FACENORMAL 15 0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 2 0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 11 0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 12 0.0464 0.4709 0.8810 + *MESH_FACENORMAL 16 0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 19 0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 33 0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 34 0.2779 0.9161 -0.2890 + *MESH_FACENORMAL 17 0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 11 0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 27 0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 12 0.1374 0.4528 0.8810 + *MESH_FACENORMAL 18 0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 19 0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 35 0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 20 0.2563 0.8448 -0.4696 + *MESH_FACENORMAL 19 0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 12 0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 28 0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 13 0.1847 0.6088 0.7715 + *MESH_FACENORMAL 20 0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 21 0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 35 0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 36 0.2248 0.7412 -0.6326 + *MESH_FACENORMAL 21 0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 13 0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 29 0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 14 0.2248 0.7412 0.6326 + *MESH_FACENORMAL 22 0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 21 0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 37 0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 22 0.1847 0.6088 -0.7715 + *MESH_FACENORMAL 23 0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 14 0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 30 0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 15 0.2563 0.8448 0.4696 + *MESH_FACENORMAL 24 0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 22 0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 38 0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 23 0.1374 0.4528 -0.8810 + *MESH_FACENORMAL 25 0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 15 0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 31 0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 16 0.2779 0.9161 0.2890 + *MESH_FACENORMAL 26 0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 23 0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 39 0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 24 0.0846 0.2790 -0.9565 + *MESH_FACENORMAL 27 0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 16 0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 32 0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 17 0.2889 0.9524 0.0976 + *MESH_FACENORMAL 28 0.0286 0.0942 0.9951 + *MESH_VERTEXNORMAL 10 0.0286 0.0942 0.9951 + *MESH_VERTEXNORMAL 296 0.0286 0.0942 0.9951 + *MESH_VERTEXNORMAL 25 0.0286 0.0942 0.9951 + *MESH_FACENORMAL 29 0.0286 0.0942 -0.9951 + *MESH_VERTEXNORMAL 205 0.0286 0.0942 -0.9951 + *MESH_VERTEXNORMAL 24 0.0286 0.0942 -0.9951 + *MESH_VERTEXNORMAL 39 0.0286 0.0942 -0.9951 + *MESH_FACENORMAL 30 0.2889 0.9524 -0.0976 + *MESH_VERTEXNORMAL 18 0.2889 0.9524 -0.0975 + *MESH_VERTEXNORMAL 32 0.2889 0.9524 -0.0975 + *MESH_VERTEXNORMAL 33 0.2889 0.9524 -0.0975 + *MESH_FACENORMAL 31 0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 10 0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 26 0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 11 0.0846 0.2790 0.9565 + *MESH_FACENORMAL 32 0.2230 0.4173 -0.8810 + *MESH_VERTEXNORMAL 37 0.2231 0.4173 -0.8810 + *MESH_VERTEXNORMAL 53 0.2231 0.4173 -0.8810 + *MESH_VERTEXNORMAL 38 0.2231 0.4173 -0.8810 + *MESH_FACENORMAL 33 0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 31 0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 45 0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 46 0.4513 0.8443 0.2890 + *MESH_FACENORMAL 34 0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 38 0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 54 0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 39 0.1374 0.2571 -0.9565 + *MESH_FACENORMAL 35 0.4691 0.8777 0.0975 + *MESH_VERTEXNORMAL 31 0.4691 0.8777 0.0975 + *MESH_VERTEXNORMAL 47 0.4691 0.8777 0.0975 + *MESH_VERTEXNORMAL 32 0.4691 0.8777 0.0975 + *MESH_FACENORMAL 36 0.0464 0.0869 0.9951 + *MESH_VERTEXNORMAL 25 0.0464 0.0869 0.9951 + *MESH_VERTEXNORMAL 296 0.0464 0.0869 0.9951 + *MESH_VERTEXNORMAL 40 0.0464 0.0869 0.9951 + *MESH_FACENORMAL 37 0.0464 0.0869 -0.9951 + *MESH_VERTEXNORMAL 205 0.0464 0.0869 -0.9951 + *MESH_VERTEXNORMAL 39 0.0464 0.0869 -0.9951 + *MESH_VERTEXNORMAL 54 0.0464 0.0869 -0.9951 + *MESH_FACENORMAL 38 0.4691 0.8777 -0.0975 + *MESH_VERTEXNORMAL 32 0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 48 0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 33 0.4691 0.8777 -0.0976 + *MESH_FACENORMAL 39 0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 25 0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 41 0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 26 0.1374 0.2571 0.9565 + *MESH_FACENORMAL 40 0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 33 0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 49 0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 34 0.4513 0.8443 -0.2890 + *MESH_FACENORMAL 41 0.2230 0.4173 0.8810 + *MESH_VERTEXNORMAL 26 0.2231 0.4173 0.8810 + *MESH_VERTEXNORMAL 42 0.2231 0.4173 0.8810 + *MESH_VERTEXNORMAL 27 0.2231 0.4173 0.8810 + *MESH_FACENORMAL 42 0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 35 0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 49 0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 50 0.4162 0.7786 -0.4696 + *MESH_FACENORMAL 43 0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 27 0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 43 0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 28 0.2999 0.5611 0.7715 + *MESH_FACENORMAL 44 0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 36 0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 50 0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 51 0.3651 0.6831 -0.6326 + *MESH_FACENORMAL 45 0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 28 0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 44 0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 29 0.3651 0.6831 0.6326 + *MESH_FACENORMAL 46 0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 36 0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 52 0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 37 0.2999 0.5611 -0.7715 + *MESH_FACENORMAL 47 0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 29 0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 45 0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 30 0.4162 0.7786 0.4696 + *MESH_FACENORMAL 48 0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 41 0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 57 0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 42 0.3002 0.3658 0.8810 + *MESH_FACENORMAL 49 0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 50 0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 64 0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 65 0.5601 0.6825 -0.4696 + *MESH_FACENORMAL 50 0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 42 0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 58 0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 43 0.4036 0.4918 0.7715 + *MESH_FACENORMAL 51 0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 50 0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 66 0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 51 0.4913 0.5987 -0.6326 + *MESH_FACENORMAL 52 0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 43 0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 59 0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 44 0.4913 0.5987 0.6326 + *MESH_FACENORMAL 53 0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 51 0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 67 0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 52 0.4036 0.4918 -0.7715 + *MESH_FACENORMAL 54 0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 44 0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 60 0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 45 0.5601 0.6825 0.4696 + *MESH_FACENORMAL 55 0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 52 0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 68 0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 53 0.3002 0.3658 -0.8810 + *MESH_FACENORMAL 56 0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 45 0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 61 0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 46 0.6073 0.7400 0.2890 + *MESH_FACENORMAL 57 0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 53 0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 69 0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 54 0.1850 0.2254 -0.9565 + *MESH_FACENORMAL 58 0.6314 0.7693 0.0975 + *MESH_VERTEXNORMAL 47 0.6314 0.7693 0.0975 + *MESH_VERTEXNORMAL 61 0.6314 0.7693 0.0975 + *MESH_VERTEXNORMAL 62 0.6314 0.7693 0.0975 + *MESH_FACENORMAL 59 0.0625 0.0761 0.9951 + *MESH_VERTEXNORMAL 40 0.0625 0.0761 0.9951 + *MESH_VERTEXNORMAL 296 0.0625 0.0761 0.9951 + *MESH_VERTEXNORMAL 55 0.0625 0.0761 0.9951 + *MESH_FACENORMAL 60 0.0625 0.0761 -0.9951 + *MESH_VERTEXNORMAL 205 0.0625 0.0761 -0.9951 + *MESH_VERTEXNORMAL 54 0.0625 0.0761 -0.9951 + *MESH_VERTEXNORMAL 69 0.0625 0.0761 -0.9951 + *MESH_FACENORMAL 61 0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 47 0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 63 0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 48 0.6314 0.7693 -0.0976 + *MESH_FACENORMAL 62 0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 40 0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 56 0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 41 0.1850 0.2254 0.9565 + *MESH_FACENORMAL 63 0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 48 0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 64 0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 49 0.6073 0.7400 -0.2890 + *MESH_FACENORMAL 64 0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 60 0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 76 0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 61 0.7400 0.6073 0.2890 + *MESH_FACENORMAL 65 0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 68 0.2254 0.1850 -0.9566 + *MESH_VERTEXNORMAL 84 0.2254 0.1850 -0.9566 + *MESH_VERTEXNORMAL 69 0.2254 0.1850 -0.9566 + *MESH_FACENORMAL 66 0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 62 0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 76 0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 77 0.7693 0.6314 0.0976 + *MESH_FACENORMAL 67 0.0761 0.0625 0.9951 + *MESH_VERTEXNORMAL 55 0.0761 0.0625 0.9951 + *MESH_VERTEXNORMAL 296 0.0761 0.0625 0.9951 + *MESH_VERTEXNORMAL 70 0.0761 0.0625 0.9951 + *MESH_FACENORMAL 68 0.0761 0.0625 -0.9951 + *MESH_VERTEXNORMAL 205 0.0761 0.0625 -0.9951 + *MESH_VERTEXNORMAL 69 0.0761 0.0625 -0.9951 + *MESH_VERTEXNORMAL 84 0.0761 0.0625 -0.9951 + *MESH_FACENORMAL 69 0.7693 0.6314 -0.0975 + *MESH_VERTEXNORMAL 62 0.7693 0.6314 -0.0975 + *MESH_VERTEXNORMAL 78 0.7693 0.6314 -0.0975 + *MESH_VERTEXNORMAL 63 0.7693 0.6314 -0.0975 + *MESH_FACENORMAL 70 0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 55 0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 71 0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 56 0.2254 0.1850 0.9565 + *MESH_FACENORMAL 71 0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 63 0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 79 0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 64 0.7400 0.6073 -0.2890 + *MESH_FACENORMAL 72 0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 56 0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 72 0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 57 0.3658 0.3002 0.8810 + *MESH_FACENORMAL 73 0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 65 0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 79 0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 80 0.6825 0.5601 -0.4696 + *MESH_FACENORMAL 74 0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 57 0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 73 0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 58 0.4918 0.4036 0.7715 + *MESH_FACENORMAL 75 0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 65 0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 81 0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 66 0.5987 0.4913 -0.6326 + *MESH_FACENORMAL 76 0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 59 0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 73 0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 74 0.5987 0.4913 0.6326 + *MESH_FACENORMAL 77 0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 67 0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 81 0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 82 0.4918 0.4036 -0.7715 + *MESH_FACENORMAL 78 0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 59 0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 75 0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 60 0.6825 0.5601 0.4696 + *MESH_FACENORMAL 79 0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 68 0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 82 0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 83 0.3658 0.3002 -0.8810 + *MESH_FACENORMAL 80 0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 80 0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 94 0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 95 0.7786 0.4162 -0.4696 + *MESH_FACENORMAL 81 0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 72 0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 88 0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 73 0.5611 0.2999 0.7715 + *MESH_FACENORMAL 82 0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 81 0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 95 0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 96 0.6831 0.3651 -0.6326 + *MESH_FACENORMAL 83 0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 74 0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 88 0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 89 0.6831 0.3651 0.6326 + *MESH_FACENORMAL 84 0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 81 0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 97 0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 82 0.5611 0.2999 -0.7715 + *MESH_FACENORMAL 85 0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 74 0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 90 0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 75 0.7786 0.4162 0.4696 + *MESH_FACENORMAL 86 0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 83 0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 97 0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 98 0.4173 0.2230 -0.8810 + *MESH_FACENORMAL 87 0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 76 0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 90 0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 91 0.8443 0.4513 0.2890 + *MESH_FACENORMAL 88 0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 83 0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 99 0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 84 0.2571 0.1374 -0.9565 + *MESH_FACENORMAL 89 0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 76 0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 92 0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 77 0.8777 0.4691 0.0976 + *MESH_FACENORMAL 90 0.0869 0.0464 0.9951 + *MESH_VERTEXNORMAL 70 0.0869 0.0464 0.9951 + *MESH_VERTEXNORMAL 296 0.0869 0.0464 0.9951 + *MESH_VERTEXNORMAL 85 0.0869 0.0464 0.9951 + *MESH_FACENORMAL 91 0.0869 0.0464 -0.9951 + *MESH_VERTEXNORMAL 205 0.0869 0.0464 -0.9951 + *MESH_VERTEXNORMAL 84 0.0869 0.0464 -0.9951 + *MESH_VERTEXNORMAL 99 0.0869 0.0464 -0.9951 + *MESH_FACENORMAL 92 0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 77 0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 93 0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 78 0.8777 0.4691 -0.0976 + *MESH_FACENORMAL 93 0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 70 0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 86 0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 71 0.2571 0.1374 0.9565 + *MESH_FACENORMAL 94 0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 78 0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 94 0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 79 0.8443 0.4513 -0.2890 + *MESH_FACENORMAL 95 0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 71 0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 87 0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 72 0.4173 0.2230 0.8810 + *MESH_FACENORMAL 96 0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 99 0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 113 0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 114 0.2790 0.0846 -0.9565 + *MESH_FACENORMAL 97 0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 91 0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 107 0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 92 0.9524 0.2889 0.0976 + *MESH_FACENORMAL 98 0.0942 0.0286 0.9951 + *MESH_VERTEXNORMAL 85 0.0942 0.0286 0.9951 + *MESH_VERTEXNORMAL 296 0.0942 0.0286 0.9951 + *MESH_VERTEXNORMAL 100 0.0942 0.0286 0.9951 + *MESH_FACENORMAL 99 0.0942 0.0286 -0.9951 + *MESH_VERTEXNORMAL 205 0.0942 0.0286 -0.9951 + *MESH_VERTEXNORMAL 99 0.0942 0.0286 -0.9951 + *MESH_VERTEXNORMAL 114 0.0942 0.0286 -0.9951 + *MESH_FACENORMAL 100 0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 92 0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 108 0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 93 0.9524 0.2889 -0.0976 + *MESH_FACENORMAL 101 0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 85 0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 101 0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 86 0.2790 0.0846 0.9565 + *MESH_FACENORMAL 102 0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 93 0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 109 0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 94 0.9161 0.2779 -0.2890 + *MESH_FACENORMAL 103 0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 86 0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 102 0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 87 0.4528 0.1374 0.8810 + *MESH_FACENORMAL 104 0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 95 0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 109 0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 110 0.8448 0.2563 -0.4696 + *MESH_FACENORMAL 105 0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 88 0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 102 0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 103 0.6088 0.1847 0.7715 + *MESH_FACENORMAL 106 0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 96 0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 110 0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 111 0.7412 0.2248 -0.6326 + *MESH_FACENORMAL 107 0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 88 0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 104 0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 89 0.7412 0.2248 0.6326 + *MESH_FACENORMAL 108 0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 96 0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 112 0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 97 0.6088 0.1847 -0.7715 + *MESH_FACENORMAL 109 0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 89 0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 105 0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 90 0.8448 0.2563 0.4696 + *MESH_FACENORMAL 110 0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 97 0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 113 0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 98 0.4528 0.1374 -0.8810 + *MESH_FACENORMAL 111 0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 91 0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 105 0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 106 0.9161 0.2779 0.2890 + *MESH_FACENORMAL 112 0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 110 0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 126 0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 111 0.7708 0.0759 -0.6326 + *MESH_FACENORMAL 113 0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 103 0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 119 0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 104 0.7708 0.0759 0.6326 + *MESH_FACENORMAL 114 0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 112 0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 126 0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 127 0.6332 0.0624 -0.7715 + *MESH_FACENORMAL 115 0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 104 0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 120 0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 105 0.8786 0.0865 0.4696 + *MESH_FACENORMAL 116 0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 113 0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 127 0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 128 0.4709 0.0464 -0.8810 + *MESH_FACENORMAL 117 0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 106 0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 120 0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 121 0.9527 0.0938 0.2890 + *MESH_FACENORMAL 118 0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 114 0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 128 0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 129 0.2902 0.0286 -0.9565 + *MESH_FACENORMAL 119 0.9904 0.0975 0.0976 + *MESH_VERTEXNORMAL 106 0.9904 0.0975 0.0976 + *MESH_VERTEXNORMAL 122 0.9904 0.0975 0.0976 + *MESH_VERTEXNORMAL 107 0.9904 0.0975 0.0976 + *MESH_FACENORMAL 120 0.0980 0.0097 0.9951 + *MESH_VERTEXNORMAL 100 0.0980 0.0097 0.9951 + *MESH_VERTEXNORMAL 296 0.0980 0.0097 0.9951 + *MESH_VERTEXNORMAL 115 0.0980 0.0097 0.9951 + *MESH_FACENORMAL 121 0.0980 0.0097 -0.9951 + *MESH_VERTEXNORMAL 205 0.0980 0.0097 -0.9951 + *MESH_VERTEXNORMAL 114 0.0980 0.0097 -0.9951 + *MESH_VERTEXNORMAL 129 0.0980 0.0097 -0.9951 + *MESH_FACENORMAL 122 0.9904 0.0975 -0.0976 + *MESH_VERTEXNORMAL 108 0.9904 0.0975 -0.0976 + *MESH_VERTEXNORMAL 122 0.9904 0.0975 -0.0976 + *MESH_VERTEXNORMAL 123 0.9904 0.0975 -0.0976 + *MESH_FACENORMAL 123 0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 100 0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 116 0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 101 0.2902 0.0286 0.9565 + *MESH_FACENORMAL 124 0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 108 0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 124 0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 109 0.9527 0.0938 -0.2890 + *MESH_FACENORMAL 125 0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 101 0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 117 0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 102 0.4709 0.0464 0.8810 + *MESH_FACENORMAL 126 0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 110 0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 124 0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 125 0.8786 0.0865 -0.4696 + *MESH_FACENORMAL 127 0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 102 0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 118 0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 103 0.6332 0.0624 0.7715 + *MESH_FACENORMAL 128 0.0980 -0.0097 0.9951 + *MESH_VERTEXNORMAL 115 0.0980 -0.0097 0.9951 + *MESH_VERTEXNORMAL 296 0.0980 -0.0097 0.9951 + *MESH_VERTEXNORMAL 130 0.0980 -0.0097 0.9951 + *MESH_FACENORMAL 129 0.0980 -0.0097 -0.9951 + *MESH_VERTEXNORMAL 205 0.0980 -0.0097 -0.9951 + *MESH_VERTEXNORMAL 129 0.0980 -0.0097 -0.9951 + *MESH_VERTEXNORMAL 144 0.0980 -0.0097 -0.9951 + *MESH_FACENORMAL 130 0.9904 -0.0976 -0.0976 + *MESH_VERTEXNORMAL 122 0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 138 0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 123 0.9904 -0.0975 -0.0976 + *MESH_FACENORMAL 131 0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 116 0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 130 0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 131 0.2902 -0.0286 0.9565 + *MESH_FACENORMAL 132 0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 123 0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 139 0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 124 0.9527 -0.0938 -0.2890 + *MESH_FACENORMAL 133 0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 116 0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 132 0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 117 0.4709 -0.0464 0.8810 + *MESH_FACENORMAL 134 0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 125 0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 139 0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 140 0.8786 -0.0865 -0.4696 + *MESH_FACENORMAL 135 0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 117 0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 133 0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 118 0.6332 -0.0624 0.7715 + *MESH_FACENORMAL 136 0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 125 0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 141 0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 126 0.7708 -0.0759 -0.6326 + *MESH_FACENORMAL 137 0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 119 0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 133 0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 134 0.7708 -0.0759 0.6326 + *MESH_FACENORMAL 138 0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 127 0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 141 0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 142 0.6332 -0.0624 -0.7715 + *MESH_FACENORMAL 139 0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 119 0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 135 0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 120 0.8786 -0.0865 0.4696 + *MESH_FACENORMAL 140 0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 127 0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 143 0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 128 0.4709 -0.0464 -0.8810 + *MESH_FACENORMAL 141 0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 121 0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 135 0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 136 0.9527 -0.0938 0.2890 + *MESH_FACENORMAL 142 0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 129 0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 143 0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 144 0.2902 -0.0286 -0.9565 + *MESH_FACENORMAL 143 0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 121 0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 137 0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 122 0.9904 -0.0975 0.0976 + *MESH_FACENORMAL 144 0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 133 0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 149 0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 134 0.7412 -0.2248 0.6326 + *MESH_FACENORMAL 145 0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 141 0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 157 0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 142 0.6088 -0.1847 -0.7715 + *MESH_FACENORMAL 146 0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 134 0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 150 0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 135 0.8448 -0.2563 0.4696 + *MESH_FACENORMAL 147 0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 143 0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 157 0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 158 0.4528 -0.1374 -0.8810 + *MESH_FACENORMAL 148 0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 136 0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 150 0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 151 0.9161 -0.2779 0.2890 + *MESH_FACENORMAL 149 0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 143 0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 159 0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 144 0.2790 -0.0846 -0.9565 + *MESH_FACENORMAL 150 0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 136 0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 152 0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 137 0.9524 -0.2889 0.0976 + *MESH_FACENORMAL 151 0.0942 -0.0286 0.9951 + *MESH_VERTEXNORMAL 130 0.0942 -0.0286 0.9951 + *MESH_VERTEXNORMAL 296 0.0942 -0.0286 0.9951 + *MESH_VERTEXNORMAL 145 0.0942 -0.0286 0.9951 + *MESH_FACENORMAL 152 0.0942 -0.0286 -0.9951 + *MESH_VERTEXNORMAL 205 0.0942 -0.0286 -0.9951 + *MESH_VERTEXNORMAL 144 0.0942 -0.0286 -0.9951 + *MESH_VERTEXNORMAL 159 0.0942 -0.0286 -0.9951 + *MESH_FACENORMAL 153 0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 137 0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 153 0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 138 0.9524 -0.2889 -0.0976 + *MESH_FACENORMAL 154 0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 130 0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 146 0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 131 0.2790 -0.0846 0.9565 + *MESH_FACENORMAL 155 0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 138 0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 154 0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 139 0.9161 -0.2779 -0.2890 + *MESH_FACENORMAL 156 0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 132 0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 146 0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 147 0.4528 -0.1374 0.8810 + *MESH_FACENORMAL 157 0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 140 0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 154 0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 155 0.8448 -0.2563 -0.4696 + *MESH_FACENORMAL 158 0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 132 0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 148 0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 133 0.6088 -0.1847 0.7715 + *MESH_FACENORMAL 159 0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 140 0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 156 0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 141 0.7412 -0.2248 -0.6326 + *MESH_FACENORMAL 160 0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 153 0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 167 0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 168 0.8777 -0.4691 -0.0976 + *MESH_FACENORMAL 161 0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 145 0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 161 0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 146 0.2571 -0.1374 0.9565 + *MESH_FACENORMAL 162 0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 153 0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 169 0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 154 0.8443 -0.4513 -0.2890 + *MESH_FACENORMAL 163 0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 146 0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 162 0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 147 0.4173 -0.2230 0.8810 + *MESH_FACENORMAL 164 0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 155 0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 169 0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 170 0.7786 -0.4162 -0.4696 + *MESH_FACENORMAL 165 0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 147 0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 163 0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 148 0.5611 -0.2999 0.7715 + *MESH_FACENORMAL 166 0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 155 0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 171 0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 156 0.6831 -0.3651 -0.6326 + *MESH_FACENORMAL 167 0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 149 0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 163 0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 164 0.6831 -0.3651 0.6326 + *MESH_FACENORMAL 168 0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 157 0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 171 0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 172 0.5611 -0.2999 -0.7715 + *MESH_FACENORMAL 169 0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 149 0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 165 0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 150 0.7786 -0.4162 0.4696 + *MESH_FACENORMAL 170 0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 157 0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 173 0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 158 0.4173 -0.2230 -0.8810 + *MESH_FACENORMAL 171 0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 151 0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 165 0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 166 0.8443 -0.4513 0.2890 + *MESH_FACENORMAL 172 0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 158 0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 174 0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 159 0.2571 -0.1374 -0.9565 + *MESH_FACENORMAL 173 0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 151 0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 167 0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 152 0.8777 -0.4691 0.0976 + *MESH_FACENORMAL 174 0.0869 -0.0464 0.9951 + *MESH_VERTEXNORMAL 145 0.0869 -0.0464 0.9951 + *MESH_VERTEXNORMAL 296 0.0869 -0.0464 0.9951 + *MESH_VERTEXNORMAL 160 0.0869 -0.0464 0.9951 + *MESH_FACENORMAL 175 0.0869 -0.0464 -0.9951 + *MESH_VERTEXNORMAL 205 0.0869 -0.0464 -0.9951 + *MESH_VERTEXNORMAL 159 0.0869 -0.0464 -0.9951 + *MESH_VERTEXNORMAL 174 0.0869 -0.0464 -0.9951 + *MESH_FACENORMAL 176 0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 172 0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 186 0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 187 0.4918 -0.4036 -0.7715 + *MESH_FACENORMAL 177 0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 164 0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 180 0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 165 0.6825 -0.5601 0.4696 + *MESH_FACENORMAL 178 0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 172 0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 188 0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 173 0.3658 -0.3002 -0.8810 + *MESH_FACENORMAL 179 0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 166 0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 180 0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 181 0.7400 -0.6073 0.2890 + *MESH_FACENORMAL 180 0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 174 0.2254 -0.1850 -0.9566 + *MESH_VERTEXNORMAL 188 0.2254 -0.1850 -0.9566 + *MESH_VERTEXNORMAL 189 0.2254 -0.1850 -0.9566 + *MESH_FACENORMAL 181 0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 166 0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 182 0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 167 0.7693 -0.6314 0.0976 + *MESH_FACENORMAL 182 0.0761 -0.0625 0.9951 + *MESH_VERTEXNORMAL 160 0.0761 -0.0625 0.9951 + *MESH_VERTEXNORMAL 296 0.0761 -0.0625 0.9951 + *MESH_VERTEXNORMAL 175 0.0761 -0.0625 0.9951 + *MESH_FACENORMAL 183 0.0761 -0.0625 -0.9951 + *MESH_VERTEXNORMAL 205 0.0761 -0.0625 -0.9951 + *MESH_VERTEXNORMAL 174 0.0761 -0.0625 -0.9951 + *MESH_VERTEXNORMAL 189 0.0761 -0.0625 -0.9951 + *MESH_FACENORMAL 184 0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 167 0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 183 0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 168 0.7693 -0.6314 -0.0976 + *MESH_FACENORMAL 185 0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 160 0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 176 0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 161 0.2254 -0.1850 0.9565 + *MESH_FACENORMAL 186 0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 168 0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 184 0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 169 0.7400 -0.6073 -0.2890 + *MESH_FACENORMAL 187 0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 161 0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 177 0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 162 0.3658 -0.3002 0.8810 + *MESH_FACENORMAL 188 0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 169 0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 185 0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 170 0.6825 -0.5601 -0.4696 + *MESH_FACENORMAL 189 0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 162 0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 178 0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 163 0.4918 -0.4036 0.7715 + *MESH_FACENORMAL 190 0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 170 0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 186 0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 171 0.5987 -0.4913 -0.6326 + *MESH_FACENORMAL 191 0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 163 0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 179 0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 164 0.5987 -0.4913 0.6326 + *MESH_FACENORMAL 192 0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 175 0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 191 0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 176 0.1850 -0.2254 0.9565 + *MESH_FACENORMAL 193 0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 183 0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 199 0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 184 0.6073 -0.7400 -0.2890 + *MESH_FACENORMAL 194 0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 176 0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 192 0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 177 0.3002 -0.3658 0.8810 + *MESH_FACENORMAL 195 0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 185 0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 199 0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 200 0.5601 -0.6825 -0.4696 + *MESH_FACENORMAL 196 0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 178 0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 192 0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 193 0.4036 -0.4918 0.7715 + *MESH_FACENORMAL 197 0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 185 0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 201 0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 186 0.4913 -0.5987 -0.6326 + *MESH_FACENORMAL 198 0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 179 0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 193 0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 194 0.4913 -0.5987 0.6326 + *MESH_FACENORMAL 199 0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 187 0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 201 0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 202 0.4036 -0.4918 -0.7715 + *MESH_FACENORMAL 200 0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 179 0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 195 0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 180 0.5601 -0.6825 0.4696 + *MESH_FACENORMAL 201 0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 187 0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 203 0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 188 0.3002 -0.3658 -0.8810 + *MESH_FACENORMAL 202 0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 181 0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 195 0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 196 0.6073 -0.7400 0.2890 + *MESH_FACENORMAL 203 0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 189 0.1850 -0.2254 -0.9566 + *MESH_VERTEXNORMAL 203 0.1850 -0.2254 -0.9566 + *MESH_VERTEXNORMAL 204 0.1850 -0.2254 -0.9566 + *MESH_FACENORMAL 204 0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 181 0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 197 0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 182 0.6314 -0.7693 0.0976 + *MESH_FACENORMAL 205 0.0625 -0.0761 0.9951 + *MESH_VERTEXNORMAL 175 0.0625 -0.0761 0.9951 + *MESH_VERTEXNORMAL 296 0.0625 -0.0761 0.9951 + *MESH_VERTEXNORMAL 190 0.0625 -0.0761 0.9951 + *MESH_FACENORMAL 206 0.0625 -0.0761 -0.9951 + *MESH_VERTEXNORMAL 205 0.0625 -0.0761 -0.9951 + *MESH_VERTEXNORMAL 189 0.0625 -0.0761 -0.9951 + *MESH_VERTEXNORMAL 204 0.0625 -0.0761 -0.9951 + *MESH_FACENORMAL 207 0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 183 0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 197 0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 198 0.6314 -0.7693 -0.0976 + *MESH_FACENORMAL 208 0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 194 0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 211 0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 195 0.4162 -0.7786 0.4696 + *MESH_FACENORMAL 209 0.2230 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 202 0.2231 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 219 0.2231 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 203 0.2231 -0.4173 -0.8810 + *MESH_FACENORMAL 210 0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 196 0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 211 0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 212 0.4513 -0.8443 0.2890 + *MESH_FACENORMAL 211 0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 203 0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 220 0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 204 0.1374 -0.2571 -0.9565 + *MESH_FACENORMAL 212 0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 196 0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 213 0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 197 0.4691 -0.8777 0.0976 + *MESH_FACENORMAL 213 0.0464 -0.0869 0.9951 + *MESH_VERTEXNORMAL 190 0.0464 -0.0869 0.9951 + *MESH_VERTEXNORMAL 296 0.0464 -0.0869 0.9951 + *MESH_VERTEXNORMAL 206 0.0464 -0.0869 0.9951 + *MESH_FACENORMAL 214 0.0464 -0.0869 -0.9951 + *MESH_VERTEXNORMAL 205 0.0464 -0.0869 -0.9951 + *MESH_VERTEXNORMAL 204 0.0464 -0.0869 -0.9951 + *MESH_VERTEXNORMAL 220 0.0464 -0.0869 -0.9951 + *MESH_FACENORMAL 215 0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 197 0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 214 0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 198 0.4691 -0.8777 -0.0976 + *MESH_FACENORMAL 216 0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 190 0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 207 0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 191 0.1374 -0.2571 0.9565 + *MESH_FACENORMAL 217 0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 198 0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 215 0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 199 0.4513 -0.8443 -0.2890 + *MESH_FACENORMAL 218 0.2230 -0.4173 0.8810 + *MESH_VERTEXNORMAL 192 0.2231 -0.4173 0.8810 + *MESH_VERTEXNORMAL 207 0.2231 -0.4173 0.8810 + *MESH_VERTEXNORMAL 208 0.2231 -0.4173 0.8810 + *MESH_FACENORMAL 219 0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 200 0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 215 0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 216 0.4162 -0.7786 -0.4696 + *MESH_FACENORMAL 220 0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 192 0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 209 0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 193 0.2999 -0.5611 0.7715 + *MESH_FACENORMAL 221 0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 200 0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 217 0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 201 0.3651 -0.6831 -0.6326 + *MESH_FACENORMAL 222 0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 193 0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 210 0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 194 0.3651 -0.6831 0.6326 + *MESH_FACENORMAL 223 0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 202 0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 217 0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 218 0.2999 -0.5611 -0.7715 + *MESH_FACENORMAL 224 0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 214 0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 230 0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 215 0.2779 -0.9161 -0.2890 + *MESH_FACENORMAL 225 0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 207 0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 223 0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 208 0.1374 -0.4528 0.8810 + *MESH_FACENORMAL 226 0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 216 0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 230 0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 231 0.2563 -0.8448 -0.4696 + *MESH_FACENORMAL 227 0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 208 0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 224 0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 209 0.1847 -0.6088 0.7715 + *MESH_FACENORMAL 228 0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 216 0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 232 0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 217 0.2248 -0.7412 -0.6326 + *MESH_FACENORMAL 229 0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 209 0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 225 0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 210 0.2248 -0.7412 0.6326 + *MESH_FACENORMAL 230 0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 217 0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 233 0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 218 0.1847 -0.6088 -0.7715 + *MESH_FACENORMAL 231 0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 210 0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 226 0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 211 0.2563 -0.8448 0.4696 + *MESH_FACENORMAL 232 0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 218 0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 234 0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 219 0.1374 -0.4528 -0.8810 + *MESH_FACENORMAL 233 0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 212 0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 226 0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 227 0.2779 -0.9161 0.2890 + *MESH_FACENORMAL 234 0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 220 0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 234 0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 235 0.0846 -0.2790 -0.9565 + *MESH_FACENORMAL 235 0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 212 0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 228 0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 213 0.2889 -0.9524 0.0976 + *MESH_FACENORMAL 236 0.0286 -0.0942 0.9951 + *MESH_VERTEXNORMAL 206 0.0286 -0.0942 0.9951 + *MESH_VERTEXNORMAL 296 0.0286 -0.0942 0.9951 + *MESH_VERTEXNORMAL 221 0.0286 -0.0942 0.9951 + *MESH_FACENORMAL 237 0.0286 -0.0942 -0.9951 + *MESH_VERTEXNORMAL 205 0.0286 -0.0942 -0.9951 + *MESH_VERTEXNORMAL 220 0.0286 -0.0942 -0.9951 + *MESH_VERTEXNORMAL 235 0.0286 -0.0942 -0.9951 + *MESH_FACENORMAL 238 0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 213 0.2889 -0.9524 -0.0975 + *MESH_VERTEXNORMAL 229 0.2889 -0.9524 -0.0975 + *MESH_VERTEXNORMAL 214 0.2889 -0.9524 -0.0975 + *MESH_FACENORMAL 239 0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 206 0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 222 0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 207 0.0846 -0.2790 0.9565 + *MESH_FACENORMAL 240 0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 233 0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 249 0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 234 0.0464 -0.4709 -0.8810 + *MESH_FACENORMAL 241 0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 227 0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 241 0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 242 0.0938 -0.9527 0.2890 + *MESH_FACENORMAL 242 0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 235 0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 249 0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 250 0.0286 -0.2902 -0.9565 + *MESH_FACENORMAL 243 0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 227 0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 243 0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 228 0.0975 -0.9904 0.0976 + *MESH_FACENORMAL 244 0.0097 -0.0980 0.9951 + *MESH_VERTEXNORMAL 221 0.0097 -0.0980 0.9951 + *MESH_VERTEXNORMAL 296 0.0097 -0.0980 0.9951 + *MESH_VERTEXNORMAL 236 0.0097 -0.0980 0.9951 + *MESH_FACENORMAL 245 0.0097 -0.0980 -0.9951 + *MESH_VERTEXNORMAL 205 0.0097 -0.0980 -0.9951 + *MESH_VERTEXNORMAL 235 0.0097 -0.0980 -0.9951 + *MESH_VERTEXNORMAL 250 0.0097 -0.0980 -0.9951 + *MESH_FACENORMAL 246 0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 228 0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 244 0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 229 0.0975 -0.9904 -0.0976 + *MESH_FACENORMAL 247 0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 221 0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 237 0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 222 0.0286 -0.2902 0.9565 + *MESH_FACENORMAL 248 0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 229 0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 245 0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 230 0.0938 -0.9527 -0.2890 + *MESH_FACENORMAL 249 0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 223 0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 237 0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 238 0.0464 -0.4709 0.8810 + *MESH_FACENORMAL 250 0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 231 0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 245 0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 246 0.0865 -0.8786 -0.4696 + *MESH_FACENORMAL 251 0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 224 0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 238 0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 239 0.0624 -0.6332 0.7715 + *MESH_FACENORMAL 252 0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 231 0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 247 0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 232 0.0759 -0.7708 -0.6326 + *MESH_FACENORMAL 253 0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 224 0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 240 0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 225 0.0759 -0.7708 0.6326 + *MESH_FACENORMAL 254 0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 233 0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 247 0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 248 0.0624 -0.6332 -0.7715 + *MESH_FACENORMAL 255 0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 225 0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 241 0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 226 0.0865 -0.8786 0.4696 + *MESH_FACENORMAL 256 -0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 246 -0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 260 -0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 261 -0.0865 -0.8786 -0.4696 + *MESH_FACENORMAL 257 -0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 239 -0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 253 -0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 254 -0.0624 -0.6332 0.7715 + *MESH_FACENORMAL 258 -0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 246 -0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 262 -0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 247 -0.0759 -0.7708 -0.6326 + *MESH_FACENORMAL 259 -0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 240 -0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 254 -0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 255 -0.0759 -0.7708 0.6326 + *MESH_FACENORMAL 260 -0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 247 -0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 263 -0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 248 -0.0624 -0.6332 -0.7715 + *MESH_FACENORMAL 261 -0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 240 -0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 256 -0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 241 -0.0865 -0.8786 0.4696 + *MESH_FACENORMAL 262 -0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 248 -0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 264 -0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 249 -0.0464 -0.4709 -0.8810 + *MESH_FACENORMAL 263 -0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 242 -0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 256 -0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 257 -0.0938 -0.9527 0.2890 + *MESH_FACENORMAL 264 -0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 249 -0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 265 -0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 250 -0.0286 -0.2902 -0.9565 + *MESH_FACENORMAL 265 -0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 242 -0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 258 -0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 243 -0.0975 -0.9904 0.0976 + *MESH_FACENORMAL 266 -0.0097 -0.0980 0.9951 + *MESH_VERTEXNORMAL 236 -0.0097 -0.0980 0.9951 + *MESH_VERTEXNORMAL 296 -0.0097 -0.0980 0.9951 + *MESH_VERTEXNORMAL 251 -0.0097 -0.0980 0.9951 + *MESH_FACENORMAL 267 -0.0097 -0.0980 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0097 -0.0980 -0.9951 + *MESH_VERTEXNORMAL 250 -0.0097 -0.0980 -0.9951 + *MESH_VERTEXNORMAL 265 -0.0097 -0.0980 -0.9951 + *MESH_FACENORMAL 268 -0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 243 -0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 259 -0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 244 -0.0975 -0.9904 -0.0976 + *MESH_FACENORMAL 269 -0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 236 -0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 252 -0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 237 -0.0286 -0.2902 0.9565 + *MESH_FACENORMAL 270 -0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 244 -0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 260 -0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 245 -0.0938 -0.9527 -0.2890 + *MESH_FACENORMAL 271 -0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 237 -0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 253 -0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 238 -0.0464 -0.4709 0.8810 + *MESH_FACENORMAL 272 -0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 265 -0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 279 -0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 280 -0.0846 -0.2790 -0.9565 + *MESH_FACENORMAL 273 -0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 257 -0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 273 -0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 258 -0.2889 -0.9524 0.0976 + *MESH_FACENORMAL 274 -0.0286 -0.0942 0.9951 + *MESH_VERTEXNORMAL 251 -0.0286 -0.0942 0.9951 + *MESH_VERTEXNORMAL 296 -0.0286 -0.0942 0.9951 + *MESH_VERTEXNORMAL 266 -0.0286 -0.0942 0.9951 + *MESH_FACENORMAL 275 -0.0286 -0.0942 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0286 -0.0942 -0.9951 + *MESH_VERTEXNORMAL 265 -0.0286 -0.0942 -0.9951 + *MESH_VERTEXNORMAL 280 -0.0286 -0.0942 -0.9951 + *MESH_FACENORMAL 276 -0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 259 -0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 273 -0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 274 -0.2889 -0.9524 -0.0976 + *MESH_FACENORMAL 277 -0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 251 -0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 267 -0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 252 -0.0846 -0.2790 0.9565 + *MESH_FACENORMAL 278 -0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 259 -0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 275 -0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 260 -0.2779 -0.9161 -0.2890 + *MESH_FACENORMAL 279 -0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 252 -0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 268 -0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 253 -0.1374 -0.4528 0.8810 + *MESH_FACENORMAL 280 -0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 261 -0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 275 -0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 276 -0.2563 -0.8448 -0.4696 + *MESH_FACENORMAL 281 -0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 254 -0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 268 -0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 269 -0.1847 -0.6088 0.7715 + *MESH_FACENORMAL 282 -0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 261 -0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 277 -0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 262 -0.2248 -0.7412 -0.6326 + *MESH_FACENORMAL 283 -0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 255 -0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 269 -0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 270 -0.2248 -0.7412 0.6326 + *MESH_FACENORMAL 284 -0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 262 -0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 278 -0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 263 -0.1847 -0.6088 -0.7715 + *MESH_FACENORMAL 285 -0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 255 -0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 271 -0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 256 -0.2563 -0.8448 0.4696 + *MESH_FACENORMAL 286 -0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 264 -0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 278 -0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 279 -0.1374 -0.4528 -0.8810 + *MESH_FACENORMAL 287 -0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 257 -0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 271 -0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 272 -0.2779 -0.9161 0.2890 + *MESH_FACENORMAL 288 -0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 268 -0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 284 -0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 269 -0.2999 -0.5611 0.7715 + *MESH_FACENORMAL 289 -0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 276 -0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 292 -0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 277 -0.3651 -0.6831 -0.6326 + *MESH_FACENORMAL 290 -0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 270 -0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 284 -0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 285 -0.3651 -0.6831 0.6326 + *MESH_FACENORMAL 291 -0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 278 -0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 292 -0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 293 -0.2999 -0.5611 -0.7715 + *MESH_FACENORMAL 292 -0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 270 -0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 286 -0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 271 -0.4162 -0.7786 0.4696 + *MESH_FACENORMAL 293 -0.2231 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 278 -0.2230 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 294 -0.2230 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 279 -0.2230 -0.4173 -0.8810 + *MESH_FACENORMAL 294 -0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 272 -0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 286 -0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 287 -0.4513 -0.8443 0.2890 + *MESH_FACENORMAL 295 -0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 280 -0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 294 -0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 295 -0.1374 -0.2571 -0.9565 + *MESH_FACENORMAL 296 -0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 272 -0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 288 -0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 273 -0.4691 -0.8777 0.0976 + *MESH_FACENORMAL 297 -0.0464 -0.0869 0.9951 + *MESH_VERTEXNORMAL 266 -0.0464 -0.0869 0.9951 + *MESH_VERTEXNORMAL 296 -0.0464 -0.0869 0.9951 + *MESH_VERTEXNORMAL 281 -0.0464 -0.0869 0.9951 + *MESH_FACENORMAL 298 -0.0464 -0.0869 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0464 -0.0869 -0.9951 + *MESH_VERTEXNORMAL 280 -0.0464 -0.0869 -0.9951 + *MESH_VERTEXNORMAL 295 -0.0464 -0.0869 -0.9951 + *MESH_FACENORMAL 299 -0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 273 -0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 289 -0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 274 -0.4691 -0.8777 -0.0976 + *MESH_FACENORMAL 300 -0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 266 -0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 282 -0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 267 -0.1374 -0.2571 0.9565 + *MESH_FACENORMAL 301 -0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 274 -0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 290 -0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 275 -0.4513 -0.8443 -0.2890 + *MESH_FACENORMAL 302 -0.2230 -0.4173 0.8810 + *MESH_VERTEXNORMAL 267 -0.2231 -0.4173 0.8810 + *MESH_VERTEXNORMAL 283 -0.2231 -0.4173 0.8810 + *MESH_VERTEXNORMAL 268 -0.2231 -0.4173 0.8810 + *MESH_FACENORMAL 303 -0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 276 -0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 290 -0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 291 -0.4162 -0.7786 -0.4696 + *MESH_FACENORMAL 304 -0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 288 -0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 303 -0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 304 -0.6314 -0.7693 0.0976 + *MESH_FACENORMAL 305 -0.0625 -0.0761 0.9951 + *MESH_VERTEXNORMAL 281 -0.0625 -0.0761 0.9951 + *MESH_VERTEXNORMAL 296 -0.0625 -0.0761 0.9951 + *MESH_VERTEXNORMAL 297 -0.0625 -0.0761 0.9951 + *MESH_FACENORMAL 306 -0.0625 -0.0761 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0625 -0.0761 -0.9951 + *MESH_VERTEXNORMAL 295 -0.0625 -0.0761 -0.9951 + *MESH_VERTEXNORMAL 311 -0.0625 -0.0761 -0.9951 + *MESH_FACENORMAL 307 -0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 288 -0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 305 -0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 289 -0.6314 -0.7693 -0.0976 + *MESH_FACENORMAL 308 -0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 281 -0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 298 -0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 282 -0.1850 -0.2254 0.9565 + *MESH_FACENORMAL 309 -0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 289 -0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 306 -0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 290 -0.6073 -0.7400 -0.2890 + *MESH_FACENORMAL 310 -0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 282 -0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 299 -0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 283 -0.3002 -0.3658 0.8810 + *MESH_FACENORMAL 311 -0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 291 -0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 306 -0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 307 -0.5601 -0.6825 -0.4696 + *MESH_FACENORMAL 312 -0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 284 -0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 299 -0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 300 -0.4036 -0.4918 0.7715 + *MESH_FACENORMAL 313 -0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 291 -0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 308 -0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 292 -0.4913 -0.5987 -0.6326 + *MESH_FACENORMAL 314 -0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 285 -0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 300 -0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 301 -0.4913 -0.5987 0.6326 + *MESH_FACENORMAL 315 -0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 292 -0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 309 -0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 293 -0.4036 -0.4918 -0.7715 + *MESH_FACENORMAL 316 -0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 285 -0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 302 -0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 286 -0.5601 -0.6825 0.4696 + *MESH_FACENORMAL 317 -0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 293 -0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 310 -0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 294 -0.3002 -0.3658 -0.8810 + *MESH_FACENORMAL 318 -0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 287 -0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 302 -0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 303 -0.6073 -0.7400 0.2890 + *MESH_FACENORMAL 319 -0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 294 -0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 311 -0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 295 -0.1850 -0.2254 -0.9565 + *MESH_FACENORMAL 320 -0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 307 -0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 323 -0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 308 -0.5987 -0.4913 -0.6326 + *MESH_FACENORMAL 321 -0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 301 -0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 315 -0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 316 -0.5987 -0.4913 0.6326 + *MESH_FACENORMAL 322 -0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 308 -0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 324 -0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 309 -0.4918 -0.4036 -0.7715 + *MESH_FACENORMAL 323 -0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 301 -0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 317 -0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 302 -0.6825 -0.5601 0.4696 + *MESH_FACENORMAL 324 -0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 310 -0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 324 -0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 325 -0.3658 -0.3002 -0.8810 + *MESH_FACENORMAL 325 -0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 303 -0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 317 -0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 318 -0.7400 -0.6073 0.2890 + *MESH_FACENORMAL 326 -0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 310 -0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 326 -0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 311 -0.2254 -0.1850 -0.9565 + *MESH_FACENORMAL 327 -0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 303 -0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 319 -0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 304 -0.7693 -0.6314 0.0976 + *MESH_FACENORMAL 328 -0.0761 -0.0625 0.9951 + *MESH_VERTEXNORMAL 297 -0.0761 -0.0625 0.9951 + *MESH_VERTEXNORMAL 296 -0.0761 -0.0625 0.9951 + *MESH_VERTEXNORMAL 312 -0.0761 -0.0625 0.9951 + *MESH_FACENORMAL 329 -0.0761 -0.0625 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0761 -0.0625 -0.9951 + *MESH_VERTEXNORMAL 311 -0.0761 -0.0625 -0.9951 + *MESH_VERTEXNORMAL 326 -0.0761 -0.0625 -0.9951 + *MESH_FACENORMAL 330 -0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 304 -0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 320 -0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 305 -0.7693 -0.6314 -0.0976 + *MESH_FACENORMAL 331 -0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 297 -0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 313 -0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 298 -0.2254 -0.1850 0.9565 + *MESH_FACENORMAL 332 -0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 305 -0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 321 -0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 306 -0.7400 -0.6073 -0.2890 + *MESH_FACENORMAL 333 -0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 298 -0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 314 -0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 299 -0.3658 -0.3002 0.8810 + *MESH_FACENORMAL 334 -0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 307 -0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 321 -0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 322 -0.6825 -0.5601 -0.4696 + *MESH_FACENORMAL 335 -0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 300 -0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 314 -0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 315 -0.4918 -0.4036 0.7715 + *MESH_FACENORMAL 336 -0.0869 -0.0464 0.9951 + *MESH_VERTEXNORMAL 312 -0.0869 -0.0464 0.9951 + *MESH_VERTEXNORMAL 296 -0.0869 -0.0464 0.9951 + *MESH_VERTEXNORMAL 327 -0.0869 -0.0464 0.9951 + *MESH_FACENORMAL 337 -0.0869 -0.0464 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0869 -0.0464 -0.9951 + *MESH_VERTEXNORMAL 326 -0.0869 -0.0464 -0.9951 + *MESH_VERTEXNORMAL 341 -0.0869 -0.0464 -0.9951 + *MESH_FACENORMAL 338 -0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 319 -0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 335 -0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 320 -0.8777 -0.4691 -0.0976 + *MESH_FACENORMAL 339 -0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 312 -0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 328 -0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 313 -0.2571 -0.1374 0.9565 + *MESH_FACENORMAL 340 -0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 320 -0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 336 -0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 321 -0.8443 -0.4513 -0.2890 + *MESH_FACENORMAL 341 -0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 313 -0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 329 -0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 314 -0.4173 -0.2230 0.8810 + *MESH_FACENORMAL 342 -0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 322 -0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 336 -0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 337 -0.7786 -0.4162 -0.4696 + *MESH_FACENORMAL 343 -0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 315 -0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 329 -0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 330 -0.5611 -0.2999 0.7715 + *MESH_FACENORMAL 344 -0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 323 -0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 337 -0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 338 -0.6831 -0.3651 -0.6326 + *MESH_FACENORMAL 345 -0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 316 -0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 330 -0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 331 -0.6831 -0.3651 0.6326 + *MESH_FACENORMAL 346 -0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 323 -0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 339 -0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 324 -0.5611 -0.2999 -0.7715 + *MESH_FACENORMAL 347 -0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 316 -0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 332 -0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 317 -0.7786 -0.4162 0.4696 + *MESH_FACENORMAL 348 -0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 325 -0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 339 -0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 340 -0.4173 -0.2230 -0.8810 + *MESH_FACENORMAL 349 -0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 318 -0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 332 -0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 333 -0.8443 -0.4513 0.2890 + *MESH_FACENORMAL 350 -0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 326 -0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 340 -0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 341 -0.2571 -0.1374 -0.9565 + *MESH_FACENORMAL 351 -0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 318 -0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 334 -0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 319 -0.8777 -0.4691 0.0976 + *MESH_FACENORMAL 352 -0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 331 -0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 345 -0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 346 -0.7412 -0.2248 0.6326 + *MESH_FACENORMAL 353 -0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 338 -0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 354 -0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 339 -0.6088 -0.1847 -0.7715 + *MESH_FACENORMAL 354 -0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 331 -0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 347 -0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 332 -0.8448 -0.2563 0.4696 + *MESH_FACENORMAL 355 -0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 340 -0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 354 -0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 355 -0.4528 -0.1374 -0.8810 + *MESH_FACENORMAL 356 -0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 333 -0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 347 -0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 348 -0.9161 -0.2779 0.2890 + *MESH_FACENORMAL 357 -0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 340 -0.2790 -0.0846 -0.9566 + *MESH_VERTEXNORMAL 356 -0.2790 -0.0846 -0.9566 + *MESH_VERTEXNORMAL 341 -0.2790 -0.0846 -0.9566 + *MESH_FACENORMAL 358 -0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 333 -0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 349 -0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 334 -0.9524 -0.2889 0.0976 + *MESH_FACENORMAL 359 -0.0942 -0.0286 0.9951 + *MESH_VERTEXNORMAL 327 -0.0942 -0.0286 0.9951 + *MESH_VERTEXNORMAL 296 -0.0942 -0.0286 0.9951 + *MESH_VERTEXNORMAL 342 -0.0942 -0.0286 0.9951 + *MESH_FACENORMAL 360 -0.0942 -0.0286 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0942 -0.0286 -0.9951 + *MESH_VERTEXNORMAL 341 -0.0942 -0.0286 -0.9951 + *MESH_VERTEXNORMAL 356 -0.0942 -0.0286 -0.9951 + *MESH_FACENORMAL 361 -0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 334 -0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 350 -0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 335 -0.9524 -0.2889 -0.0976 + *MESH_FACENORMAL 362 -0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 328 -0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 342 -0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 343 -0.2790 -0.0846 0.9565 + *MESH_FACENORMAL 363 -0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 335 -0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 351 -0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 336 -0.9161 -0.2779 -0.2890 + *MESH_FACENORMAL 364 -0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 328 -0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 344 -0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 329 -0.4528 -0.1374 0.8810 + *MESH_FACENORMAL 365 -0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 337 -0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 351 -0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 352 -0.8448 -0.2563 -0.4696 + *MESH_FACENORMAL 366 -0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 330 -0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 344 -0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 345 -0.6088 -0.1847 0.7715 + *MESH_FACENORMAL 367 -0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 337 -0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 353 -0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 338 -0.7412 -0.2248 -0.6326 + *MESH_FACENORMAL 368 -0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 350 -0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 364 -0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 365 -0.9904 -0.0975 -0.0976 + *MESH_FACENORMAL 369 -0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 343 -0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 357 -0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 358 -0.2902 -0.0286 0.9565 + *MESH_FACENORMAL 370 -0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 350 -0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 366 -0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 351 -0.9527 -0.0938 -0.2890 + *MESH_FACENORMAL 371 -0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 343 -0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 359 -0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 344 -0.4709 -0.0464 0.8810 + *MESH_FACENORMAL 372 -0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 352 -0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 366 -0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 367 -0.8786 -0.0865 -0.4696 + *MESH_FACENORMAL 373 -0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 345 -0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 359 -0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 360 -0.6332 -0.0624 0.7715 + *MESH_FACENORMAL 374 -0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 352 -0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 368 -0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 353 -0.7708 -0.0759 -0.6326 + *MESH_FACENORMAL 375 -0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 345 -0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 361 -0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 346 -0.7708 -0.0759 0.6326 + *MESH_FACENORMAL 376 -0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 354 -0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 368 -0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 369 -0.6332 -0.0624 -0.7715 + *MESH_FACENORMAL 377 -0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 346 -0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 362 -0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 347 -0.8786 -0.0865 0.4696 + *MESH_FACENORMAL 378 -0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 355 -0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 369 -0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 370 -0.4709 -0.0464 -0.8810 + *MESH_FACENORMAL 379 -0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 348 -0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 362 -0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 363 -0.9527 -0.0938 0.2890 + *MESH_FACENORMAL 380 -0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 355 -0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 371 -0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 356 -0.2902 -0.0286 -0.9565 + *MESH_FACENORMAL 381 -0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 348 -0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 364 -0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 349 -0.9904 -0.0975 0.0976 + *MESH_FACENORMAL 382 -0.0980 -0.0097 0.9951 + *MESH_VERTEXNORMAL 342 -0.0980 -0.0097 0.9951 + *MESH_VERTEXNORMAL 296 -0.0980 -0.0097 0.9951 + *MESH_VERTEXNORMAL 357 -0.0980 -0.0097 0.9951 + *MESH_FACENORMAL 383 -0.0980 -0.0097 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0980 -0.0097 -0.9951 + *MESH_VERTEXNORMAL 356 -0.0980 -0.0097 -0.9951 + *MESH_VERTEXNORMAL 371 -0.0980 -0.0097 -0.9951 + *MESH_FACENORMAL 384 -0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 368 -0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 384 -0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 369 -0.6332 0.0624 -0.7715 + *MESH_FACENORMAL 385 -0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 361 -0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 377 -0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 362 -0.8786 0.0865 0.4696 + *MESH_FACENORMAL 386 -0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 370 -0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 384 -0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 385 -0.4709 0.0464 -0.8810 + *MESH_FACENORMAL 387 -0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 363 -0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 377 -0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 378 -0.9527 0.0938 0.2890 + *MESH_FACENORMAL 388 -0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 370 -0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 386 -0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 371 -0.2902 0.0286 -0.9565 + *MESH_FACENORMAL 389 -0.9904 0.0975 0.0976 + *MESH_VERTEXNORMAL 363 -0.9904 0.0976 0.0976 + *MESH_VERTEXNORMAL 379 -0.9904 0.0976 0.0976 + *MESH_VERTEXNORMAL 364 -0.9904 0.0976 0.0976 + *MESH_FACENORMAL 390 -0.0980 0.0097 0.9951 + *MESH_VERTEXNORMAL 357 -0.0980 0.0097 0.9951 + *MESH_VERTEXNORMAL 296 -0.0980 0.0097 0.9951 + *MESH_VERTEXNORMAL 372 -0.0980 0.0097 0.9951 + *MESH_FACENORMAL 391 -0.0980 0.0097 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0980 0.0097 -0.9951 + *MESH_VERTEXNORMAL 371 -0.0980 0.0097 -0.9951 + *MESH_VERTEXNORMAL 386 -0.0980 0.0097 -0.9951 + *MESH_FACENORMAL 392 -0.9904 0.0976 -0.0976 + *MESH_VERTEXNORMAL 365 -0.9904 0.0975 -0.0976 + *MESH_VERTEXNORMAL 379 -0.9904 0.0975 -0.0976 + *MESH_VERTEXNORMAL 380 -0.9904 0.0975 -0.0976 + *MESH_FACENORMAL 393 -0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 358 -0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 372 -0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 373 -0.2902 0.0286 0.9565 + *MESH_FACENORMAL 394 -0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 365 -0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 381 -0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 366 -0.9527 0.0938 -0.2890 + *MESH_FACENORMAL 395 -0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 358 -0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 374 -0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 359 -0.4709 0.0464 0.8810 + *MESH_FACENORMAL 396 -0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 367 -0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 381 -0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 382 -0.8786 0.0865 -0.4696 + *MESH_FACENORMAL 397 -0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 360 -0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 374 -0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 375 -0.6332 0.0624 0.7715 + *MESH_FACENORMAL 398 -0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 367 -0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 383 -0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 368 -0.7708 0.0759 -0.6326 + *MESH_FACENORMAL 399 -0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 361 -0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 375 -0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 376 -0.7708 0.0759 0.6326 + *MESH_FACENORMAL 400 -0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 380 -0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 396 -0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 381 -0.9161 0.2779 -0.2890 + *MESH_FACENORMAL 401 -0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 373 -0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 389 -0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 374 -0.4528 0.1374 0.8810 + *MESH_FACENORMAL 402 -0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 382 -0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 396 -0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 397 -0.8448 0.2563 -0.4696 + *MESH_FACENORMAL 403 -0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 375 -0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 389 -0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 390 -0.6088 0.1847 0.7715 + *MESH_FACENORMAL 404 -0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 382 -0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 398 -0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 383 -0.7412 0.2248 -0.6326 + *MESH_FACENORMAL 405 -0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 375 -0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 391 -0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 376 -0.7412 0.2248 0.6326 + *MESH_FACENORMAL 406 -0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 383 -0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 399 -0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 384 -0.6088 0.1847 -0.7715 + *MESH_FACENORMAL 407 -0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 376 -0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 392 -0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 377 -0.8448 0.2563 0.4696 + *MESH_FACENORMAL 408 -0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 385 -0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 399 -0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 400 -0.4528 0.1374 -0.8810 + *MESH_FACENORMAL 409 -0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 378 -0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 392 -0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 393 -0.9161 0.2779 0.2890 + *MESH_FACENORMAL 410 -0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 385 -0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 401 -0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 386 -0.2790 0.0846 -0.9565 + *MESH_FACENORMAL 411 -0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 378 -0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 394 -0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 379 -0.9524 0.2889 0.0976 + *MESH_FACENORMAL 412 -0.0942 0.0286 0.9951 + *MESH_VERTEXNORMAL 372 -0.0942 0.0286 0.9951 + *MESH_VERTEXNORMAL 296 -0.0942 0.0286 0.9951 + *MESH_VERTEXNORMAL 387 -0.0942 0.0286 0.9951 + *MESH_FACENORMAL 413 -0.0942 0.0286 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0942 0.0286 -0.9951 + *MESH_VERTEXNORMAL 386 -0.0942 0.0286 -0.9951 + *MESH_VERTEXNORMAL 401 -0.0942 0.0286 -0.9951 + *MESH_FACENORMAL 414 -0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 379 -0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 395 -0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 380 -0.9524 0.2889 -0.0976 + *MESH_FACENORMAL 415 -0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 372 -0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 388 -0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 373 -0.2790 0.0846 0.9565 + *MESH_FACENORMAL 416 -0.4173 0.2231 -0.8810 + *MESH_VERTEXNORMAL 400 -0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 414 -0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 415 -0.4173 0.2230 -0.8810 + *MESH_FACENORMAL 417 -0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 393 -0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 407 -0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 408 -0.8443 0.4513 0.2890 + *MESH_FACENORMAL 418 -0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 400 -0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 416 -0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 401 -0.2571 0.1374 -0.9565 + *MESH_FACENORMAL 419 -0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 393 -0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 409 -0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 394 -0.8777 0.4691 0.0976 + *MESH_FACENORMAL 420 -0.0869 0.0464 0.9951 + *MESH_VERTEXNORMAL 387 -0.0869 0.0464 0.9951 + *MESH_VERTEXNORMAL 296 -0.0869 0.0464 0.9951 + *MESH_VERTEXNORMAL 402 -0.0869 0.0464 0.9951 + *MESH_FACENORMAL 421 -0.0869 0.0464 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0869 0.0464 -0.9951 + *MESH_VERTEXNORMAL 401 -0.0869 0.0464 -0.9951 + *MESH_VERTEXNORMAL 416 -0.0869 0.0464 -0.9951 + *MESH_FACENORMAL 422 -0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 395 -0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 409 -0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 410 -0.8777 0.4691 -0.0976 + *MESH_FACENORMAL 423 -0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 387 -0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 403 -0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 388 -0.2571 0.1374 0.9565 + *MESH_FACENORMAL 424 -0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 395 -0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 411 -0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 396 -0.8443 0.4513 -0.2890 + *MESH_FACENORMAL 425 -0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 389 -0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 403 -0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 404 -0.4173 0.2230 0.8810 + *MESH_FACENORMAL 426 -0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 397 -0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 411 -0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 412 -0.7786 0.4162 -0.4696 + *MESH_FACENORMAL 427 -0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 390 -0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 404 -0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 405 -0.5611 0.2999 0.7715 + *MESH_FACENORMAL 428 -0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 397 -0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 413 -0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 398 -0.6831 0.3651 -0.6326 + *MESH_FACENORMAL 429 -0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 391 -0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 405 -0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 406 -0.6831 0.3651 0.6326 + *MESH_FACENORMAL 430 -0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 398 -0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 414 -0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 399 -0.5611 0.2999 -0.7715 + *MESH_FACENORMAL 431 -0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 391 -0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 407 -0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 392 -0.7786 0.4162 0.4696 + *MESH_FACENORMAL 432 -0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 403 -0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 419 -0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 404 -0.3658 0.3002 0.8810 + *MESH_FACENORMAL 433 -0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 412 -0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 426 -0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 427 -0.6825 0.5601 -0.4696 + *MESH_FACENORMAL 434 -0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 404 -0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 420 -0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 405 -0.4918 0.4036 0.7715 + *MESH_FACENORMAL 435 -0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 412 -0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 428 -0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 413 -0.5987 0.4913 -0.6326 + *MESH_FACENORMAL 436 -0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 406 -0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 420 -0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 421 -0.5987 0.4913 0.6326 + *MESH_FACENORMAL 437 -0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 413 -0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 429 -0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 414 -0.4918 0.4036 -0.7715 + *MESH_FACENORMAL 438 -0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 406 -0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 422 -0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 407 -0.6825 0.5601 0.4696 + *MESH_FACENORMAL 439 -0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 414 -0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 430 -0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 415 -0.3658 0.3002 -0.8810 + *MESH_FACENORMAL 440 -0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 408 -0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 422 -0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 423 -0.7400 0.6073 0.2890 + *MESH_FACENORMAL 441 -0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 415 -0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 431 -0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 416 -0.2254 0.1850 -0.9565 + *MESH_FACENORMAL 442 -0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 408 -0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 424 -0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 409 -0.7693 0.6314 0.0976 + *MESH_FACENORMAL 443 -0.0761 0.0625 0.9951 + *MESH_VERTEXNORMAL 402 -0.0761 0.0625 0.9951 + *MESH_VERTEXNORMAL 296 -0.0761 0.0625 0.9951 + *MESH_VERTEXNORMAL 417 -0.0761 0.0625 0.9951 + *MESH_FACENORMAL 444 -0.0761 0.0625 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0761 0.0625 -0.9951 + *MESH_VERTEXNORMAL 416 -0.0761 0.0625 -0.9951 + *MESH_VERTEXNORMAL 431 -0.0761 0.0625 -0.9951 + *MESH_FACENORMAL 445 -0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 410 -0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 424 -0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 425 -0.7693 0.6314 -0.0976 + *MESH_FACENORMAL 446 -0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 402 -0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 418 -0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 403 -0.2254 0.1850 0.9565 + *MESH_FACENORMAL 447 -0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 410 -0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 426 -0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 411 -0.7400 0.6073 -0.2890 + *MESH_FACENORMAL 448 -0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 423 -0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 437 -0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 438 -0.6073 0.7400 0.2890 + *MESH_FACENORMAL 449 -0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 430 -0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 446 -0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 431 -0.1850 0.2254 -0.9565 + *MESH_FACENORMAL 450 -0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 424 -0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 438 -0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 439 -0.6314 0.7693 0.0976 + *MESH_FACENORMAL 451 -0.0625 0.0761 0.9951 + *MESH_VERTEXNORMAL 417 -0.0625 0.0761 0.9951 + *MESH_VERTEXNORMAL 296 -0.0625 0.0761 0.9951 + *MESH_VERTEXNORMAL 432 -0.0625 0.0761 0.9951 + *MESH_FACENORMAL 452 -0.0625 0.0761 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0625 0.0761 -0.9951 + *MESH_VERTEXNORMAL 431 -0.0625 0.0761 -0.9951 + *MESH_VERTEXNORMAL 446 -0.0625 0.0761 -0.9951 + *MESH_FACENORMAL 453 -0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 424 -0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 440 -0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 425 -0.6314 0.7693 -0.0976 + *MESH_FACENORMAL 454 -0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 417 -0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 433 -0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 418 -0.1850 0.2254 0.9565 + *MESH_FACENORMAL 455 -0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 425 -0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 441 -0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 426 -0.6073 0.7400 -0.2890 + *MESH_FACENORMAL 456 -0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 418 -0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 434 -0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 419 -0.3002 0.3658 0.8810 + *MESH_FACENORMAL 457 -0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 427 -0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 441 -0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 442 -0.5601 0.6825 -0.4696 + *MESH_FACENORMAL 458 -0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 419 -0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 435 -0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 420 -0.4036 0.4918 0.7715 + *MESH_FACENORMAL 459 -0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 427 -0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 443 -0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 428 -0.4913 0.5987 -0.6326 + *MESH_FACENORMAL 460 -0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 421 -0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 435 -0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 436 -0.4913 0.5987 0.6326 + *MESH_FACENORMAL 461 -0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 429 -0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 443 -0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 444 -0.4036 0.4918 -0.7715 + *MESH_FACENORMAL 462 -0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 421 -0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 437 -0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 422 -0.5601 0.6825 0.4696 + *MESH_FACENORMAL 463 -0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 429 -0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 445 -0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 430 -0.3002 0.3658 -0.8810 + *MESH_FACENORMAL 464 -0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 442 -0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 456 -0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 457 -0.4162 0.7786 -0.4696 + *MESH_FACENORMAL 465 -0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 435 -0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 449 -0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 450 -0.2999 0.5611 0.7715 + *MESH_FACENORMAL 466 -0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 442 -0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 458 -0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 443 -0.3651 0.6831 -0.6326 + *MESH_FACENORMAL 467 -0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 436 -0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 450 -0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 451 -0.3651 0.6831 0.6326 + *MESH_FACENORMAL 468 -0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 443 -0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 459 -0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 444 -0.2999 0.5611 -0.7715 + *MESH_FACENORMAL 469 -0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 436 -0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 452 -0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 437 -0.4162 0.7786 0.4696 + *MESH_FACENORMAL 470 -0.2230 0.4173 -0.8810 + *MESH_VERTEXNORMAL 444 -0.2231 0.4173 -0.8810 + *MESH_VERTEXNORMAL 460 -0.2231 0.4173 -0.8810 + *MESH_VERTEXNORMAL 445 -0.2231 0.4173 -0.8810 + *MESH_FACENORMAL 471 -0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 438 -0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 452 -0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 453 -0.4513 0.8443 0.2890 + *MESH_FACENORMAL 472 -0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 445 -0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 461 -0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 446 -0.1374 0.2571 -0.9565 + *MESH_FACENORMAL 473 -0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 438 -0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 454 -0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 439 -0.4691 0.8777 0.0976 + *MESH_FACENORMAL 474 -0.0464 0.0869 0.9951 + *MESH_VERTEXNORMAL 432 -0.0464 0.0869 0.9951 + *MESH_VERTEXNORMAL 296 -0.0464 0.0869 0.9951 + *MESH_VERTEXNORMAL 447 -0.0464 0.0869 0.9951 + *MESH_FACENORMAL 475 -0.0464 0.0869 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0464 0.0869 -0.9951 + *MESH_VERTEXNORMAL 446 -0.0464 0.0869 -0.9951 + *MESH_VERTEXNORMAL 461 -0.0464 0.0869 -0.9951 + *MESH_FACENORMAL 476 -0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 439 -0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 455 -0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 440 -0.4691 0.8777 -0.0976 + *MESH_FACENORMAL 477 -0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 433 -0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 447 -0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 448 -0.1374 0.2571 0.9565 + *MESH_FACENORMAL 478 -0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 440 -0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 456 -0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 441 -0.4513 0.8443 -0.2890 + *MESH_FACENORMAL 479 -0.2230 0.4173 0.8810 + *MESH_VERTEXNORMAL 434 -0.2231 0.4173 0.8810 + *MESH_VERTEXNORMAL 448 -0.2231 0.4173 0.8810 + *MESH_VERTEXNORMAL 449 -0.2231 0.4173 0.8810 + *MESH_FACENORMAL 480 -0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 461 -0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 475 -0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 476 -0.0846 0.2790 -0.9565 + *MESH_FACENORMAL 481 -0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 453 -0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 469 -0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 454 -0.2889 0.9524 0.0976 + *MESH_FACENORMAL 482 -0.0286 0.0942 0.9951 + *MESH_VERTEXNORMAL 447 -0.0286 0.0942 0.9951 + *MESH_VERTEXNORMAL 296 -0.0286 0.0942 0.9951 + *MESH_VERTEXNORMAL 462 -0.0286 0.0942 0.9951 + *MESH_FACENORMAL 483 -0.0286 0.0942 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0286 0.0942 -0.9951 + *MESH_VERTEXNORMAL 461 -0.0286 0.0942 -0.9951 + *MESH_VERTEXNORMAL 476 -0.0286 0.0942 -0.9951 + *MESH_FACENORMAL 484 -0.2889 0.9524 -0.0976 + *MESH_VERTEXNORMAL 454 -0.2889 0.9524 -0.0976 + *MESH_VERTEXNORMAL 470 -0.2889 0.9524 -0.0976 + *MESH_VERTEXNORMAL 455 -0.2889 0.9524 -0.0976 + *MESH_FACENORMAL 485 -0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 447 -0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 463 -0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 448 -0.0846 0.2790 0.9565 + *MESH_FACENORMAL 486 -0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 455 -0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 471 -0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 456 -0.2779 0.9161 -0.2890 + *MESH_FACENORMAL 487 -0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 448 -0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 464 -0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 449 -0.1374 0.4528 0.8810 + *MESH_FACENORMAL 488 -0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 457 -0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 471 -0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 472 -0.2563 0.8448 -0.4696 + *MESH_FACENORMAL 489 -0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 449 -0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 465 -0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 450 -0.1847 0.6088 0.7715 + *MESH_FACENORMAL 490 -0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 457 -0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 473 -0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 458 -0.2248 0.7412 -0.6326 + *MESH_FACENORMAL 491 -0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 451 -0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 465 -0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 466 -0.2248 0.7412 0.6326 + *MESH_FACENORMAL 492 -0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 458 -0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 474 -0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 459 -0.1847 0.6088 -0.7715 + *MESH_FACENORMAL 493 -0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 451 -0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 467 -0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 452 -0.2563 0.8448 0.4696 + *MESH_FACENORMAL 494 -0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 459 -0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 475 -0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 460 -0.1374 0.4528 -0.8810 + *MESH_FACENORMAL 495 -0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 453 -0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 467 -0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 468 -0.2779 0.9161 0.2890 + *MESH_FACENORMAL 496 -0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 465 -0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 2 -0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 3 -0.0624 0.6332 0.7715 + *MESH_FACENORMAL 497 -0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 472 -0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 479 -0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 473 -0.0759 0.7708 -0.6326 + *MESH_FACENORMAL 498 -0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 466 -0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 3 -0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 4 -0.0759 0.7708 0.6326 + *MESH_FACENORMAL 499 -0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 473 -0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 9 -0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 474 -0.0624 0.6332 -0.7715 + *MESH_FACENORMAL 500 -0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 467 -0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 4 -0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 5 -0.0865 0.8786 0.4696 + *MESH_FACENORMAL 501 -0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 474 -0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 480 -0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 475 -0.0464 0.4709 -0.8810 + *MESH_FACENORMAL 502 -0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 468 -0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 5 -0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 6 -0.0938 0.9527 0.2890 + *MESH_FACENORMAL 503 -0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 475 -0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 481 -0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 476 -0.0286 0.2902 -0.9565 + *MESH_FACENORMAL 504 -0.0976 0.9904 0.0975 + *MESH_VERTEXNORMAL 469 -0.0976 0.9904 0.0976 + *MESH_VERTEXNORMAL 6 -0.0976 0.9904 0.0976 + *MESH_VERTEXNORMAL 7 -0.0976 0.9904 0.0976 + *MESH_FACENORMAL 505 -0.0097 0.0980 0.9951 + *MESH_VERTEXNORMAL 462 -0.0097 0.0980 0.9951 + *MESH_VERTEXNORMAL 296 -0.0097 0.0980 0.9951 + *MESH_VERTEXNORMAL 0 -0.0097 0.0980 0.9951 + *MESH_FACENORMAL 506 -0.0097 0.0980 -0.9951 + *MESH_VERTEXNORMAL 205 -0.0097 0.0980 -0.9951 + *MESH_VERTEXNORMAL 476 -0.0097 0.0980 -0.9951 + *MESH_VERTEXNORMAL 481 -0.0097 0.0980 -0.9951 + *MESH_FACENORMAL 507 -0.0976 0.9904 -0.0976 + *MESH_VERTEXNORMAL 469 -0.0976 0.9904 -0.0975 + *MESH_VERTEXNORMAL 8 -0.0976 0.9904 -0.0975 + *MESH_VERTEXNORMAL 470 -0.0976 0.9904 -0.0975 + *MESH_FACENORMAL 508 -0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 463 -0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 0 -0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 1 -0.0286 0.2902 0.9565 + *MESH_FACENORMAL 509 -0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 470 -0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 477 -0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 471 -0.0938 0.9527 -0.2890 + *MESH_FACENORMAL 510 -0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 464 -0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 1 -0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 2 -0.0464 0.4709 0.8810 + *MESH_FACENORMAL 511 -0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 472 -0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 477 -0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 478 -0.0865 0.8786 -0.4696 + *MESH_FACENORMAL 512 0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 477 0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 19 0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 20 0.0865 0.8786 -0.4696 + *MESH_FACENORMAL 513 0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 2 0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 12 0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 13 0.0624 0.6332 0.7715 + *MESH_FACENORMAL 514 0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 478 0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 20 0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 21 0.0759 0.7708 -0.6326 + *MESH_FACENORMAL 515 0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 3 0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 13 0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 14 0.0759 0.7708 0.6326 + *MESH_FACENORMAL 516 0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 479 0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 21 0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 22 0.0624 0.6332 -0.7715 + *MESH_FACENORMAL 517 0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 4 0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 14 0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 15 0.0865 0.8786 0.4696 + *MESH_FACENORMAL 518 0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 9 0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 22 0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 23 0.0464 0.4709 -0.8810 + *MESH_FACENORMAL 519 0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 5 0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 15 0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 16 0.0938 0.9527 0.2890 + *MESH_FACENORMAL 520 0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 480 0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 23 0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 24 0.0286 0.2902 -0.9565 + *MESH_FACENORMAL 521 0.0975 0.9904 0.0976 + *MESH_VERTEXNORMAL 6 0.0975 0.9904 0.0976 + *MESH_VERTEXNORMAL 16 0.0975 0.9904 0.0976 + *MESH_VERTEXNORMAL 17 0.0975 0.9904 0.0976 + *MESH_FACENORMAL 522 0.0975 0.9904 -0.0975 + *MESH_VERTEXNORMAL 7 0.0975 0.9904 -0.0975 + *MESH_VERTEXNORMAL 17 0.0975 0.9904 -0.0975 + *MESH_VERTEXNORMAL 18 0.0975 0.9904 -0.0975 + *MESH_FACENORMAL 523 0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 0 0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 10 0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 11 0.0286 0.2902 0.9565 + *MESH_FACENORMAL 524 0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 8 0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 18 0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 19 0.0938 0.9527 -0.2890 + *MESH_FACENORMAL 525 0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 2 0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 1 0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 11 0.0464 0.4709 0.8810 + *MESH_FACENORMAL 526 0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 19 0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 18 0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 33 0.2779 0.9161 -0.2890 + *MESH_FACENORMAL 527 0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 11 0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 26 0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 27 0.1374 0.4528 0.8810 + *MESH_FACENORMAL 528 0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 19 0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 34 0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 35 0.2563 0.8448 -0.4696 + *MESH_FACENORMAL 529 0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 12 0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 27 0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 28 0.1847 0.6088 0.7715 + *MESH_FACENORMAL 530 0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 21 0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 20 0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 35 0.2248 0.7412 -0.6326 + *MESH_FACENORMAL 531 0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 13 0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 28 0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 29 0.2248 0.7412 0.6326 + *MESH_FACENORMAL 532 0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 21 0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 36 0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 37 0.1847 0.6088 -0.7715 + *MESH_FACENORMAL 533 0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 14 0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 29 0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 30 0.2563 0.8448 0.4696 + *MESH_FACENORMAL 534 0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 22 0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 37 0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 38 0.1374 0.4528 -0.8810 + *MESH_FACENORMAL 535 0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 15 0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 30 0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 31 0.2779 0.9161 0.2890 + *MESH_FACENORMAL 536 0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 23 0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 38 0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 39 0.0846 0.2790 -0.9565 + *MESH_FACENORMAL 537 0.2889 0.9524 0.0975 + *MESH_VERTEXNORMAL 16 0.2889 0.9524 0.0975 + *MESH_VERTEXNORMAL 31 0.2889 0.9524 0.0975 + *MESH_VERTEXNORMAL 32 0.2889 0.9524 0.0975 + *MESH_FACENORMAL 538 0.2889 0.9524 -0.0975 + *MESH_VERTEXNORMAL 18 0.2889 0.9524 -0.0975 + *MESH_VERTEXNORMAL 17 0.2889 0.9524 -0.0975 + *MESH_VERTEXNORMAL 32 0.2889 0.9524 -0.0975 + *MESH_FACENORMAL 539 0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 10 0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 25 0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 26 0.0846 0.2790 0.9565 + *MESH_FACENORMAL 540 0.2230 0.4173 -0.8810 + *MESH_VERTEXNORMAL 37 0.2231 0.4173 -0.8810 + *MESH_VERTEXNORMAL 52 0.2231 0.4173 -0.8810 + *MESH_VERTEXNORMAL 53 0.2231 0.4173 -0.8810 + *MESH_FACENORMAL 541 0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 31 0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 30 0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 45 0.4513 0.8443 0.2890 + *MESH_FACENORMAL 542 0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 38 0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 53 0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 54 0.1374 0.2571 -0.9565 + *MESH_FACENORMAL 543 0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 31 0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 46 0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 47 0.4691 0.8777 0.0976 + *MESH_FACENORMAL 544 0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 32 0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 47 0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 48 0.4691 0.8777 -0.0976 + *MESH_FACENORMAL 545 0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 25 0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 40 0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 41 0.1374 0.2571 0.9565 + *MESH_FACENORMAL 546 0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 33 0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 48 0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 49 0.4513 0.8443 -0.2890 + *MESH_FACENORMAL 547 0.2230 0.4173 0.8810 + *MESH_VERTEXNORMAL 26 0.2231 0.4173 0.8810 + *MESH_VERTEXNORMAL 41 0.2231 0.4173 0.8810 + *MESH_VERTEXNORMAL 42 0.2231 0.4173 0.8810 + *MESH_FACENORMAL 548 0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 35 0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 34 0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 49 0.4162 0.7786 -0.4696 + *MESH_FACENORMAL 549 0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 27 0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 42 0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 43 0.2999 0.5611 0.7715 + *MESH_FACENORMAL 550 0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 36 0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 35 0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 50 0.3651 0.6831 -0.6326 + *MESH_FACENORMAL 551 0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 28 0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 43 0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 44 0.3651 0.6831 0.6326 + *MESH_FACENORMAL 552 0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 36 0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 51 0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 52 0.2999 0.5611 -0.7715 + *MESH_FACENORMAL 553 0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 29 0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 44 0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 45 0.4162 0.7786 0.4696 + *MESH_FACENORMAL 554 0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 41 0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 56 0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 57 0.3002 0.3658 0.8810 + *MESH_FACENORMAL 555 0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 50 0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 49 0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 64 0.5601 0.6825 -0.4696 + *MESH_FACENORMAL 556 0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 42 0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 57 0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 58 0.4036 0.4918 0.7715 + *MESH_FACENORMAL 557 0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 50 0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 65 0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 66 0.4913 0.5987 -0.6326 + *MESH_FACENORMAL 558 0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 43 0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 58 0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 59 0.4913 0.5987 0.6326 + *MESH_FACENORMAL 559 0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 51 0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 66 0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 67 0.4036 0.4918 -0.7715 + *MESH_FACENORMAL 560 0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 44 0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 59 0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 60 0.5601 0.6825 0.4696 + *MESH_FACENORMAL 561 0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 52 0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 67 0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 68 0.3002 0.3658 -0.8810 + *MESH_FACENORMAL 562 0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 45 0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 60 0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 61 0.6073 0.7400 0.2890 + *MESH_FACENORMAL 563 0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 53 0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 68 0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 69 0.1850 0.2254 -0.9565 + *MESH_FACENORMAL 564 0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 47 0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 46 0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 61 0.6314 0.7693 0.0976 + *MESH_FACENORMAL 565 0.6314 0.7693 -0.0975 + *MESH_VERTEXNORMAL 47 0.6314 0.7693 -0.0975 + *MESH_VERTEXNORMAL 62 0.6314 0.7693 -0.0975 + *MESH_VERTEXNORMAL 63 0.6314 0.7693 -0.0975 + *MESH_FACENORMAL 566 0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 40 0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 55 0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 56 0.1850 0.2254 0.9565 + *MESH_FACENORMAL 567 0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 48 0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 63 0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 64 0.6073 0.7400 -0.2890 + *MESH_FACENORMAL 568 0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 60 0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 75 0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 76 0.7400 0.6073 0.2890 + *MESH_FACENORMAL 569 0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 68 0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 83 0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 84 0.2254 0.1850 -0.9565 + *MESH_FACENORMAL 570 0.7693 0.6314 0.0975 + *MESH_VERTEXNORMAL 62 0.7693 0.6314 0.0975 + *MESH_VERTEXNORMAL 61 0.7693 0.6314 0.0975 + *MESH_VERTEXNORMAL 76 0.7693 0.6314 0.0975 + *MESH_FACENORMAL 571 0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 62 0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 77 0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 78 0.7693 0.6314 -0.0976 + *MESH_FACENORMAL 572 0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 55 0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 70 0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 71 0.2254 0.1850 0.9565 + *MESH_FACENORMAL 573 0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 63 0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 78 0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 79 0.7400 0.6073 -0.2890 + *MESH_FACENORMAL 574 0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 56 0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 71 0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 72 0.3658 0.3002 0.8810 + *MESH_FACENORMAL 575 0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 65 0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 64 0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 79 0.6825 0.5601 -0.4696 + *MESH_FACENORMAL 576 0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 57 0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 72 0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 73 0.4918 0.4036 0.7715 + *MESH_FACENORMAL 577 0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 65 0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 80 0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 81 0.5987 0.4913 -0.6326 + *MESH_FACENORMAL 578 0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 59 0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 58 0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 73 0.5987 0.4913 0.6326 + *MESH_FACENORMAL 579 0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 67 0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 66 0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 81 0.4918 0.4036 -0.7715 + *MESH_FACENORMAL 580 0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 59 0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 74 0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 75 0.6825 0.5601 0.4696 + *MESH_FACENORMAL 581 0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 68 0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 67 0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 82 0.3658 0.3002 -0.8810 + *MESH_FACENORMAL 582 0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 80 0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 79 0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 94 0.7786 0.4162 -0.4696 + *MESH_FACENORMAL 583 0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 72 0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 87 0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 88 0.5611 0.2999 0.7715 + *MESH_FACENORMAL 584 0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 81 0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 80 0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 95 0.6831 0.3651 -0.6326 + *MESH_FACENORMAL 585 0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 74 0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 73 0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 88 0.6831 0.3651 0.6326 + *MESH_FACENORMAL 586 0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 81 0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 96 0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 97 0.5611 0.2999 -0.7715 + *MESH_FACENORMAL 587 0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 74 0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 89 0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 90 0.7786 0.4162 0.4696 + *MESH_FACENORMAL 588 0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 83 0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 82 0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 97 0.4173 0.2230 -0.8810 + *MESH_FACENORMAL 589 0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 76 0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 75 0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 90 0.8443 0.4513 0.2890 + *MESH_FACENORMAL 590 0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 83 0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 98 0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 99 0.2571 0.1374 -0.9565 + *MESH_FACENORMAL 591 0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 76 0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 91 0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 92 0.8777 0.4691 0.0976 + *MESH_FACENORMAL 592 0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 77 0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 92 0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 93 0.8777 0.4691 -0.0976 + *MESH_FACENORMAL 593 0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 70 0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 85 0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 86 0.2571 0.1374 0.9565 + *MESH_FACENORMAL 594 0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 78 0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 93 0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 94 0.8443 0.4513 -0.2890 + *MESH_FACENORMAL 595 0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 71 0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 86 0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 87 0.4173 0.2230 0.8810 + *MESH_FACENORMAL 596 0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 99 0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 98 0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 113 0.2790 0.0846 -0.9565 + *MESH_FACENORMAL 597 0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 91 0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 106 0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 107 0.9524 0.2889 0.0976 + *MESH_FACENORMAL 598 0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 92 0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 107 0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 108 0.9524 0.2889 -0.0976 + *MESH_FACENORMAL 599 0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 85 0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 100 0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 101 0.2790 0.0846 0.9565 + *MESH_FACENORMAL 600 0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 93 0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 108 0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 109 0.9161 0.2779 -0.2890 + *MESH_FACENORMAL 601 0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 86 0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 101 0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 102 0.4528 0.1374 0.8810 + *MESH_FACENORMAL 602 0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 95 0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 94 0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 109 0.8448 0.2563 -0.4696 + *MESH_FACENORMAL 603 0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 88 0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 87 0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 102 0.6088 0.1847 0.7715 + *MESH_FACENORMAL 604 0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 96 0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 95 0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 110 0.7412 0.2248 -0.6326 + *MESH_FACENORMAL 605 0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 88 0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 103 0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 104 0.7412 0.2248 0.6326 + *MESH_FACENORMAL 606 0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 96 0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 111 0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 112 0.6088 0.1847 -0.7715 + *MESH_FACENORMAL 607 0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 89 0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 104 0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 105 0.8448 0.2563 0.4696 + *MESH_FACENORMAL 608 0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 97 0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 112 0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 113 0.4528 0.1374 -0.8810 + *MESH_FACENORMAL 609 0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 91 0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 90 0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 105 0.9161 0.2779 0.2890 + *MESH_FACENORMAL 610 0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 110 0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 125 0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 126 0.7708 0.0759 -0.6326 + *MESH_FACENORMAL 611 0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 103 0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 118 0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 119 0.7708 0.0759 0.6326 + *MESH_FACENORMAL 612 0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 112 0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 111 0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 126 0.6332 0.0624 -0.7715 + *MESH_FACENORMAL 613 0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 104 0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 119 0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 120 0.8786 0.0865 0.4696 + *MESH_FACENORMAL 614 0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 113 0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 112 0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 127 0.4709 0.0464 -0.8810 + *MESH_FACENORMAL 615 0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 106 0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 105 0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 120 0.9527 0.0938 0.2890 + *MESH_FACENORMAL 616 0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 114 0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 113 0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 128 0.2902 0.0286 -0.9565 + *MESH_FACENORMAL 617 0.9904 0.0975 0.0976 + *MESH_VERTEXNORMAL 106 0.9904 0.0975 0.0976 + *MESH_VERTEXNORMAL 121 0.9904 0.0975 0.0976 + *MESH_VERTEXNORMAL 122 0.9904 0.0975 0.0976 + *MESH_FACENORMAL 618 0.9904 0.0975 -0.0976 + *MESH_VERTEXNORMAL 108 0.9904 0.0975 -0.0976 + *MESH_VERTEXNORMAL 107 0.9904 0.0975 -0.0976 + *MESH_VERTEXNORMAL 122 0.9904 0.0975 -0.0976 + *MESH_FACENORMAL 619 0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 100 0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 115 0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 116 0.2902 0.0286 0.9565 + *MESH_FACENORMAL 620 0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 108 0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 123 0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 124 0.9527 0.0938 -0.2890 + *MESH_FACENORMAL 621 0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 101 0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 116 0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 117 0.4709 0.0464 0.8810 + *MESH_FACENORMAL 622 0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 110 0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 109 0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 124 0.8786 0.0865 -0.4696 + *MESH_FACENORMAL 623 0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 102 0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 117 0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 118 0.6332 0.0624 0.7715 + *MESH_FACENORMAL 624 0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 122 0.9904 -0.0976 -0.0976 + *MESH_VERTEXNORMAL 137 0.9904 -0.0976 -0.0976 + *MESH_VERTEXNORMAL 138 0.9904 -0.0976 -0.0976 + *MESH_FACENORMAL 625 0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 116 0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 115 0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 130 0.2902 -0.0286 0.9565 + *MESH_FACENORMAL 626 0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 123 0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 138 0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 139 0.9527 -0.0938 -0.2890 + *MESH_FACENORMAL 627 0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 116 0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 131 0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 132 0.4709 -0.0464 0.8810 + *MESH_FACENORMAL 628 0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 125 0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 124 0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 139 0.8786 -0.0865 -0.4696 + *MESH_FACENORMAL 629 0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 117 0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 132 0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 133 0.6332 -0.0624 0.7715 + *MESH_FACENORMAL 630 0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 125 0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 140 0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 141 0.7708 -0.0759 -0.6326 + *MESH_FACENORMAL 631 0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 119 0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 118 0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 133 0.7708 -0.0759 0.6326 + *MESH_FACENORMAL 632 0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 127 0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 126 0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 141 0.6332 -0.0624 -0.7715 + *MESH_FACENORMAL 633 0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 119 0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 134 0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 135 0.8786 -0.0865 0.4696 + *MESH_FACENORMAL 634 0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 127 0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 142 0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 143 0.4709 -0.0464 -0.8810 + *MESH_FACENORMAL 635 0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 121 0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 120 0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 135 0.9527 -0.0938 0.2890 + *MESH_FACENORMAL 636 0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 129 0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 128 0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 143 0.2902 -0.0286 -0.9565 + *MESH_FACENORMAL 637 0.9904 -0.0976 0.0976 + *MESH_VERTEXNORMAL 121 0.9904 -0.0976 0.0976 + *MESH_VERTEXNORMAL 136 0.9904 -0.0976 0.0976 + *MESH_VERTEXNORMAL 137 0.9904 -0.0976 0.0976 + *MESH_FACENORMAL 638 0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 133 0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 148 0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 149 0.7412 -0.2248 0.6326 + *MESH_FACENORMAL 639 0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 141 0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 156 0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 157 0.6088 -0.1847 -0.7715 + *MESH_FACENORMAL 640 0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 134 0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 149 0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 150 0.8448 -0.2563 0.4696 + *MESH_FACENORMAL 641 0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 143 0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 142 0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 157 0.4528 -0.1374 -0.8810 + *MESH_FACENORMAL 642 0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 136 0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 135 0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 150 0.9161 -0.2779 0.2890 + *MESH_FACENORMAL 643 0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 143 0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 158 0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 159 0.2790 -0.0846 -0.9565 + *MESH_FACENORMAL 644 0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 136 0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 151 0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 152 0.9524 -0.2889 0.0976 + *MESH_FACENORMAL 645 0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 137 0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 152 0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 153 0.9524 -0.2889 -0.0976 + *MESH_FACENORMAL 646 0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 130 0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 145 0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 146 0.2790 -0.0846 0.9565 + *MESH_FACENORMAL 647 0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 138 0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 153 0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 154 0.9161 -0.2779 -0.2890 + *MESH_FACENORMAL 648 0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 132 0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 131 0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 146 0.4528 -0.1374 0.8810 + *MESH_FACENORMAL 649 0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 140 0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 139 0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 154 0.8448 -0.2563 -0.4696 + *MESH_FACENORMAL 650 0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 132 0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 147 0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 148 0.6088 -0.1847 0.7715 + *MESH_FACENORMAL 651 0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 140 0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 155 0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 156 0.7412 -0.2248 -0.6326 + *MESH_FACENORMAL 652 0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 153 0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 152 0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 167 0.8777 -0.4691 -0.0976 + *MESH_FACENORMAL 653 0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 145 0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 160 0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 161 0.2571 -0.1374 0.9565 + *MESH_FACENORMAL 654 0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 153 0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 168 0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 169 0.8443 -0.4513 -0.2890 + *MESH_FACENORMAL 655 0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 146 0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 161 0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 162 0.4173 -0.2230 0.8810 + *MESH_FACENORMAL 656 0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 155 0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 154 0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 169 0.7786 -0.4162 -0.4696 + *MESH_FACENORMAL 657 0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 147 0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 162 0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 163 0.5611 -0.2999 0.7715 + *MESH_FACENORMAL 658 0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 155 0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 170 0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 171 0.6831 -0.3651 -0.6326 + *MESH_FACENORMAL 659 0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 149 0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 148 0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 163 0.6831 -0.3651 0.6326 + *MESH_FACENORMAL 660 0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 157 0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 156 0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 171 0.5611 -0.2999 -0.7715 + *MESH_FACENORMAL 661 0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 149 0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 164 0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 165 0.7786 -0.4162 0.4696 + *MESH_FACENORMAL 662 0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 157 0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 172 0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 173 0.4173 -0.2230 -0.8810 + *MESH_FACENORMAL 663 0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 151 0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 150 0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 165 0.8443 -0.4513 0.2890 + *MESH_FACENORMAL 664 0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 158 0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 173 0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 174 0.2571 -0.1374 -0.9565 + *MESH_FACENORMAL 665 0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 151 0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 166 0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 167 0.8777 -0.4691 0.0976 + *MESH_FACENORMAL 666 0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 172 0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 171 0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 186 0.4918 -0.4036 -0.7715 + *MESH_FACENORMAL 667 0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 164 0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 179 0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 180 0.6825 -0.5601 0.4696 + *MESH_FACENORMAL 668 0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 172 0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 187 0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 188 0.3658 -0.3002 -0.8810 + *MESH_FACENORMAL 669 0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 166 0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 165 0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 180 0.7400 -0.6073 0.2890 + *MESH_FACENORMAL 670 0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 174 0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 173 0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 188 0.2254 -0.1850 -0.9565 + *MESH_FACENORMAL 671 0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 166 0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 181 0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 182 0.7693 -0.6314 0.0976 + *MESH_FACENORMAL 672 0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 167 0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 182 0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 183 0.7693 -0.6314 -0.0976 + *MESH_FACENORMAL 673 0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 160 0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 175 0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 176 0.2254 -0.1850 0.9565 + *MESH_FACENORMAL 674 0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 168 0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 183 0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 184 0.7400 -0.6073 -0.2890 + *MESH_FACENORMAL 675 0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 161 0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 176 0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 177 0.3658 -0.3002 0.8810 + *MESH_FACENORMAL 676 0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 169 0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 184 0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 185 0.6825 -0.5601 -0.4696 + *MESH_FACENORMAL 677 0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 162 0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 177 0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 178 0.4918 -0.4036 0.7715 + *MESH_FACENORMAL 678 0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 170 0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 185 0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 186 0.5987 -0.4913 -0.6326 + *MESH_FACENORMAL 679 0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 163 0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 178 0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 179 0.5987 -0.4913 0.6326 + *MESH_FACENORMAL 680 0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 175 0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 190 0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 191 0.1850 -0.2254 0.9565 + *MESH_FACENORMAL 681 0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 183 0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 198 0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 199 0.6073 -0.7400 -0.2890 + *MESH_FACENORMAL 682 0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 176 0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 191 0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 192 0.3002 -0.3658 0.8810 + *MESH_FACENORMAL 683 0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 185 0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 184 0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 199 0.5601 -0.6825 -0.4696 + *MESH_FACENORMAL 684 0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 178 0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 177 0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 192 0.4036 -0.4918 0.7715 + *MESH_FACENORMAL 685 0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 185 0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 200 0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 201 0.4913 -0.5987 -0.6326 + *MESH_FACENORMAL 686 0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 179 0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 178 0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 193 0.4913 -0.5987 0.6326 + *MESH_FACENORMAL 687 0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 187 0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 186 0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 201 0.4036 -0.4918 -0.7715 + *MESH_FACENORMAL 688 0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 179 0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 194 0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 195 0.5601 -0.6825 0.4696 + *MESH_FACENORMAL 689 0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 187 0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 202 0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 203 0.3002 -0.3658 -0.8810 + *MESH_FACENORMAL 690 0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 181 0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 180 0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 195 0.6073 -0.7400 0.2890 + *MESH_FACENORMAL 691 0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 189 0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 188 0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 203 0.1850 -0.2254 -0.9565 + *MESH_FACENORMAL 692 0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 181 0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 196 0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 197 0.6314 -0.7693 0.0976 + *MESH_FACENORMAL 693 0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 183 0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 182 0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 197 0.6314 -0.7693 -0.0976 + *MESH_FACENORMAL 694 0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 194 0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 210 0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 211 0.4162 -0.7786 0.4696 + *MESH_FACENORMAL 695 0.2230 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 202 0.2230 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 218 0.2230 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 219 0.2230 -0.4173 -0.8810 + *MESH_FACENORMAL 696 0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 196 0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 195 0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 211 0.4513 -0.8443 0.2890 + *MESH_FACENORMAL 697 0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 203 0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 219 0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 220 0.1374 -0.2571 -0.9565 + *MESH_FACENORMAL 698 0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 196 0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 212 0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 213 0.4691 -0.8777 0.0976 + *MESH_FACENORMAL 699 0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 197 0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 213 0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 214 0.4691 -0.8777 -0.0976 + *MESH_FACENORMAL 700 0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 190 0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 206 0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 207 0.1374 -0.2571 0.9565 + *MESH_FACENORMAL 701 0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 198 0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 214 0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 215 0.4513 -0.8443 -0.2890 + *MESH_FACENORMAL 702 0.2230 -0.4173 0.8810 + *MESH_VERTEXNORMAL 192 0.2231 -0.4173 0.8810 + *MESH_VERTEXNORMAL 191 0.2231 -0.4173 0.8810 + *MESH_VERTEXNORMAL 207 0.2231 -0.4173 0.8810 + *MESH_FACENORMAL 703 0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 200 0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 199 0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 215 0.4162 -0.7786 -0.4696 + *MESH_FACENORMAL 704 0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 192 0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 208 0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 209 0.2999 -0.5611 0.7715 + *MESH_FACENORMAL 705 0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 200 0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 216 0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 217 0.3651 -0.6831 -0.6326 + *MESH_FACENORMAL 706 0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 193 0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 209 0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 210 0.3651 -0.6831 0.6326 + *MESH_FACENORMAL 707 0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 202 0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 201 0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 217 0.2999 -0.5611 -0.7715 + *MESH_FACENORMAL 708 0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 214 0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 229 0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 230 0.2779 -0.9161 -0.2890 + *MESH_FACENORMAL 709 0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 207 0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 222 0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 223 0.1374 -0.4528 0.8810 + *MESH_FACENORMAL 710 0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 216 0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 215 0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 230 0.2563 -0.8448 -0.4696 + *MESH_FACENORMAL 711 0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 208 0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 223 0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 224 0.1847 -0.6088 0.7715 + *MESH_FACENORMAL 712 0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 216 0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 231 0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 232 0.2248 -0.7412 -0.6326 + *MESH_FACENORMAL 713 0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 209 0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 224 0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 225 0.2248 -0.7412 0.6326 + *MESH_FACENORMAL 714 0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 217 0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 232 0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 233 0.1847 -0.6088 -0.7715 + *MESH_FACENORMAL 715 0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 210 0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 225 0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 226 0.2563 -0.8448 0.4696 + *MESH_FACENORMAL 716 0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 218 0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 233 0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 234 0.1374 -0.4528 -0.8810 + *MESH_FACENORMAL 717 0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 212 0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 211 0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 226 0.2779 -0.9161 0.2890 + *MESH_FACENORMAL 718 0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 220 0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 219 0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 234 0.0846 -0.2790 -0.9565 + *MESH_FACENORMAL 719 0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 212 0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 227 0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 228 0.2889 -0.9524 0.0976 + *MESH_FACENORMAL 720 0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 213 0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 228 0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 229 0.2889 -0.9524 -0.0976 + *MESH_FACENORMAL 721 0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 206 0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 221 0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 222 0.0846 -0.2790 0.9565 + *MESH_FACENORMAL 722 0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 233 0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 248 0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 249 0.0464 -0.4709 -0.8810 + *MESH_FACENORMAL 723 0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 227 0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 226 0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 241 0.0938 -0.9527 0.2890 + *MESH_FACENORMAL 724 0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 235 0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 234 0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 249 0.0286 -0.2902 -0.9565 + *MESH_FACENORMAL 725 0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 227 0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 242 0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 243 0.0975 -0.9904 0.0976 + *MESH_FACENORMAL 726 0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 228 0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 243 0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 244 0.0975 -0.9904 -0.0976 + *MESH_FACENORMAL 727 0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 221 0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 236 0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 237 0.0286 -0.2902 0.9565 + *MESH_FACENORMAL 728 0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 229 0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 244 0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 245 0.0938 -0.9527 -0.2890 + *MESH_FACENORMAL 729 0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 223 0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 222 0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 237 0.0464 -0.4709 0.8810 + *MESH_FACENORMAL 730 0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 231 0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 230 0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 245 0.0865 -0.8786 -0.4696 + *MESH_FACENORMAL 731 0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 224 0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 223 0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 238 0.0624 -0.6332 0.7715 + *MESH_FACENORMAL 732 0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 231 0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 246 0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 247 0.0759 -0.7708 -0.6326 + *MESH_FACENORMAL 733 0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 224 0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 239 0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 240 0.0759 -0.7708 0.6326 + *MESH_FACENORMAL 734 0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 233 0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 232 0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 247 0.0624 -0.6332 -0.7715 + *MESH_FACENORMAL 735 0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 225 0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 240 0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 241 0.0865 -0.8786 0.4696 + *MESH_FACENORMAL 736 -0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 246 -0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 245 -0.0865 -0.8786 -0.4696 + *MESH_VERTEXNORMAL 260 -0.0865 -0.8786 -0.4696 + *MESH_FACENORMAL 737 -0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 239 -0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 238 -0.0624 -0.6332 0.7715 + *MESH_VERTEXNORMAL 253 -0.0624 -0.6332 0.7715 + *MESH_FACENORMAL 738 -0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 246 -0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 261 -0.0759 -0.7708 -0.6326 + *MESH_VERTEXNORMAL 262 -0.0759 -0.7708 -0.6326 + *MESH_FACENORMAL 739 -0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 240 -0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 239 -0.0759 -0.7708 0.6326 + *MESH_VERTEXNORMAL 254 -0.0759 -0.7708 0.6326 + *MESH_FACENORMAL 740 -0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 247 -0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 262 -0.0624 -0.6332 -0.7715 + *MESH_VERTEXNORMAL 263 -0.0624 -0.6332 -0.7715 + *MESH_FACENORMAL 741 -0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 240 -0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 255 -0.0865 -0.8786 0.4696 + *MESH_VERTEXNORMAL 256 -0.0865 -0.8786 0.4696 + *MESH_FACENORMAL 742 -0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 248 -0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 263 -0.0464 -0.4709 -0.8810 + *MESH_VERTEXNORMAL 264 -0.0464 -0.4709 -0.8810 + *MESH_FACENORMAL 743 -0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 242 -0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 241 -0.0938 -0.9527 0.2890 + *MESH_VERTEXNORMAL 256 -0.0938 -0.9527 0.2890 + *MESH_FACENORMAL 744 -0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 249 -0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 264 -0.0286 -0.2902 -0.9565 + *MESH_VERTEXNORMAL 265 -0.0286 -0.2902 -0.9565 + *MESH_FACENORMAL 745 -0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 242 -0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 257 -0.0975 -0.9904 0.0976 + *MESH_VERTEXNORMAL 258 -0.0975 -0.9904 0.0976 + *MESH_FACENORMAL 746 -0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 243 -0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 258 -0.0975 -0.9904 -0.0976 + *MESH_VERTEXNORMAL 259 -0.0975 -0.9904 -0.0976 + *MESH_FACENORMAL 747 -0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 236 -0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 251 -0.0286 -0.2902 0.9565 + *MESH_VERTEXNORMAL 252 -0.0286 -0.2902 0.9565 + *MESH_FACENORMAL 748 -0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 244 -0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 259 -0.0938 -0.9527 -0.2890 + *MESH_VERTEXNORMAL 260 -0.0938 -0.9527 -0.2890 + *MESH_FACENORMAL 749 -0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 237 -0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 252 -0.0464 -0.4709 0.8810 + *MESH_VERTEXNORMAL 253 -0.0464 -0.4709 0.8810 + *MESH_FACENORMAL 750 -0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 265 -0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 264 -0.0846 -0.2790 -0.9565 + *MESH_VERTEXNORMAL 279 -0.0846 -0.2790 -0.9565 + *MESH_FACENORMAL 751 -0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 257 -0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 272 -0.2889 -0.9524 0.0976 + *MESH_VERTEXNORMAL 273 -0.2889 -0.9524 0.0976 + *MESH_FACENORMAL 752 -0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 259 -0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 258 -0.2889 -0.9524 -0.0976 + *MESH_VERTEXNORMAL 273 -0.2889 -0.9524 -0.0976 + *MESH_FACENORMAL 753 -0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 251 -0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 266 -0.0846 -0.2790 0.9565 + *MESH_VERTEXNORMAL 267 -0.0846 -0.2790 0.9565 + *MESH_FACENORMAL 754 -0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 259 -0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 274 -0.2779 -0.9161 -0.2890 + *MESH_VERTEXNORMAL 275 -0.2779 -0.9161 -0.2890 + *MESH_FACENORMAL 755 -0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 252 -0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 267 -0.1374 -0.4528 0.8810 + *MESH_VERTEXNORMAL 268 -0.1374 -0.4528 0.8810 + *MESH_FACENORMAL 756 -0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 261 -0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 260 -0.2563 -0.8448 -0.4696 + *MESH_VERTEXNORMAL 275 -0.2563 -0.8448 -0.4696 + *MESH_FACENORMAL 757 -0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 254 -0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 253 -0.1847 -0.6088 0.7715 + *MESH_VERTEXNORMAL 268 -0.1847 -0.6088 0.7715 + *MESH_FACENORMAL 758 -0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 261 -0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 276 -0.2248 -0.7412 -0.6326 + *MESH_VERTEXNORMAL 277 -0.2248 -0.7412 -0.6326 + *MESH_FACENORMAL 759 -0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 255 -0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 254 -0.2248 -0.7412 0.6326 + *MESH_VERTEXNORMAL 269 -0.2248 -0.7412 0.6326 + *MESH_FACENORMAL 760 -0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 262 -0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 277 -0.1847 -0.6088 -0.7715 + *MESH_VERTEXNORMAL 278 -0.1847 -0.6088 -0.7715 + *MESH_FACENORMAL 761 -0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 255 -0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 270 -0.2563 -0.8448 0.4696 + *MESH_VERTEXNORMAL 271 -0.2563 -0.8448 0.4696 + *MESH_FACENORMAL 762 -0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 264 -0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 263 -0.1374 -0.4528 -0.8810 + *MESH_VERTEXNORMAL 278 -0.1374 -0.4528 -0.8810 + *MESH_FACENORMAL 763 -0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 257 -0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 256 -0.2779 -0.9161 0.2890 + *MESH_VERTEXNORMAL 271 -0.2779 -0.9161 0.2890 + *MESH_FACENORMAL 764 -0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 268 -0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 283 -0.2999 -0.5611 0.7715 + *MESH_VERTEXNORMAL 284 -0.2999 -0.5611 0.7715 + *MESH_FACENORMAL 765 -0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 276 -0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 291 -0.3651 -0.6831 -0.6326 + *MESH_VERTEXNORMAL 292 -0.3651 -0.6831 -0.6326 + *MESH_FACENORMAL 766 -0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 270 -0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 269 -0.3651 -0.6831 0.6326 + *MESH_VERTEXNORMAL 284 -0.3651 -0.6831 0.6326 + *MESH_FACENORMAL 767 -0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 278 -0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 277 -0.2999 -0.5611 -0.7715 + *MESH_VERTEXNORMAL 292 -0.2999 -0.5611 -0.7715 + *MESH_FACENORMAL 768 -0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 270 -0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 285 -0.4162 -0.7786 0.4696 + *MESH_VERTEXNORMAL 286 -0.4162 -0.7786 0.4696 + *MESH_FACENORMAL 769 -0.2230 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 278 -0.2231 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 293 -0.2231 -0.4173 -0.8810 + *MESH_VERTEXNORMAL 294 -0.2231 -0.4173 -0.8810 + *MESH_FACENORMAL 770 -0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 272 -0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 271 -0.4513 -0.8443 0.2890 + *MESH_VERTEXNORMAL 286 -0.4513 -0.8443 0.2890 + *MESH_FACENORMAL 771 -0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 280 -0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 279 -0.1374 -0.2571 -0.9565 + *MESH_VERTEXNORMAL 294 -0.1374 -0.2571 -0.9565 + *MESH_FACENORMAL 772 -0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 272 -0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 287 -0.4691 -0.8777 0.0976 + *MESH_VERTEXNORMAL 288 -0.4691 -0.8777 0.0976 + *MESH_FACENORMAL 773 -0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 273 -0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 288 -0.4691 -0.8777 -0.0976 + *MESH_VERTEXNORMAL 289 -0.4691 -0.8777 -0.0976 + *MESH_FACENORMAL 774 -0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 266 -0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 281 -0.1374 -0.2571 0.9565 + *MESH_VERTEXNORMAL 282 -0.1374 -0.2571 0.9565 + *MESH_FACENORMAL 775 -0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 274 -0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 289 -0.4513 -0.8443 -0.2890 + *MESH_VERTEXNORMAL 290 -0.4513 -0.8443 -0.2890 + *MESH_FACENORMAL 776 -0.2230 -0.4173 0.8810 + *MESH_VERTEXNORMAL 267 -0.2230 -0.4173 0.8810 + *MESH_VERTEXNORMAL 282 -0.2230 -0.4173 0.8810 + *MESH_VERTEXNORMAL 283 -0.2230 -0.4173 0.8810 + *MESH_FACENORMAL 777 -0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 276 -0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 275 -0.4162 -0.7786 -0.4696 + *MESH_VERTEXNORMAL 290 -0.4162 -0.7786 -0.4696 + *MESH_FACENORMAL 778 -0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 288 -0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 287 -0.6314 -0.7693 0.0976 + *MESH_VERTEXNORMAL 303 -0.6314 -0.7693 0.0976 + *MESH_FACENORMAL 779 -0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 288 -0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 304 -0.6314 -0.7693 -0.0976 + *MESH_VERTEXNORMAL 305 -0.6314 -0.7693 -0.0976 + *MESH_FACENORMAL 780 -0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 281 -0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 297 -0.1850 -0.2254 0.9565 + *MESH_VERTEXNORMAL 298 -0.1850 -0.2254 0.9565 + *MESH_FACENORMAL 781 -0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 289 -0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 305 -0.6073 -0.7400 -0.2890 + *MESH_VERTEXNORMAL 306 -0.6073 -0.7400 -0.2890 + *MESH_FACENORMAL 782 -0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 282 -0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 298 -0.3002 -0.3658 0.8810 + *MESH_VERTEXNORMAL 299 -0.3002 -0.3658 0.8810 + *MESH_FACENORMAL 783 -0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 291 -0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 290 -0.5601 -0.6825 -0.4696 + *MESH_VERTEXNORMAL 306 -0.5601 -0.6825 -0.4696 + *MESH_FACENORMAL 784 -0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 284 -0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 283 -0.4036 -0.4918 0.7715 + *MESH_VERTEXNORMAL 299 -0.4036 -0.4918 0.7715 + *MESH_FACENORMAL 785 -0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 291 -0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 307 -0.4913 -0.5987 -0.6326 + *MESH_VERTEXNORMAL 308 -0.4913 -0.5987 -0.6326 + *MESH_FACENORMAL 786 -0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 285 -0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 284 -0.4913 -0.5987 0.6326 + *MESH_VERTEXNORMAL 300 -0.4913 -0.5987 0.6326 + *MESH_FACENORMAL 787 -0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 292 -0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 308 -0.4036 -0.4918 -0.7715 + *MESH_VERTEXNORMAL 309 -0.4036 -0.4918 -0.7715 + *MESH_FACENORMAL 788 -0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 285 -0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 301 -0.5601 -0.6825 0.4696 + *MESH_VERTEXNORMAL 302 -0.5601 -0.6825 0.4696 + *MESH_FACENORMAL 789 -0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 293 -0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 309 -0.3002 -0.3658 -0.8810 + *MESH_VERTEXNORMAL 310 -0.3002 -0.3658 -0.8810 + *MESH_FACENORMAL 790 -0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 287 -0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 286 -0.6073 -0.7400 0.2890 + *MESH_VERTEXNORMAL 302 -0.6073 -0.7400 0.2890 + *MESH_FACENORMAL 791 -0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 294 -0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 310 -0.1850 -0.2254 -0.9565 + *MESH_VERTEXNORMAL 311 -0.1850 -0.2254 -0.9565 + *MESH_FACENORMAL 792 -0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 307 -0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 322 -0.5987 -0.4913 -0.6326 + *MESH_VERTEXNORMAL 323 -0.5987 -0.4913 -0.6326 + *MESH_FACENORMAL 793 -0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 301 -0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 300 -0.5987 -0.4913 0.6326 + *MESH_VERTEXNORMAL 315 -0.5987 -0.4913 0.6326 + *MESH_FACENORMAL 794 -0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 308 -0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 323 -0.4918 -0.4036 -0.7715 + *MESH_VERTEXNORMAL 324 -0.4918 -0.4036 -0.7715 + *MESH_FACENORMAL 795 -0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 301 -0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 316 -0.6825 -0.5601 0.4696 + *MESH_VERTEXNORMAL 317 -0.6825 -0.5601 0.4696 + *MESH_FACENORMAL 796 -0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 310 -0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 309 -0.3658 -0.3002 -0.8810 + *MESH_VERTEXNORMAL 324 -0.3658 -0.3002 -0.8810 + *MESH_FACENORMAL 797 -0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 303 -0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 302 -0.7400 -0.6073 0.2890 + *MESH_VERTEXNORMAL 317 -0.7400 -0.6073 0.2890 + *MESH_FACENORMAL 798 -0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 310 -0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 325 -0.2254 -0.1850 -0.9565 + *MESH_VERTEXNORMAL 326 -0.2254 -0.1850 -0.9565 + *MESH_FACENORMAL 799 -0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 303 -0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 318 -0.7693 -0.6314 0.0976 + *MESH_VERTEXNORMAL 319 -0.7693 -0.6314 0.0976 + *MESH_FACENORMAL 800 -0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 304 -0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 319 -0.7693 -0.6314 -0.0976 + *MESH_VERTEXNORMAL 320 -0.7693 -0.6314 -0.0976 + *MESH_FACENORMAL 801 -0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 297 -0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 312 -0.2254 -0.1850 0.9565 + *MESH_VERTEXNORMAL 313 -0.2254 -0.1850 0.9565 + *MESH_FACENORMAL 802 -0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 305 -0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 320 -0.7400 -0.6073 -0.2890 + *MESH_VERTEXNORMAL 321 -0.7400 -0.6073 -0.2890 + *MESH_FACENORMAL 803 -0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 298 -0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 313 -0.3658 -0.3002 0.8810 + *MESH_VERTEXNORMAL 314 -0.3658 -0.3002 0.8810 + *MESH_FACENORMAL 804 -0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 307 -0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 306 -0.6825 -0.5601 -0.4696 + *MESH_VERTEXNORMAL 321 -0.6825 -0.5601 -0.4696 + *MESH_FACENORMAL 805 -0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 300 -0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 299 -0.4918 -0.4036 0.7715 + *MESH_VERTEXNORMAL 314 -0.4918 -0.4036 0.7715 + *MESH_FACENORMAL 806 -0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 319 -0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 334 -0.8777 -0.4691 -0.0976 + *MESH_VERTEXNORMAL 335 -0.8777 -0.4691 -0.0976 + *MESH_FACENORMAL 807 -0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 312 -0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 327 -0.2571 -0.1374 0.9565 + *MESH_VERTEXNORMAL 328 -0.2571 -0.1374 0.9565 + *MESH_FACENORMAL 808 -0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 320 -0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 335 -0.8443 -0.4513 -0.2890 + *MESH_VERTEXNORMAL 336 -0.8443 -0.4513 -0.2890 + *MESH_FACENORMAL 809 -0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 313 -0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 328 -0.4173 -0.2230 0.8810 + *MESH_VERTEXNORMAL 329 -0.4173 -0.2230 0.8810 + *MESH_FACENORMAL 810 -0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 322 -0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 321 -0.7786 -0.4162 -0.4696 + *MESH_VERTEXNORMAL 336 -0.7786 -0.4162 -0.4696 + *MESH_FACENORMAL 811 -0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 315 -0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 314 -0.5611 -0.2999 0.7715 + *MESH_VERTEXNORMAL 329 -0.5611 -0.2999 0.7715 + *MESH_FACENORMAL 812 -0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 323 -0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 322 -0.6831 -0.3651 -0.6326 + *MESH_VERTEXNORMAL 337 -0.6831 -0.3651 -0.6326 + *MESH_FACENORMAL 813 -0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 316 -0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 315 -0.6831 -0.3651 0.6326 + *MESH_VERTEXNORMAL 330 -0.6831 -0.3651 0.6326 + *MESH_FACENORMAL 814 -0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 323 -0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 338 -0.5611 -0.2999 -0.7715 + *MESH_VERTEXNORMAL 339 -0.5611 -0.2999 -0.7715 + *MESH_FACENORMAL 815 -0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 316 -0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 331 -0.7786 -0.4162 0.4696 + *MESH_VERTEXNORMAL 332 -0.7786 -0.4162 0.4696 + *MESH_FACENORMAL 816 -0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 325 -0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 324 -0.4173 -0.2230 -0.8810 + *MESH_VERTEXNORMAL 339 -0.4173 -0.2230 -0.8810 + *MESH_FACENORMAL 817 -0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 318 -0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 317 -0.8443 -0.4513 0.2890 + *MESH_VERTEXNORMAL 332 -0.8443 -0.4513 0.2890 + *MESH_FACENORMAL 818 -0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 326 -0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 325 -0.2571 -0.1374 -0.9565 + *MESH_VERTEXNORMAL 340 -0.2571 -0.1374 -0.9565 + *MESH_FACENORMAL 819 -0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 318 -0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 333 -0.8777 -0.4691 0.0976 + *MESH_VERTEXNORMAL 334 -0.8777 -0.4691 0.0976 + *MESH_FACENORMAL 820 -0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 331 -0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 330 -0.7412 -0.2248 0.6326 + *MESH_VERTEXNORMAL 345 -0.7412 -0.2248 0.6326 + *MESH_FACENORMAL 821 -0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 338 -0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 353 -0.6088 -0.1847 -0.7715 + *MESH_VERTEXNORMAL 354 -0.6088 -0.1847 -0.7715 + *MESH_FACENORMAL 822 -0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 331 -0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 346 -0.8448 -0.2563 0.4696 + *MESH_VERTEXNORMAL 347 -0.8448 -0.2563 0.4696 + *MESH_FACENORMAL 823 -0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 340 -0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 339 -0.4528 -0.1374 -0.8810 + *MESH_VERTEXNORMAL 354 -0.4528 -0.1374 -0.8810 + *MESH_FACENORMAL 824 -0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 333 -0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 332 -0.9161 -0.2779 0.2890 + *MESH_VERTEXNORMAL 347 -0.9161 -0.2779 0.2890 + *MESH_FACENORMAL 825 -0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 340 -0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 355 -0.2790 -0.0846 -0.9565 + *MESH_VERTEXNORMAL 356 -0.2790 -0.0846 -0.9565 + *MESH_FACENORMAL 826 -0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 333 -0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 348 -0.9524 -0.2889 0.0976 + *MESH_VERTEXNORMAL 349 -0.9524 -0.2889 0.0976 + *MESH_FACENORMAL 827 -0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 334 -0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 349 -0.9524 -0.2889 -0.0976 + *MESH_VERTEXNORMAL 350 -0.9524 -0.2889 -0.0976 + *MESH_FACENORMAL 828 -0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 328 -0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 327 -0.2790 -0.0846 0.9565 + *MESH_VERTEXNORMAL 342 -0.2790 -0.0846 0.9565 + *MESH_FACENORMAL 829 -0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 335 -0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 350 -0.9161 -0.2779 -0.2890 + *MESH_VERTEXNORMAL 351 -0.9161 -0.2779 -0.2890 + *MESH_FACENORMAL 830 -0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 328 -0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 343 -0.4528 -0.1374 0.8810 + *MESH_VERTEXNORMAL 344 -0.4528 -0.1374 0.8810 + *MESH_FACENORMAL 831 -0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 337 -0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 336 -0.8448 -0.2563 -0.4696 + *MESH_VERTEXNORMAL 351 -0.8448 -0.2563 -0.4696 + *MESH_FACENORMAL 832 -0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 330 -0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 329 -0.6088 -0.1847 0.7715 + *MESH_VERTEXNORMAL 344 -0.6088 -0.1847 0.7715 + *MESH_FACENORMAL 833 -0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 337 -0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 352 -0.7412 -0.2248 -0.6326 + *MESH_VERTEXNORMAL 353 -0.7412 -0.2248 -0.6326 + *MESH_FACENORMAL 834 -0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 350 -0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 349 -0.9904 -0.0975 -0.0976 + *MESH_VERTEXNORMAL 364 -0.9904 -0.0975 -0.0976 + *MESH_FACENORMAL 835 -0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 343 -0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 342 -0.2902 -0.0286 0.9565 + *MESH_VERTEXNORMAL 357 -0.2902 -0.0286 0.9565 + *MESH_FACENORMAL 836 -0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 350 -0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 365 -0.9527 -0.0938 -0.2890 + *MESH_VERTEXNORMAL 366 -0.9527 -0.0938 -0.2890 + *MESH_FACENORMAL 837 -0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 343 -0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 358 -0.4709 -0.0464 0.8810 + *MESH_VERTEXNORMAL 359 -0.4709 -0.0464 0.8810 + *MESH_FACENORMAL 838 -0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 352 -0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 351 -0.8786 -0.0865 -0.4696 + *MESH_VERTEXNORMAL 366 -0.8786 -0.0865 -0.4696 + *MESH_FACENORMAL 839 -0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 345 -0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 344 -0.6332 -0.0624 0.7715 + *MESH_VERTEXNORMAL 359 -0.6332 -0.0624 0.7715 + *MESH_FACENORMAL 840 -0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 352 -0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 367 -0.7708 -0.0759 -0.6326 + *MESH_VERTEXNORMAL 368 -0.7708 -0.0759 -0.6326 + *MESH_FACENORMAL 841 -0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 345 -0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 360 -0.7708 -0.0759 0.6326 + *MESH_VERTEXNORMAL 361 -0.7708 -0.0759 0.6326 + *MESH_FACENORMAL 842 -0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 354 -0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 353 -0.6332 -0.0624 -0.7715 + *MESH_VERTEXNORMAL 368 -0.6332 -0.0624 -0.7715 + *MESH_FACENORMAL 843 -0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 346 -0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 361 -0.8786 -0.0865 0.4696 + *MESH_VERTEXNORMAL 362 -0.8786 -0.0865 0.4696 + *MESH_FACENORMAL 844 -0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 355 -0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 354 -0.4709 -0.0464 -0.8810 + *MESH_VERTEXNORMAL 369 -0.4709 -0.0464 -0.8810 + *MESH_FACENORMAL 845 -0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 348 -0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 347 -0.9527 -0.0938 0.2890 + *MESH_VERTEXNORMAL 362 -0.9527 -0.0938 0.2890 + *MESH_FACENORMAL 846 -0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 355 -0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 370 -0.2902 -0.0286 -0.9565 + *MESH_VERTEXNORMAL 371 -0.2902 -0.0286 -0.9565 + *MESH_FACENORMAL 847 -0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 348 -0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 363 -0.9904 -0.0975 0.0976 + *MESH_VERTEXNORMAL 364 -0.9904 -0.0975 0.0976 + *MESH_FACENORMAL 848 -0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 368 -0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 383 -0.6332 0.0624 -0.7715 + *MESH_VERTEXNORMAL 384 -0.6332 0.0624 -0.7715 + *MESH_FACENORMAL 849 -0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 361 -0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 376 -0.8786 0.0865 0.4696 + *MESH_VERTEXNORMAL 377 -0.8786 0.0865 0.4696 + *MESH_FACENORMAL 850 -0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 370 -0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 369 -0.4709 0.0464 -0.8810 + *MESH_VERTEXNORMAL 384 -0.4709 0.0464 -0.8810 + *MESH_FACENORMAL 851 -0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 363 -0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 362 -0.9527 0.0938 0.2890 + *MESH_VERTEXNORMAL 377 -0.9527 0.0938 0.2890 + *MESH_FACENORMAL 852 -0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 370 -0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 385 -0.2902 0.0286 -0.9565 + *MESH_VERTEXNORMAL 386 -0.2902 0.0286 -0.9565 + *MESH_FACENORMAL 853 -0.9904 0.0976 0.0976 + *MESH_VERTEXNORMAL 363 -0.9904 0.0976 0.0976 + *MESH_VERTEXNORMAL 378 -0.9904 0.0976 0.0976 + *MESH_VERTEXNORMAL 379 -0.9904 0.0976 0.0976 + *MESH_FACENORMAL 854 -0.9904 0.0976 -0.0976 + *MESH_VERTEXNORMAL 365 -0.9904 0.0976 -0.0976 + *MESH_VERTEXNORMAL 364 -0.9904 0.0976 -0.0976 + *MESH_VERTEXNORMAL 379 -0.9904 0.0976 -0.0976 + *MESH_FACENORMAL 855 -0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 358 -0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 357 -0.2902 0.0286 0.9565 + *MESH_VERTEXNORMAL 372 -0.2902 0.0286 0.9565 + *MESH_FACENORMAL 856 -0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 365 -0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 380 -0.9527 0.0938 -0.2890 + *MESH_VERTEXNORMAL 381 -0.9527 0.0938 -0.2890 + *MESH_FACENORMAL 857 -0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 358 -0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 373 -0.4709 0.0464 0.8810 + *MESH_VERTEXNORMAL 374 -0.4709 0.0464 0.8810 + *MESH_FACENORMAL 858 -0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 367 -0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 366 -0.8786 0.0865 -0.4696 + *MESH_VERTEXNORMAL 381 -0.8786 0.0865 -0.4696 + *MESH_FACENORMAL 859 -0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 360 -0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 359 -0.6332 0.0624 0.7715 + *MESH_VERTEXNORMAL 374 -0.6332 0.0624 0.7715 + *MESH_FACENORMAL 860 -0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 367 -0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 382 -0.7708 0.0759 -0.6326 + *MESH_VERTEXNORMAL 383 -0.7708 0.0759 -0.6326 + *MESH_FACENORMAL 861 -0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 361 -0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 360 -0.7708 0.0759 0.6326 + *MESH_VERTEXNORMAL 375 -0.7708 0.0759 0.6326 + *MESH_FACENORMAL 862 -0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 380 -0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 395 -0.9161 0.2779 -0.2890 + *MESH_VERTEXNORMAL 396 -0.9161 0.2779 -0.2890 + *MESH_FACENORMAL 863 -0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 373 -0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 388 -0.4528 0.1374 0.8810 + *MESH_VERTEXNORMAL 389 -0.4528 0.1374 0.8810 + *MESH_FACENORMAL 864 -0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 382 -0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 381 -0.8448 0.2563 -0.4696 + *MESH_VERTEXNORMAL 396 -0.8448 0.2563 -0.4696 + *MESH_FACENORMAL 865 -0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 375 -0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 374 -0.6088 0.1847 0.7715 + *MESH_VERTEXNORMAL 389 -0.6088 0.1847 0.7715 + *MESH_FACENORMAL 866 -0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 382 -0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 397 -0.7412 0.2248 -0.6326 + *MESH_VERTEXNORMAL 398 -0.7412 0.2248 -0.6326 + *MESH_FACENORMAL 867 -0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 375 -0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 390 -0.7412 0.2248 0.6326 + *MESH_VERTEXNORMAL 391 -0.7412 0.2248 0.6326 + *MESH_FACENORMAL 868 -0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 383 -0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 398 -0.6088 0.1847 -0.7715 + *MESH_VERTEXNORMAL 399 -0.6088 0.1847 -0.7715 + *MESH_FACENORMAL 869 -0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 376 -0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 391 -0.8448 0.2563 0.4696 + *MESH_VERTEXNORMAL 392 -0.8448 0.2563 0.4696 + *MESH_FACENORMAL 870 -0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 385 -0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 384 -0.4528 0.1374 -0.8810 + *MESH_VERTEXNORMAL 399 -0.4528 0.1374 -0.8810 + *MESH_FACENORMAL 871 -0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 378 -0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 377 -0.9161 0.2779 0.2890 + *MESH_VERTEXNORMAL 392 -0.9161 0.2779 0.2890 + *MESH_FACENORMAL 872 -0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 385 -0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 400 -0.2790 0.0846 -0.9565 + *MESH_VERTEXNORMAL 401 -0.2790 0.0846 -0.9565 + *MESH_FACENORMAL 873 -0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 378 -0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 393 -0.9524 0.2889 0.0976 + *MESH_VERTEXNORMAL 394 -0.9524 0.2889 0.0976 + *MESH_FACENORMAL 874 -0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 379 -0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 394 -0.9524 0.2889 -0.0976 + *MESH_VERTEXNORMAL 395 -0.9524 0.2889 -0.0976 + *MESH_FACENORMAL 875 -0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 372 -0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 387 -0.2790 0.0846 0.9565 + *MESH_VERTEXNORMAL 388 -0.2790 0.0846 0.9565 + *MESH_FACENORMAL 876 -0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 400 -0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 399 -0.4173 0.2230 -0.8810 + *MESH_VERTEXNORMAL 414 -0.4173 0.2230 -0.8810 + *MESH_FACENORMAL 877 -0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 393 -0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 392 -0.8443 0.4513 0.2890 + *MESH_VERTEXNORMAL 407 -0.8443 0.4513 0.2890 + *MESH_FACENORMAL 878 -0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 400 -0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 415 -0.2571 0.1374 -0.9565 + *MESH_VERTEXNORMAL 416 -0.2571 0.1374 -0.9565 + *MESH_FACENORMAL 879 -0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 393 -0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 408 -0.8777 0.4691 0.0976 + *MESH_VERTEXNORMAL 409 -0.8777 0.4691 0.0976 + *MESH_FACENORMAL 880 -0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 395 -0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 394 -0.8777 0.4691 -0.0976 + *MESH_VERTEXNORMAL 409 -0.8777 0.4691 -0.0976 + *MESH_FACENORMAL 881 -0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 387 -0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 402 -0.2571 0.1374 0.9565 + *MESH_VERTEXNORMAL 403 -0.2571 0.1374 0.9565 + *MESH_FACENORMAL 882 -0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 395 -0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 410 -0.8443 0.4513 -0.2890 + *MESH_VERTEXNORMAL 411 -0.8443 0.4513 -0.2890 + *MESH_FACENORMAL 883 -0.4173 0.2230 0.8810 + *MESH_VERTEXNORMAL 389 -0.4173 0.2231 0.8810 + *MESH_VERTEXNORMAL 388 -0.4173 0.2231 0.8810 + *MESH_VERTEXNORMAL 403 -0.4173 0.2231 0.8810 + *MESH_FACENORMAL 884 -0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 397 -0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 396 -0.7786 0.4162 -0.4696 + *MESH_VERTEXNORMAL 411 -0.7786 0.4162 -0.4696 + *MESH_FACENORMAL 885 -0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 390 -0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 389 -0.5611 0.2999 0.7715 + *MESH_VERTEXNORMAL 404 -0.5611 0.2999 0.7715 + *MESH_FACENORMAL 886 -0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 397 -0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 412 -0.6831 0.3651 -0.6326 + *MESH_VERTEXNORMAL 413 -0.6831 0.3651 -0.6326 + *MESH_FACENORMAL 887 -0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 391 -0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 390 -0.6831 0.3651 0.6326 + *MESH_VERTEXNORMAL 405 -0.6831 0.3651 0.6326 + *MESH_FACENORMAL 888 -0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 398 -0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 413 -0.5611 0.2999 -0.7715 + *MESH_VERTEXNORMAL 414 -0.5611 0.2999 -0.7715 + *MESH_FACENORMAL 889 -0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 391 -0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 406 -0.7786 0.4162 0.4696 + *MESH_VERTEXNORMAL 407 -0.7786 0.4162 0.4696 + *MESH_FACENORMAL 890 -0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 403 -0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 418 -0.3658 0.3002 0.8810 + *MESH_VERTEXNORMAL 419 -0.3658 0.3002 0.8810 + *MESH_FACENORMAL 891 -0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 412 -0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 411 -0.6825 0.5601 -0.4696 + *MESH_VERTEXNORMAL 426 -0.6825 0.5601 -0.4696 + *MESH_FACENORMAL 892 -0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 404 -0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 419 -0.4918 0.4036 0.7715 + *MESH_VERTEXNORMAL 420 -0.4918 0.4036 0.7715 + *MESH_FACENORMAL 893 -0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 412 -0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 427 -0.5987 0.4913 -0.6326 + *MESH_VERTEXNORMAL 428 -0.5987 0.4913 -0.6326 + *MESH_FACENORMAL 894 -0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 406 -0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 405 -0.5987 0.4913 0.6326 + *MESH_VERTEXNORMAL 420 -0.5987 0.4913 0.6326 + *MESH_FACENORMAL 895 -0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 413 -0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 428 -0.4918 0.4036 -0.7715 + *MESH_VERTEXNORMAL 429 -0.4918 0.4036 -0.7715 + *MESH_FACENORMAL 896 -0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 406 -0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 421 -0.6825 0.5601 0.4696 + *MESH_VERTEXNORMAL 422 -0.6825 0.5601 0.4696 + *MESH_FACENORMAL 897 -0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 414 -0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 429 -0.3658 0.3002 -0.8810 + *MESH_VERTEXNORMAL 430 -0.3658 0.3002 -0.8810 + *MESH_FACENORMAL 898 -0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 408 -0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 407 -0.7400 0.6073 0.2890 + *MESH_VERTEXNORMAL 422 -0.7400 0.6073 0.2890 + *MESH_FACENORMAL 899 -0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 415 -0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 430 -0.2254 0.1850 -0.9565 + *MESH_VERTEXNORMAL 431 -0.2254 0.1850 -0.9565 + *MESH_FACENORMAL 900 -0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 408 -0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 423 -0.7693 0.6314 0.0976 + *MESH_VERTEXNORMAL 424 -0.7693 0.6314 0.0976 + *MESH_FACENORMAL 901 -0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 410 -0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 409 -0.7693 0.6314 -0.0976 + *MESH_VERTEXNORMAL 424 -0.7693 0.6314 -0.0976 + *MESH_FACENORMAL 902 -0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 402 -0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 417 -0.2254 0.1850 0.9565 + *MESH_VERTEXNORMAL 418 -0.2254 0.1850 0.9565 + *MESH_FACENORMAL 903 -0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 410 -0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 425 -0.7400 0.6073 -0.2890 + *MESH_VERTEXNORMAL 426 -0.7400 0.6073 -0.2890 + *MESH_FACENORMAL 904 -0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 423 -0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 422 -0.6073 0.7400 0.2890 + *MESH_VERTEXNORMAL 437 -0.6073 0.7400 0.2890 + *MESH_FACENORMAL 905 -0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 430 -0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 445 -0.1850 0.2254 -0.9565 + *MESH_VERTEXNORMAL 446 -0.1850 0.2254 -0.9565 + *MESH_FACENORMAL 906 -0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 424 -0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 423 -0.6314 0.7693 0.0976 + *MESH_VERTEXNORMAL 438 -0.6314 0.7693 0.0976 + *MESH_FACENORMAL 907 -0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 424 -0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 439 -0.6314 0.7693 -0.0976 + *MESH_VERTEXNORMAL 440 -0.6314 0.7693 -0.0976 + *MESH_FACENORMAL 908 -0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 417 -0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 432 -0.1850 0.2254 0.9565 + *MESH_VERTEXNORMAL 433 -0.1850 0.2254 0.9565 + *MESH_FACENORMAL 909 -0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 425 -0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 440 -0.6073 0.7400 -0.2890 + *MESH_VERTEXNORMAL 441 -0.6073 0.7400 -0.2890 + *MESH_FACENORMAL 910 -0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 418 -0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 433 -0.3002 0.3658 0.8810 + *MESH_VERTEXNORMAL 434 -0.3002 0.3658 0.8810 + *MESH_FACENORMAL 911 -0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 427 -0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 426 -0.5601 0.6825 -0.4696 + *MESH_VERTEXNORMAL 441 -0.5601 0.6825 -0.4696 + *MESH_FACENORMAL 912 -0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 419 -0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 434 -0.4036 0.4918 0.7715 + *MESH_VERTEXNORMAL 435 -0.4036 0.4918 0.7715 + *MESH_FACENORMAL 913 -0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 427 -0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 442 -0.4913 0.5987 -0.6326 + *MESH_VERTEXNORMAL 443 -0.4913 0.5987 -0.6326 + *MESH_FACENORMAL 914 -0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 421 -0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 420 -0.4913 0.5987 0.6326 + *MESH_VERTEXNORMAL 435 -0.4913 0.5987 0.6326 + *MESH_FACENORMAL 915 -0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 429 -0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 428 -0.4036 0.4918 -0.7715 + *MESH_VERTEXNORMAL 443 -0.4036 0.4918 -0.7715 + *MESH_FACENORMAL 916 -0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 421 -0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 436 -0.5601 0.6825 0.4696 + *MESH_VERTEXNORMAL 437 -0.5601 0.6825 0.4696 + *MESH_FACENORMAL 917 -0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 429 -0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 444 -0.3002 0.3658 -0.8810 + *MESH_VERTEXNORMAL 445 -0.3002 0.3658 -0.8810 + *MESH_FACENORMAL 918 -0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 442 -0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 441 -0.4162 0.7786 -0.4696 + *MESH_VERTEXNORMAL 456 -0.4162 0.7786 -0.4696 + *MESH_FACENORMAL 919 -0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 435 -0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 434 -0.2999 0.5611 0.7715 + *MESH_VERTEXNORMAL 449 -0.2999 0.5611 0.7715 + *MESH_FACENORMAL 920 -0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 442 -0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 457 -0.3651 0.6831 -0.6326 + *MESH_VERTEXNORMAL 458 -0.3651 0.6831 -0.6326 + *MESH_FACENORMAL 921 -0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 436 -0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 435 -0.3651 0.6831 0.6326 + *MESH_VERTEXNORMAL 450 -0.3651 0.6831 0.6326 + *MESH_FACENORMAL 922 -0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 443 -0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 458 -0.2999 0.5611 -0.7715 + *MESH_VERTEXNORMAL 459 -0.2999 0.5611 -0.7715 + *MESH_FACENORMAL 923 -0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 436 -0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 451 -0.4162 0.7786 0.4696 + *MESH_VERTEXNORMAL 452 -0.4162 0.7786 0.4696 + *MESH_FACENORMAL 924 -0.2230 0.4173 -0.8810 + *MESH_VERTEXNORMAL 444 -0.2230 0.4173 -0.8810 + *MESH_VERTEXNORMAL 459 -0.2230 0.4173 -0.8810 + *MESH_VERTEXNORMAL 460 -0.2230 0.4173 -0.8810 + *MESH_FACENORMAL 925 -0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 438 -0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 437 -0.4513 0.8443 0.2890 + *MESH_VERTEXNORMAL 452 -0.4513 0.8443 0.2890 + *MESH_FACENORMAL 926 -0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 445 -0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 460 -0.1374 0.2571 -0.9565 + *MESH_VERTEXNORMAL 461 -0.1374 0.2571 -0.9565 + *MESH_FACENORMAL 927 -0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 438 -0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 453 -0.4691 0.8777 0.0976 + *MESH_VERTEXNORMAL 454 -0.4691 0.8777 0.0976 + *MESH_FACENORMAL 928 -0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 439 -0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 454 -0.4691 0.8777 -0.0976 + *MESH_VERTEXNORMAL 455 -0.4691 0.8777 -0.0976 + *MESH_FACENORMAL 929 -0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 433 -0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 432 -0.1374 0.2571 0.9565 + *MESH_VERTEXNORMAL 447 -0.1374 0.2571 0.9565 + *MESH_FACENORMAL 930 -0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 440 -0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 455 -0.4513 0.8443 -0.2890 + *MESH_VERTEXNORMAL 456 -0.4513 0.8443 -0.2890 + *MESH_FACENORMAL 931 -0.2230 0.4173 0.8810 + *MESH_VERTEXNORMAL 434 -0.2231 0.4173 0.8810 + *MESH_VERTEXNORMAL 433 -0.2231 0.4173 0.8810 + *MESH_VERTEXNORMAL 448 -0.2231 0.4173 0.8810 + *MESH_FACENORMAL 932 -0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 461 -0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 460 -0.0846 0.2790 -0.9565 + *MESH_VERTEXNORMAL 475 -0.0846 0.2790 -0.9565 + *MESH_FACENORMAL 933 -0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 453 -0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 468 -0.2889 0.9524 0.0976 + *MESH_VERTEXNORMAL 469 -0.2889 0.9524 0.0976 + *MESH_FACENORMAL 934 -0.2889 0.9524 -0.0976 + *MESH_VERTEXNORMAL 454 -0.2889 0.9524 -0.0975 + *MESH_VERTEXNORMAL 469 -0.2889 0.9524 -0.0975 + *MESH_VERTEXNORMAL 470 -0.2889 0.9524 -0.0975 + *MESH_FACENORMAL 935 -0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 447 -0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 462 -0.0846 0.2790 0.9565 + *MESH_VERTEXNORMAL 463 -0.0846 0.2790 0.9565 + *MESH_FACENORMAL 936 -0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 455 -0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 470 -0.2779 0.9161 -0.2890 + *MESH_VERTEXNORMAL 471 -0.2779 0.9161 -0.2890 + *MESH_FACENORMAL 937 -0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 448 -0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 463 -0.1374 0.4528 0.8810 + *MESH_VERTEXNORMAL 464 -0.1374 0.4528 0.8810 + *MESH_FACENORMAL 938 -0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 457 -0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 456 -0.2563 0.8448 -0.4696 + *MESH_VERTEXNORMAL 471 -0.2563 0.8448 -0.4696 + *MESH_FACENORMAL 939 -0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 449 -0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 464 -0.1847 0.6088 0.7715 + *MESH_VERTEXNORMAL 465 -0.1847 0.6088 0.7715 + *MESH_FACENORMAL 940 -0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 457 -0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 472 -0.2248 0.7412 -0.6326 + *MESH_VERTEXNORMAL 473 -0.2248 0.7412 -0.6326 + *MESH_FACENORMAL 941 -0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 451 -0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 450 -0.2248 0.7412 0.6326 + *MESH_VERTEXNORMAL 465 -0.2248 0.7412 0.6326 + *MESH_FACENORMAL 942 -0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 458 -0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 473 -0.1847 0.6088 -0.7715 + *MESH_VERTEXNORMAL 474 -0.1847 0.6088 -0.7715 + *MESH_FACENORMAL 943 -0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 451 -0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 466 -0.2563 0.8448 0.4696 + *MESH_VERTEXNORMAL 467 -0.2563 0.8448 0.4696 + *MESH_FACENORMAL 944 -0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 459 -0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 474 -0.1374 0.4528 -0.8810 + *MESH_VERTEXNORMAL 475 -0.1374 0.4528 -0.8810 + *MESH_FACENORMAL 945 -0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 453 -0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 452 -0.2779 0.9161 0.2890 + *MESH_VERTEXNORMAL 467 -0.2779 0.9161 0.2890 + *MESH_FACENORMAL 946 -0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 465 -0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 464 -0.0624 0.6332 0.7715 + *MESH_VERTEXNORMAL 2 -0.0624 0.6332 0.7715 + *MESH_FACENORMAL 947 -0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 472 -0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 478 -0.0759 0.7708 -0.6326 + *MESH_VERTEXNORMAL 479 -0.0759 0.7708 -0.6326 + *MESH_FACENORMAL 948 -0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 466 -0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 465 -0.0759 0.7708 0.6326 + *MESH_VERTEXNORMAL 3 -0.0759 0.7708 0.6326 + *MESH_FACENORMAL 949 -0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 473 -0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 479 -0.0624 0.6332 -0.7715 + *MESH_VERTEXNORMAL 9 -0.0624 0.6332 -0.7715 + *MESH_FACENORMAL 950 -0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 467 -0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 466 -0.0865 0.8786 0.4696 + *MESH_VERTEXNORMAL 4 -0.0865 0.8786 0.4696 + *MESH_FACENORMAL 951 -0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 474 -0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 9 -0.0464 0.4709 -0.8810 + *MESH_VERTEXNORMAL 480 -0.0464 0.4709 -0.8810 + *MESH_FACENORMAL 952 -0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 468 -0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 467 -0.0938 0.9527 0.2890 + *MESH_VERTEXNORMAL 5 -0.0938 0.9527 0.2890 + *MESH_FACENORMAL 953 -0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 475 -0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 480 -0.0286 0.2902 -0.9565 + *MESH_VERTEXNORMAL 481 -0.0286 0.2902 -0.9565 + *MESH_FACENORMAL 954 -0.0976 0.9904 0.0976 + *MESH_VERTEXNORMAL 469 -0.0976 0.9904 0.0975 + *MESH_VERTEXNORMAL 468 -0.0976 0.9904 0.0975 + *MESH_VERTEXNORMAL 6 -0.0976 0.9904 0.0975 + *MESH_FACENORMAL 955 -0.0976 0.9904 -0.0975 + *MESH_VERTEXNORMAL 469 -0.0976 0.9904 -0.0976 + *MESH_VERTEXNORMAL 7 -0.0976 0.9904 -0.0976 + *MESH_VERTEXNORMAL 8 -0.0976 0.9904 -0.0976 + *MESH_FACENORMAL 956 -0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 463 -0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 462 -0.0286 0.2902 0.9565 + *MESH_VERTEXNORMAL 0 -0.0286 0.2902 0.9565 + *MESH_FACENORMAL 957 -0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 470 -0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 8 -0.0938 0.9527 -0.2890 + *MESH_VERTEXNORMAL 477 -0.0938 0.9527 -0.2890 + *MESH_FACENORMAL 958 -0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 464 -0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 463 -0.0464 0.4709 0.8810 + *MESH_VERTEXNORMAL 1 -0.0464 0.4709 0.8810 + *MESH_FACENORMAL 959 -0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 472 -0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 471 -0.0865 0.8786 -0.4696 + *MESH_VERTEXNORMAL 477 -0.0865 0.8786 -0.4696 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} \ No newline at end of file diff --git a/install/resources/preview/tiles.ase b/install/resources/preview/tiles.ase new file mode 100644 index 0000000000..5f609d5d7f --- /dev/null +++ b/install/resources/preview/tiles.ase @@ -0,0 +1,122 @@ +*3DSMAX_ASCIIEXPORT 200 +*COMMENT "DarkRadiant ASCII Scene Export(*.ase)" +*SCENE { + *SCENE_FILENAME "unnamed.map" + *SCENE_FIRSTFRAME 0 + *SCENE_LASTFRAME 100 + *SCENE_FRAMESPEED 30 + *SCENE_TICKSPERFRAME 160 + *SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000 + *SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000 +} +*MATERIAL_LIST { + *MATERIAL_COUNT 1 + *MATERIAL 0 { + *MATERIAL_NAME "Plane" + *MATERIAL_CLASS "Standard" + *MATERIAL_AMBIENT 0.5882 0.5882 0.5882 + *MATERIAL_DIFFUSE 0.5882 0.5882 0.5882 + *MATERIAL_SPECULAR 0.9000 0.9000 0.9000 + *MATERIAL_SHINE 0.1000 + *MATERIAL_SHINESTRENGTH 0.0000 + *MATERIAL_TRANSPARENCY 0.0000 + *MATERIAL_WIRESIZE 1.0000 + *MATERIAL_SHADING Blinn + *MATERIAL_XP_FALLOFF 0.0000 + *MATERIAL_SELFILLUM 0.0000 + *MATERIAL_FALLOFF In + *MATERIAL_XP_TYPE Filter + *MAP_DIFFUSE { + *MAP_NAME "Plane" + *MAP_CLASS "Bitmap" + *MAP_SUBNO 1 + *MAP_AMOUNT 1.0000 + *BITMAP "\\base\material" + *MAP_TYPE Screen + *UVW_U_OFFSET 0.0000 + *UVW_V_OFFSET 0.0000 + *UVW_U_TILING 1.0000 + *UVW_V_TILING 1.0000 + *UVW_ANGLE 0.0000 + *UVW_BLUR 1.0000 + *UVW_BLUR_OFFSET 0.0000 + *UVW_NOUSE_AMT 1.0000 + *UVW_NOISE_SIZE 1.0000 + *UVW_NOISE_LEVEL 1 + *UVW_NOISE_PHASE 0.0000 + *BITMAP_FILTER Pyramidal + } + } +} +*GEOMOBJECT { + *NODE_NAME "mesh0" + *NODE_TM { + *NODE_NAME "mesh0" + *INHERIT_POS 0 0 0 + *INHERIT_ROT 0 0 0 + *INHERIT_SCL 0 0 0 + *TM_ROW0 1.0000 0.0000 0.0000 + *TM_ROW1 0.0000 1.0000 0.0000 + *TM_ROW2 0.0000 0.0000 1.0000 + *TM_ROW3 0.0000 0.0000 0.0000 + *TM_POS 0.0000 0.0000 0.0000 + *TM_ROTAXIS 0.0000 0.0000 0.0000 + *TM_ROTANGLE 0.0000 + *TM_SCALE 1.0000 1.0000 1.0000 + *TM_SCALEAXIS 0.0000 0.0000 0.0000 + *TM_SCALEAXISANG 0.0000 + } + *MESH { + *TIMEVALUE 0 + *MESH_NUMVERTEX 4 + *MESH_NUMFACES 2 + *MESH_VERTEX_LIST { + *MESH_VERTEX 0 -105.781 -116 -21.7808 + *MESH_VERTEX 1 105.781 -116 21.7808 + *MESH_VERTEX 2 -105.781 116 -21.7808 + *MESH_VERTEX 3 105.781 116 21.7808 + } + *MESH_FACE_LIST { + *MESH_FACE 0: A: 0 B: 1 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + *MESH_FACE 1: A: 1 B: 3 C: 2 AB: 0 BC: 0 CA: 0 *MESH_SMOOTHING 1 *MESH_MTLID 0 + } + *MESH_NUMTVERTEX 4 + *MESH_TVERTLIST { + *MESH_TVERT 0 0 -0 0.0000 + *MESH_TVERT 1 3 -0 0.0000 + *MESH_TVERT 2 0 -3 0.0000 + *MESH_TVERT 3 3 -3 0.0000 + } + *MESH_NUMTVFACES 2 + *MESH_TFACELIST { + *MESH_TFACE 0 0 1 2 + *MESH_TFACE 1 1 3 2 + } + *MESH_NUMCVERTEX 4 + *MESH_CVERTLIST { + *MESH_VERTCOL 0 1 1 1 + *MESH_VERTCOL 1 1 1 1 + *MESH_VERTCOL 2 1 1 1 + *MESH_VERTCOL 3 1 1 1 + } + *MESH_NUMCVFACES 2 + *MESH_CFACELIST { + *MESH_CFACE 0 0 1 2 + *MESH_CFACE 1 1 3 2 + } + *MESH_NORMALS { + *MESH_FACENORMAL 0 -0.201674 0 0.979453 + *MESH_VERTEXNORMAL 0 -0.201674 0 0.979453 + *MESH_VERTEXNORMAL 1 -0.201674 0 0.979453 + *MESH_VERTEXNORMAL 2 -0.201674 0 0.979453 + *MESH_FACENORMAL 1 -0.201674 0 0.979453 + *MESH_VERTEXNORMAL 1 -0.201674 0 0.979453 + *MESH_VERTEXNORMAL 3 -0.201674 0 0.979453 + *MESH_VERTEXNORMAL 2 -0.201674 0 0.979453 + } + } + *PROP_MOTIONBLUR 0 + *PROP_CASTSHADOW 1 + *PROP_RECVSHADOW 1 + *MATERIAL_REF 0 +} diff --git a/install/ui/materialeditor.fbp b/install/ui/materialeditor.fbp index e85b065507..5ebb6eb307 100644 --- a/install/ui/materialeditor.fbp +++ b/install/ui/materialeditor.fbp @@ -108,7 +108,7 @@ 1 wxSPLIT_VERTICAL - wxSP_3D + wxSP_3D|wxSP_3DBORDER 0 @@ -236,14 +236,14 @@ 12 wxEXPAND|wxLEFT - 2 + 1 bSizer5 wxHORIZONTAL none - 5 + 0 wxEXPAND | wxALL 1 @@ -279,7 +279,7 @@ 0 - -1,120 + -1,200 1 MaterialEditorTreeView 1 @@ -290,7 +290,7 @@ Resizable 1 - + -1,200 0 @@ -307,7 +307,7 @@ 6 - wxEXPAND|wxLEFT|wxRIGHT|wxTOP + wxEXPAND|wxLEFT|wxRIGHT 0 @@ -534,11055 +534,219 @@ - - 6 - wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Material Properties - 0 - - 0 - - - 0 - - 1 - MaterialEditorMaterialPropertiesLabel - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - 12 + 6 wxEXPAND|wxLEFT - 2 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - -1,120 - 1 - MaterialEditorMaterialPropertiesPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer62 - wxVERTICAL - none - - 6 - wxEXPAND|wxRIGHT - 1 - - - bSizer8 - wxVERTICAL - none - - 6 - wxBOTTOM|wxEXPAND - 0 - - 2 - wxBOTH - 1 - - 6 - - fgSizer8 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 6 - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Material: - 0 - - 0 - - - 0 - - 1 - m_staticText571 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialType - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Description: - 0 - - 0 - - - 0 - - 1 - m_staticText57 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxEXPAND|wxLEFT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDescription - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - + 3 + + + bSizer81 + wxVERTICAL + none + + 6 + wxALL|wxBOTTOM|wxEXPAND|wxLEFT|wxTOP + 2 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_notebook3 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + + + Basic + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_panel40 + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL - - 0 - wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_notebook2 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - - - Interaction - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InteractionPage - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer571 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 0 - - 2 - wxBOTH - 0,1 - - 8 - - fgSizer71 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 8 - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - noShadows - - 0 - - - 0 - - 1 - MaterialNoShadows - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - translucent - - 0 - - - 0 - - 1 - MaterialTranslucent - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - noSelfShadows - - 0 - - - 0 - - 1 - MaterialNoSelfShadows - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - noFog - - 0 - - - 0 - - 1 - MaterialNoFog - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - forceShadows - - 0 - - - 0 - - 1 - MaterialForceShadows - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxEXPAND - 1 - - - bSizer51 - wxVERTICAL - none - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - twoSided - - 0 - - - 0 - - 1 - MaterialTwoSided - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - backSided - - 0 - - - 0 - - 1 - MaterialBackSided - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - - bSizer141 - wxHORIZONTAL - none - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - polygonOffset - - 0 - - - 0 - - 1 - MaterialFlagHasPolygonOffset - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - 1 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 0.1 - 0 - 100 - - 0 - - -100 - - 0 - - 1 - MaterialPolygonOffsetValue - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - - - - - - - - - - 5 - wxEXPAND - 1 - - - bSizer1411 - wxHORIZONTAL - none - - - - - - 0 - wxEXPAND - 0 - - - bSizer16121121 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - ambientRimColor - - 0 - - - 0 - - 1 - MaterialRimColor - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 3 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialAmbientRimColorExpression1 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - , - 0 - - 0 - - - 0 - - 1 - m_staticText166141 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 3 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialAmbientRimColorExpression2 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 3 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - , - 0 - - 0 - - - 0 - - 1 - m_staticText1661111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialAmbientRimColorExpression3 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - Surface Flags - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - SurfaceFlagsPage - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer157 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 1 - - 5 - wxBOTH - 0,1,2,3,4 - - 6 - - fgSizer24 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 6 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - solid - - 0 - - - 0 - - 1 - MaterialSurfaceFlagSolid - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - ikclip - - 0 - - - 0 - - 1 - MaterialSurfaceFlagIkclip - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - flashlight_trigger - - 0 - - - 0 - - 1 - MaterialSurfaceFlagFlashlighttrigger - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - discrete - - 0 - - - 0 - - 1 - MaterialSurfaceFlagDiscrete - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - noimpact - - 0 - - - 0 - - 1 - MaterialSurfaceFlagNoimpact - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - water - - 0 - - - 0 - - 1 - MaterialSurfaceFlagWater - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - blood - - 0 - - - 0 - - 1 - MaterialSurfaceFlagBlood - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - nonsolid - - 0 - - - 0 - - 1 - MaterialSurfaceFlagNonsolid - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - noFragment - - 0 - - - 0 - - 1 - MaterialSurfaceFlagNofragment - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - nodamage - - 0 - - - 0 - - 1 - MaterialSurfaceFlagNodamage - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - playerclip - - 0 - - - 0 - - 1 - MaterialSurfaceFlagPlayerclip - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - trigger - - 0 - - - 0 - - 1 - MaterialSurfaceFlagTrigger - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - nullNormal - - 0 - - - 0 - - 1 - MaterialSurfaceFlagNullnormal - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - slick - - 0 - - - 0 - - 1 - MaterialSurfaceFlagSlick - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - ladder - - 0 - - - 0 - - 1 - MaterialSurfaceFlagLadder - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - monsterclip - - 0 - - - 0 - - 1 - MaterialSurfaceFlagMonsterclip - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - aassolid - - 0 - - - 0 - - 1 - MaterialSurfaceFlagAassolid - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - areaPortal - - 0 - - - 0 - - 1 - MaterialSurfaceFlagAreaportal - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - collision - - 0 - - - 0 - - 1 - MaterialSurfaceFlagCollision - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - nosteps - - 0 - - - 0 - - 1 - MaterialSurfaceFlagNosteps - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - moveableclip - - 0 - - - 0 - - 1 - MaterialSurfaceFlagMoveableClip - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - aasobstacle - - 0 - - - 0 - - 1 - MaterialSurfaceFlagAasobstacle - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - qer_nocarve - - 0 - - - 0 - - 1 - MaterialSurfaceFlagQernocarve - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - Light - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - LightPage - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer5711 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 20 - - fgSizer711 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 8 - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - ambientLight - - 0 - - - 0 - - 1 - MaterialIsAmbientLight - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - cubicLight - - 0 - - - 0 - - 1 - MaterialIsCubicLight - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - ambientCubicLight - - 0 - - - 0 - - 1 - MaterialIsAmbientCubicLight - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - blendLight - - 0 - - - 0 - - 1 - MaterialIsBlendLight - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - fogLight - - 0 - - - 0 - - 1 - MaterialIsFogLight - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - noPortalFog - - 0 - - - 0 - - 1 - MaterialFlagNoPortalFog - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - lightFalloffMap - 0 - - 0 - - - 0 - - 1 - m_staticText42 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialLightFalloffMap - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - lightFalloffCubeMap - 0 - - 0 - - - 0 - - 1 - m_staticText421 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialLightFalloffCubeMap - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - spectrum - - 0 - - - 0 - - 1 - MaterialHasSpectrum - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 1 - 99999 - - 0 - - -99999 - - 0 - - 1 - MaterialSpectrumValue - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - 0 - - - - - - - - - - - - - Depth / Clamping - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - DepthPage - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer5712 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 1 - - 2 - wxBOTH - 0,1 - - 8 - - fgSizer712 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 8 - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - forceOpaque - - 0 - - - 0 - - 1 - MaterialFlagForceOpaque - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - mirror - - 0 - - - 0 - - 1 - MaterialFlagMirror - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - clamp - - 0 - - - 0 - - 1 - MaterialFlagClamp - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - zeroClamp - - 0 - - - 0 - - 1 - MaterialFlagZeroClamp - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - alphaZeroClamp - - 0 - - - 0 - - 1 - MaterialFlagAlphaZeroClamp - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxEXPAND - 1 - - - bSizer511 - wxVERTICAL - none - - - - 0 - - 0 - - - bSizer1412 - wxHORIZONTAL - none - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - sort - - 0 - - - 0 - - 1 - MaterialHasSortValue - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialSortValue - 1 - - - protected - 1 - - Resizable - -1 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - Decals - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - DecalPage - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer57121 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - bSizer79 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 0 - - 2 - wxBOTH - 0,1 - - 8 - - fgSizer7121 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 8 - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - noOverlays - - 0 - - - 0 - - 1 - MaterialFlagNoOverlays - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - DECAL_MACRO - - 0 - - - 0 - - 1 - MaterialHasDecalMacro - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - forceOverlays - - 0 - - - 0 - - 1 - MaterialFlagForceOverlays - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - TWOSIDED_DECAL_MACRO - - 0 - - - 0 - - 1 - MaterialHasTwoSidedDecalMacro - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 6 - wxEXPAND|wxRIGHT - 0 - - - bSizer78 - wxHORIZONTAL - none - - 6 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - decalInfo - - 0 - - - 0 - - 1 - MaterialHasDecalInfo - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialDecalInfoPanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - 2 - wxBOTH - 0,1 - - 24 - - fgSizer14 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 8 - - 0 - wxEXPAND - 1 - - - bSizer7811 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Stay: - 0 - - 0 - - - 0 - - 1 - m_staticText4613 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - 2 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 0.1 - 0 - 999999 - - 0 - - 0 - - 0 - - 1 - MaterialEditorDecalInfoStaySeconds - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - secs - 0 - - 0 - - - 0 - - 1 - m_staticText46112 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - 0 - wxEXPAND - 1 - - - bSizer7812 - wxHORIZONTAL - none - - 24 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Fade: - 0 - - 0 - - - 0 - - 1 - m_staticText46122 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - 2 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 0.1 - 0.200000 - 999999 - - 0 - - 0 - - 0 - - 1 - MaterialEditorDecalInfoFadeSeconds - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - secs - 0 - - 0 - - - 0 - - 1 - m_staticText461112 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - 0 - wxEXPAND - 1 - - - bSizer78111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Start RGB: - 0 - - 0 - - - 0 - - 1 - m_staticText46131 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDecalInfoStartRgb - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - 0 - wxEXPAND - 1 - - - bSizer781111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - End RGB: - 0 - - 0 - - - 0 - - 1 - m_staticText461311 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDecalInfoEndRgb - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - Deform - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - DeformPage - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer108 - wxVERTICAL - none - - 6 - wxEXPAND - 0 - - - bSizer109111 - wxHORIZONTAL - none - - 6 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialEditorDeformChoice - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALL - 1 - - - DeformPanels - wxVERTICAL - none - - 0 - wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - DeformFlarePanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer781121 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Size: - 0 - - 0 - - - 0 - - 1 - m_staticText461321 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformFlareSize - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - 0 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - DeformExpandPanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer7811211 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Amount: - 0 - - 0 - - - 0 - - 1 - m_staticText4613211 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformExpandAmount - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - 0 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - DeformMovePanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer78112111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Amount: - 0 - - 0 - - - 0 - - 1 - m_staticText46132111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformMoveAmount - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - 0 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - DeformTurbulentPanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer82 - wxVERTICAL - none - - 0 - wxEXPAND - 0 - - 2 - wxBOTH - 1 - - 6 - - fgSizer161 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 6 - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Table: - 0 - - 0 - - - 0 - - 1 - m_staticText46132111111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformTurbulentTableName - 1 - - - protected - 1 - - Resizable - 1 - 60,-1 - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Range: - 0 - - 0 - - - 0 - - 1 - m_staticText4613211111112 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformTurbulentRange - 1 - - - protected - 1 - - Resizable - 1 - 40,-1 - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Time Offset: - 0 - - 0 - - - 0 - - 1 - m_staticText4613211111111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformTurbulentTimeOffset - 1 - - - protected - 1 - - Resizable - 1 - 40,-1 - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Domain: - 0 - - 0 - - - 0 - - 1 - m_staticText461321111111111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformTurbulentDomain - 1 - - - protected - 1 - - Resizable - 1 - 40,-1 - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - 0 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - DeformParticlePanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer7811211111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Particle Def: - 0 - - 0 - - - 0 - - 1 - m_staticText4613211111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformParticleDeclName - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - 0 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - DeformParticle2Panel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer78112111112 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Particle Def: - 0 - - 0 - - - 0 - - 1 - m_staticText46132111112 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialDeformParticle2DeclName - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - Misc - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MiscPage - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer1081 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 20 - - fgSizer7111 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 8 - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - renderBump - - 0 - - - 0 - - 1 - MaterialHasRenderBump - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialRenderBumpArguments - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - renderBumpFlat - - 0 - - - 0 - - 1 - MaterialHasRenderBumpFlat - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialRenderBumpFlatArguments - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - isLightgemSurf - - 0 - - - 0 - - 1 - MaterialFlagIsLightGemSurf - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 3 - wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - unsmoothedTangents - - 0 - - - 0 - - 1 - MaterialFlagUnsmoothedTangents - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - GLASS_MACRO - - 0 - - - 0 - - 1 - MaterialHasGlassMacro - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 3 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - PARTICLE_MACRO - - 0 - - - 0 - - 1 - MaterialHasParticleMacro - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 3 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - guisurf - - 0 - - - 0 - - 1 - MaterialHasGuiSurf - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialGuiSurfPanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer76 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - GUI Path: - - 0 - - - 0 - - 1 - MaterialGuiSurfRegular - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialGuiSurfPath - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - entity - - 0 - - - 0 - - 1 - MaterialGuiSurfEntity - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - entity2 - - 0 - - - 0 - - 1 - MaterialGuiSurfEntity2 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - entity3 - - 0 - - - 0 - - 1 - MaterialGuiSurfEntity3 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - - - - - - - - - - - - - - 0 - wxEXPAND|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialEditorStageListPanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer60 - wxVERTICAL - none - - 6 - wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Material Stages - 0 - - 0 - - - 0 - - 1 - MaterialEditorMaterialStagesLabel - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 12 - wxEXPAND|wxLEFT - 1 - - - bSizer92 - wxHORIZONTAL - none - - 0 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialEditorStageView - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer103 - wxVERTICAL - none - - - - - 6 - wxEXPAND|wxLEFT|wxRIGHT - 0 - - - bSizer9 - wxVERTICAL - none - - 6 - wxBOTTOM|wxEXPAND - 1 - - - bSizer11 - wxHORIZONTAL - none - - 6 - wxRIGHT - 1 - - - bSizer61 - wxVERTICAL - none - - 0 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Add - - 0 - - 0 - - - 0 - - 1 - MaterialEditorAddStageButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxTOP|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Remove - - 0 - - 0 - - - 0 - - 1 - MaterialEditorRemoveStageButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxTOP|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Toggle Visibility - - 0 - - 0 - - - 0 - - 1 - MaterialEditorToggleStageButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 0 - - 1 - - - bSizer621 - wxVERTICAL - none - - 0 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Up - - 0 - - 0 - - - 0 - - 1 - MaterialEditorMoveUpStageButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxTOP|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Down - - 0 - - 0 - - - 0 - - 1 - MaterialEditorMoveDownStageButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxTOP|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Duplicate - - 0 - - 0 - - - 0 - - 1 - MaterialEditorDuplicateStageButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - 0 - wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialEditorStageSettingsPanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer91 - wxVERTICAL - none - - 6 - wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Stage Settings - 0 - - 0 - - - 0 - - 1 - MaterialEditorStageSettingsLabel - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 12 - wxEXPAND|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialEditorSettingsNotebook - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - - - Blending - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - BlendPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer26 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 12 - - fgSizer1 - wxFLEX_GROWMODE_SPECIFIED - none - 7 - 6 - - 5 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Blend: - 0 - - 0 - - - 0 - - 1 - m_staticText8 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 0 - wxEXPAND - 1 - - - bSizer73 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialStageBlendType - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Source: - 0 - - 0 - - - 0 - - 1 - m_staticText60 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialStageBlendTypeSrc - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Dest: - 0 - - 0 - - - 0 - - 1 - m_staticText601 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialStageBlendTypeDest - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Image Map: - 0 - - 0 - - - 0 - - 1 - m_staticText9 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 0 - wxEXPAND - 1 - - - bSizer93 - wxHORIZONTAL - none - - 6 - wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialStageMapType - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageImageMap - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Mask: - 0 - - 0 - - - 0 - - 1 - m_staticText10 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 0 - wxEXPAND - 1 - - - bSizer15 - wxHORIZONTAL - none - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Red - - 0 - - - 0 - - 1 - MaterialStageFlagMaskRed - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Green - - 0 - - - 0 - - 1 - MaterialStageFlagMaskGreen - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Blue - - 0 - - - 0 - - 1 - MaterialStageFlagMaskBlue - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Alpha - - 0 - - - 0 - - 1 - MaterialStageFlagMaskAlpha - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Colour - - 0 - - - 0 - - 1 - MaterialStageFlagMaskColour - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Depth - - 0 - - - 0 - - 1 - MaterialStageFlagMaskDepth - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Alphatest: - - 0 - - - 0 - - 1 - MaterialStageHasAlphaTest - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 0 - - fgSizer16 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 0 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - 1 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 0.1 - 0 - 1 - - 0 - - 0 - - 0 - - 1 - MaterialStageAlphaTestValue - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT - 0 - - - bSizer16 - wxHORIZONTAL - none - - 24 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Private Polygon Offset: - 0 - - 0 - - - 0 - - 1 - m_staticText111 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 6 - wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - 1 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 0.1 - 0 - 9999 - - 0 - - -9999 - - 0 - - 1 - MaterialStagePrivatePolygonOffset - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - - bSizer95 - wxVERTICAL - none - - 6 - wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Depth Function: - 0 - - 0 - - - 0 - - 1 - m_staticText96 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - 5 - wxEXPAND - 1 - - - bSizer161 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - ignoreAlphaTest - - 0 - - - 0 - - 1 - MaterialStageIgnoreAlphaTest - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - ignoreDepth - - 0 - - - 0 - - 1 - MaterialStageIgnoreDepth - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - Special Map - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 + + + + Advanced + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_panel38 + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + - 1 - SpecialMapPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer261 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 0 - - 2 - wxBOTH - 1 - - 12 - - fgSizer11 - wxFLEX_GROWMODE_SPECIFIED - none - 7 - 6 - - 3 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No special map - - 0 - - - 0 - - 1 - MaterialStageMapTypeNotSpecial - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 6 - wxALL|wxEXPAND - 1 - - - bSizer94 - wxVERTICAL - none - - - - - - 6 - wxEXPAND|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialStageSpecialMapPanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - 2 + bSizer79 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 1 + + + bSizer781 + wxVERTICAL + none + + 6 + wxBOTTOM|wxEXPAND + 0 + + 4 wxBOTH - 1 + 3 - 12 + 6 - fgSizer113 + fgSizer8 wxFLEX_GROWMODE_SPECIFIED none - 7 + 0 6 - + 0 wxALIGN_CENTER_VERTICAL|wxALL 0 - + 1 1 1 @@ -11601,191 +765,49 @@ 1 0 Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - videoMap - - 0 - - - 0 - - 1 - MaterialStageVideoMap - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxEXPAND - 1 - - - bSizer86 - wxHORIZONTAL - none - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageVideoMapFile - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Loop - - 0 - - - 0 - - 1 - MaterialStageVideoMapLoop - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Material: + 0 + + 0 + + + 0 + + 1 + m_staticText571 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 - + 0 - wxALIGN_CENTER_VERTICAL|wxALL + wxALIGN_CENTER_VERTICAL 0 - + 1 1 1 @@ -11799,6 +821,7 @@ 1 0 + 1 1 @@ -11813,7 +836,6 @@ 0 0 wxID_ANY - soundMap 0 @@ -11821,7 +843,7 @@ 0 1 - MaterialStageSoundMap + MaterialType 1 @@ -11829,6 +851,7 @@ 1 Resizable + 0 1 @@ -11839,17 +862,16 @@ wxFILTER_NONE wxDefaultValidator - 0 - - 3 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + + 0 + wxALIGN_CENTER_VERTICAL|wxALL 0 - + 1 1 1 @@ -11863,7 +885,6 @@ 1 0 - 0 1 1 @@ -11878,7 +899,8 @@ 0 0 wxID_ANY - Waveform + Description: + 0 0 @@ -11886,7 +908,7 @@ 0 1 - MaterialStageSoundMapWaveform + m_staticText57 1 @@ -11900,20 +922,17 @@ ; ; forward_declare 0 - - wxFILTER_NONE - wxDefaultValidator - + -1 - + 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - + wxEXPAND|wxLEFT + 1 + 1 1 1 @@ -11941,15 +960,15 @@ 0 0 wxID_ANY - remoteRenderMap 0 + 0 1 - MaterialStageRemoteRenderMap + MaterialDescription 1 @@ -11967,274 +986,28 @@ wxFILTER_NONE wxDefaultValidator - 0 + - - 0 - wxALIGN_CENTER_VERTICAL|wxEXPAND - 1 - - - bSizer861 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Width: - 0 - - 0 - - - 0 - - 1 - m_staticText87 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 0 - 9999 - - 0 - - 0 - - 0 - - 1 - MaterialStageRemoteRenderMapWidth - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - - - - - - - - 12 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Height: - 0 - - 0 - - - 0 - - 1 - m_staticText88 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 0 - 9999 - - 0 - - 0 - - 0 - - 1 - MaterialStageRemoteRenderMapHeight - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - - - - - - - - - + + + + 0 + wxEXPAND + 1 + + + bSizer82 + wxHORIZONTAL + none + 0 - wxALIGN_CENTER_VERTICAL|wxALL + wxEXPAND|wxLEFT 0 - + 1 1 1 @@ -12262,7 +1035,6 @@ 0 0 wxID_ANY - mirrorRenderMap 0 @@ -12270,7 +1042,7 @@ 0 1 - MaterialStageMirrorRenderMap + MaterialEditorStageListPanel 1 @@ -12280,218 +1052,619 @@ Resizable 1 - ; ; forward_declare 0 - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - 5 - wxEXPAND - 1 - - - bSizer8611 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Width: - 0 - - 0 - - - 0 - - 1 - m_staticText871 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 0 - 9999 - - 0 - - 0 - - 0 - - 1 - MaterialStageMirrorRenderMapWidth - 1 - - - protected - 1 - - Resizable - 1 - - wxSP_ARROW_KEYS - ; ; forward_declare - 0 - - - - - + wxTAB_TRAVERSAL + + + bSizer60 + wxVERTICAL + none + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Material Stages + 0 + + 0 + + + 0 + + 1 + MaterialEditorMaterialStagesLabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + - - - 12 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Height: - 0 - - 0 - - - 0 - - 1 - m_staticText881 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 + + 0 + wxEXPAND|wxLEFT + 1 + + + bSizer92 + wxVERTICAL + none + + 6 + wxBOTTOM|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + -1,-1 + 1 + MaterialEditorStageView + 1 + + + protected + 1 + + Resizable + 1 + -1,-1 + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer103 + wxVERTICAL + none + + + + + 0 + wxEXPAND + 0 + + 2 + wxBOTH + 0,1 + + 6 + + fgSizer17 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 0 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Add + + 0 + + 0 + + + 0 + + 1 + MaterialEditorAddStageButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Up + + 0 + + 0 + + + 0 + + 1 + MaterialEditorMoveUpStageButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxTOP|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Remove + + 0 + + 0 + + + 0 + + 1 + MaterialEditorRemoveStageButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxTOP|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Down + + 0 + + 0 + + + 0 + + 1 + MaterialEditorMoveDownStageButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxTOP|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Toggle + + 0 + + 0 + + + 0 + + 1 + MaterialEditorToggleStageButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxTOP|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Duplicate + + 0 + + 0 + + + 0 + + 1 + MaterialEditorDuplicateStageButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + 6 + wxEXPAND|wxLEFT + 1 + + + bSizer77 + wxVERTICAL + none 0 - wxALIGN_CENTER_VERTICAL - 0 - + wxEXPAND | wxALL + 1 + 1 1 1 @@ -12519,17 +1692,14 @@ 0 0 wxID_ANY - 0 - 9999 0 - 0 0 - + -1,120 1 - MaterialStageMirrorRenderMapHeight + MaterialEditorStageSettingsPanel 1 @@ -12539,667 +1709,13595 @@ Resizable 1 - wxSP_ARROW_KEYS - ; ; forward_declare + 0 - - - - - - - - - - - - - - - Texture - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - TexturePanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer89 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 12 - - fgSizer1131 - wxFLEX_GROWMODE_SPECIFIED - none - 7 - 6 - - 0 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - texGen: - 0 - - 0 - - - 0 - - 1 - m_staticText102 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxEXPAND - 1 - - - bSizer90 - wxHORIZONTAL - none - - 0 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialStageTexGenType - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 0 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialStageWobblySkyPanel - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer911 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - x: - 0 - - 0 - - - 0 - - 1 - m_staticText91 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxALIGN_CENTER_VERTICAL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageWobbleSkyX - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - y: - 0 - - 0 - - - 0 - - 1 - m_staticText92 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageWobbleSkyY - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - z: - 0 - - 0 - - - 0 - - 1 - m_staticText93 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 + wxTAB_TRAVERSAL + + + bSizer62 + wxVERTICAL + none + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Global Material Settings + 0 + + 0 + + + 0 + + 1 + MaterialEditorStagePropertiesLabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + - - - 0 - wxALIGN_CENTER_VERTICAL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageWobbleSkyZ - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - + + 6 + wxEXPAND + 1 + + + bSizer8 + wxVERTICAL + none + + 0 + wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageSettingsNotebook + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + + + Interaction + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialPageInteraction + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer571 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 0 + + 2 + wxBOTH + 1 + + 12 + + fgSizer191 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 6 + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Clamping: + 0 + + 0 + + + 0 + + 1 + m_staticText901 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialClampType + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Culling: + 0 + + 0 + + + 0 + + 1 + m_staticText64 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialCullType + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + polygonOffset: + + 0 + + + 0 + + 1 + MaterialFlagHasPolygonOffset + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 1 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + 0.1 + 0.300000 + 100 + + 0 + + -100 + + 0 + + 1 + MaterialPolygonOffsetValue + 1 + + + protected + 1 + + Resizable + 1 + 70,-1 + wxSP_ARROW_KEYS + ; ; forward_declare + 0 + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + sort: + + 0 + + + 0 + + 1 + MaterialHasSortValue + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialSortValue + 1 + + + protected + 1 + + Resizable + -1 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Shadow Casting: + 0 + + 0 + + + 0 + + 1 + m_staticText65 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL + 1 + + + bSizer85 + wxVERTICAL + none + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + noShadows + + 0 + + + 0 + + 1 + MaterialNoShadows + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + noSelfShadow + + 0 + + + 0 + + 1 + MaterialNoSelfShadow + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + forceShadows + + 0 + + + 0 + + 1 + MaterialForceShadows + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Coverage: + 0 + + 0 + + + 0 + + 1 + m_staticText661 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + + 1 + + + bSizer86 + wxVERTICAL + none + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + translucent + + 0 + + + 0 + + 1 + MaterialTranslucent + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + Blended with Background + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + forceOpaque + + 0 + + + 0 + + 1 + MaterialFlagForceOpaque + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + Completely fills the triangle + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + mirror + + 0 + + + 0 + + 1 + MaterialFlagMirror + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + Equivalent to "sort subview" and "forceOpaque" + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Fogging: + 0 + + 0 + + + 0 + + 1 + m_staticText67 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + noFog + + 0 + + + 0 + + 1 + MaterialNoFog + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + When checked, this surface does not create fog interactions + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + Light + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialPageLight + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer5711 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 1 + + 2 + wxBOTH + 1 + + 12 + + fgSizer20 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 6 + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Light Flags: + 0 + + 0 + + + 0 + + 1 + m_staticText68 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxBOTTOM|wxEXPAND|wxTOP + 1 + + 2 + wxBOTH + 1 + + 20 + + fgSizer711 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 8 + + 0 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + ambientLight + + 0 + + + 0 + + 1 + MaterialIsAmbientLight + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + cubicLight + + 0 + + + 0 + + 1 + MaterialIsCubicLight + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + ambientCubicLight + + 0 + + + 0 + + 1 + MaterialIsAmbientCubicLight + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + blendLight + + 0 + + + 0 + + 1 + MaterialIsBlendLight + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + fogLight + + 0 + + + 0 + + 1 + MaterialIsFogLight + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + noPortalFog + + 0 + + + 0 + + 1 + MaterialFlagNoPortalFog + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + LightFalloff Map: + 0 + + 0 + + + 0 + + 1 + m_staticText42 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialLightFalloffMap + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + LightFalloff Type: + 0 + + 0 + + + 0 + + 1 + m_staticText69 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialLightFalloffCubeMapType + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Spectrum: + + 0 + + + 0 + + 1 + MaterialHasSpectrum + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + 1 + 99999 + + 0 + + -99999 + + 0 + + 1 + MaterialSpectrumValue + 1 + + + protected + 1 + + Resizable + 1 + + wxSP_ARROW_KEYS + ; ; forward_declare + 0 + + 0 + + + + + + + + + + + + + Surface Flags + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialPageSurfaceFlags + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer157 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 1 + + 5 + wxBOTH + 0,1,2,3,4 + + 6 + + fgSizer24 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 3 + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + solid + + 0 + + + 0 + + 1 + MaterialSurfaceFlagSolid + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + ikclip + + 0 + + + 0 + + 1 + MaterialSurfaceFlagIkclip + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + flashlight_trigger + + 0 + + + 0 + + 1 + MaterialSurfaceFlagFlashlighttrigger + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + discrete + + 0 + + + 0 + + 1 + MaterialSurfaceFlagDiscrete + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + noimpact + + 0 + + + 0 + + 1 + MaterialSurfaceFlagNoimpact + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + water + + 0 + + + 0 + + 1 + MaterialSurfaceFlagWater + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + blood + + 0 + + + 0 + + 1 + MaterialSurfaceFlagBlood + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + nonsolid + + 0 + + + 0 + + 1 + MaterialSurfaceFlagNonsolid + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + noFragment + + 0 + + + 0 + + 1 + MaterialSurfaceFlagNofragment + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + nodamage + + 0 + + + 0 + + 1 + MaterialSurfaceFlagNodamage + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + playerclip + + 0 + + + 0 + + 1 + MaterialSurfaceFlagPlayerclip + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + trigger + + 0 + + + 0 + + 1 + MaterialSurfaceFlagTrigger + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + nullNormal + + 0 + + + 0 + + 1 + MaterialSurfaceFlagNullnormal + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + slick + + 0 + + + 0 + + 1 + MaterialSurfaceFlagSlick + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + ladder + + 0 + + + 0 + + 1 + MaterialSurfaceFlagLadder + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + monsterclip + + 0 + + + 0 + + 1 + MaterialSurfaceFlagMonsterclip + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + aassolid + + 0 + + + 0 + + 1 + MaterialSurfaceFlagAassolid + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + areaPortal + + 0 + + + 0 + + 1 + MaterialSurfaceFlagAreaportal + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + collision + + 0 + + + 0 + + 1 + MaterialSurfaceFlagCollision + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + nosteps + + 0 + + + 0 + + 1 + MaterialSurfaceFlagNosteps + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + moveableclip + + 0 + + + 0 + + 1 + MaterialSurfaceFlagMoveableClip + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + aasobstacle + + 0 + + + 0 + + 1 + MaterialSurfaceFlagAasobstacle + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + qer_nocarve + + 0 + + + 0 + + 1 + MaterialSurfaceFlagQernocarve + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + Decals + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialPageDecals + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer57121 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizer791 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 0 + + 2 + wxBOTH + 0,1 + + 8 + + fgSizer7121 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 8 + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + noOverlays + + 0 + + + 0 + + 1 + MaterialFlagNoOverlays + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + DECAL_MACRO + + 0 + + + 0 + + 1 + MaterialHasDecalMacro + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + forceOverlays + + 0 + + + 0 + + 1 + MaterialFlagForceOverlays + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + TWOSIDED_DECAL_MACRO + + 0 + + + 0 + + 1 + MaterialHasTwoSidedDecalMacro + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 6 + wxEXPAND|wxRIGHT + 0 + + + bSizer78 + wxHORIZONTAL + none + + 6 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + decalInfo + + 0 + + + 0 + + 1 + MaterialHasDecalInfo + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialDecalInfoPanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + 2 + wxBOTH + 0,1 + + 24 + + fgSizer14 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 8 + + 0 + wxEXPAND + 1 + + + bSizer7811 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Stay: + 0 + + 0 + + + 0 + + 1 + m_staticText4613 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 2 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + 0.1 + 0.100000 + 999999 + + 0 + + 0 + + 0 + + 1 + MaterialEditorDecalInfoStaySeconds + 1 + + + protected + 1 + + Resizable + 1 + + wxSP_ARROW_KEYS + ; ; forward_declare + 0 + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + secs + 0 + + 0 + + + 0 + + 1 + m_staticText46112 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + + + 0 + wxEXPAND + 1 + + + bSizer7812 + wxHORIZONTAL + none + + 24 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Fade: + 0 + + 0 + + + 0 + + 1 + m_staticText46122 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 2 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + 0.1 + 0.200000 + 999999 + + 0 + + 0 + + 0 + + 1 + MaterialEditorDecalInfoFadeSeconds + 1 + + + protected + 1 + + Resizable + 1 + + wxSP_ARROW_KEYS + ; ; forward_declare + 0 + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + secs + 0 + + 0 + + + 0 + + 1 + m_staticText461112 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + + + 0 + wxEXPAND + 1 + + + bSizer78111 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Start RGB: + 0 + + 0 + + + 0 + + 1 + m_staticText46131 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDecalInfoStartRgb + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + 0 + wxEXPAND + 1 + + + bSizer781111 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + End RGB: + 0 + + 0 + + + 0 + + 1 + m_staticText461311 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDecalInfoEndRgb + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + Deform + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialPageDeform + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer108 + wxVERTICAL + none + + 6 + wxEXPAND + 0 + + + bSizer109111 + wxHORIZONTAL + none + + 6 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialEditorDeformChoice + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALL + 1 + + + DeformPanels + wxVERTICAL + none + + 0 + wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + DeformFlarePanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer781121 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Size: + 0 + + 0 + + + 0 + + 1 + m_staticText461321 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformFlareSize + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + 0 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + DeformExpandPanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer7811211 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Amount: + 0 + + 0 + + + 0 + + 1 + m_staticText4613211 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformExpandAmount + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + 0 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + DeformMovePanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer78112111 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Amount: + 0 + + 0 + + + 0 + + 1 + m_staticText46132111 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformMoveAmount + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + 0 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + DeformTurbulentPanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer821 + wxVERTICAL + none + + 0 + wxEXPAND + 0 + + 2 + wxBOTH + 1 + + 6 + + fgSizer161 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 6 + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Table: + 0 + + 0 + + + 0 + + 1 + m_staticText46132111111 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformTurbulentTableName + 1 + + + protected + 1 + + Resizable + 1 + 60,-1 + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Range: + 0 + + 0 + + + 0 + + 1 + m_staticText4613211111112 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformTurbulentRange + 1 + + + protected + 1 + + Resizable + 1 + 40,-1 + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Time Offset: + 0 + + 0 + + + 0 + + 1 + m_staticText4613211111111 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformTurbulentTimeOffset + 1 + + + protected + 1 + + Resizable + 1 + 40,-1 + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Domain: + 0 + + 0 + + + 0 + + 1 + m_staticText461321111111111 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformTurbulentDomain + 1 + + + protected + 1 + + Resizable + 1 + 40,-1 + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + 0 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + DeformParticlePanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer7811211111 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Particle Def: + 0 + + 0 + + + 0 + + 1 + m_staticText4613211111 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformParticleDeclName + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + 0 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + DeformParticle2Panel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer78112111112 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Particle Def: + 0 + + 0 + + + 0 + + 1 + m_staticText46132111112 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialDeformParticle2DeclName + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + Misc + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialPageMisc + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer1081 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 1 + + 2 + wxBOTH + 1 + + 20 + + fgSizer7111 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 8 + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + renderBump + + 0 + + + 0 + + 1 + MaterialHasRenderBump + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialRenderBumpArguments + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + renderBumpFlat + + 0 + + + 0 + + 1 + MaterialHasRenderBumpFlat + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialRenderBumpFlatArguments + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + isLightgemSurf + + 0 + + + 0 + + 1 + MaterialFlagIsLightGemSurf + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 3 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + unsmoothedTangents + + 0 + + + 0 + + 1 + MaterialFlagUnsmoothedTangents + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + GLASS_MACRO + + 0 + + + 0 + + 1 + MaterialHasGlassMacro + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 3 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + PARTICLE_MACRO + + 0 + + + 0 + + 1 + MaterialHasParticleMacro + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 3 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + guisurf + + 0 + + + 0 + + 1 + MaterialHasGuiSurf + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialGuiSurfPanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer76 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + GUI Path: + + 0 + + + 0 + + 1 + MaterialGuiSurfRegular + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialGuiSurfPath + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + entity + + 0 + + + 0 + + 1 + MaterialGuiSurfEntity + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + entity2 + + 0 + + + 0 + + 1 + MaterialGuiSurfEntity2 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + entity3 + + 0 + + + 0 + + 1 + MaterialGuiSurfEntity3 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + ambientRimColor + + 0 + + + 0 + + 1 + MaterialRimColor + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxEXPAND + 0 + + + bSizer16121121 + wxHORIZONTAL + none + + 3 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialAmbientRimColorExpression1 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + , + 0 + + 0 + + + 0 + + 1 + m_staticText166141 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 3 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialAmbientRimColorExpression2 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 3 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + , + 0 + + 0 + + + 0 + + 1 + m_staticText1661111 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxALIGN_CENTER_VERTICAL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialAmbientRimColorExpression3 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + Blending + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StagePageBlending + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer26 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 0 + + 2 + wxBOTH + 1 + + 12 + + fgSizer1 + wxFLEX_GROWMODE_SPECIFIED + none + 8 + 6 + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Image Map: + 0 + + 0 + + + 0 + + 1 + m_staticText9 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 0 + wxEXPAND + 1 + + + bSizer93 + wxHORIZONTAL + none + + 0 + + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageImageMap + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + 5 + wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Blend: + 0 + + 0 + + + 0 + + 1 + m_staticText8 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 0 + wxEXPAND + 1 + + + bSizer73 + wxVERTICAL + none + + 6 + wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + 30,-1 + 1 + MaterialStageBlendType + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Function: + 0 + + 0 + + + 0 + + 1 + m_staticText81 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 0 + wxEXPAND + 0 + + + bSizer803 + wxHORIZONTAL + none + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Source: + 0 + + 0 + + + 0 + + 1 + m_staticText60 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageBlendTypeSrc + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Dest: + 0 + + 0 + + + 0 + + 1 + m_staticText601 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageBlendTypeDest + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Map Type: + 0 + + 0 + + + 0 + + 1 + m_staticText94 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer78 + wxHORIZONTAL + none + + 6 + wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageMapType + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL + 1 + + + bSizer792 + wxVERTICAL + none + + 3 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + Waveform + + 0 + + + 0 + + 1 + MaterialStageSoundMapWaveform + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageRenderMapPanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer8611 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Width: + 0 + + 0 + + + 0 + + 1 + m_staticText871 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + 0 + 9999 + + 0 + + 0 + + 0 + + 1 + MaterialStageRenderMapWidth + 1 + + + protected + 1 + + Resizable + 1 + + wxSP_ARROW_KEYS + ; ; forward_declare + 0 + + + + + + + + + 12 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Height: + 0 + + 0 + + + 0 + + 1 + m_staticText881 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + 0 + 9999 + + 0 + + 0 + + 0 + + 1 + MaterialStageRenderMapHeight + 1 + + + protected + 1 + + Resizable + 1 + + wxSP_ARROW_KEYS + ; ; forward_declare + 0 + + + + + + + + + + + + 3 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + Loop + + 0 + + + 0 + + 1 + MaterialStageVideoMapLoop + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Alphatest: + 0 + + 0 + + + 0 + + 1 + m_staticText62 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageAlphaTestExpression + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + 6 + wxEXPAND|wxLEFT|wxRIGHT + 0 + + 2 + wxBOTH + 1 + + 12 + + fgSizer181 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 6 + + 6 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Mask: + 0 + + 0 + + + 0 + + 1 + m_staticText10 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL + 1 + + + bSizer15 + wxHORIZONTAL + none + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Red + + 0 + + + 0 + + 1 + MaterialStageFlagMaskRed + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Green + + 0 + + + 0 + + 1 + MaterialStageFlagMaskGreen + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Blue + + 0 + + + 0 + + 1 + MaterialStageFlagMaskBlue + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Alpha + + 0 + + + 0 + + 1 + MaterialStageFlagMaskAlpha + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Colour + + 0 + + + 0 + + 1 + MaterialStageFlagMaskColour + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Depth + + 0 + + + 0 + + 1 + MaterialStageFlagMaskDepth + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Private Polygon Offset: + 0 + + 0 + + + 0 + + 1 + m_staticText111 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 6 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 1 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + 0.1 + 0.100000 + 9999 + + 0 + + -9999 + + 0 + + 1 + MaterialStagePrivatePolygonOffset + 1 + + + protected + 1 + + Resizable + 1 + + wxSP_ARROW_KEYS + ; ; forward_declare + 0 + + + + + + + + + 6 + wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Depth Function: + 0 + + 0 + + + 0 + + 1 + m_staticText96 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer161 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + ignoreAlphaTest + + 0 + + + 0 + + 1 + MaterialStageIgnoreAlphaTest + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + ignoreDepth + + 0 + + + 0 + + 1 + MaterialStageIgnoreDepth + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + Texture + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StagePageTexture + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer89 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 1 + + 2 + wxBOTH + 1 + + 12 + + fgSizer1131 + wxFLEX_GROWMODE_SPECIFIED + none + 7 + 6 + + 0 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + texGen: + 0 + + 0 + + + 0 + + 1 + m_staticText102 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxEXPAND + 1 + + + bSizer90 + wxHORIZONTAL + none + + 0 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageTexGenType + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 0 + + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageWobblySkyPanel + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer911 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + x: + 0 + + 0 + + + 0 + + 1 + m_staticText91 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + -1,-1 + + + 0 + + 1 + MaterialStageWobbleSkyX + 1 + + + protected + 1 + + Resizable + 1 + 80,-1 + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + y: + 0 + + 0 + + + 0 + + 1 + m_staticText92 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + -1,-1 + + + 0 + + 1 + MaterialStageWobbleSkyY + 1 + + + protected + 1 + + Resizable + 1 + 80,-1 + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + z: + 0 + + 0 + + + 0 + + 1 + m_staticText93 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + -1,-1 + + + 0 + + 1 + MaterialStageWobbleSkyZ + 1 + + + protected + 1 + + Resizable + 1 + 80,-1 + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Clamping: + 0 + + 0 + + + 0 + + 1 + m_staticText90 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxBOTTOM|wxEXPAND|wxTOP + 0 + + + bSizer96 + wxHORIZONTAL + none + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageClampType + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Filtering: + 0 + + 0 + + + 0 + + 1 + m_staticText1021 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxBOTTOM|wxEXPAND|wxTOP + 0 + + + bSizer962 + wxHORIZONTAL + none + + 12 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + nearest + + 0 + + + 0 + + 1 + MaterialStageFilterNearest + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 12 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + linear + + 0 + + + 0 + + 1 + MaterialStageFilterLinear + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Compression: + 0 + + 0 + + + 0 + + 1 + m_staticText10211 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxBOTTOM|wxEXPAND|wxRIGHT|wxTOP + 0 + + + bSizer963 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + highquality + + 0 + + + 0 + + 1 + MaterialStageHighQuality + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + forceHighQuality + + 0 + + + 0 + + 1 + MaterialStageForceHighQuality + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + nopicmip + + 0 + + + 0 + + 1 + MaterialStageNoPicMip + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + Transform + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StagePageTransform + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer2612 + wxVERTICAL + none + + 0 + wxEXPAND + 0 + + 2 + wxBOTH + 1 + + 0 + + fgSizer19 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 6 + wxALL|wxEXPAND + 0 + + + bSizer802 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Add Transformation: + 0 + + 0 + + + 0 + + 1 + m_staticText66 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageAddTransformChoice + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Add + + 0 + + 0 + + + 0 + + 1 + MaterialStageAddTransformButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Remove Selected + + 0 + + 0 + + + 0 + + 1 + MaterialStageRemoveTransformButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 6 + wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageTransformations + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer801 + wxVERTICAL + none + + + + + + + + + Vertex Colour + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StagePageVertexColour + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer26121 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizer158 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 0 + + + bSizer16221 + wxHORIZONTAL + none + + 3 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No Vertex Color + + 0 + + + 0 + + 1 + MaterialStageNoVertexColourFlag + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 3 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + vertexColor + + 0 + + + 0 + + 1 + MaterialStageVertexColourFlag + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 3 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + inverseVertexColor + + 0 + + + 0 + + 1 + MaterialStageInverseVertexColourFlag + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 24 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + colored + + 0 + + + 0 + + 1 + MaterialStageColored + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + Shortcut for "color parm0, parm1, parm2, parm3" + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 6 + wxALL|wxEXPAND + 0 + + 2 + wxBOTH + 1 + + 6 + + fgSizer18 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 6 + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Red: + 0 + + 0 + + + 0 + + 1 + m_staticText166 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxEXPAND|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageRed + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Green: + 0 + + 0 + + + 0 + + 1 + m_staticText1661 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxEXPAND|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageGreen + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Blue: + 0 + + 0 + + + 0 + + 1 + m_staticText16611 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxEXPAND|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageBlue + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Alpha: + 0 + + 0 + + + 0 + + 1 + m_staticText16612 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 6 + wxEXPAND|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageAlpha + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + Condition + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StagePageCondition + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer261211 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 1 + + 2 + wxBOTH + 1 + + 12 + + fgSizer11211 + wxFLEX_GROWMODE_SPECIFIED + none + 7 + 6 + + 6 + wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Enable this stage if: + 0 + + 0 + + + 0 + + 1 + MaterialEditorStageRadialSpeedLabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 0 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageCondition + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + Program + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StagePagePrograms + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer2612111 + wxVERTICAL + none + + 6 + wxALL|wxEXPAND + 0 + + 4 + wxBOTH + 1,3 + + 12 + + fgSizer111 + wxFLEX_GROWMODE_SPECIFIED + none + 7 + 6 + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + fragmentProgram + 0 + + 0 + + + 0 + + 1 + m_staticText202 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageFragmentProgram + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + vertexProgram + 0 + + 0 + + + 0 + + 1 + m_staticText204 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 0 + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaterialStageVertexProgram + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + 6 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + MaterialStageProgramParameters + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + bSizer80 + wxVERTICAL + none + + + + + 0 + wxALIGN_RIGHT + 0 + + + bSizer152 + wxHORIZONTAL + none + + 6 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 0 + + 1 + + + 0 + 0 + wxID_ANY + Add Vertex Parameter + + 0 + + 0 + + + 0 + + 1 + m_button11 + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 6 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 0 + + 1 + + + 0 + 0 + wxID_ANY + Add Fragment Map + + 0 + + 0 + + + 0 + + 1 + m_button112 + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + @@ -13207,3978 +15305,6 @@ - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Clamping: - 0 - - 0 - - - 0 - - 1 - m_staticText90 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxBOTTOM|wxEXPAND|wxTOP - 0 - - - bSizer96 - wxHORIZONTAL - none - - 0 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - clamp - - 0 - - - 0 - - 1 - MaterialStageClamp - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - noclamp - - 0 - - - 0 - - 1 - MaterialStageNoclamp - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - zeroclamp - - 0 - - - 0 - - 1 - MaterialStageZeroClamp - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - alphazeroclamp - - 0 - - - 0 - - 1 - MaterialStageAlphaZeroClamp - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Filtering: - 0 - - 0 - - - 0 - - 1 - m_staticText1021 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxBOTTOM|wxEXPAND|wxTOP - 0 - - - bSizer962 - wxHORIZONTAL - none - - 12 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - nearest - - 0 - - - 0 - - 1 - MaterialStageFilterNearest - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 12 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - linear - - 0 - - - 0 - - 1 - MaterialStageFilterLinear - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Compression: - 0 - - 0 - - - 0 - - 1 - m_staticText10211 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxBOTTOM|wxEXPAND|wxRIGHT|wxTOP - 0 - - - bSizer963 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - highquality - - 0 - - - 0 - - 1 - MaterialStageHighQuality - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - forceHighQuality - - 0 - - - 0 - - 1 - MaterialStageForceHighQuality - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - nopicmip - - 0 - - - 0 - - 1 - MaterialStageNoPicMip - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - Transform - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_panel61 - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer2612 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 12 - - fgSizer112 - wxFLEX_GROWMODE_SPECIFIED - none - 7 - 6 - - 6 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Scroll/Translate: - 0 - - 0 - - - 0 - - 1 - m_staticText117 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxEXPAND - 1 - - - bSizer111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - U: - 0 - - 0 - - - 0 - - 1 - m_staticText118 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageTranslateX - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - V: - 0 - - 0 - - - 0 - - 1 - m_staticText119 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageTranslateY - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Scale: - 0 - - 0 - - - 0 - - 1 - m_staticText11711 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer11111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - U: - 0 - - 0 - - - 0 - - 1 - m_staticText11811 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageScaleX - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - V: - 0 - - 0 - - - 0 - - 1 - m_staticText11911 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageScaleY - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - CenterScale: - 0 - - 0 - - - 0 - - 1 - m_staticText117111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer111111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - U: - 0 - - 0 - - - 0 - - 1 - m_staticText118111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageCenterScaleX - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - V: - 0 - - 0 - - - 0 - - 1 - m_staticText119111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageCenterScaleY - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Shear: - 0 - - 0 - - - 0 - - 1 - m_staticText1171111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer1111111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - U: - 0 - - 0 - - - 0 - - 1 - m_staticText1181111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageShearX - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - V: - 0 - - 0 - - - 0 - - 1 - m_staticText1191111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageShearY - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Rotate: - 0 - - 0 - - - 0 - - 1 - m_staticText11711111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer11111111 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Angle: - 0 - - 0 - - - 0 - - 1 - m_staticText11811111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageRotate - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - Vertex Colour - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_panel611 - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer26121 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - bSizer158 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 0 - - - bSizer16221 - wxHORIZONTAL - none - - 3 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No Vertex Color - - 0 - - - 0 - - 1 - MaterialStageNoVertexColourFlag - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 3 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - vertexColor - - 0 - - - 0 - - 1 - MaterialStageVertexColourFlag - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 3 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - inverseVertexColor - - 0 - - - 0 - - 1 - MaterialStageInverseVertexColourFlag - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 24 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - colored - - 0 - - - 0 - - 1 - MaterialStageColored - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - Shortcut for "color parm0, parm1, parm2, parm3" - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 6 - wxALL|wxEXPAND - 0 - - 2 - wxBOTH - 1 - - 6 - - fgSizer18 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 6 - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Red: - 0 - - 0 - - - 0 - - 1 - m_staticText166 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxEXPAND|wxLEFT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageRed - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Green: - 0 - - 0 - - - 0 - - 1 - m_staticText1661 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxEXPAND|wxLEFT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageGreen - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Blue: - 0 - - 0 - - - 0 - - 1 - m_staticText16611 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxEXPAND|wxLEFT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageBlue - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Alpha: - 0 - - 0 - - - 0 - - 1 - m_staticText16612 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 6 - wxEXPAND|wxLEFT - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageAlpha - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - Condition - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_panel6111 - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer261211 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 12 - - fgSizer11211 - wxFLEX_GROWMODE_SPECIFIED - none - 7 - 6 - - 6 - wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Enable this stage if: - 0 - - 0 - - - 0 - - 1 - MaterialEditorStageRadialSpeedLabel - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 0 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageCondition - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - Program - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_panel61111 - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer2612111 - wxVERTICAL - none - - 6 - wxALL|wxEXPAND - 0 - - 4 - wxBOTH - 1,3 - - 12 - - fgSizer111 - wxFLEX_GROWMODE_SPECIFIED - none - 7 - 6 - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - fragmentProgram - 0 - - 0 - - - 0 - - 1 - m_staticText202 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageFragmentProgram - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - vertexProgram - 0 - - 0 - - - 0 - - 1 - m_staticText204 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 0 - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaterialStageVertexProgram - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - 6 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - MaterialStageProgramParameters - 1 - - - protected - 1 - - Resizable - 1 - - ; ; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - bSizer80 - wxVERTICAL - none - - - - - 0 - wxALIGN_RIGHT - 0 - - - bSizer152 - wxHORIZONTAL - none - - 6 - wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Add Vertex Parameter - - 0 - - 0 - - - 0 - - 1 - m_button11 - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 6 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Add Fragment Map - - 0 - - 0 - - - 0 - - 1 - m_button112 - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - diff --git a/install/ui/materialeditor.xrc b/install/ui/materialeditor.xrc index 54d172c130..f56384ee3b 100644 --- a/install/ui/materialeditor.xrc +++ b/install/ui/materialeditor.xrc @@ -10,7 +10,7 @@ wxALL|wxEXPAND 12 - + 0 0 0 @@ -30,7 +30,7 @@ - + wxEXPAND|wxLEFT 12 @@ -38,9 +38,10 @@ wxEXPAND | wxALL - 5 + 0 + -1,200 wxVERTICAL @@ -48,7 +49,7 @@ - wxEXPAND|wxLEFT|wxRIGHT|wxTOP + wxEXPAND|wxLEFT|wxRIGHT 6 wxVERTICAL @@ -90,950 +91,199 @@ - - wxBOTTOM|wxTOP - 6 - - - -1 - - - - + wxEXPAND|wxLEFT - 12 - - - - wxVERTICAL - - - wxEXPAND|wxRIGHT - 6 - - wxVERTICAL - - - wxBOTTOM|wxEXPAND - 6 - - 0 - 2 - 6 - 6 - 1 - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - 0 - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - + 6 + + wxVERTICAL + + + wxALL|wxBOTTOM|wxEXPAND|wxLEFT|wxTOP + 6 + + + + 0 + + + + + + + 1 + + + + wxVERTICAL - wxEXPAND|wxLEFT - 0 - - - - - - - - - wxEXPAND - 0 - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 0 - 2 - 8 - 8 - 0,1 - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - wxEXPAND - 5 - - wxVERTICAL - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - -100 - 100 - 0.1 - 1 - - - - - - - wxEXPAND - 5 - - wxHORIZONTAL - + wxALL|wxEXPAND + 6 + + wxVERTICAL + + + wxBOTTOM|wxEXPAND + 6 + + 0 + 4 + 6 + 6 + 3 + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 - - - - wxEXPAND - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 3 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 3 - - - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 3 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - + + + wxALIGN_CENTER_VERTICAL + 0 + + 0 + - - - - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 0 - 5 - 6 - 6 - 0,1,2,3,4 - - - - wxALL - 5 - - - 1 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 1 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - - - - - wxALL - 5 - - - 0 - + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 - - - - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 0 - 2 - 8 - 20 - 1 - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 1 - - - - - wxALL - 0 - - - 1 - -99999 - 99999 - + + + wxEXPAND|wxLEFT + 0 + + - - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 0 - 2 - 8 - 8 - 0,1 - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - - - wxEXPAND - 5 + + + wxEXPAND + 0 + + wxHORIZONTAL + + + wxEXPAND|wxLEFT + 0 + + wxVERTICAL - - - - - - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - - - - - - - - - - - - - 0 - - - - wxVERTICAL - - - wxEXPAND - 5 - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 0 - 2 - 8 - 8 - 0,1 - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - - - - - - - wxEXPAND|wxRIGHT - 6 - - wxHORIZONTAL - wxALL + wxBOTTOM|wxTOP 6 - - - 0 + + + -1 - wxEXPAND | wxALL + wxEXPAND|wxLEFT 0 - - - - 0 - 2 - 8 - 24 - 0,1 - - - - wxEXPAND - 0 + + wxVERTICAL + + + wxBOTTOM|wxEXPAND + 6 + + - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL - 6 - - - 0 - 0 - 999999 - 0.1 - 2 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - -1 - - + wxVERTICAL - - - wxEXPAND - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL - 24 - - - -1 - + + + + wxEXPAND + 0 + + 0 + 2 + 0 + 6 + 0,1 + + + + wxALL|wxEXPAND + 0 + + + 0 + 0 + - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 0.200000 - 0 - 999999 - 0.1 - 2 - + + + + wxALL|wxEXPAND + 0 + + + 0 + 0 + - - - wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT - 6 - - - -1 - + + + + wxTOP|wxEXPAND + 6 + + + 0 + 0 + - - - - wxEXPAND - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - + + + wxTOP|wxEXPAND + 6 + + + 0 + 0 + - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - - - wxEXPAND - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - + + + + wxTOP|wxEXPAND + 6 + + + 0 + 0 + + + + + + wxTOP|wxEXPAND + 6 + + + 0 + 0 + @@ -1043,215 +293,2363 @@ - - - - - - - 0 - - - - wxVERTICAL - - - wxEXPAND - 6 - - wxHORIZONTAL - - - wxALL - 6 - - 0 - - - - - - wxALL - 6 - - wxVERTICAL - - - wxEXPAND - 0 - - - 1 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - - - - - - - - - wxEXPAND | wxALL - 0 - - - 1 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - - - - - - - - - wxEXPAND | wxALL - 0 - - - 1 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - - + + + wxEXPAND|wxLEFT + 6 + + wxVERTICAL + + + wxEXPAND | wxALL + 0 + + + + wxVERTICAL + + + wxBOTTOM|wxTOP + 6 + + + -1 - - - - - wxEXPAND | wxALL - 0 - - - 1 - - wxVERTICAL - - - wxEXPAND - 0 - - 0 - 2 - 6 - 6 - 1 - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 + + + wxEXPAND + 6 + + wxVERTICAL + + + wxEXPAND + 0 + + + + 0 + + + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 0 + 2 + 6 + 12 + 1 + + + + wxALIGN_CENTER_VERTICAL + 0 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 6 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + 70,-1 + 0.300000 + -100 + 100 + 0.1 + 1 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + + + + + + wxBOTTOM|wxTOP + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + wxVERTICAL + + + wxBOTTOM|wxTOP + 6 + + + 0 + + + + + wxBOTTOM|wxTOP + 6 + + + 0 + + + + + wxBOTTOM|wxTOP + 6 + + + 0 + + + + + + + wxBOTTOM|wxTOP + 6 + + + -1 + + + + + + 0 + + wxVERTICAL + + + wxBOTTOM|wxTOP + 6 + + Blended with Background + + 0 + + + + + wxBOTTOM|wxTOP + 6 + + Completely fills the triangle + + 0 + + + + + wxBOTTOM|wxTOP + 6 + + Equivalent to "sort subview" and "forceOpaque" + + 0 + + + + + + + wxBOTTOM|wxTOP + 6 + + + -1 + + + + + wxBOTTOM|wxTOP + 6 + + When checked, this surface does not create fog interactions + + 0 + + + + + + - - - - wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT - 0 - - 60,-1 - + + + 0 + + + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 0 + 2 + 6 + 12 + 1 + + + + wxBOTTOM|wxTOP + 6 + + + -1 + + + + + wxBOTTOM|wxEXPAND|wxTOP + 6 + + 0 + 2 + 8 + 20 + 1 + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxEXPAND + 0 + + + + + + + wxBOTTOM|wxTOP + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + 1 + + + + + wxALL + 0 + + + 1 + -99999 + 99999 + + + + + + - - - - wxALIGN_CENTER_VERTICAL - 5 - - - -1 + + + 0 + + + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 0 + 5 + 3 + 6 + 0,1,2,3,4 + + + + wxALL + 5 + + + 1 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 1 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + + - - - - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - 40,-1 - + + + 0 + + + + wxVERTICAL + + + wxEXPAND + 5 + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 0 + 2 + 8 + 8 + 0,1 + + + + wxALIGN_CENTER_VERTICAL + 0 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + 0 + + 0 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 0 + + 0 + + + + + + + wxEXPAND|wxRIGHT + 6 + + wxHORIZONTAL + + + wxALL + 6 + + + 0 + + + + + wxEXPAND | wxALL + 0 + + + + 0 + 2 + 8 + 24 + 0,1 + + + + wxEXPAND + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 6 + + + 0 + 0.100000 + 0 + 999999 + 0.1 + 2 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + + -1 + + + + + + + wxEXPAND + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL + 24 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + + 0 + 0.200000 + 0 + 999999 + 0.1 + 2 + + + + + wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT + 6 + + + -1 + + + + + + + wxEXPAND + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 0 + + + + + + + + wxEXPAND + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 0 + + + + + + + + + + + + + + - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 + + + 0 + + + + wxVERTICAL + + + wxEXPAND + 6 + + wxHORIZONTAL + + + wxALL + 6 + + 0 + 0 + + + + + + wxALL + 6 + + wxVERTICAL + + + wxEXPAND + 0 + + + 0 + 1 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + + + + + + + + + wxEXPAND | wxALL + 0 + + + 0 + 1 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + + + + + + + + + wxEXPAND | wxALL + 0 + + + 0 + 1 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + + + + + + + + + wxEXPAND | wxALL + 0 + + + 0 + 1 + + wxVERTICAL + + + wxEXPAND + 0 + + 0 + 2 + 6 + 6 + 1 + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT + 0 + + 60,-1 + + + + + + wxALIGN_CENTER_VERTICAL + 5 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 0 + + 40,-1 + + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 0 + + 40,-1 + + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 0 + + 40,-1 + + + + + + + + + + + wxEXPAND | wxALL + 0 + + + 0 + 1 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + + + + + + + + + wxEXPAND | wxALL + 0 + + + 0 + 1 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 0 + + + + + + + + + + + + + - - - - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - 40,-1 - + + + 0 + + + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 0 + 2 + 8 + 20 + 1 + + + + wxALIGN_CENTER_VERTICAL + 0 + + 0 + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxEXPAND + 0 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 0 + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 0 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + 0 + + + + + wxBOTTOM|wxTOP + 3 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 0 + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 3 + + 0 + + 0 + + + + + wxALIGN_CENTER_VERTICAL + 3 + + 0 + + 0 + + + + + wxEXPAND + 0 + + + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL + 6 + + 0 + + 0 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT + 6 + + 0 + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + 0 + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + 0 + + 0 + + + + + + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 6 + + 0 + + 0 + + + + + wxEXPAND + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 3 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 3 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 3 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 6 + + 0 + + + + + + + + + - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 + + + 0 + + + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 8 + 2 + 6 + 12 + 1 + + + + wxALIGN_CENTER_VERTICAL + 0 + + + -1 + + + + + wxEXPAND + 0 + + wxHORIZONTAL + + + + 0 + + + + + + + + + wxTOP + 5 + + + -1 + + + + + wxEXPAND + 0 + + wxVERTICAL + + + wxRIGHT + 6 + + 0 + + + + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + -1 + + + + + wxEXPAND + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT + 6 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + 0 + + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxEXPAND + 5 + + wxHORIZONTAL + + + wxRIGHT + 6 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL + 6 + + wxVERTICAL + + + + 3 + + 1 + + 0 + + + + + wxEXPAND | wxALL + 0 + + + 1 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + 0 + 0 + 9999 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 12 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + 0 + 0 + 9999 + + + + + + + + + 3 + + 1 + + 0 + + + + + + + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + + + + + + + + wxEXPAND|wxLEFT|wxRIGHT + 6 + + 0 + 2 + 6 + 12 + 1 + + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL + 0 + + + 1 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + + 1 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + + 1 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + + 1 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + + 1 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + + 1 + + + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + + -1 + + + + + + 6 + + + 0 + 0.100000 + -9999 + 9999 + 0.1 + 1 + + + + + wxBOTTOM|wxTOP + 6 + + + -1 + + + + + wxEXPAND + 5 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 6 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 6 + + + 0 + + + + + + + + - - - - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - 40,-1 - + + + 1 + + + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 7 + 2 + 6 + 12 + 1 + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxEXPAND + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 0 + + + + + + + 0 + + + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 6 + + 80,-1 + + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + 80,-1 + + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL + 0 + + 80,-1 + + + + + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxBOTTOM|wxEXPAND|wxTOP + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 0 + + + + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + + -1 + + + + + wxBOTTOM|wxEXPAND|wxTOP + 6 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL + 12 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 12 + + + 0 + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxBOTTOM|wxEXPAND|wxRIGHT|wxTOP + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL + 6 + + + 0 + + + + + + + + + + + + 0 + + + + wxVERTICAL + + + wxEXPAND + 0 + + 0 + 2 + 0 + 0 + 1 + + + + wxALL|wxEXPAND + 6 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxRIGHT + 6 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 5 + + + 0 + 0 + + + + + + + + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT + 6 + + + 0 + 0 + + + + + + + + wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT + 6 + + + + wxVERTICAL + + + + + + + + + 0 + + + + wxVERTICAL + + + wxEXPAND + 5 + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP + 3 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP + 3 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP + 3 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxLEFT + 24 + + Shortcut for "color parm0, parm1, parm2, parm3" + + 0 + + + + + + + wxALL|wxEXPAND + 6 + + 0 + 2 + 6 + 6 + 1 + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxEXPAND|wxLEFT + 6 + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxEXPAND|wxLEFT + 6 + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxEXPAND|wxLEFT + 6 + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxEXPAND|wxLEFT + 6 + + + + + + + + + + + + + + 0 + + + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 7 + 2 + 6 + 12 + 1 + + + + wxALIGN_CENTER_VERTICAL + 6 + + + -1 + + + + + wxALL|wxEXPAND + 0 + + + + + + + + + + + + 0 + + + + wxVERTICAL + + + wxALL|wxEXPAND + 6 + + 7 + 4 + 6 + 12 + 1,3 + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxEXPAND + 5 + + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + -1 + + + + + wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 0 + + 0 + + + + + + + + wxEXPAND | wxALL + 6 + + + 0 + + wxVERTICAL + + + + + + wxALIGN_RIGHT + 0 + + wxHORIZONTAL + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT + 6 + + 0 + + 0 + 0 + + + + + + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT + 6 + + 0 + + 0 + 0 + + + + + + + @@ -1259,1693 +2657,8 @@ - - - wxEXPAND | wxALL - 0 - - - 1 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - - - - - - - - - wxEXPAND | wxALL - 0 - - - 1 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - - - - - - - - - - - - - - - - 1 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 0 - 2 - 8 - 20 - 1 - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxBOTTOM|wxTOP - 3 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 3 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 3 - - - 0 - - - - - wxEXPAND - 0 - - - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 0 - - - - - - - - - - - - - - - - - - - - wxEXPAND|wxLEFT - 0 - - - - wxVERTICAL - - - wxBOTTOM|wxTOP - 6 - - - -1 - - - - - wxEXPAND|wxLEFT - 12 - - wxHORIZONTAL - - - wxEXPAND | wxALL - 0 - - - - wxVERTICAL - - - - - - wxEXPAND|wxLEFT|wxRIGHT - 6 - - wxVERTICAL - - - wxBOTTOM|wxEXPAND - 6 - - wxHORIZONTAL - - - wxRIGHT - 6 - - wxVERTICAL - - - wxALL|wxEXPAND - 0 - - - 0 - 0 - - - - - - wxTOP|wxEXPAND - 6 - - - 0 - 0 - - - - - - wxTOP|wxEXPAND - 6 - - - 0 - 0 - - - - - - - - - 0 - - wxVERTICAL - - - wxALL|wxEXPAND - 0 - - - 0 - 0 - - - - - - wxTOP|wxEXPAND - 6 - - - 0 - 0 - - - - - - wxTOP|wxEXPAND - 6 - - - 0 - 0 - - - - - - - - - - - - - - - - - wxEXPAND - 0 - - - - wxVERTICAL - - - wxBOTTOM|wxTOP - 6 - - - -1 - - - - - wxEXPAND|wxLEFT - 12 - - - - 1 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 7 - 2 - 6 - 12 - 1 - - - - wxALIGN_CENTER_VERTICAL - 5 - - - -1 - - - - - wxEXPAND - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - 0 - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT - 6 - - 0 - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - 0 - - - - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - -1 - - - - - wxEXPAND - 0 - - wxHORIZONTAL - - - wxRIGHT - 6 - - 0 - - - - - - - 0 - - - - - - - - - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 6 - - - -1 - - - - - wxEXPAND - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL - 0 - - - 1 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 1 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 1 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 1 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 1 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 1 - - - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - - - - wxEXPAND - 5 - - 0 - 2 - 0 - 0 - 1 - - - - wxALL - 0 - - - 0 - 0 - 1 - 0.1 - 1 - - - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 24 - - - -1 - - - - - wxLEFT - 6 - - - 0 - -9999 - 9999 - 0.1 - 1 - - - - - - - - - wxEXPAND - 5 - - wxVERTICAL - - - wxBOTTOM|wxTOP - 6 - - - -1 - - - - - - - wxEXPAND - 5 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 0 - - - - - - - - - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 7 - 2 - 6 - 12 - 1 - - - - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 3 - - - 0 - - - - - wxALL|wxEXPAND - 6 - - wxVERTICAL - - - - - - - wxEXPAND|wxLEFT|wxRIGHT - 6 - - - - 7 - 2 - 6 - 12 - 1 - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - - - - - wxEXPAND - 5 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 6 - - - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 3 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - 0 - 9999 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 12 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - 0 - 9999 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - - - - - wxEXPAND - 5 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - 0 - 0 - 9999 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 12 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - 0 - 0 - 9999 - - - - - - - - - - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 7 - 2 - 6 - 12 - 1 - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - 0 - - - - - - wxEXPAND | wxALL - 0 - - - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL - 6 - - - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - - - - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxBOTTOM|wxEXPAND|wxTOP - 6 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 6 - - - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - - -1 - - - - - wxBOTTOM|wxEXPAND|wxTOP - 6 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL - 12 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 12 - - - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxBOTTOM|wxEXPAND|wxRIGHT|wxTOP - 6 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL - 6 - - - 0 - - - - - - - - - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 7 - 2 - 6 - 12 - 1 - - - - wxALIGN_CENTER_VERTICAL - 6 - - - -1 - - - - - wxEXPAND - 6 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - -1 - - - - - wxEXPAND - 5 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - -1 - - - - - wxEXPAND - 5 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - -1 - - - - - wxEXPAND - 5 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - - - wxALIGN_CENTER_VERTICAL - 0 - - - -1 - - - - - wxEXPAND - 5 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxRIGHT - 6 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - - - - - - - - - - - 0 - - - - wxVERTICAL - - - wxEXPAND - 5 - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP - 3 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP - 3 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP - 3 - - - 0 - - - - - wxALIGN_CENTER_VERTICAL|wxLEFT - 24 - - Shortcut for "color parm0, parm1, parm2, parm3" - - 0 - - - - - - - wxALL|wxEXPAND - 6 - - 0 - 2 - 6 - 6 - 1 - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxEXPAND|wxLEFT - 6 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxEXPAND|wxLEFT - 6 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxEXPAND|wxLEFT - 6 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxEXPAND|wxLEFT - 6 - - - - - - - - - - - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 7 - 2 - 6 - 12 - 1 - - - - wxALIGN_CENTER_VERTICAL - 6 - - - -1 - - - - - wxALL|wxEXPAND - 0 - - - - - - - - - - - - 0 - - - - wxVERTICAL - - - wxALL|wxEXPAND - 6 - - 7 - 4 - 6 - 12 - 1,3 - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxEXPAND - 5 - - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - -1 - - - - - wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - - - - - - - - - wxEXPAND | wxALL - 6 - - - - wxVERTICAL - - - - - - wxALIGN_RIGHT - 0 - - wxHORIZONTAL - - - wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT - 6 - - - 0 - 0 - - - - - - wxALIGN_CENTER_VERTICAL|wxALL - 6 - - - 0 - 0 - diff --git a/libs/materials/ParseLib.h b/libs/materials/ParseLib.h index c373266f2c..281d8e8ddf 100644 --- a/libs/materials/ParseLib.h +++ b/libs/materials/ParseLib.h @@ -2,7 +2,7 @@ #include #include "ishaders.h" -#include "ShaderLayer.h" +#include "ishaderlayer.h" namespace shaders { @@ -39,6 +39,52 @@ inline std::string getStringForSurfaceType(Material::SurfaceType type) return std::string(); } +inline Material::SurfaceType getSurfaceTypeForString(const std::string& surfaceTypeString) +{ + for (const auto& pair : SurfaceTypeMapping) + { + if (surfaceTypeString == pair.first) + { + return pair.second; + } + } + + return Material::SURFTYPE_DEFAULT; +} + +constexpr std::pair CullTypes[] +{ + { "Frontsided", Material::CULL_BACK }, + { "Backsided", Material::CULL_FRONT }, + { "Twosided", Material::CULL_NONE }, +}; + +inline std::string getStringForCullType(Material::CullType type) +{ + for (const auto& pair : CullTypes) + { + if (type == pair.second) + { + return pair.first; + } + } + + return CullTypes[0].first; +} + +inline Material::CullType getCullTypeForString(const std::string& typeString) +{ + for (const auto& pair : CullTypes) + { + if (typeString == pair.first) + { + return pair.second; + } + } + + return Material::CULL_BACK; +} + constexpr std::pair PredefinedSortValues[] { { "subview", Material::SORT_SUBVIEW }, @@ -67,6 +113,43 @@ inline std::string getStringForSortRequestValue(float value) return std::string(); } +constexpr std::pair MapTypeNames[] +{ + { "map", IShaderLayer::MapType::Map }, + { "cubeMap", IShaderLayer::MapType::CubeMap }, + { "cameraCubeMap", IShaderLayer::MapType::CameraCubeMap }, + { "mirrorRenderMap", IShaderLayer::MapType::MirrorRenderMap }, + { "remoteRenderMap", IShaderLayer::MapType::RemoteRenderMap }, + { "videoMap", IShaderLayer::MapType::VideoMap }, + { "soundMap", IShaderLayer::MapType::SoundMap }, +}; + +inline std::string getStringForMapType(IShaderLayer::MapType type) +{ + for (const auto& pair : MapTypeNames) + { + if (type == pair.second) + { + return pair.first; + } + } + + return std::string(); +} + +inline IShaderLayer::MapType getMapTypeForString(const std::string& typeString) +{ + for (const auto& pair : MapTypeNames) + { + if (typeString == pair.first) + { + return pair.second; + } + } + + return IShaderLayer::MapType::Map; +} + constexpr std::pair DeformTypeNames[] { { "sprite", Material::DEFORM_SPRITE }, @@ -102,15 +185,15 @@ constexpr std::pair> BlendTypeS { "none", { "gl_zero", "gl_one" } }, }; -constexpr std::pair TexGenTypeNames[] +constexpr std::pair TexGenTypeNames[] { - { "normal", ShaderLayer::TEXGEN_NORMAL }, - { "reflect", ShaderLayer::TEXGEN_REFLECT }, - { "skybox", ShaderLayer::TEXGEN_SKYBOX }, - { "wobbleSky", ShaderLayer::TEXGEN_WOBBLESKY }, + { "normal", IShaderLayer::TEXGEN_NORMAL }, + { "reflect", IShaderLayer::TEXGEN_REFLECT }, + { "skybox", IShaderLayer::TEXGEN_SKYBOX }, + { "wobbleSky", IShaderLayer::TEXGEN_WOBBLESKY }, }; -inline std::string getStringForTexGenType(ShaderLayer::TexGenType type) +inline std::string getStringForTexGenType(IShaderLayer::TexGenType type) { for (const auto& pair : TexGenTypeNames) { @@ -123,6 +206,88 @@ inline std::string getStringForTexGenType(ShaderLayer::TexGenType type) return std::string(); } +inline IShaderLayer::TexGenType getTexGenTypeForString(const std::string& typeString) +{ + for (const auto& pair : TexGenTypeNames) + { + if (typeString == pair.first) + { + return pair.second; + } + } + + return IShaderLayer::TexGenType::TEXGEN_NORMAL; +} + +constexpr std::pair TransformTypeNames[] +{ + { "Translate", IShaderLayer::TransformType::Translate }, + { "Scale", IShaderLayer::TransformType::Scale }, + { "CenterScale", IShaderLayer::TransformType::CenterScale }, + { "Shear", IShaderLayer::TransformType::Shear }, + { "Rotate", IShaderLayer::TransformType::Rotate }, +}; + +inline std::string getStringForTransformType(IShaderLayer::TransformType type) +{ + for (const auto& pair : TransformTypeNames) + { + if (type == pair.second) + { + return pair.first; + } + } + + return std::string(); +} + +inline IShaderLayer::TransformType getTransformTypeForString(const std::string& typeString) +{ + for (const auto& pair : TransformTypeNames) + { + if (typeString == pair.first) + { + return pair.second; + } + } + + return IShaderLayer::TransformType::Translate; +} + +constexpr std::pair ClampTypeNames[] +{ + { "noclamp", CLAMP_REPEAT }, + { "clamp", CLAMP_NOREPEAT }, + { "zeroclamp", CLAMP_ZEROCLAMP }, + { "alphazeroclamp", CLAMP_ALPHAZEROCLAMP }, +}; + +inline ClampType getClampTypeForString(const std::string& typeString) +{ + for (const auto& pair : ClampTypeNames) + { + if (typeString == pair.first) + { + return pair.second; + } + } + + return CLAMP_REPEAT; +} + +inline std::string getStringForClampType(ClampType type) +{ + for (const auto& pair : ClampTypeNames) + { + if (type == pair.second) + { + return pair.first; + } + } + + return std::string(); +} + constexpr int NUM_MAX_VERTEX_PARMS = 4; constexpr int NUM_MAX_FRAGMENT_MAPS = 8; diff --git a/libs/util/ScopedBoolLock.h b/libs/util/ScopedBoolLock.h index adba568d95..055a4254c0 100644 --- a/libs/util/ScopedBoolLock.h +++ b/libs/util/ScopedBoolLock.h @@ -8,20 +8,22 @@ namespace util class ScopedBoolLock { bool& _target; + bool _previousValue; public: /// Construct and set target to true ScopedBoolLock(bool& target) : - _target(target) + _target(target), + _previousValue(target) { _target = true; } - /// Destroy and set target to false + /// Destroy and set target to the previous value ~ScopedBoolLock() { - _target = false; + _target = _previousValue; } }; diff --git a/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp b/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp index 9bd81b51d7..424f7c08d6 100644 --- a/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp +++ b/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp @@ -23,18 +23,18 @@ ResourceTreeViewToolbar::ResourceTreeViewToolbar(wxWindow* parent, ResourceTreeV SetSizer(grid); // Hbox for the favourites selection widgets - auto* favourites = new wxBoxSizer(wxHORIZONTAL); + _leftSizer = new wxBoxSizer(wxHORIZONTAL); _showAll = new wxRadioButton(this, wxID_ANY, _("Show All"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); _showFavourites = new wxRadioButton(this, wxID_ANY, _("Show Favourites")); _showAll->Bind(wxEVT_RADIOBUTTON, &ResourceTreeViewToolbar::_onFilterButtonToggled, this); _showFavourites->Bind(wxEVT_RADIOBUTTON, &ResourceTreeViewToolbar::_onFilterButtonToggled, this); - favourites->Add(_showAll, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 0); - favourites->Add(_showFavourites, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 6); + _leftSizer->Add(_showAll, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 0); + _leftSizer->Add(_showFavourites, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 6); // Filter text entry box - auto* filterBox = new wxBoxSizer(wxHORIZONTAL); + _rightSizer = new wxBoxSizer(wxHORIZONTAL); auto* filterImage = new wxStaticBitmap(this, wxID_ANY, wxArtProvider::GetBitmap(wxART_FIND, wxART_TOOLBAR, wxSize(16, 16))); @@ -65,17 +65,33 @@ ResourceTreeViewToolbar::ResourceTreeViewToolbar(wxWindow* parent, ResourceTreeV JumpToPrevFilterMatch(); }); - filterBox->Add(filterImage, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); - filterBox->Add(_filterEntry, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); - filterBox->Add(_findPrevButton, 0, wxEXPAND | wxRIGHT, 3); - filterBox->Add(_findNextButton, 0, wxEXPAND, 6); + _rightSizer->Add(filterImage, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); + _rightSizer->Add(_filterEntry, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); + _rightSizer->Add(_findPrevButton, 0, wxEXPAND | wxRIGHT, 3); + _rightSizer->Add(_findNextButton, 0, wxEXPAND, 6); - grid->Add(favourites, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxRIGHT, 6); - grid->Add(filterBox, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT, 6); + grid->Add(_leftSizer, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxRIGHT, 6); + grid->Add(_rightSizer, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT, 6); AssociateToTreeView(treeView); } +wxSizer* ResourceTreeViewToolbar::GetLeftSizer() +{ + return _leftSizer; +} + +wxSizer* ResourceTreeViewToolbar::GetRightSizer() +{ + return _rightSizer; +} + +void ResourceTreeViewToolbar::EnableFavouriteManagement(bool enable) +{ + _showAll->Show(enable); + _showFavourites->Show(enable); +} + void ResourceTreeViewToolbar::AssociateToTreeView(ResourceTreeView* treeView) { _treeView = treeView; diff --git a/libs/wxutil/dataview/ResourceTreeViewToolbar.h b/libs/wxutil/dataview/ResourceTreeViewToolbar.h index efaffc7629..c021caaff6 100644 --- a/libs/wxutil/dataview/ResourceTreeViewToolbar.h +++ b/libs/wxutil/dataview/ResourceTreeViewToolbar.h @@ -26,9 +26,20 @@ class ResourceTreeViewToolbar : wxBitmapButton* _findPrevButton; wxBitmapButton* _findNextButton; + wxSizer* _leftSizer; + wxSizer* _rightSizer; + public: ResourceTreeViewToolbar(wxWindow* parent, ResourceTreeView* treeView = nullptr); + // Return the sizer for packing items in the left half of the toolbar + wxSizer* GetLeftSizer(); + + // Return the sizer for packing items in the right half of the toolbar + wxSizer* GetRightSizer(); + + void EnableFavouriteManagement(bool enable); + void AssociateToTreeView(ResourceTreeView* treeView); void ClearFilter(); diff --git a/libs/wxutil/preview/GuiRenderer.cpp b/libs/wxutil/preview/GuiRenderer.cpp index 040380c437..d7e22ce194 100644 --- a/libs/wxutil/preview/GuiRenderer.cpp +++ b/libs/wxutil/preview/GuiRenderer.cpp @@ -112,13 +112,13 @@ void GuiRenderer::render(const gui::IGuiWindowDefPtr& window, bool ignoreFilter) if (window->backgroundShader != NULL && (matcolor[3] > 0 || _ignoreVisibility)) { // Get the diffuse layer - const ShaderLayerVector layers = window->backgroundShader->getAllLayers(); + const IShaderLayerVector layers = window->backgroundShader->getAllLayers(); TexturePtr tex; - for (ShaderLayerVector::const_iterator i = layers.begin(); i != layers.end(); ++i) + for (IShaderLayerVector::const_iterator i = layers.begin(); i != layers.end(); ++i) { - if ((*i)->getType() == ShaderLayer::DIFFUSE) + if ((*i)->getType() == IShaderLayer::DIFFUSE) { // Found the diffuse tex = (*i)->getTexture(); diff --git a/libs/wxutil/preview/RenderPreview.cpp b/libs/wxutil/preview/RenderPreview.cpp index 0cd63c9acf..57515f8d4b 100644 --- a/libs/wxutil/preview/RenderPreview.cpp +++ b/libs/wxutil/preview/RenderPreview.cpp @@ -28,7 +28,6 @@ namespace wxutil namespace { const GLfloat PREVIEW_FOV = 60; - const unsigned int MSEC_PER_FRAME = 16; // Widget names const std::string BOTTOM_BOX("bottomBox"); @@ -252,6 +251,20 @@ void RenderPreview::setLightingModeEnabled(bool enabled) _renderSystem->setShaderProgram(RenderSystem::SHADER_PROGRAM_NONE); queueDraw(); } + + // Synchronise the button state, if necessary + auto* toolbar = static_cast(_mainPanel->FindWindow("RenderPreviewRenderModeToolbar")); + auto* textureButton = getToolBarToolByLabel(toolbar, "texturedModeButton"); + auto* lightingButton = getToolBarToolByLabel(toolbar, "lightingModeButton"); + + if (!enabled && !textureButton->IsToggled()) + { + toolbar->ToggleTool(textureButton->GetId(), true); + } + else if (enabled && !lightingButton->IsToggled()) + { + toolbar->ToggleTool(lightingButton->GetId(), true); + } } const scene::GraphPtr& RenderPreview::getScene() @@ -426,6 +439,14 @@ bool RenderPreview::drawPreview() if (!_initialised) { initialisePreview(); + + // Since we shouldn't call the virtual canDrawGrid() in the constructor + // adjust the tool bar here. + if (!canDrawGrid()) + { + auto* utilToolbar = findNamedObject(_mainPanel, "RenderPreviewUtilToolbar"); + utilToolbar->DeleteTool(getToolBarToolByLabel(utilToolbar, "gridButton")->GetId()); + } } util::ScopedBoolLock lock(_renderingInProgress); @@ -476,7 +497,7 @@ bool RenderPreview::drawPreview() glMatrixMode(GL_MODELVIEW); glLoadMatrixd(_volumeTest.GetModelview()); - if (_renderGrid) + if (_renderGrid && canDrawGrid()) { drawGrid(); } @@ -732,6 +753,11 @@ void RenderPreview::onSizeAllocate(wxSizeEvent& ev) _previewHeight = ev.GetSize().GetHeight(); } +bool RenderPreview::canDrawGrid() +{ + return true; +} + void RenderPreview::drawGrid() { static float GRID_MAX_DIM = 512.0f; diff --git a/libs/wxutil/preview/RenderPreview.h b/libs/wxutil/preview/RenderPreview.h index eff01c59ab..854ba0a5ec 100644 --- a/libs/wxutil/preview/RenderPreview.h +++ b/libs/wxutil/preview/RenderPreview.h @@ -86,6 +86,8 @@ class RenderPreview : bool _renderGrid; protected: + const unsigned int MSEC_PER_FRAME = 16; + // The backend rendersystem instance RenderSystemPtr _renderSystem; @@ -164,6 +166,9 @@ class RenderPreview : void associateRenderSystem(); + // Base method will return true, which will also make the corresponding button appear on the toolbar + virtual bool canDrawGrid(); + // Can be overridden by subclasses to update their scene/models virtual void onRenderModeChanged() {} diff --git a/radiant/CMakeLists.txt b/radiant/CMakeLists.txt index 5217fd6427..e8048f9108 100644 --- a/radiant/CMakeLists.txt +++ b/radiant/CMakeLists.txt @@ -105,6 +105,7 @@ add_executable(darkradiant ui/mapselector/MapSelector.cpp ui/materials/MaterialEditor.cpp ui/materials/MaterialEditorModule.cpp + ui/materials/MaterialPreview.cpp ui/animationpreview/AnimationPreview.cpp ui/animationpreview/MD5AnimationChooser.cpp ui/animationpreview/MD5AnimationViewer.cpp diff --git a/radiant/camera/CamWnd.cpp b/radiant/camera/CamWnd.cpp index 67bc85f699..a08e84cecc 100644 --- a/radiant/camera/CamWnd.cpp +++ b/radiant/camera/CamWnd.cpp @@ -603,7 +603,7 @@ void CamWnd::drawGrid() glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_1D); - glDisable(GL_DEPTH_TEST); + glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); glLineWidth(1); @@ -635,6 +635,8 @@ void CamWnd::drawGrid() glEnd(); glPopMatrix(); + + glDisable(GL_DEPTH_TEST); } void CamWnd::Cam_Draw() diff --git a/radiant/ui/common/ShaderSelector.cpp b/radiant/ui/common/ShaderSelector.cpp index 0d6e7fcc17..b7b781ddad 100644 --- a/radiant/ui/common/ShaderSelector.cpp +++ b/radiant/ui/common/ShaderSelector.cpp @@ -259,7 +259,7 @@ bool ShaderSelector::onPreviewRender() // Check what part of the shader we should display in the preview if (_isLightTexture) { // This is a light, take the first layer texture - const ShaderLayer* first = shader->firstLayer(); + const IShaderLayer* first = shader->firstLayer(); if (first != NULL) { tex = shader->firstLayer()->getTexture(); glBindTexture (GL_TEXTURE_2D, tex->getGLTexNum()); @@ -343,7 +343,7 @@ void ShaderSelector::displayLightShaderInfo(const MaterialPtr& shader, wxutil::TreeModel& listStore, int attrCol, int valueCol) { - const ShaderLayer* first = shader->firstLayer(); + const IShaderLayer* first = shader->firstLayer(); std::string texName = _("None"); if (first != NULL) diff --git a/radiant/ui/materials/Binding.h b/radiant/ui/materials/Binding.h index a3153f0658..ee8006ec22 100644 --- a/radiant/ui/materials/Binding.h +++ b/radiant/ui/materials/Binding.h @@ -13,6 +13,8 @@ class Binding Source _source; public: + using Ptr = std::shared_ptr; + virtual ~Binding() {} @@ -27,38 +29,106 @@ class Binding onSourceChanged(); } - virtual void updateFromSource(const Source& source) = 0; + virtual void updateFromSource() = 0; protected: virtual void onSourceChanged() - { - updateFromSource(getSource()); - } + {} }; +// Target selection, usually the Source type is identical to the target type template -class CheckBoxBinding : - public Binding +struct TargetSelector { -private: - wxCheckBox* _checkbox; - std::function _loadFunc; + using TargetType = Source; +}; + +// Specialisation for shader layer editing, where the target type is an IEditableShaderLayer +template<> +struct TargetSelector +{ + using TargetType = IEditableShaderLayer::Ptr; +}; +template +class TwoWayBinding : + public Binding +{ public: - CheckBoxBinding(wxCheckBox* checkbox, const std::function loadFunc) : - _checkbox(checkbox), - _loadFunc(loadFunc) + // Select target: will map Material => Material, but IShaderLayer => IEditableShaderLayer + using Target = typename TargetSelector::TargetType; + + using LoadFunc = std::function; + using UpdateFunc = std::function; + using AcquireTargetFunc = std::function; + using PostUpdateFunc = std::function; + + Target UseSourceAsTarget() + { + return Binding::getSource(); + } + +protected: + LoadFunc _loadValue; + AcquireTargetFunc _acquireTarget; + UpdateFunc _updateValue; + PostUpdateFunc _postUpdate; + +protected: + bool _blockUpdates; + +protected: + TwoWayBinding(const LoadFunc& loadValue, + const UpdateFunc& updateValue, + const PostUpdateFunc& postChangeNotify = PostUpdateFunc(), + const AcquireTargetFunc& acquireTarget = std::bind(&TwoWayBinding::UseSourceAsTarget, this)) : + _loadValue(loadValue), + _acquireTarget(acquireTarget), + _updateValue(updateValue), + _postUpdate(postChangeNotify), + _blockUpdates(false) {} - virtual void updateFromSource(const Source& source) override + Target getTarget() { - if (!source) + if (_blockUpdates) { - _checkbox->SetValue(false); + return Target(); + } + + return _acquireTarget(); + } + +protected: + // Just load the given value into the control + virtual void setValueOnControl(const ValueType& value) = 0; + + virtual void updateFromSource() override + { + util::ScopedBoolLock lock(_blockUpdates); + + if (!Binding::getSource()) + { + setValueOnControl(ValueType()); return; } - _checkbox->SetValue(_loadFunc(source)); + setValueOnControl(_loadValue(Binding::getSource())); + } + + virtual void updateValueOnTarget(const ValueType& newValue) + { + auto target = getTarget(); + + if (target) + { + _updateValue(target, newValue); + + if (_postUpdate) + { + _postUpdate(); + } + } } }; diff --git a/radiant/ui/materials/CheckBoxBinding.h b/radiant/ui/materials/CheckBoxBinding.h new file mode 100644 index 0000000000..ea0b287a70 --- /dev/null +++ b/radiant/ui/materials/CheckBoxBinding.h @@ -0,0 +1,64 @@ +#pragma once + +namespace ui +{ + +template +class CheckBoxBinding : + public TwoWayBinding +{ +public: + using BaseBinding = TwoWayBinding; + +private: + wxCheckBox* _checkbox; + +public: + CheckBoxBinding(wxCheckBox* checkbox, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc) : + CheckBoxBinding(checkbox, loadFunc, saveFunc, BaseBinding::PostUpdateFunc()) + {} + + CheckBoxBinding(wxCheckBox* checkbox, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc, + const typename BaseBinding::PostUpdateFunc& postChangeNotify) : + CheckBoxBinding(checkbox, loadFunc, saveFunc, postChangeNotify, std::bind(&BaseBinding::UseSourceAsTarget, this)) + {} + + CheckBoxBinding(wxCheckBox* checkbox, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc, + const typename BaseBinding::PostUpdateFunc& postChangeNotify, + const typename BaseBinding::AcquireTargetFunc& acquireSaveTarget) : + BaseBinding(loadFunc, saveFunc, postChangeNotify, acquireSaveTarget), + _checkbox(checkbox) + { + if (BaseBinding::_updateValue) + { + _checkbox->Bind(wxEVT_CHECKBOX, &CheckBoxBinding::onValueChanged, this); + } + } + + virtual ~CheckBoxBinding() + { + if (BaseBinding::_updateValue) + { + _checkbox->Unbind(wxEVT_CHECKBOX, &CheckBoxBinding::onValueChanged, this); + } + } + +protected: + void setValueOnControl(const bool& value) override + { + _checkbox->SetValue(value); + } + + void onValueChanged(wxCommandEvent& ev) + { + BaseBinding::updateValueOnTarget(_checkbox->GetValue()); + } +}; + +} diff --git a/radiant/ui/materials/ExpressionBinding.h b/radiant/ui/materials/ExpressionBinding.h index 1ef4450dae..054b594cc5 100644 --- a/radiant/ui/materials/ExpressionBinding.h +++ b/radiant/ui/materials/ExpressionBinding.h @@ -2,34 +2,66 @@ #include "Binding.h" #include "ishaderexpression.h" +#include "util/ScopedBoolLock.h" namespace ui { template class ExpressionBinding : - public Binding + public TwoWayBinding { +public: + using BaseBinding = TwoWayBinding; + private: wxTextCtrl* _textCtrl; - std::function _getExpression; public: - ExpressionBinding(wxTextCtrl* textCtrl, const std::function loadFunc) : - _textCtrl(textCtrl), - _getExpression(loadFunc) + ExpressionBinding(wxTextCtrl* textCtrl, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc) : + ExpressionBinding(textCtrl, loadFunc, saveFunc, BaseBinding::PostUpdateFunc()) + {} + + ExpressionBinding(wxTextCtrl* textCtrl, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc, + const typename BaseBinding::PostUpdateFunc& postChangeNotify) : + ExpressionBinding(textCtrl, loadFunc, saveFunc, postChangeNotify, std::bind(&BaseBinding::UseSourceAsTarget, this)) {} - virtual void updateFromSource(const Source& source) override + ExpressionBinding(wxTextCtrl* textCtrl, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc, + const typename BaseBinding::PostUpdateFunc& postChangeNotify, + const typename BaseBinding::AcquireTargetFunc& acquireSaveTarget) : + BaseBinding(loadFunc, saveFunc, postChangeNotify, acquireSaveTarget), + _textCtrl(textCtrl) + { + if (BaseBinding::_updateValue) + { + _textCtrl->Bind(wxEVT_TEXT, &ExpressionBinding::onTextChanged, this); + } + } + + virtual ~ExpressionBinding() { - if (!source) + if (BaseBinding::_updateValue) { - _textCtrl->SetValue(""); - return; + _textCtrl->Unbind(wxEVT_TEXT, &ExpressionBinding::onTextChanged, this); } + } - auto expression = _getExpression(source); - _textCtrl->SetValue(expression ? expression->getExpressionString() : ""); +protected: + void setValueOnControl(const std::string& value) override + { + _textCtrl->SetValue(value); + } + + void onTextChanged(wxCommandEvent& ev) + { + BaseBinding::updateValueOnTarget(_textCtrl->GetValue().ToStdString()); } }; diff --git a/radiant/ui/materials/MaterialEditor.cpp b/radiant/ui/materials/MaterialEditor.cpp index 54f98c620a..9a1c3788b6 100644 --- a/radiant/ui/materials/MaterialEditor.cpp +++ b/radiant/ui/materials/MaterialEditor.cpp @@ -13,13 +13,20 @@ #include #include #include +#include #include +#include #include "wxutil/SourceView.h" +#include "wxutil/dataview/ResourceTreeViewToolbar.h" +#include "wxutil/Bitmap.h" #include "fmt/format.h" #include "string/join.h" #include "materials/ParseLib.h" #include "ExpressionBinding.h" +#include "RadioButtonBinding.h" +#include "SpinCtrlBinding.h" +#include "CheckBoxBinding.h" namespace ui { @@ -27,23 +34,36 @@ namespace ui namespace { const char* const DIALOG_TITLE = N_("Material Editor"); + + const char* const ICON_STAGE_VISIBLE = "visible.png"; + const char* const ICON_STAGE_INVISIBLE = "invisible.png"; + const char* const ICON_GLOBAL_SETTINGS = "icon_texture.png"; + const std::string RKEY_ROOT = "user/ui/materialEditor/"; const std::string RKEY_SPLIT_POS = RKEY_ROOT + "splitPos"; const std::string RKEY_WINDOW_STATE = RKEY_ROOT + "window"; + const char* const CUSTOM_BLEND_TYPE = N_("Custom"); + // Columns for the stages list struct StageColumns : public wxutil::TreeModel::ColumnRecord { StageColumns() : + enabled(add(wxutil::TreeModel::Column::Boolean)), + icon(add(wxutil::TreeModel::Column::Icon)), name(add(wxutil::TreeModel::Column::String)), index(add(wxutil::TreeModel::Column::Integer)), - visible(add(wxutil::TreeModel::Column::Boolean)) + visible(add(wxutil::TreeModel::Column::Boolean)), + global(add(wxutil::TreeModel::Column::Boolean)) {} + wxutil::TreeModel::Column enabled; + wxutil::TreeModel::Column icon; wxutil::TreeModel::Column name; wxutil::TreeModel::Column index; wxutil::TreeModel::Column visible; + wxutil::TreeModel::Column global; }; StageColumns& STAGE_COLS() @@ -51,20 +71,53 @@ namespace static StageColumns _i; return _i; } + + bool stageQualifiesAsColoured(const IShaderLayer::Ptr& layer) + { + auto red = layer->getColourExpression(IShaderLayer::COMP_RED); + auto green = layer->getColourExpression(IShaderLayer::COMP_GREEN); + auto blue = layer->getColourExpression(IShaderLayer::COMP_BLUE); + auto alpha = layer->getColourExpression(IShaderLayer::COMP_ALPHA); + + return red && red->getExpressionString() == "parm0" && + green && green->getExpressionString() == "parm1" && + blue && blue->getExpressionString() == "parm2" && + alpha && alpha->getExpressionString() == "parm3"; + } + + IShaderLayer::Type determineStageTypeToCreate(const MaterialPtr& material) + { + bool hasDiffuse = false; + bool hasBump = false; + bool hasSpecular = false; + + for (const auto& layer : material->getAllLayers()) + { + hasDiffuse |= layer->getType() == IShaderLayer::DIFFUSE; + hasBump |= layer->getType() == IShaderLayer::BUMP; + hasSpecular |= layer->getType() == IShaderLayer::SPECULAR; + } + + return !hasDiffuse ? IShaderLayer::DIFFUSE : + !hasBump ? IShaderLayer::BUMP : + !hasSpecular ? IShaderLayer::SPECULAR : + IShaderLayer::BLEND; + } } MaterialEditor::MaterialEditor() : DialogBase(DIALOG_TITLE), _treeView(nullptr), _stageList(new wxutil::TreeModel(STAGE_COLS(), true)), - _stageView(nullptr) + _stageView(nullptr), + _stageUpdateInProgress(false), + _materialUpdateInProgress(false) { loadNamedPanel(this, "MaterialEditorMainPanel"); makeLabelBold(this, "MaterialEditorDefinitionLabel"); - makeLabelBold(this, "MaterialEditorMaterialPropertiesLabel"); + makeLabelBold(this, "MaterialEditorStagePropertiesLabel"); makeLabelBold(this, "MaterialEditorMaterialStagesLabel"); - makeLabelBold(this, "MaterialEditorStageSettingsLabel"); // Wire up the close button getControl("MaterialEditorCloseButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onClose, this); @@ -73,6 +126,16 @@ MaterialEditor::MaterialEditor() : auto* panel = getControl("MaterialEditorTreeView"); _treeView = new MaterialTreeView(panel); _treeView->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MaterialEditor::_onTreeViewSelectionChanged, this); + + auto* treeToolbar = new wxutil::ResourceTreeViewToolbar(panel, _treeView); + treeToolbar->EnableFavouriteManagement(false); + + auto definitionLabel = getControl("MaterialEditorDefinitionLabel"); + definitionLabel->GetContainingSizer()->Detach(definitionLabel); + definitionLabel->Reparent(treeToolbar); + treeToolbar->GetLeftSizer()->Add(definitionLabel, 0, wxALIGN_LEFT); + + panel->GetSizer()->Add(treeToolbar, 0, wxEXPAND | wxBOTTOM, 6); panel->GetSizer()->Add(_treeView, 1, wxEXPAND); // Setup the splitter and preview @@ -82,12 +145,25 @@ MaterialEditor::MaterialEditor() : // Set up the preview auto* previewPanel = getControl("MaterialEditorPreviewPanel"); - _preview.reset(new wxutil::ModelPreview(previewPanel)); + _preview.reset(new MaterialPreview(previewPanel)); - _sourceView = new wxutil::D3MaterialSourceViewCtrl(previewPanel); + // Collapsible preview pane + auto sourceTextPanel = new wxCollapsiblePane(previewPanel, wxID_ANY, _("Material Source Text")); + _sourceView = new wxutil::D3MaterialSourceViewCtrl(sourceTextPanel->GetPane()); + _sourceView->SetMinSize(wxSize(-1, 400)); + + sourceTextPanel->Bind(wxEVT_COLLAPSIBLEPANE_CHANGED, [=](wxCollapsiblePaneEvent& ev) + { + previewPanel->Layout(); + }); + + auto paneSizer = new wxBoxSizer(wxVERTICAL); + paneSizer->Add(_sourceView, 1, wxGROW | wxEXPAND); + sourceTextPanel->GetPane()->SetSizer(paneSizer); + sourceTextPanel->Collapse(); previewPanel->GetSizer()->Add(_preview->getWidget(), 1, wxEXPAND); - previewPanel->GetSizer()->Add(_sourceView, 1, wxEXPAND); + previewPanel->GetSizer()->Add(sourceTextPanel, 0, wxEXPAND); setupMaterialProperties(); setupMaterialStageView(); @@ -118,6 +194,25 @@ MaterialEditor::MaterialEditor() : updateControlsFromMaterial(); } +MaterialEditor::~MaterialEditor() +{ + _materialBindings.clear(); + _stageBindings.clear(); + + auto notebook = getControl("MaterialStageSettingsNotebook"); + + // Remove all umapped pages to avoid memory leaks + for (const auto& pair : _notebookPages) + { + if (notebook->FindPage(pair.second.first) == -1) + { + pair.second.first->Destroy(); + } + } + + _notebookPages.clear(); +} + int MaterialEditor::ShowModal() { // Restore the position @@ -155,6 +250,8 @@ void MaterialEditor::setupMaterialProperties() typeDropdown->AppendString(pair.first); } + typeDropdown->Bind(wxEVT_CHOICE, &MaterialEditor::_onMaterialTypeChoice, this); + auto* sortDropdown = getControl("MaterialSortValue"); sortDropdown->AppendString(""); // empty string for undefined @@ -163,51 +260,202 @@ void MaterialEditor::setupMaterialProperties() { sortDropdown->AppendString(pair.first); } + + sortDropdown->Bind(wxEVT_COMBOBOX, &MaterialEditor::_onSortRequestChanged, this); + sortDropdown->Bind(wxEVT_TEXT, &MaterialEditor::_onSortRequestChanged, this); + + auto description = getControl("MaterialDescription"); + description->Bind(wxEVT_TEXT, [description, this](wxCommandEvent& ev) + { + if (_material && !_materialUpdateInProgress) + { + _material->setDescription(description->GetValue().ToStdString()); + } + }); _materialBindings.emplace(std::make_shared>(getControl("MaterialHasSortValue"), - [](const MaterialPtr& material) { return (material->getParseFlags() & Material::PF_HasSortDefined) != 0; })); + [](const MaterialPtr& material) + { + return (material->getMaterialFlags() & Material::FLAG_HAS_SORT_DEFINED) != 0; + }, + [this](const MaterialPtr& material, const bool& value) + { + if (!value) + { + material->resetSortReqest(); + } + else + { + material->setSortRequest(Material::SORT_OPAQUE); + } + }, + [this]() { onMaterialChanged(); })); + + _materialBindings.emplace(std::make_shared>( + getControl("MaterialPolygonOffsetValue"), + [](const MaterialPtr& material) { return material->getPolygonOffset(); }, + [this](const MaterialPtr& material, const double& value) + { + material->setPolygonOffset(value); + getControl("MaterialFlagHasPolygonOffset")->SetValue((material->getMaterialFlags() & Material::FLAG_POLYGONOFFSET) != 0); + }, + [this]() { onMaterialChanged(); })); + + getControl("MaterialHasSpectrum")->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& ev) + { + getControl("MaterialSpectrumValue")->Enable(ev.IsChecked()); + }); + + // For light fall off images, only cameracubemap and map are allowed + auto lightFallOffCubeMapType = getControl("MaterialLightFalloffCubeMapType"); + lightFallOffCubeMapType->AppendString(shaders::getStringForMapType(IShaderLayer::MapType::Map)); + lightFallOffCubeMapType->AppendString(shaders::getStringForMapType(IShaderLayer::MapType::CameraCubeMap)); + + lightFallOffCubeMapType->Bind(wxEVT_CHOICE, [this, lightFallOffCubeMapType] (wxCommandEvent& ev) + { + if (_materialUpdateInProgress || !_material) return; + _material->setLightFalloffCubeMapType(shaders::getMapTypeForString(lightFallOffCubeMapType->GetStringSelection().ToStdString())); + }); + + _materialBindings.emplace(std::make_shared>(getControl("MaterialLightFalloffMap"), + [](const MaterialPtr& material) + { + auto expr = material->getLightFalloffExpression(); + return expr ? expr->getExpressionString() : std::string(); + }, + [this](const MaterialPtr& material, const std::string& value) + { + if (_materialUpdateInProgress || !_material) return; + material->setLightFalloffExpressionFromString(value); + }, + [this]() { onMaterialChanged(); })); + + _materialBindings.emplace(std::make_shared>(getControl("MaterialSpectrumValue"), + [](const MaterialPtr& material) { return material->getSpectrum(); }, + [this](const MaterialPtr& material, const int& value) + { + if (_materialUpdateInProgress || !_material) return; + material->setSpectrum(value); + }, + [this]() { onMaterialChanged(); })); } void MaterialEditor::setupSurfaceFlag(const std::string& controlName, Material::SurfaceFlags flag) { _materialBindings.emplace(std::make_shared>(getControl(controlName), [=](const MaterialPtr& material) - { - return (material->getSurfaceFlags() & flag) != 0; - })); + { + return (material->getSurfaceFlags() & flag) != 0; + }, + [this, flag](const MaterialPtr& material, const bool& value) + { + if (_materialUpdateInProgress || !_material) return; + + if (value) + { + _material->setSurfaceFlag(flag); + } + else + { + _material->clearSurfaceFlag(flag); + } + }, + [this]() { onMaterialChanged(); })); } void MaterialEditor::setupMaterialFlag(const std::string& controlName, Material::Flags flag) { _materialBindings.emplace(std::make_shared>(getControl(controlName), - [=](const MaterialPtr& material) + [=](const MaterialPtr& material) { return (material->getMaterialFlags() & flag) != 0; + }, + [=](const MaterialPtr& material, const bool& newValue) + { + if (newValue) + { + material->setMaterialFlag(flag); + } + else + { + material->clearMaterialFlag(flag); + } + }, + [this]() // post-update + { + onMaterialChanged(); + updateMaterialPropertiesFromMaterial(); })); } void MaterialEditor::setupMaterialLightFlags() { _materialBindings.emplace(std::make_shared>(getControl("MaterialIsAmbientLight"), - [](const MaterialPtr& material) { return material->isAmbientLight(); })); + [](const MaterialPtr& material) { return material->isAmbientLight(); }, + [=](const MaterialPtr& material, const bool& newValue) + { + material->setIsAmbientLight(newValue); + }, + [this]() // post-update + { + onMaterialChanged(); + updateMaterialPropertiesFromMaterial(); + })); _materialBindings.emplace(std::make_shared>(getControl("MaterialIsAmbientCubicLight"), - [](const MaterialPtr& material) { return material->isAmbientLight() && material->isCubicLight(); })); + [](const MaterialPtr& material) { return material->isAmbientLight() && material->isCubicLight(); }, + [=](const MaterialPtr& material, const bool& newValue) + { + material->setIsAmbientLight(newValue); + material->setIsCubicLight(newValue); + }, + [this]() // post-update + { + onMaterialChanged(); + updateMaterialPropertiesFromMaterial(); + })); _materialBindings.emplace(std::make_shared>(getControl("MaterialIsFogLight"), - [](const MaterialPtr& material) { return material->isFogLight(); })); + [](const MaterialPtr& material) { return material->isFogLight(); }, + [=](const MaterialPtr& material, const bool& newValue) + { + material->setIsFogLight(newValue); + }, + [this]() // post-update + { + onMaterialChanged(); + updateMaterialPropertiesFromMaterial(); + })); _materialBindings.emplace(std::make_shared>(getControl("MaterialIsCubicLight"), - [](const MaterialPtr& material) { return material->isCubicLight(); })); + [](const MaterialPtr& material) { return material->isCubicLight(); }, + [=](const MaterialPtr& material, const bool& newValue) + { + material->setIsCubicLight(newValue); + }, + [this]() // post-update + { + onMaterialChanged(); + updateMaterialPropertiesFromMaterial(); + })); _materialBindings.emplace(std::make_shared>(getControl("MaterialIsBlendLight"), - [](const MaterialPtr& material) { return material->isBlendLight(); })); + [](const MaterialPtr& material) { return material->isBlendLight(); }, + [=](const MaterialPtr& material, const bool& newValue) + { + material->setIsBlendLight(newValue); + }, + [this]() // post-update + { + onMaterialChanged(); + updateMaterialPropertiesFromMaterial(); + })); } void MaterialEditor::setupMaterialShaderFlags() { setupMaterialFlag("MaterialNoShadows", Material::FLAG_NOSHADOWS); - setupMaterialFlag("MaterialNoSelfShadows", Material::FLAG_NOSELFSHADOW); + setupMaterialFlag("MaterialNoSelfShadow", Material::FLAG_NOSELFSHADOW); setupMaterialFlag("MaterialForceShadows", Material::FLAG_FORCESHADOWS); setupMaterialFlag("MaterialTranslucent", Material::FLAG_TRANSLUCENT); setupMaterialFlag("MaterialNoFog", Material::FLAG_NOFOG); @@ -221,52 +469,57 @@ void MaterialEditor::setupMaterialShaderFlags() setupMaterialFlag("MaterialFlagIsLightGemSurf", Material::FLAG_ISLIGHTGEMSURF); // Cull types - _materialBindings.emplace(std::make_shared>(getControl("MaterialTwoSided"), - [](const MaterialPtr& material) + auto cullTypes = getControl("MaterialCullType"); + + for (const auto& pair : shaders::CullTypes) { - return material->getCullType() == Material::CULL_NONE; - })); + cullTypes->AppendString(pair.first); + } - _materialBindings.emplace(std::make_shared>(getControl("MaterialBackSided"), - [](const MaterialPtr& material) + cullTypes->Bind(wxEVT_CHOICE, [=](wxCommandEvent& ev) { - return material->getCullType() == Material::CULL_FRONT; - })); + if (!_material || _materialUpdateInProgress) return; + _material->setCullType(shaders::getCullTypeForString(cullTypes->GetStringSelection().ToStdString())); + onMaterialChanged(); + }); // Global Clamping - _materialBindings.emplace(std::make_shared>(getControl("MaterialFlagClamp"), - [](const MaterialPtr& material) + auto clampDropdown = getControl("MaterialClampType"); + for (const auto& pair : shaders::ClampTypeNames) { - return material->getClampType() == CLAMP_NOREPEAT; - })); + clampDropdown->AppendString(pair.first); + } - _materialBindings.emplace(std::make_shared>(getControl("MaterialFlagZeroClamp"), - [](const MaterialPtr& material) + clampDropdown->Bind(wxEVT_CHOICE, [this, clampDropdown](wxCommandEvent& ev) { - return material->getClampType() == CLAMP_ZEROCLAMP; - })); + if (!_material || _materialUpdateInProgress) return; - _materialBindings.emplace(std::make_shared>(getControl("MaterialFlagAlphaZeroClamp"), - [](const MaterialPtr& material) - { - return material->getClampType() == CLAMP_ALPHAZEROCLAMP; - })); + if (_material) + { + _material->setClampType(shaders::getClampTypeForString(clampDropdown->GetStringSelection().ToStdString())); + onMaterialChanged(); + } + }); // DECAL_MACRO _materialBindings.emplace(std::make_shared>(getControl("MaterialHasDecalMacro"), - [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasDecalMacro; })); + [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasDecalMacro; }, + [=](const MaterialPtr& material, const bool& newValue) {})); // TWOSIDED_DECAL_MACRO _materialBindings.emplace(std::make_shared>(getControl("MaterialHasTwoSidedDecalMacro"), - [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasTwoSidedDecalMacro; })); + [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasTwoSidedDecalMacro; }, + [=](const MaterialPtr& material, const bool& newValue) {})); // GLASS_MACRO _materialBindings.emplace(std::make_shared>(getControl("MaterialHasGlassMacro"), - [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasGlassMacro; })); + [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasGlassMacro; }, + [=](const MaterialPtr& material, const bool& newValue) {})); // PARTICLE_MACRO _materialBindings.emplace(std::make_shared>(getControl("MaterialHasParticleMacro"), - [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasParticleMacro; })); + [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasParticleMacro; }, + [=](const MaterialPtr& material, const bool& newValue) {})); } void MaterialEditor::setupMaterialSurfaceFlags() @@ -318,53 +571,177 @@ void MaterialEditor::setupMaterialDeformPage() void MaterialEditor::setupMaterialStageView() { + _iconVisible = wxutil::GetLocalBitmap(ICON_STAGE_VISIBLE); + _iconInvisible = wxutil::GetLocalBitmap(ICON_STAGE_INVISIBLE); + // Stage view auto* panel = getControl("MaterialEditorStageView"); _stageView = wxutil::TreeView::CreateWithModel(panel, _stageList.get(), wxDV_NO_HEADER); panel->GetSizer()->Add(_stageView, 1, wxEXPAND); - // Single text column + _stageView->AppendBitmapColumn(_("Enabled"), STAGE_COLS().icon.getColumnIndex(), + wxDATAVIEW_CELL_ACTIVATABLE, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _stageView->AppendTextColumn(_("Stage"), STAGE_COLS().name.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _stageView->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MaterialEditor::_onStageListSelectionChanged, this); + _stageView->Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, &MaterialEditor::_onStageListItemActivated, this); + + getControl("MaterialEditorAddStageButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onAddStage, this); + getControl("MaterialEditorRemoveStageButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onRemoveStage, this); + getControl("MaterialEditorToggleStageButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onToggleStage, this); + getControl("MaterialEditorMoveUpStageButton")->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { moveStagePosition(-1); }); + getControl("MaterialEditorMoveDownStageButton")->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { moveStagePosition(+1); }); + getControl("MaterialEditorDuplicateStageButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onDuplicateStage, this); + + auto row = _stageList->AddItem(); + + row[STAGE_COLS().global] = true; + row[STAGE_COLS().index] = -1; + row[STAGE_COLS().icon] = wxVariant(wxutil::GetLocalBitmap(ICON_GLOBAL_SETTINGS)); + row[STAGE_COLS().name] = _("Global Settings"); + row[STAGE_COLS().enabled] = true; + + wxDataViewItemAttr globalStyle; + globalStyle.SetColour(wxColor(15, 15, 15)); + globalStyle.SetBold(true); + row[STAGE_COLS().name] = globalStyle; + + row.SendItemAdded(); + + auto notebook = getControl("MaterialStageSettingsNotebook"); + for (int i = 0; i < notebook->GetPageCount(); ++i) + { + auto page = notebook->GetPage(i); + _notebookPages.emplace(i, std::make_pair(page, notebook->GetPageText(i))); + } } -void MaterialEditor::setupStageFlag(const std::string& controlName, int flags) +void MaterialEditor::setupStageFlag(const std::string& controlName, IShaderLayer::Flags flag) { - _stageBindings.emplace(std::make_shared>(getControl(controlName), - [=](const ShaderLayerPtr& layer) - { - return (layer->getStageFlags() & flags) == flags; - })); + _stageBindings.emplace(std::make_shared>(getControl(controlName), + [=](const IShaderLayer::Ptr& layer) + { + return (layer->getStageFlags() & flag) == flag; + }, + [=](const IEditableShaderLayer::Ptr& layer, const bool& value) + { + if (value) + { + layer->setStageFlag(flag); + } + else + { + layer->clearStageFlag(flag); + } + }, + std::bind(&MaterialEditor::onMaterialChanged, this), + std::bind(&MaterialEditor::getEditableStageForSelection, this))); +} + +void MaterialEditor::createExpressionBinding(const std::string& textCtrlName, + const std::function& loadFunc, + const std::function& saveFunc) +{ + _stageBindings.emplace(std::make_shared>( + getControl(textCtrlName), + [loadFunc] (const IShaderLayer::Ptr& layer) + { + auto expr = loadFunc(layer); + return expr ? expr->getExpressionString() : std::string(); + }, + saveFunc, + std::bind(&MaterialEditor::onMaterialChanged, this), + std::bind(&MaterialEditor::getEditableStageForSelection, this))); +} + +void MaterialEditor::createRadioButtonBinding(const std::string& ctrlName, + const std::function& loadFunc, + const std::function& saveFunc) +{ + _stageBindings.emplace(std::make_shared>( + getControl(ctrlName), + loadFunc, + saveFunc, + std::bind(&MaterialEditor::onMaterialChanged, this), + std::bind(&MaterialEditor::getEditableStageForSelection, this))); +} + +void MaterialEditor::createSpinCtrlBinding(const std::string& ctrlName, + const std::function& loadFunc, + const std::function& saveFunc) +{ + _stageBindings.emplace(std::make_shared>( + getControl(ctrlName), + loadFunc, + saveFunc, + std::bind(&MaterialEditor::onMaterialChanged, this), + std::bind(&MaterialEditor::getEditableStageForSelection, this))); +} + +void MaterialEditor::createSpinCtrlDoubleBinding(const std::string& ctrlName, + const std::function& loadFunc, + const std::function& saveFunc) +{ + _stageBindings.emplace(std::make_shared>( + getControl(ctrlName), + loadFunc, + saveFunc, + std::bind(&MaterialEditor::onMaterialChanged, this), + std::bind(&MaterialEditor::getEditableStageForSelection, this))); } void MaterialEditor::setupMaterialStageProperties() { - setupStageFlag("MaterialStageFlagMaskRed", ShaderLayer::FLAG_MASK_RED); - setupStageFlag("MaterialStageFlagMaskGreen", ShaderLayer::FLAG_MASK_GREEN); - setupStageFlag("MaterialStageFlagMaskBlue", ShaderLayer::FLAG_MASK_BLUE); - setupStageFlag("MaterialStageFlagMaskAlpha", ShaderLayer::FLAG_MASK_ALPHA); - setupStageFlag("MaterialStageFlagMaskColour", ShaderLayer::FLAG_MASK_RED | ShaderLayer::FLAG_MASK_GREEN | ShaderLayer::FLAG_MASK_BLUE); - setupStageFlag("MaterialStageFlagMaskDepth", ShaderLayer::FLAG_MASK_DEPTH); - setupStageFlag("MaterialStageIgnoreAlphaTest", ShaderLayer::FLAG_IGNORE_ALPHATEST); - - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageHasAlphaTest"), - [=](const ShaderLayerPtr& layer) - { - return layer->hasAlphaTest(); - })); + setupStageFlag("MaterialStageFlagMaskRed", IShaderLayer::FLAG_MASK_RED); + setupStageFlag("MaterialStageFlagMaskGreen", IShaderLayer::FLAG_MASK_GREEN); + setupStageFlag("MaterialStageFlagMaskBlue", IShaderLayer::FLAG_MASK_BLUE); + setupStageFlag("MaterialStageFlagMaskAlpha", IShaderLayer::FLAG_MASK_ALPHA); - for (const auto& value : { - "diffusemap", "bumpmap", "specularmap", "blend", "add", "filter", "modulate", "none", "Custom" - }) + _stageBindings.emplace(std::make_shared>(getControl("MaterialStageFlagMaskColour"), + [=](const IShaderLayer::Ptr& layer) + { + auto colourFlags = IShaderLayer::FLAG_MASK_RED | IShaderLayer::FLAG_MASK_GREEN | IShaderLayer::FLAG_MASK_BLUE; + return (layer->getStageFlags() & colourFlags) == colourFlags; + }, + [=](const IEditableShaderLayer::Ptr& layer, const bool& value) + { + if (value) + { + layer->setStageFlag(IShaderLayer::FLAG_MASK_RED); + layer->setStageFlag(IShaderLayer::FLAG_MASK_GREEN); + layer->setStageFlag(IShaderLayer::FLAG_MASK_BLUE); + } + else + { + layer->clearStageFlag(IShaderLayer::FLAG_MASK_RED); + layer->clearStageFlag(IShaderLayer::FLAG_MASK_GREEN); + layer->clearStageFlag(IShaderLayer::FLAG_MASK_BLUE); + } + }, + std::bind(&MaterialEditor::onMaterialChanged, this), + std::bind(&MaterialEditor::getEditableStageForSelection, this))); + + setupStageFlag("MaterialStageFlagMaskDepth", IShaderLayer::FLAG_MASK_DEPTH); + setupStageFlag("MaterialStageIgnoreAlphaTest", IShaderLayer::FLAG_IGNORE_ALPHATEST); + + createExpressionBinding("MaterialStageAlphaTestExpression", + [](const IShaderLayer::Ptr& layer) { return layer->getAlphaTestExpression(); }, + [this](const IEditableShaderLayer::Ptr& layer, const std::string& value) + { + layer->setAlphaTestExpressionFromString(value); + }); + + for (const auto& value : { "diffusemap", "bumpmap", "specularmap", "blend", "add", "filter", "modulate", "none" }) { getControl("MaterialStageBlendType")->Append(value); } + + getControl("MaterialStageBlendType")->Append(_(CUSTOM_BLEND_TYPE)); for (const auto& value : { - "", "gl_one", "gl_zero", "gl_dst_color", "gl_one_minus_dst_color", "gl_src_alpha", + "gl_one", "gl_zero", "gl_dst_color", "gl_one_minus_dst_color", "gl_src_alpha", "gl_one_minus_src_alpha", "gl_dst_alpha", "gl_one_minus_dst_alpha", "gl_src_alpha_saturate" }) { @@ -372,37 +749,74 @@ void MaterialEditor::setupMaterialStageProperties() } for (const auto& value : { - "", "gl_one", "gl_zero", "gl_src_color", "gl_one_minus_src_color", "gl_src_alpha", + "gl_one", "gl_zero", "gl_src_color", "gl_one_minus_src_color", "gl_src_alpha", "gl_one_minus_src_alpha", "gl_dst_alpha", "gl_one_minus_dst_alpha" }) { getControl("MaterialStageBlendTypeDest")->Append(value); } - for (const auto& value : { "map", "cubeMap", "cameraCubeMap", "Special" }) + getControl("MaterialStageBlendType")->Bind(wxEVT_CHOICE, &MaterialEditor::_onStageBlendTypeChanged, this);; + getControl("MaterialStageBlendTypeSrc")->Bind(wxEVT_CHOICE, &MaterialEditor::_onStageBlendTypeChanged, this);; + getControl("MaterialStageBlendTypeDest")->Bind(wxEVT_CHOICE, &MaterialEditor::_onStageBlendTypeChanged, this);; + + auto mapTypeDropdown = getControl("MaterialStageMapType"); + + for (const auto& value : shaders::MapTypeNames) { - getControl("MaterialStageMapType")->Append(value); + mapTypeDropdown->Append(value.first); } + mapTypeDropdown->Bind(wxEVT_CHOICE, &MaterialEditor::_onStageMapTypeChanged, this); + + createSpinCtrlBinding("MaterialStageRenderMapWidth", + [](const IShaderLayer::Ptr& layer) { return static_cast(layer->getRenderMapSize().x()); }, + [this](const IEditableShaderLayer::Ptr& layer, const int& value) + { + auto currentSize = layer->getRenderMapSize(); + layer->setRenderMapSize(Vector2(value, currentSize.y())); + }); + createSpinCtrlBinding("MaterialStageRenderMapHeight", + [](const IShaderLayer::Ptr& layer) { return static_cast(layer->getRenderMapSize().y()); }, + [this](const IEditableShaderLayer::Ptr& layer, const int& value) + { + auto currentSize = layer->getRenderMapSize(); + layer->setRenderMapSize(Vector2(currentSize.x(), value)); + }); + + getControl("MaterialStageSoundMapWaveform")->Bind(wxEVT_CHECKBOX, [this] (wxCommandEvent& ev) + { + if (this->_stageUpdateInProgress) return; + auto stage = getEditableStageForSelection(); + if (!stage) return; + + stage->setSoundMapWaveForm(ev.IsChecked()); + }); + + getControl("MaterialStageVideoMapLoop")->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& ev) + { + if (this->_stageUpdateInProgress) return; + auto stage = getEditableStageForSelection(); + if (!stage) return; + + auto filePath = getControl("MaterialStageImageMap")->GetValue().ToStdString(); + stage->setVideoMapProperties(filePath, ev.IsChecked()); + }); + + createSpinCtrlDoubleBinding("MaterialStagePrivatePolygonOffset", + [](const IShaderLayer::Ptr& layer) { return layer->getPrivatePolygonOffset(); }, + [this](const IEditableShaderLayer::Ptr& layer, const double& value) + { + layer->setPrivatePolygonOffset(value); + }); + // Texture - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageClamp"), - [=](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_NOREPEAT; })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageNoclamp"), - [=](const ShaderLayerPtr& layer) - { - return layer->getClampType() == CLAMP_REPEAT && (layer->getParseFlags() & ShaderLayer::PF_HasNoclampKeyword) != 0; - })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageZeroClamp"), - [=](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_ZEROCLAMP; })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageAlphaZeroClamp"), - [=](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_ALPHAZEROCLAMP; })); - - setupStageFlag("MaterialStageFilterNearest", ShaderLayer::FLAG_FILTER_NEAREST); - setupStageFlag("MaterialStageFilterLinear", ShaderLayer::FLAG_FILTER_LINEAR); - setupStageFlag("MaterialStageHighQuality", ShaderLayer::FLAG_HIGHQUALITY); - setupStageFlag("MaterialStageForceHighQuality", ShaderLayer::FLAG_FORCE_HIGHQUALITY); - setupStageFlag("MaterialStageNoPicMip", ShaderLayer::FLAG_NO_PICMIP); - setupStageFlag("MaterialStageIgnoreDepth", ShaderLayer::FLAG_IGNORE_DEPTH); + setupStageFlag("MaterialStageFilterNearest", IShaderLayer::FLAG_FILTER_NEAREST); + setupStageFlag("MaterialStageFilterLinear", IShaderLayer::FLAG_FILTER_LINEAR); + setupStageFlag("MaterialStageHighQuality", IShaderLayer::FLAG_HIGHQUALITY); + setupStageFlag("MaterialStageForceHighQuality", IShaderLayer::FLAG_FORCE_HIGHQUALITY); + setupStageFlag("MaterialStageNoPicMip", IShaderLayer::FLAG_NO_PICMIP); + setupStageFlag("MaterialStageIgnoreDepth", IShaderLayer::FLAG_IGNORE_DEPTH); auto texgenDropdown = getControl("MaterialStageTexGenType"); texgenDropdown->AppendString(""); @@ -412,58 +826,164 @@ void MaterialEditor::setupMaterialStageProperties() texgenDropdown->AppendString(pair.first); } - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageTranslateX"), - [=](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(0); })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageTranslateY"), - [=](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(1); })); + texgenDropdown->Bind(wxEVT_CHOICE, [this, texgenDropdown](wxCommandEvent& ev) + { + auto stage = getEditableStageForSelection(); + + if (stage) + { + stage->setTexGenType(shaders::getTexGenTypeForString(texgenDropdown->GetStringSelection().ToStdString())); + updateStageTextureControls(); + } + }); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageScaleX"), - [=](const ShaderLayerPtr& layer) { return layer->getScaleExpression(0); })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageScaleY"), - [=](const ShaderLayerPtr& layer) { return layer->getScaleExpression(1); })); + createExpressionBinding("MaterialStageWobbleSkyX", + [](const IShaderLayer::Ptr& layer) { return layer->getExpression(IShaderLayer::Expression::TexGenParam1); }, + [this](const IEditableShaderLayer::Ptr& layer, const std::string& value) + { + layer->setTexGenExpressionFromString(0, value); + }); + createExpressionBinding("MaterialStageWobbleSkyY", + [](const IShaderLayer::Ptr& layer) { return layer->getExpression(IShaderLayer::Expression::TexGenParam2); }, + [this](const IEditableShaderLayer::Ptr& layer, const std::string& value) + { + layer->setTexGenExpressionFromString(1, value); + }); + createExpressionBinding("MaterialStageWobbleSkyZ", + [](const IShaderLayer::Ptr& layer) { return layer->getExpression(IShaderLayer::Expression::TexGenParam3); }, + [this](const IEditableShaderLayer::Ptr& layer, const std::string& value) + { + layer->setTexGenExpressionFromString(2, value); + }); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageCenterScaleX"), - [=](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(0); })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageCenterScaleY"), - [=](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(1); })); + // Clamp Type + auto clampDropdown = getControl("MaterialStageClampType"); + for (const auto& pair : shaders::ClampTypeNames) + { + clampDropdown->AppendString(pair.first); + } - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageShearX"), - [=](const ShaderLayerPtr& layer) { return layer->getShearExpression(0); })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageShearY"), - [=](const ShaderLayerPtr& layer) { return layer->getShearExpression(1); })); + clampDropdown->Bind(wxEVT_CHOICE, [this, clampDropdown](wxCommandEvent& ev) + { + auto stage = getEditableStageForSelection(); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageRotate"), - [=](const ShaderLayerPtr& layer) { return layer->getRotationExpression(); })); + if (stage) + { + stage->setClampType(shaders::getClampTypeForString(clampDropdown->GetStringSelection().ToStdString())); + onMaterialChanged(); + } + }); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageCondition"), - [=](const ShaderLayerPtr& layer) { return layer->getConditionExpression(); })); + auto transformDropdown = getControl("MaterialStageAddTransformChoice"); + for (const auto& pair : shaders::TransformTypeNames) + { + transformDropdown->AppendString(pair.first); + } - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageColored"), - [=](const ShaderLayerPtr& layer) { return (layer->getParseFlags() & ShaderLayer::PF_HasColoredKeyword) != 0; })); + getControl("MaterialStageAddTransformButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onAddStageTransform, this); + getControl("MaterialStageRemoveTransformButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onRemoveStageTransform, this); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageRed"), - [=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_RED); })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageGreen"), - [=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_GREEN); })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageBlue"), - [=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_BLUE); })); - _stageBindings.emplace(std::make_shared>(getControl("MaterialStageAlpha"), - [=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_ALPHA); })); + // Add the transformation listview + auto transformationPanel = getControl("MaterialStageTransformations"); + _stageTransformations = wxutil::TreeModel::Ptr(new wxutil::TreeModel(_stageTransformationColumns, true)); + + _stageTransformView = wxutil::TreeView::CreateWithModel(transformationPanel, _stageTransformations.get(), wxDV_NO_HEADER); + _stageTransformView->AppendTextColumn("Type", _stageTransformationColumns.type.getColumnIndex(), + wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); + _stageTransformView->AppendTextColumn("Index", _stageTransformationColumns.index.getColumnIndex(), + wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); + _stageTransformView->AppendTextColumn("Expr1", _stageTransformationColumns.expression1.getColumnIndex(), + wxDATAVIEW_CELL_EDITABLE, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); + _stageTransformView->AppendTextColumn("Expr2", _stageTransformationColumns.expression2.getColumnIndex(), + wxDATAVIEW_CELL_EDITABLE, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); + + _stageTransformView->Bind(wxEVT_DATAVIEW_ITEM_EDITING_DONE, &MaterialEditor::_onStageTransformEdited, this); + _stageTransformView->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this] (wxDataViewEvent&) + { + getControl("MaterialStageRemoveTransformButton")->Enable(_stageTransformView->GetSelection().IsOk()); + }); + + transformationPanel->GetSizer()->Add(_stageTransformView, 1, wxEXPAND); + + createExpressionBinding("MaterialStageCondition", + [](const IShaderLayer::Ptr& layer) { return layer->getConditionExpression(); }, + [](const IEditableShaderLayer::Ptr& layer, const std::string& value) { layer->setConditionExpressionFromString(value); }); + + _stageBindings.emplace(std::make_shared>(getControl("MaterialStageColored"), + [](const IShaderLayer::Ptr& layer) { return stageQualifiesAsColoured(layer); }, + [=](const IEditableShaderLayer::Ptr& layer, const bool& value) { _onStageColoredChecked(layer, value); }, + std::bind(&MaterialEditor::onMaterialChanged, this), + std::bind(&MaterialEditor::getEditableStageForSelection, this))); + + createRadioButtonBinding("MaterialStageNoVertexColourFlag", + [](const IShaderLayer::Ptr& layer) { return layer->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_NONE; }, + [](const IEditableShaderLayer::Ptr& layer, bool value) { if (value) layer->setVertexColourMode(IShaderLayer::VERTEX_COLOUR_NONE); }); + createRadioButtonBinding("MaterialStageVertexColourFlag", + [](const IShaderLayer::Ptr& layer) { return layer->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_MULTIPLY; }, + [](const IEditableShaderLayer::Ptr& layer, bool value) { if (value) layer->setVertexColourMode(IShaderLayer::VERTEX_COLOUR_MULTIPLY); }); + createRadioButtonBinding("MaterialStageInverseVertexColourFlag", + [](const IShaderLayer::Ptr& layer) { return layer->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY; }, + [](const IEditableShaderLayer::Ptr& layer, bool value) { if (value) layer->setVertexColourMode(IShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY); }); + + createExpressionBinding("MaterialStageRed", + [](const IShaderLayer::Ptr& layer) { return layer->getColourExpression(IShaderLayer::COMP_RED); }, + [this](const IEditableShaderLayer::Ptr& layer, const std::string& value) + { + layer->setColourExpressionFromString(IShaderLayer::COMP_RED, value); + updateStageColoredStatus(); + }); + createExpressionBinding("MaterialStageGreen", + [](const IShaderLayer::Ptr& layer) { return layer->getColourExpression(IShaderLayer::COMP_GREEN); }, + [this](const IEditableShaderLayer::Ptr& layer, const std::string& value) + { + layer->setColourExpressionFromString(IShaderLayer::COMP_GREEN, value); + updateStageColoredStatus(); + }); + createExpressionBinding("MaterialStageBlue", + [](const IShaderLayer::Ptr& layer) { return layer->getColourExpression(IShaderLayer::COMP_BLUE); }, + [this](const IEditableShaderLayer::Ptr& layer, const std::string& value) + { + layer->setColourExpressionFromString(IShaderLayer::COMP_BLUE, value); + updateStageColoredStatus(); + }); + createExpressionBinding("MaterialStageAlpha", + [](const IShaderLayer::Ptr& layer) { return layer->getColourExpression(IShaderLayer::COMP_ALPHA); }, + [this](const IEditableShaderLayer::Ptr& layer, const std::string& value) + { + layer->setColourExpressionFromString(IShaderLayer::COMP_ALPHA, value); + updateStageColoredStatus(); + }); auto parameterPanel = getControl("MaterialStageProgramParameters"); _stageProgramParameters = wxutil::TreeModel::Ptr(new wxutil::TreeModel(_stageProgramColumns, true)); auto paramsView = wxutil::TreeView::CreateWithModel(parameterPanel, _stageProgramParameters.get(), wxDV_NO_HEADER); - paramsView->AppendTextColumn("Type", _stageProgramColumns.type.getColumnIndex(), - wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); paramsView->AppendTextColumn("Index", _stageProgramColumns.index.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); + paramsView->AppendTextColumn("Type", _stageProgramColumns.type.getColumnIndex(), + wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); paramsView->AppendTextColumn("Expression", _stageProgramColumns.expression.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); parameterPanel->GetSizer()->Add(paramsView, 1, wxEXPAND); } +void MaterialEditor::updateStageColoredStatus() +{ + auto selectedStage = getSelectedStage(); + + if (!selectedStage) return; + + bool stageIsColoured = stageQualifiesAsColoured(selectedStage); + + getControl("MaterialStageColored")->SetValue(stageIsColoured); + + getControl("MaterialStageRed")->Enable(!stageIsColoured); + getControl("MaterialStageGreen")->Enable(!stageIsColoured); + getControl("MaterialStageBlue")->Enable(!stageIsColoured); + getControl("MaterialStageAlpha")->Enable(!stageIsColoured); +} + void MaterialEditor::_onTreeViewSelectionChanged(wxDataViewEvent& ev) { // Update the preview if a texture is selected @@ -481,11 +1001,93 @@ void MaterialEditor::_onTreeViewSelectionChanged(wxDataViewEvent& ev) void MaterialEditor::_onStageListSelectionChanged(wxDataViewEvent& ev) { + auto item = _stageView->GetSelection(); + + if (!_material || !item.IsOk()) return; + auto row = wxutil::TreeModel::Row(item, *_stageList); + + updateSettingsNotebook(); updateStageControls(); + updateStageButtonSensitivity(); +} + +void MaterialEditor::updateSettingsNotebook() +{ + auto item = _stageView->GetSelection(); + + bool isGlobal = true; + + if (_material && item.IsOk()) + { + auto row = wxutil::TreeModel::Row(item, *_stageList); + isGlobal = row[STAGE_COLS().global].getBool(); + } + + auto notebook = getControl("MaterialStageSettingsNotebook"); + auto desiredPrefix = isGlobal ? "Material" : "Stage"; + + // Remove unwanted pages + for (int i = notebook->GetPageCount() - 1; i >= 0; --i) + { + if (!notebook->GetPage(i)->GetName().StartsWith(desiredPrefix)) + { + notebook->RemovePage(i); + } + } + + // Add missing pages + for (const auto& pair : _notebookPages) + { + auto page = pair.second.first; + if (page->GetName().StartsWith(desiredPrefix) && notebook->FindPage(page) == -1) + { + notebook->AddPage(page, pair.second.second); + } + } + + // Update settings title + getControl("MaterialEditorStagePropertiesLabel")->SetLabel(isGlobal ? + _("Global Material Settings") : _("Stage Settings")); +} + +void MaterialEditor::updateStageButtonSensitivity() +{ + auto item = _stageView->GetSelection(); + + if (_material && item.IsOk()) + { + auto row = wxutil::TreeModel::Row(item, *_stageList); + auto index = row[STAGE_COLS().index].getInteger(); + auto isGlobalStage = row[STAGE_COLS().global].getBool(); + auto layersCount = _material->getAllLayers().size(); + + getControl("MaterialEditorRemoveStageButton")->Enable(!isGlobalStage); + getControl("MaterialEditorToggleStageButton")->Enable(!isGlobalStage); + getControl("MaterialEditorMoveUpStageButton")->Enable(!isGlobalStage && index > 0); + getControl("MaterialEditorMoveDownStageButton")->Enable(!isGlobalStage && index + 1 < layersCount); + getControl("MaterialEditorDuplicateStageButton")->Enable(!isGlobalStage); + } + else + { + getControl("MaterialEditorRemoveStageButton")->Disable(); + getControl("MaterialEditorToggleStageButton")->Disable(); + getControl("MaterialEditorMoveUpStageButton")->Disable(); + getControl("MaterialEditorMoveDownStageButton")->Disable(); + getControl("MaterialEditorDuplicateStageButton")->Disable(); + } +} + +void MaterialEditor::_onStageListItemActivated(wxDataViewEvent& ev) +{ + toggleSelectedStage(); } void MaterialEditor::updateControlsFromMaterial() { + util::ScopedBoolLock lock(_materialUpdateInProgress); + + _preview->setMaterial(_material); + updateMaterialPropertiesFromMaterial(); updateStageListFromMaterial(); } @@ -543,8 +1145,6 @@ void MaterialEditor::updateDeformControlsFromMaterial() { pair.second->Show(_material->getDeformType() == pair.first); } - - getControl("DeformPage")->Layout(); } else // no material { @@ -554,9 +1154,9 @@ void MaterialEditor::updateDeformControlsFromMaterial() { pair.second->Hide(); } - - getControl("DeformPage")->Layout(); } + + getControl("MaterialPageDeform")->Layout(); } inline std::string getBlendFuncString(const std::pair& pair) @@ -564,17 +1164,17 @@ inline std::string getBlendFuncString(const std::pair& return !pair.second.empty() ? fmt::format("{0}, {1}", pair.first, pair.second) : pair.first; } -inline std::string getNameForLayer(const ShaderLayer& layer) +inline std::string getNameForLayer(const IShaderLayer& layer) { switch (layer.getType()) { - case ShaderLayer::DIFFUSE: + case IShaderLayer::DIFFUSE: return "diffuse"; - case ShaderLayer::BUMP: + case IShaderLayer::BUMP: return "bump"; - case ShaderLayer::SPECULAR: + case IShaderLayer::SPECULAR: return "specular"; - case ShaderLayer::BLEND: + case IShaderLayer::BLEND: return fmt::format("blend {0}", getBlendFuncString(layer.getBlendFuncStrings())); } @@ -583,10 +1183,13 @@ inline std::string getNameForLayer(const ShaderLayer& layer) void MaterialEditor::updateStageListFromMaterial() { - _stageList->Clear(); + // Remove all non-global items + _stageList->RemoveItems([&](const wxutil::TreeModel::Row& row) + { + return !row[STAGE_COLS().global].getBool(); + }); getControl("MaterialEditorStageListPanel")->Enable(_material != nullptr); - getControl("MaterialEditorStageSettingsPanel")->Enable(_material != nullptr); if (!_material) return; @@ -597,6 +1200,8 @@ void MaterialEditor::updateStageListFromMaterial() { auto row = _stageList->AddItem(); + row[STAGE_COLS().enabled] = layer->isEnabled(); + row[STAGE_COLS().icon] = wxVariant(layer->isEnabled() ? _iconVisible : _iconInvisible); row[STAGE_COLS().index] = index; row[STAGE_COLS().name] = getNameForLayer(*layer); row[STAGE_COLS().visible] = true; @@ -612,12 +1217,15 @@ void MaterialEditor::updateStageListFromMaterial() void MaterialEditor::updateMaterialPropertiesFromMaterial() { - getControl("MaterialEditorMaterialPropertiesPanel")->Enable(_material != nullptr); + util::ScopedBoolLock lock(_materialUpdateInProgress); + + getControl("MaterialEditorStageSettingsPanel")->Enable(_material != nullptr); // Update all registered bindings for (const auto& binding : _materialBindings) { binding->setSource(_material); + binding->updateFromSource(); } updateDeformControlsFromMaterial(); @@ -638,19 +1246,9 @@ void MaterialEditor::updateMaterialPropertiesFromMaterial() materialTypeDropdown->Select(materialTypeDropdown->FindString(surfType)); } - // Polygon offset - if (_material->getMaterialFlags() & Material::FLAG_POLYGONOFFSET) - { - getControl("MaterialPolygonOffsetValue")->SetValue(_material->getPolygonOffset()); - } - else - { - getControl("MaterialPolygonOffsetValue")->SetValue(0.0); - } - // Sort dropdown auto* materialSortDropdown = getControl("MaterialSortValue"); - if (_material->getParseFlags() & Material::PF_HasSortDefined) + if (_material->getMaterialFlags() & Material::FLAG_HAS_SORT_DEFINED) { auto predefinedName = shaders::getStringForSortRequestValue(_material->getSortRequest()); @@ -668,15 +1266,22 @@ void MaterialEditor::updateMaterialPropertiesFromMaterial() materialSortDropdown->Select(0); } - // Light Falloff - auto lightFalloffMap = _material->getLightFalloffExpression(); - getControl("MaterialLightFalloffMap")->SetValue(lightFalloffMap ? lightFalloffMap->getExpressionString() : ""); + // Clamping + auto clampDropdown = getControl("MaterialClampType"); + auto clampTypeString = shaders::getStringForClampType(_material->getClampType()); + clampDropdown->SetStringSelection(clampTypeString); + + // Culling + auto cullTypes = getControl("MaterialCullType"); + auto cullTypeString = shaders::getStringForCullType(_material->getCullType()); + cullTypes->SetStringSelection(cullTypeString); - auto lightFalloffCubeMap = _material->getLightFalloffCubeMapExpression(); - getControl("MaterialLightFalloffCubeMap")->SetValue(lightFalloffCubeMap ? lightFalloffCubeMap->getExpressionString() : ""); + // Light Falloff type + auto lightFalloffCubeMapType = _material->getLightFalloffCubeMapType(); + getControl("MaterialLightFalloffCubeMapType")->SetStringSelection(shaders::getStringForMapType(lightFalloffCubeMapType)); // Spectrum - bool hasSpectrum = _material->getParseFlags() & Material::PF_HasSpectrum; + bool hasSpectrum = (_material->getParseFlags() & Material::PF_HasSpectrum) != 0 || _material->getSpectrum() != 0; getControl("MaterialHasSpectrum")->SetValue(hasSpectrum); getControl("MaterialSpectrumValue")->Enable(hasSpectrum); getControl("MaterialSpectrumValue")->SetValue(_material->getSpectrum()); @@ -695,11 +1300,11 @@ void MaterialEditor::updateMaterialPropertiesFromMaterial() decalInfo.endColour.x(), decalInfo.endColour.y(), decalInfo.endColour.z(), decalInfo.endColour.w())); getControl("MaterialHasRenderBump")->SetValue(!_material->getRenderBumpArguments().empty()); - getControl("MaterialRenderBumpArguments")->Enable(!_material->getRenderBumpArguments().empty()); + //getControl("MaterialRenderBumpArguments")->Enable(!_material->getRenderBumpArguments().empty()); getControl("MaterialRenderBumpArguments")->SetValue(_material->getRenderBumpArguments()); getControl("MaterialHasRenderBumpFlat")->SetValue(!_material->getRenderBumpFlatArguments().empty()); - getControl("MaterialRenderBumpFlatArguments")->Enable(!_material->getRenderBumpFlatArguments().empty()); + //getControl("MaterialRenderBumpFlatArguments")->Enable(!_material->getRenderBumpFlatArguments().empty()); getControl("MaterialRenderBumpFlatArguments")->SetValue(_material->getRenderBumpFlatArguments()); // guisurf @@ -708,8 +1313,8 @@ void MaterialEditor::updateMaterialPropertiesFromMaterial() bool isEntityGui = (_material->getSurfaceFlags() & (Material::SURF_ENTITYGUI | Material::SURF_ENTITYGUI2 | Material::SURF_ENTITYGUI3)) != 0; - getControl("MaterialGuiSurfPath")->Enable(!isEntityGui); - getControl("MaterialGuiSurfPanel")->Enable(_material->getSurfaceFlags() & Material::SURF_GUISURF); + //getControl("MaterialGuiSurfPath")->Enable(!isEntityGui); + //getControl("MaterialGuiSurfPanel")->Enable(_material->getSurfaceFlags() & Material::SURF_GUISURF); getControl("MaterialGuiSurfRegular")->SetValue(!isEntityGui); getControl("MaterialGuiSurfEntity")->SetValue(_material->getSurfaceFlags() & Material::SURF_ENTITYGUI); @@ -738,7 +1343,6 @@ void MaterialEditor::updateMaterialPropertiesFromMaterial() getControl("MaterialHasSpectrum")->SetValue(false); getControl("MaterialSpectrumValue")->SetValue(0); - getControl("MaterialLightFalloffMap")->SetValue(""); getControl("MaterialDescription")->SetValue(""); _sourceView->SetValue(""); } @@ -757,14 +1361,16 @@ void MaterialEditor::selectStageByIndex(std::size_t index) _stageView->UnselectAll(); } + updateSettingsNotebook(); updateStageControls(); + updateStageButtonSensitivity(); } -ShaderLayerPtr MaterialEditor::getSelectedStage() +IShaderLayer::Ptr MaterialEditor::getSelectedStage() { auto selectedStageItem = _stageView->GetSelection(); - if (!selectedStageItem.IsOk() || !_material) return ShaderLayerPtr(); + if (!selectedStageItem.IsOk() || !_material) return IShaderLayer::Ptr(); const auto& layers = _material->getAllLayers(); wxutil::TreeModel::Row stageRow(selectedStageItem, *_stageList); @@ -775,7 +1381,19 @@ ShaderLayerPtr MaterialEditor::getSelectedStage() return layers[stageIndex]; } - return ShaderLayerPtr(); + return IShaderLayer::Ptr(); +} + +IEditableShaderLayer::Ptr MaterialEditor::getEditableStageForSelection() +{ + auto selectedStageItem = _stageView->GetSelection(); + + if (!selectedStageItem.IsOk() || !_material) return IEditableShaderLayer::Ptr(); + + wxutil::TreeModel::Row stageRow(selectedStageItem, *_stageList); + int stageIndex = stageRow[STAGE_COLS().index].getInteger(); + + return _material->getEditableLayer(stageIndex); } void MaterialEditor::updateStageBlendControls() @@ -791,22 +1409,6 @@ void MaterialEditor::updateStageBlendControls() blendType->Enable(); auto blendTypeStrings = selectedStage->getBlendFuncStrings(); - switch (selectedStage->getType()) - { - case ShaderLayer::DIFFUSE: - blendTypeStrings.first = "diffusemap"; - blendTypeStrings.second.clear(); - break; - case ShaderLayer::BUMP: - blendTypeStrings.first = "bumpmap"; - blendTypeStrings.second.clear(); - break; - case ShaderLayer::SPECULAR: - blendTypeStrings.first = "specularmap"; - blendTypeStrings.second.clear(); - break; - }; - blendTypeSrc->Enable(!blendTypeStrings.second.empty()); blendTypeDest->Enable(!blendTypeStrings.second.empty()); @@ -814,8 +1416,8 @@ void MaterialEditor::updateStageBlendControls() { blendType->SetStringSelection(blendTypeStrings.first); - blendTypeSrc->SetStringSelection(""); - blendTypeDest->SetStringSelection(""); + blendTypeSrc->SetStringSelection("gl_one"); + blendTypeDest->SetStringSelection("gl_zero"); // Get the actual src and dest blend types this shortcut is working with for (const auto& pair : shaders::BlendTypeShortcuts) @@ -830,7 +1432,7 @@ void MaterialEditor::updateStageBlendControls() } else { - blendType->SetStringSelection("Custom"); + blendType->SetStringSelection(_(CUSTOM_BLEND_TYPE)); blendTypeSrc->SetStringSelection(blendTypeStrings.first); blendTypeDest->SetStringSelection(blendTypeStrings.second); } @@ -843,34 +1445,23 @@ void MaterialEditor::updateStageBlendControls() } } -void MaterialEditor::updateStageTexgenControls() +void MaterialEditor::updateStageTextureControls() { auto selectedStage = getSelectedStage(); auto texgenDropdown = getControl("MaterialStageTexGenType"); - if (selectedStage && (selectedStage->getParseFlags() & ShaderLayer::PF_HasTexGenKeyword) != 0) + if (selectedStage) { + // Clamp Type + auto clampDropdown = getControl("MaterialStageClampType"); + auto clampTypeString = shaders::getStringForClampType(selectedStage->getClampType()); + clampDropdown->SetStringSelection(clampTypeString); + auto texgenName = shaders::getStringForTexGenType(selectedStage->getTexGenType()); texgenDropdown->Select(texgenDropdown->FindString(texgenName)); - if (selectedStage->getTexGenType() == ShaderLayer::TEXGEN_WOBBLESKY) - { - getControl("MaterialStageWobblySkyPanel")->Show(); - - auto wobbleSkyX = selectedStage->getTexGenExpression(0); - getControl("MaterialStageWobbleSkyX")->SetValue(wobbleSkyX ? wobbleSkyX->getExpressionString() : ""); - - auto wobbleSkyY = selectedStage->getTexGenExpression(1); - getControl("MaterialStageWobbleSkyY")->SetValue(wobbleSkyY ? wobbleSkyY->getExpressionString() : ""); - - auto wobbleSkyZ = selectedStage->getTexGenExpression(2); - getControl("MaterialStageWobbleSkyZ")->SetValue(wobbleSkyZ ? wobbleSkyZ->getExpressionString() : ""); - } - else - { - getControl("MaterialStageWobblySkyPanel")->Hide(); - } + getControl("MaterialStageWobblySkyPanel")->Show(selectedStage->getTexGenType() == IShaderLayer::TEXGEN_WOBBLESKY); } else { @@ -944,122 +1535,401 @@ void MaterialEditor::updateStageProgramControls() } } +void MaterialEditor::updateStageTransformControls() +{ + _stageTransformations->Clear(); + + auto selectedStage = getSelectedStage(); + + if (!selectedStage) + { + return; + } + + getControl("MaterialStageRemoveTransformButton")->Enable(_stageTransformView->GetSelection().IsOk()); + + const auto& transformations = selectedStage->getTransformations(); + + for (int i = 0; i < transformations.size(); ++i) + { + const auto& transformation = transformations[i]; + + auto row = _stageTransformations->AddItem(); + + row[_stageTransformationColumns.type] = shaders::getStringForTransformType(transformation.type); + row[_stageTransformationColumns.index] = string::to_string(i); + + row[_stageTransformationColumns.expression1] = transformation.expression1 ? + transformation.expression1->getExpressionString() : std::string(); + row[_stageTransformationColumns.expression2] = transformation.expression2 ? + transformation.expression2->getExpressionString() : std::string(); + + row.SendItemAdded(); + } +} + void MaterialEditor::updateStageControls() { + util::ScopedBoolLock lock(_stageUpdateInProgress); + auto selectedStage = getSelectedStage(); // Update all registered bindings for (const auto& binding : _stageBindings) { binding->setSource(selectedStage); + binding->updateFromSource(); } - getControl("MaterialEditorStageSettingsPanel")->Enable(selectedStage != nullptr); - updateStageBlendControls(); - updateStageTexgenControls(); - updateStageProgramControls(); + updateStageTextureControls(); + updateStageProgramControls(); + updateStageTransformControls(); + updateStageColoredStatus(); if (selectedStage) { selectedStage->evaluateExpressions(0); // initialise the values of this stage - getControl("MaterialStageAlphaTestValue")->SetValue(selectedStage->getAlphaTest()); - getControl("MaterialStagePrivatePolygonOffset")->SetValue(selectedStage->getPrivatePolygonOffset()); - auto mapExpr = selectedStage->getMapExpression(); auto imageMap = getControl("MaterialStageImageMap"); imageMap->SetValue(mapExpr ? mapExpr->getExpressionString() : ""); - auto mapTypeNotSpecial = getControl("MaterialStageMapTypeNotSpecial"); - auto specialMapPanel = getControl("MaterialStageSpecialMapPanel"); + imageMap->Bind(wxEVT_TEXT, [imageMap, this](wxCommandEvent&) + { + if (_stageUpdateInProgress) return; + + auto stage = getEditableStageForSelection(); + stage->setMapExpressionFromString(imageMap->GetValue().ToStdString()); + onMaterialChanged(); + }); - auto videoMapFile = getControl("MaterialStageVideoMapFile"); auto videoMapLoop = getControl("MaterialStageVideoMapLoop"); auto soundMapWave = getControl("MaterialStageSoundMapWaveform"); - auto remoteRenderMapWidth = getControl("MaterialStageRemoteRenderMapWidth"); - auto remoteRenderMapHeight = getControl("MaterialStageRemoteRenderMapHeight"); - - auto mirrorRenderMapWidth = getControl("MaterialStageMirrorRenderMapWidth"); - auto mirrorRenderMapHeight = getControl("MaterialStageMirrorRenderMapHeight"); + auto renderMapWidth = getControl("MaterialStageRenderMapWidth"); + auto renderMapHeight = getControl("MaterialStageRenderMapHeight"); auto mapType = getControl("MaterialStageMapType"); + mapType->SetStringSelection(shaders::getStringForMapType(selectedStage->getMapType())); + + if (selectedStage->getMapType() != IShaderLayer::MapType::SoundMap) + { + soundMapWave->SetValue(false); + } - if (selectedStage->getMapType() == ShaderLayer::MapType::VideoMap || - selectedStage->getMapType() == ShaderLayer::MapType::SoundMap || - selectedStage->getMapType() == ShaderLayer::MapType::RemoteRenderMap || - selectedStage->getMapType() == ShaderLayer::MapType::MirrorRenderMap) + if (selectedStage->getMapType() == IShaderLayer::MapType::RemoteRenderMap || + selectedStage->getMapType() == IShaderLayer::MapType::MirrorRenderMap || + selectedStage->getMapType() == IShaderLayer::MapType::SoundMap) { - mapType->SetStringSelection("Special"); - mapTypeNotSpecial->SetValue(false); - specialMapPanel->Enable(); imageMap->Disable(); } else { - mapTypeNotSpecial->SetValue(true); - specialMapPanel->Disable(); imageMap->Enable(); - videoMapFile->SetValue(""); videoMapLoop->SetValue(false); soundMapWave->SetValue(false); - remoteRenderMapWidth->SetValue(0); - remoteRenderMapHeight->SetValue(0); - mirrorRenderMapWidth->SetValue(0); - mirrorRenderMapHeight->SetValue(0); + renderMapWidth->SetValue(0); + renderMapHeight->SetValue(0); } switch (selectedStage->getMapType()) { - case ShaderLayer::MapType::Map: - mapType->SetStringSelection("map"); - break; - case ShaderLayer::MapType::CameraCubeMap: - mapType->SetStringSelection("cameraCubeMap"); - break; - case ShaderLayer::MapType::CubeMap: - mapType->SetStringSelection("cubeMap"); - break; - case ShaderLayer::MapType::VideoMap: + case IShaderLayer::MapType::VideoMap: { auto videoMapExpression = std::dynamic_pointer_cast(selectedStage->getMapExpression()); - videoMapFile->SetValue(videoMapExpression ? videoMapExpression->getExpressionString() : ""); videoMapLoop->SetValue(videoMapExpression ? videoMapExpression->isLooping() : false); } break; - case ShaderLayer::MapType::SoundMap: + case IShaderLayer::MapType::SoundMap: { auto soundMapExpression = std::dynamic_pointer_cast(selectedStage->getMapExpression()); soundMapWave->SetValue(soundMapExpression ? soundMapExpression->isWaveform() : false); } break; - case ShaderLayer::MapType::RemoteRenderMap: - remoteRenderMapWidth->SetValue(static_cast(selectedStage->getRenderMapSize().x())); - remoteRenderMapHeight->SetValue(static_cast(selectedStage->getRenderMapSize().y())); - break; - case ShaderLayer::MapType::MirrorRenderMap: - mirrorRenderMapWidth->SetValue(static_cast(selectedStage->getRenderMapSize().x())); - mirrorRenderMapHeight->SetValue(static_cast(selectedStage->getRenderMapSize().y())); + case IShaderLayer::MapType::RemoteRenderMap: + case IShaderLayer::MapType::MirrorRenderMap: + renderMapWidth->SetValue(static_cast(selectedStage->getRenderMapSize().x())); + renderMapHeight->SetValue(static_cast(selectedStage->getRenderMapSize().y())); break; } - getControl("MaterialStageVideoMap")->SetValue(selectedStage->getMapType() == ShaderLayer::MapType::VideoMap); - getControl("MaterialStageSoundMap")->SetValue(selectedStage->getMapType() == ShaderLayer::MapType::SoundMap); - getControl("MaterialStageRemoteRenderMap")->SetValue(selectedStage->getMapType() == ShaderLayer::MapType::RemoteRenderMap); - getControl("MaterialStageMirrorRenderMap")->SetValue(selectedStage->getMapType() == ShaderLayer::MapType::MirrorRenderMap); + // Show the specialised map type controls + videoMapLoop->Show(selectedStage->getMapType() == IShaderLayer::MapType::VideoMap); + soundMapWave->Show(selectedStage->getMapType() == IShaderLayer::MapType::SoundMap); + getControl("MaterialStageRenderMapPanel")->Show(selectedStage->getMapType() == IShaderLayer::MapType::MirrorRenderMap || + selectedStage->getMapType() == IShaderLayer::MapType::RemoteRenderMap); + + getControl("StagePageBlending")->Layout(); // Vertex Colours - getControl("MaterialStageNoVertexColourFlag")->SetValue(selectedStage->getVertexColourMode() == ShaderLayer::VERTEX_COLOUR_NONE); - getControl("MaterialStageVertexColourFlag")->SetValue(selectedStage->getVertexColourMode() == ShaderLayer::VERTEX_COLOUR_MULTIPLY); - getControl("MaterialStageInverseVertexColourFlag")->SetValue(selectedStage->getVertexColourMode() == ShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY); + getControl("MaterialStageNoVertexColourFlag")->SetValue(selectedStage->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_NONE); + getControl("MaterialStageVertexColourFlag")->SetValue(selectedStage->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_MULTIPLY); + getControl("MaterialStageInverseVertexColourFlag")->SetValue(selectedStage->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY); } else { getControl("MaterialStageNoVertexColourFlag")->SetValue(true); getControl("MaterialStageImageMap")->SetValue(""); - getControl("MaterialStageVideoMapFile")->SetValue(""); } } +void MaterialEditor::_onMaterialTypeChoice(wxCommandEvent& ev) +{ + if (!_material) return; + + auto selectedString = getControl("MaterialType")->GetStringSelection(); + _material->setSurfaceType(shaders::getSurfaceTypeForString(selectedString.ToStdString())); +} + +void MaterialEditor::_onAddStageTransform(wxCommandEvent& ev) +{ + auto selectedStage = getSelectedStage(); + + if (selectedStage) + { + auto typeString = getControl("MaterialStageAddTransformChoice")->GetStringSelection(); + auto type = shaders::getTransformTypeForString(typeString.ToStdString()); + + selectedStage->appendTransformation(IShaderLayer::Transformation{ type }); + + updateStageControls(); + } +} + +void MaterialEditor::_onRemoveStageTransform(wxCommandEvent& ev) +{ + auto stage = getEditableStageForSelection(); + + if (stage && _stageTransformView->GetSelection().IsOk()) + { + wxutil::TreeModel::Row row(_stageTransformView->GetSelection(), *_stageTransformations); + + auto index = row[_stageTransformationColumns.index].getInteger(); + stage->removeTransformation(index); + + updateStageControls(); + } +} + +void MaterialEditor::_onStageTransformEdited(wxDataViewEvent& ev) +{ + if (ev.IsEditCancelled()) return; + + auto stage = getEditableStageForSelection(); + + if (!stage) return; + + wxutil::TreeModel::Row row(ev.GetItem(), *_stageTransformations); + + // The iter points to the edited cell now, get the actor number + int transformIndex = row[_stageTransformationColumns.index].getInteger(); + std::string transformTypeString = row[_stageTransformationColumns.type]; + + if (transformIndex < 0 || transformIndex > stage->getTransformations().size()) + { + return; + } + + std::string expression1, expression2; + auto type = shaders::getTransformTypeForString(transformTypeString); + +#if wxCHECK_VERSION(3, 1, 0) + // wx 3.1+ delivers the new value through the event + if (ev.GetColumn() == _stageTransformationColumns.expression1.getColumnIndex()) + { + expression1 = ev.GetValue().GetString().ToStdString(); + expression2 = row[_stageTransformationColumns.expression2]; + } + else if (ev.GetColumn() == _stageTransformationColumns.expression2.getColumnIndex()) + { + expression1 = row[_stageTransformationColumns.expression1]; + expression2 = ev.GetValue().GetString().ToStdString(); + } +#else + // wx 3.0.x has the values set in the model + expression1 = row[_stageTransformationColumns.expression1]; + expression2 = row[_stageTransformationColumns.expression2]; +#endif + + stage->updateTransformation(transformIndex, type, expression1, expression2); +} + +void MaterialEditor::_onStageColoredChecked(const IEditableShaderLayer::Ptr& stage, bool newValue) +{ + bool stageIsCurrentlyColoured = stageQualifiesAsColoured(stage); + + if (newValue && !stageIsCurrentlyColoured) + { + stage->setColourExpressionFromString(IShaderLayer::COMP_RED, "parm0"); + stage->setColourExpressionFromString(IShaderLayer::COMP_GREEN, "parm1"); + stage->setColourExpressionFromString(IShaderLayer::COMP_BLUE, "parm2"); + stage->setColourExpressionFromString(IShaderLayer::COMP_ALPHA, "parm3"); + } + else if (!newValue && stageIsCurrentlyColoured) + { + stage->setColourExpressionFromString(IShaderLayer::COMP_RED, ""); + stage->setColourExpressionFromString(IShaderLayer::COMP_GREEN, ""); + stage->setColourExpressionFromString(IShaderLayer::COMP_BLUE, ""); + stage->setColourExpressionFromString(IShaderLayer::COMP_ALPHA, ""); + } + + updateStageControls(); +} + +void MaterialEditor::_onStageMapTypeChanged(wxCommandEvent& ev) +{ + auto stage = getEditableStageForSelection(); + if (!stage) return; + + auto mapTypeString = getControl("MaterialStageMapType")->GetStringSelection(); + stage->setMapType(shaders::getMapTypeForString(mapTypeString.ToStdString())); + + updateStageControls(); +} + +void MaterialEditor::_onStageBlendTypeChanged(wxCommandEvent& ev) +{ + auto stage = getEditableStageForSelection(); + if (!stage) return; + + std::pair blendFuncStrings; + + auto blendTypeString = getControl("MaterialStageBlendType")->GetStringSelection(); + + if (blendTypeString == _(CUSTOM_BLEND_TYPE)) + { + blendFuncStrings.first = getControl("MaterialStageBlendTypeSrc")->GetStringSelection(); + blendFuncStrings.second = getControl("MaterialStageBlendTypeDest")->GetStringSelection(); + } + else + { + // It's one of diffuse/bump/specular or a blend shortcut like add/modulate + blendFuncStrings.first = blendTypeString; + } + + stage->setBlendFuncStrings(blendFuncStrings); + + updateNameOfSelectedStage(); + updateStageControls(); + onMaterialChanged(); +} + +void MaterialEditor::_onAddStage(wxCommandEvent& ev) +{ + std::size_t index = _material->addLayer(determineStageTypeToCreate(_material)); + + updateStageListFromMaterial(); + selectStageByIndex(index); +} + +void MaterialEditor::_onRemoveStage(wxCommandEvent& ev) +{ + auto item = _stageView->GetSelection(); + if (!_material || !item.IsOk()) return; + + auto row = wxutil::TreeModel::Row(item, *_stageList); + auto index = row[STAGE_COLS().index].getInteger(); + + _material->removeLayer(index); + updateStageListFromMaterial(); + + auto layersCount = _material->getAllLayers().size(); + + while (index > 0) + { + if (index < layersCount) + { + selectStageByIndex(index); + return; + } + + --index; + } +} + +void MaterialEditor::toggleSelectedStage() +{ + if (!_stageView->GetSelection().IsOk()) return; + + wxutil::TreeModel::Row row(_stageView->GetSelection(), *_stageList); + + if (!_material || row[STAGE_COLS().global].getBool()) return; + + auto stage = getEditableStageForSelection(); + + if (!stage) return; + + bool newState = !row[STAGE_COLS().enabled].getBool(); + stage->setEnabled(newState); + + row[STAGE_COLS().enabled] = newState; + row[STAGE_COLS().icon] = wxVariant(newState ? _iconVisible : _iconInvisible); + row.SendItemChanged(); + + onMaterialChanged(); +} + +void MaterialEditor::_onToggleStage(wxCommandEvent& ev) +{ + toggleSelectedStage(); +} + +void MaterialEditor::_onDuplicateStage(wxCommandEvent& ev) +{ + auto item = _stageView->GetSelection(); + if (!_material || !item.IsOk()) return; + + auto row = wxutil::TreeModel::Row(item, *_stageList); + auto index = row[STAGE_COLS().index].getInteger(); + + auto newIndex = _material->duplicateLayer(index); + updateStageListFromMaterial(); + selectStageByIndex(newIndex); +} + +void MaterialEditor::updateNameOfSelectedStage() +{ + auto item = _stageView->GetSelection(); + if (!item.IsOk()) return; + + auto row = wxutil::TreeModel::Row(item, *_stageList); + + row[STAGE_COLS().name] = getNameForLayer(*getSelectedStage()); + row.SendItemChanged(); +} + +void MaterialEditor::moveStagePosition(int direction) +{ + auto item = _stageView->GetSelection(); + if (!_material || !item.IsOk()) return; + + auto row = wxutil::TreeModel::Row(item, *_stageList); + auto index = row[STAGE_COLS().index].getInteger(); + + int newPosition = index + direction; + + if (newPosition >= 0 && newPosition < _material->getAllLayers().size()) + { + _material->swapLayerPosition(static_cast(index), static_cast(newPosition)); + onMaterialChanged(); + updateStageListFromMaterial(); + selectStageByIndex(static_cast(newPosition)); + } +} + +void MaterialEditor::_onSortRequestChanged(wxCommandEvent& ev) +{ + if (!_material || _materialUpdateInProgress) return; + + auto sortDropdown = getControl("MaterialSortValue"); + _material->setSortRequest(string::convert(sortDropdown->GetValue().ToStdString(), Material::SORT_OPAQUE)); + onMaterialChanged(); +} + +void MaterialEditor::onMaterialChanged() +{ + _preview->onMaterialChanged(); +} + } diff --git a/radiant/ui/materials/MaterialEditor.h b/radiant/ui/materials/MaterialEditor.h index 106d1f6cc8..2f0b9e2155 100644 --- a/radiant/ui/materials/MaterialEditor.h +++ b/radiant/ui/materials/MaterialEditor.h @@ -7,7 +7,7 @@ #include "wxutil/WindowPosition.h" #include "wxutil/PanedPosition.h" #include "wxutil/XmlResourceBasedWidget.h" -#include "wxutil/preview/ModelPreview.h" +#include "MaterialPreview.h" #include "wxutil/SourceView.h" #include "ui/common/MaterialTreeView.h" @@ -25,23 +25,27 @@ class MaterialEditor : wxutil::TreeModel::Ptr _stageList; wxutil::TreeView* _stageView; + wxBitmap _iconVisible; + wxBitmap _iconInvisible; + + std::multimap> _notebookPages; wxutil::WindowPosition _windowPosition; wxutil::PanedPosition _panedPosition; - std::shared_ptr _preview; + std::unique_ptr _preview; wxutil::D3MaterialSourceViewCtrl* _sourceView; MaterialPtr _material; std::set>> _materialBindings; - std::set>> _stageBindings; + std::set>> _stageBindings; std::map _deformPanels; - struct StageProgramParmsColumns : + struct StageProgramColumns : public wxutil::TreeModel::ColumnRecord { - StageProgramParmsColumns() : + StageProgramColumns() : type(add(wxutil::TreeModel::Column::String)), index(add(wxutil::TreeModel::Column::String)), expression(add(wxutil::TreeModel::Column::String)) @@ -52,11 +56,35 @@ class MaterialEditor : wxutil::TreeModel::Column expression; }; - StageProgramParmsColumns _stageProgramColumns; + struct StageTransformColumns : + public wxutil::TreeModel::ColumnRecord + { + StageTransformColumns() : + type(add(wxutil::TreeModel::Column::String)), + index(add(wxutil::TreeModel::Column::String)), + expression1(add(wxutil::TreeModel::Column::String)), + expression2(add(wxutil::TreeModel::Column::String)) + {} + + wxutil::TreeModel::Column type; + wxutil::TreeModel::Column index; + wxutil::TreeModel::Column expression1; + wxutil::TreeModel::Column expression2; + }; + + StageProgramColumns _stageProgramColumns; wxutil::TreeModel::Ptr _stageProgramParameters; + StageTransformColumns _stageTransformationColumns; + wxutil::TreeModel::Ptr _stageTransformations; + wxutil::TreeView* _stageTransformView; + + bool _stageUpdateInProgress; + bool _materialUpdateInProgress; + private: MaterialEditor(); + ~MaterialEditor(); int ShowModal() override; @@ -75,7 +103,21 @@ class MaterialEditor : void setupMaterialDeformPage(); void setupSurfaceFlag(const std::string& controlName, Material::SurfaceFlags flag); void setupMaterialFlag(const std::string& controlName, Material::Flags flag); - void setupStageFlag(const std::string& controlName, int flags); + void setupStageFlag(const std::string& controlName, IShaderLayer::Flags flags); + + void createExpressionBinding(const std::string& textCtrlName, + const std::function& loadFunc, + const std::function& saveFunc); + void createRadioButtonBinding(const std::string& ctrlName, + const std::function& loadFunc, + const std::function& saveFunc); + + void createSpinCtrlBinding(const std::string& ctrlName, + const std::function& loadFunc, + const std::function& saveFunc); + void createSpinCtrlDoubleBinding(const std::string& ctrlName, + const std::function& loadFunc, + const std::function& saveFunc); void updateControlsFromMaterial(); void updateDeformControlsFromMaterial(); @@ -83,15 +125,38 @@ class MaterialEditor : void updateMaterialPropertiesFromMaterial(); void selectStageByIndex(std::size_t index); - ShaderLayerPtr getSelectedStage(); + IShaderLayer::Ptr getSelectedStage(); + IEditableShaderLayer::Ptr getEditableStageForSelection(); void updateStageControls(); void updateStageBlendControls(); - void updateStageTexgenControls(); + void updateStageTextureControls(); void updateStageProgramControls(); + void updateStageTransformControls(); + void updateStageColoredStatus(); + void updateNameOfSelectedStage(); + void moveStagePosition(int direction); + void updateStageButtonSensitivity(); + void updateSettingsNotebook(); void _onTreeViewSelectionChanged(wxDataViewEvent& ev); void _onStageListSelectionChanged(wxDataViewEvent& ev); + void _onStageListItemActivated(wxDataViewEvent& ev); + void _onMaterialTypeChoice(wxCommandEvent& ev); + void _onAddStageTransform(wxCommandEvent& ev); + void _onRemoveStageTransform(wxCommandEvent& ev); + void _onStageTransformEdited(wxDataViewEvent& ev); + void _onStageColoredChecked(const IEditableShaderLayer::Ptr& layer, bool newValue); + void _onStageMapTypeChanged(wxCommandEvent& ev); + void _onStageBlendTypeChanged(wxCommandEvent& ev); + void _onAddStage(wxCommandEvent& ev); + void _onRemoveStage(wxCommandEvent& ev); + void _onToggleStage(wxCommandEvent& ev); + void _onDuplicateStage(wxCommandEvent& ev); + void _onSortRequestChanged(wxCommandEvent& ev); + + void toggleSelectedStage(); + void onMaterialChanged(); // Shortcut template diff --git a/radiant/ui/materials/MaterialEditorModule.cpp b/radiant/ui/materials/MaterialEditorModule.cpp index d0818baac3..fdaaea6d2a 100644 --- a/radiant/ui/materials/MaterialEditorModule.cpp +++ b/radiant/ui/materials/MaterialEditorModule.cpp @@ -42,7 +42,7 @@ class MaterialEditorModule : GlobalMenuManager().add("main/entity", // menu location path "MaterialEditor", // name ui::menu::ItemType::Item, // type - _("Material Editor..."), // caption + _("Material Editor (experimental)..."), // caption "icon_texture.png", // icon "MaterialEditor"); // event name } diff --git a/radiant/ui/materials/MaterialPreview.cpp b/radiant/ui/materials/MaterialPreview.cpp new file mode 100644 index 0000000000..9194a6b805 --- /dev/null +++ b/radiant/ui/materials/MaterialPreview.cpp @@ -0,0 +1,279 @@ +#include "MaterialPreview.h" + +#include "ibrush.h" +#include "ientity.h" +#include "ieclass.h" +#include "ishaders.h" +#include "string/convert.h" +#include "math/pi.h" +#include "wxutil/dialog/MessageBox.h" +#include "wxutil/Bitmap.h" +#include +#include "gamelib.h" + +namespace ui +{ + +namespace +{ + const char* const FUNC_STATIC_CLASS = "func_static"; + const char* const GKEY_DEFAULT_ROOM_MATERIAL = "/materialPreview/defaultRoomMaterial"; +} + +MaterialPreview::MaterialPreview(wxWindow* parent) : + RenderPreview(parent, true), + _sceneIsReady(false), + _defaultCamDistanceFactor(2.0f) +{ + _testModelSkin.reset(new TestModelSkin("model")); + GlobalModelSkinCache().addNamedSkin(_testModelSkin); + + _testRoomSkin.reset(new TestModelSkin("room")); + GlobalModelSkinCache().addNamedSkin(_testRoomSkin); + + setupToolbar(); + + setViewOrigin(Vector3(1, 1, 1) * 100); + setViewAngles(Vector3(37, 135, 0)); +} + +MaterialPreview::~MaterialPreview() +{ + if (_testModelSkin) + { + GlobalModelSkinCache().removeSkin(_testModelSkin->getName()); + _testModelSkin.reset(); + } + + if (_testRoomSkin) + { + GlobalModelSkinCache().removeSkin(_testRoomSkin->getName()); + _testRoomSkin.reset(); + } +} + +void MaterialPreview::setupToolbar() +{ + // Add one additional toolbar for particle-related stuff + wxToolBar* toolbar = new wxToolBar(_mainPanel, wxID_ANY); + toolbar->SetToolBitmapSize(wxSize(16, 16)); + + _testModelCubeButton = toolbar->AddRadioTool(wxID_ANY, "", wxutil::GetLocalBitmap("cube.png", wxART_TOOLBAR)); + _testModelCubeButton->SetShortHelp(_("Show Cube")); + toolbar->ToggleTool(_testModelCubeButton->GetId(), true); + + _testModelSphereButton = toolbar->AddRadioTool(wxID_ANY, "", wxutil::GetLocalBitmap("sphere.png", wxART_TOOLBAR)); + _testModelSphereButton->SetShortHelp(_("Show Sphere")); + + _testModelTilesButton = toolbar->AddRadioTool(wxID_ANY, "", wxutil::GetLocalBitmap("tiles.png", wxART_TOOLBAR)); + _testModelTilesButton->SetShortHelp(_("Show Tiles")); + + toolbar->Bind(wxEVT_TOOL, &MaterialPreview::onTestModelSelectionChanged, this, _testModelCubeButton->GetId()); + toolbar->Bind(wxEVT_TOOL, &MaterialPreview::onTestModelSelectionChanged, this, _testModelSphereButton->GetId()); + toolbar->Bind(wxEVT_TOOL, &MaterialPreview::onTestModelSelectionChanged, this, _testModelTilesButton->GetId()); + + toolbar->Realize(); + + addToolbar(toolbar); +} + +const MaterialPtr& MaterialPreview::getMaterial() +{ + return _material; +} + +void MaterialPreview::updateModelSkin() +{ + // Hide the model if there's no material to preview + _model->setFiltered(_testModelSkin->isEmpty()); + + // Let the model update its remaps + auto skinnedModel = std::dynamic_pointer_cast(_model); + + if (skinnedModel) + { + skinnedModel->skinChanged(_testModelSkin->getName()); + } +} + +std::string MaterialPreview::getRoomMaterial() +{ + return game::current::getValue(GKEY_DEFAULT_ROOM_MATERIAL); +} + +void MaterialPreview::updateRoomSkin() +{ + auto roomMaterial = getRoomMaterial(); + _testRoomSkin->setRemapMaterial(GlobalMaterialManager().getMaterial(roomMaterial)); + + // Let the model update its remaps + auto skinnedRoom = std::dynamic_pointer_cast(_room); + + if (skinnedRoom) + { + skinnedRoom->skinChanged(_testRoomSkin->getName()); + } +} + +void MaterialPreview::setMaterial(const MaterialPtr& material) +{ + bool hadMaterial = _material != nullptr; + + _material = material; + _sceneIsReady = false; + + if (_model) + { + // Assign the material to the temporary skin + _testModelSkin->setRemapMaterial(_material); + + updateModelSkin(); + } + + if (!hadMaterial && _material) + { + setLightingModeEnabled(true); + startPlayback(); + } + else if (hadMaterial && !_material) + { + stopPlayback(); + } + + queueDraw(); +} + +void MaterialPreview::onMaterialChanged() +{ + if (!_material) return; + + _renderSystem->onMaterialChanged(_material->getName()); + queueDraw(); +} + +bool MaterialPreview::onPreRender() +{ + if (!_sceneIsReady) + { + prepareScene(); + } + + // Update the rotation of the func_static + if (_model) + { + auto time = _renderSystem->getTime(); + + // one full rotation per 10 seconds + auto newAngle = 2 * c_pi * time / 10000; + + Node_getEntity(_entity)->setKeyValue("angle", string::to_string(radians_to_degrees(newAngle))); + } + + return RenderPreview::onPreRender(); +} + +void MaterialPreview::prepareScene() +{ + _sceneIsReady = true; +} + +bool MaterialPreview::canDrawGrid() +{ + return false; +} + +RenderStateFlags MaterialPreview::getRenderFlagsFill() +{ + return RenderPreview::getRenderFlagsFill() | RENDER_DEPTHWRITE | RENDER_DEPTHTEST; +} + +void MaterialPreview::setupSceneGraph() +{ + RenderPreview::setupSceneGraph(); + + try + { + _rootNode = std::make_shared(); + + setupRoom(); + + _entity = GlobalEntityModule().createEntity( + GlobalEntityClassManager().findClass(FUNC_STATIC_CLASS)); + + _rootNode->addChildNode(_entity); + + setupTestModel(); + + getScene()->setRoot(_rootNode); + + // Set up the light + _light = GlobalEntityModule().createEntity( + GlobalEntityClassManager().findClass("light")); + + Node_getEntity(_light)->setKeyValue("light_radius", "600 600 600"); + Node_getEntity(_light)->setKeyValue("origin", "250 250 250"); + + _rootNode->addChildNode(_light); + + // Reset the default view, facing down to the model from diagonally above the bounding box + double distance = _model->localAABB().getRadius() * _defaultCamDistanceFactor; + + setViewOrigin(Vector3(1, 1, 1) * distance); + setViewAngles(Vector3(37, 135, 0)); + } + catch (std::runtime_error&) + { + wxutil::Messagebox::ShowError(fmt::format(_("Unable to setup the preview,\n" + "could not find the entity class {0}"), FUNC_STATIC_CLASS)); + } +} + +void MaterialPreview::setupRoom() +{ + _room = GlobalModelCache().getModelNodeForStaticResource("preview/room_cuboid.ase"); + + auto roomEntity = GlobalEntityModule().createEntity( + GlobalEntityClassManager().findClass(FUNC_STATIC_CLASS)); + + _rootNode->addChildNode(roomEntity); + + roomEntity->addChildNode(_room); + + updateRoomSkin(); +} + +void MaterialPreview::setupTestModel() +{ + if (_entity && _model) + { + _entity->removeChildNode(_model); + _model.reset(); + } + + // Load the pre-defined model from the resources path + if (_testModelCubeButton->IsToggled()) + { + _model = GlobalModelCache().getModelNodeForStaticResource("preview/cube.ase"); + } + else if (_testModelSphereButton->IsToggled()) // sphere + { + _model = GlobalModelCache().getModelNodeForStaticResource("preview/sphere.ase"); + } + else // Tiles + { + _model = GlobalModelCache().getModelNodeForStaticResource("preview/tiles.ase"); + } + + // The test model is a child of this entity + _entity->addChildNode(_model); + + updateModelSkin(); +} + +void MaterialPreview::onTestModelSelectionChanged(wxCommandEvent& ev) +{ + setupTestModel(); + queueDraw(); +} + +} diff --git a/radiant/ui/materials/MaterialPreview.h b/radiant/ui/materials/MaterialPreview.h new file mode 100644 index 0000000000..f1a77f53aa --- /dev/null +++ b/radiant/ui/materials/MaterialPreview.h @@ -0,0 +1,63 @@ +#pragma once + +#include "ishaders.h" +#include "modelskin.h" +#include "scene/BasicRootNode.h" +#include "TestModelSkin.h" +#include "wxutil/preview/RenderPreview.h" + +namespace ui +{ + +class MaterialPreview : + public wxutil::RenderPreview +{ +private: + bool _sceneIsReady; + + MaterialPtr _material; + + scene::IMapRootNodePtr _rootNode; + + scene::INodePtr _entity; // The func_static entity + scene::INodePtr _model; // The textured model + scene::INodePtr _room; // The textured room + scene::INodePtr _light; // The light + + std::shared_ptr _testModelSkin; + std::shared_ptr _testRoomSkin; + + float _defaultCamDistanceFactor; + + wxToolBarToolBase* _testModelCubeButton; + wxToolBarToolBase* _testModelSphereButton; + wxToolBarToolBase* _testModelTilesButton; + +public: + MaterialPreview(wxWindow* parent); + + virtual ~MaterialPreview(); + + const MaterialPtr& getMaterial(); + void setMaterial(const MaterialPtr& material); + + void onMaterialChanged(); + +protected: + bool canDrawGrid() override; + void setupSceneGraph() override; + RenderStateFlags getRenderFlagsFill() override; + +private: + bool onPreRender() override; + void prepareScene(); + void setupToolbar(); + void setupTestModel(); + void setupRoom(); + void updateModelSkin(); + void updateRoomSkin(); + std::string getRoomMaterial(); + void onTestModelSelectionChanged(wxCommandEvent& ev); +}; + +} diff --git a/radiant/ui/materials/RadioButtonBinding.h b/radiant/ui/materials/RadioButtonBinding.h new file mode 100644 index 0000000000..63df0b01ef --- /dev/null +++ b/radiant/ui/materials/RadioButtonBinding.h @@ -0,0 +1,55 @@ +#pragma once + +#include "Binding.h" +#include "ishaderlayer.h" +#include + +namespace ui +{ + +template +class RadioButtonBinding : + public TwoWayBinding +{ +public: + using BaseBinding = TwoWayBinding; + +private: + wxRadioButton* _radioButton; + +public: + RadioButtonBinding(wxRadioButton* radioButton, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc, + const typename BaseBinding::PostUpdateFunc& postChangeNotify = BaseBinding::PostUpdateFunc(), + const typename BaseBinding::AcquireTargetFunc& acquireSaveTarget = BaseBinding::UseSourceAsTarget) : + BaseBinding(loadFunc, saveFunc, postChangeNotify, acquireSaveTarget), + _radioButton(radioButton) + { + if (BaseBinding::_updateValue) + { + _radioButton->Bind(wxEVT_RADIOBUTTON, &RadioButtonBinding::onValueChanged, this); + } + } + + virtual ~RadioButtonBinding() + { + if (BaseBinding::_updateValue) + { + _radioButton->Unbind(wxEVT_RADIOBUTTON, &RadioButtonBinding::onValueChanged, this); + } + } + +protected: + void setValueOnControl(const bool& value) override + { + _radioButton->SetValue(value); + } + + void onValueChanged(wxCommandEvent& ev) + { + BaseBinding::updateValueOnTarget(_radioButton->GetValue()); + } +}; + +} diff --git a/radiant/ui/materials/SpinCtrlBinding.h b/radiant/ui/materials/SpinCtrlBinding.h new file mode 100644 index 0000000000..c979a522ca --- /dev/null +++ b/radiant/ui/materials/SpinCtrlBinding.h @@ -0,0 +1,82 @@ +#pragma once + +#include "Binding.h" +#include + +namespace ui +{ + +template +class SpinCtrlBinding : + public TwoWayBinding().GetValue())> +{ +public: + using ValueType = decltype(std::declval().GetValue()); + using BaseBinding = TwoWayBinding; + +private: + SpinCtrlType* _spinCtrl; + +public: + SpinCtrlBinding(SpinCtrlType* spinCtrl, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc) : + SpinCtrlBinding(spinCtrl, loadFunc, saveFunc, BaseBinding::PostUpdateFunc()) + {} + + SpinCtrlBinding(SpinCtrlType* spinCtrl, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc, + const typename BaseBinding::PostUpdateFunc& postChangeNotify) : + SpinCtrlBinding(spinCtrl, loadFunc, saveFunc, postChangeNotify, std::bind(&BaseBinding::UseSourceAsTarget, this)) + {} + + SpinCtrlBinding(SpinCtrlType* spinCtrl, + const typename BaseBinding::LoadFunc& loadFunc, + const typename BaseBinding::UpdateFunc& saveFunc, + const typename BaseBinding::PostUpdateFunc& postChangeNotify, + const typename BaseBinding::AcquireTargetFunc& acquireSaveTarget) : + BaseBinding(loadFunc, saveFunc, postChangeNotify, acquireSaveTarget), + _spinCtrl(spinCtrl) + { + if (BaseBinding::_updateValue) + { + if (std::is_integral::value) + { + _spinCtrl->Bind(wxEVT_SPINCTRL, &SpinCtrlBinding::onValueChanged, this); + } + else + { + _spinCtrl->Bind(wxEVT_SPINCTRLDOUBLE, &SpinCtrlBinding::onValueChanged, this); + } + } + } + + virtual ~SpinCtrlBinding() + { + if (BaseBinding::_updateValue) + { + if (std::is_integral::value) + { + _spinCtrl->Unbind(wxEVT_SPINCTRL, &SpinCtrlBinding::onValueChanged, this); + } + else + { + _spinCtrl->Unbind(wxEVT_SPINCTRLDOUBLE, &SpinCtrlBinding::onValueChanged, this); + } + } + } + +protected: + void setValueOnControl(const ValueType& value) override + { + _spinCtrl->SetValue(value); + } + + void onValueChanged(wxCommandEvent& ev) + { + BaseBinding::updateValueOnTarget(_spinCtrl->GetValue()); + } +}; + +} diff --git a/radiant/ui/materials/TestModelSkin.h b/radiant/ui/materials/TestModelSkin.h new file mode 100644 index 0000000000..2dde416fed --- /dev/null +++ b/radiant/ui/materials/TestModelSkin.h @@ -0,0 +1,61 @@ +#pragma once + +#include "modelskin.h" + +namespace ui +{ + +// Temporary skin implementation used to assign the given material +class TestModelSkin final : + public ModelSkin +{ +private: + MaterialPtr _material; + + const char* const NAME_PREFIX = "__internal_test_skin__"; + std::string _nameSuffix; + +public: + const char* const TEST_MODEL_MATERIAL = "material"; + + TestModelSkin(const std::string& name) : + _nameSuffix(name) + {} + + std::string getName() const override + { + return NAME_PREFIX + _nameSuffix; + } + + std::string getRemap(const std::string& name) const override + { + if (_material && name == TEST_MODEL_MATERIAL) + { + return _material->getName(); + } + + return std::string(); + } + + std::string getSkinFileName() const override + { + return "__defined_by_darkradiant.skin"; + } + + bool isEmpty() const + { + return !_material; + } + + void clear() + { + _material.reset(); + } + + void setRemapMaterial(const MaterialPtr& material) + { + _material = material; + } +}; + +} diff --git a/radiantcore/CMakeLists.txt b/radiantcore/CMakeLists.txt index 6304a453cb..71367776ef 100644 --- a/radiantcore/CMakeLists.txt +++ b/radiantcore/CMakeLists.txt @@ -260,11 +260,13 @@ add_library(radiantcore MODULE shaders/CShader.cpp shaders/Doom3ShaderLayer.cpp shaders/Doom3ShaderSystem.cpp + shaders/ExpressionSlots.cpp shaders/MapExpression.cpp shaders/ShaderExpression.cpp shaders/ShaderLibrary.cpp shaders/ShaderTemplate.cpp shaders/TableDefinition.cpp + shaders/TextureMatrix.cpp shaders/textures/GLTextureManager.cpp shaders/textures/TextureManipulator.cpp skins/Doom3SkinCache.cpp diff --git a/radiantcore/brush/Brush.h b/radiantcore/brush/Brush.h index 6d792bd5f9..71ca4c1765 100644 --- a/radiantcore/brush/Brush.h +++ b/radiantcore/brush/Brush.h @@ -255,7 +255,7 @@ class Brush : void pop_back(); void erase(std::size_t index); - void clear(); + void clear() override; std::size_t getNumFaces() const; diff --git a/radiantcore/model/ModelCache.cpp b/radiantcore/model/ModelCache.cpp index c3795acc59..40f1b7fa83 100644 --- a/radiantcore/model/ModelCache.cpp +++ b/radiantcore/model/ModelCache.cpp @@ -52,7 +52,7 @@ scene::INodePtr ModelCache::getModelNode(const std::string& modelPath) IModelImporterPtr modelLoader = GlobalModelFormatManager().getImporter(type); // Try to construct a model node using the suitable loader - scene::INodePtr node = modelLoader->loadModel(actualModelPath); + auto node = modelLoader->loadModel(actualModelPath); if (node) { @@ -97,15 +97,13 @@ scene::INodePtr ModelCache::getModelNode(const std::string& modelPath) } // The model load failed, let's return a NullModel - IModelImporterPtr nullModelLoader = GlobalModelFormatManager().getImporter(""); - - return nullModelLoader->loadModel(actualModelPath); + return loadNullModel(actualModelPath); } IModelPtr ModelCache::getModel(const std::string& modelPath) { // Try to lookup the existing model - ModelMap::iterator found = _modelMap.find(modelPath); + auto found = _modelMap.find(modelPath); if (_enabled && found != _modelMap.end()) { @@ -115,7 +113,7 @@ IModelPtr ModelCache::getModel(const std::string& modelPath) // The model is not cached or the cache is disabled, load afresh // Get the extension of this model - std::string type = modelPath.substr(modelPath.rfind(".") + 1); + std::string type = os::getExtension(modelPath); // Find a suitable model loader IModelImporterPtr modelLoader = GlobalModelFormatManager().getImporter(type); @@ -125,12 +123,35 @@ IModelPtr ModelCache::getModel(const std::string& modelPath) if (model) { // Model successfully loaded, insert a reference into the map - _modelMap.insert(ModelMap::value_type(modelPath, model)); + _modelMap.emplace(modelPath, model); } return model; } +scene::INodePtr ModelCache::getModelNodeForStaticResource(const std::string& resourcePath) +{ + // Get the extension of this model + auto extension = os::getExtension(resourcePath); + + // Find a suitable model loader + auto modelLoader = GlobalModelFormatManager().getImporter(extension); + + auto fullPath = module::GlobalModuleRegistry().getApplicationContext().getRuntimeDataPath(); + fullPath += "resources/" + resourcePath; + + auto node = modelLoader->loadModel(fullPath); + + return node ? node : loadNullModel(resourcePath); +} + +scene::INodePtr ModelCache::loadNullModel(const std::string& modelPath) +{ + auto nullModelLoader = GlobalModelFormatManager().getImporter(""); + + return nullModelLoader->loadModel(modelPath); +} + void ModelCache::removeModel(const std::string& modelPath) { // greebo: Disable the modelcache. During map::clear(), the nodes diff --git a/radiantcore/model/ModelCache.h b/radiantcore/model/ModelCache.h index d9adaac12c..b1e6108d94 100644 --- a/radiantcore/model/ModelCache.h +++ b/radiantcore/model/ModelCache.h @@ -30,6 +30,8 @@ class ModelCache : // greebo: For documentation, see the abstract base class. IModelPtr getModel(const std::string& modelPath) override; + scene::INodePtr getModelNodeForStaticResource(const std::string& resourcePath) override; + // Clear methods void removeModel(const std::string& modelPath) override; void clear() override; @@ -47,6 +49,8 @@ class ModelCache : void shutdownModule() override; private: + scene::INodePtr loadNullModel(const std::string& modelPath); + // Command targets void refreshModelsCmd(const cmd::ArgumentList& args); void refreshSelectedModelsCmd(const cmd::ArgumentList& args); diff --git a/radiantcore/model/export/WavefrontExporter.cpp b/radiantcore/model/export/WavefrontExporter.cpp index dc61045d66..b0bdce0807 100644 --- a/radiantcore/model/export/WavefrontExporter.cpp +++ b/radiantcore/model/export/WavefrontExporter.cpp @@ -137,15 +137,15 @@ void WavefrontExporter::writeMaterialLib(std::ostream& stream) for (const auto& layer : layers) { - if (layer->getType() == ShaderLayer::DIFFUSE) + if (layer->getType() == IShaderLayer::DIFFUSE) { diffuseFilename = layer->getMapImageFilename(); } - else if (layer->getType() == ShaderLayer::BUMP) + else if (layer->getType() == IShaderLayer::BUMP) { bumpFilename = layer->getMapImageFilename(); } - else if (layer->getType() == ShaderLayer::SPECULAR) + else if (layer->getType() == IShaderLayer::SPECULAR) { specularFilename = layer->getMapImageFilename(); } diff --git a/radiantcore/model/md5/MD5ModelLoader.cpp b/radiantcore/model/md5/MD5ModelLoader.cpp index 3613019170..8226b738b8 100644 --- a/radiantcore/model/md5/MD5ModelLoader.cpp +++ b/radiantcore/model/md5/MD5ModelLoader.cpp @@ -34,79 +34,74 @@ const std::string& MD5ModelLoader::getExtension() const scene::INodePtr MD5ModelLoader::loadModel(const std::string& modelName) { // Initialise the paths, this is all needed for realisation - std::string path = rootPath(modelName); - std::string name = os::getRelativePath(modelName, path); + auto path = rootPath(modelName); + auto name = os::getRelativePath(modelName, path); // greebo: Path is empty for models in PK4 files, don't check for that // Try to load the model from the given VFS path model::IModelPtr model = GlobalModelCache().getModel(name); - if (model == NULL) + if (!model) { rError() << "MD5ModelLoader: Could not load model << " << modelName << std::endl; return scene::INodePtr(); } // The cached model should be an MD5Model, otherwise we're in the wrong movie - MD5ModelPtr md5Model = std::dynamic_pointer_cast(model); + auto md5Model = std::dynamic_pointer_cast(model); - if (md5Model != NULL) + if (md5Model) { // Load was successful, construct a modelnode using this resource - return MD5ModelNodePtr(new MD5ModelNode(md5Model)); + return std::make_shared(md5Model); } - else - { - rError() << "MD5ModelLoader: Cached model is not an MD5Model?" << std::endl; - } - + + rError() << "MD5ModelLoader: Cached model is not an MD5Model?" << std::endl; return scene::INodePtr(); } -model::IModelPtr MD5ModelLoader::loadModelFromPath(const std::string& name) +model::IModelPtr MD5ModelLoader::loadModelFromPath(const std::string& path) { // Open an ArchiveFile to load - ArchiveFilePtr file = GlobalFileSystem().openFile(name); - - if (file != NULL) - { - // Construct a new MD5Model container - MD5ModelPtr model(new MD5Model); - - // Store the VFS path in this model - model->setModelPath(name); - // Set the filename this model was loaded from - model->setFilename(os::getFilename(file->getName())); - - // greebo: Get the Inputstream from the given file - stream::BinaryToTextInputStream inputStream(file->getInputStream()); - - // Construct a Tokeniser object and start reading the file - try - { - std::istream is(&inputStream); - parser::BasicDefTokeniser tokeniser(is); - - // Invoke the parser routine (might throw) - model->parseFromTokens(tokeniser); - } - catch (parser::ParseException& e) - { - rError() << "[md5model] Parse failure. Exception was:" << std::endl - << e.what() << std::endl; - // Return an empty model on error - return model::IModelPtr(); - } - - // Load was successful, return the model - return model; - } - else - { - rError() << "Failed to load model " << name << std::endl; - return model::IModelPtr(); // delete the model - } + auto file = path_is_absolute(path.c_str()) ? + GlobalFileSystem().openFileInAbsolutePath(path) : + GlobalFileSystem().openFile(path); + + if (!file) + { + rError() << "Failed to load model " << path << std::endl; + return model::IModelPtr(); // delete the model + } + + // Construct a new MD5Model container + auto model = std::make_shared(); + + // Store the path in this model + model->setModelPath(path); + // Set the filename this model was loaded from + model->setFilename(os::getFilename(file->getName())); + + // greebo: Get the Inputstream from the given file + stream::BinaryToTextInputStream inputStream(file->getInputStream()); + + // Construct a Tokeniser object and start reading the file + try + { + std::istream is(&inputStream); + parser::BasicDefTokeniser tokeniser(is); + + // Invoke the parser routine (might throw) + model->parseFromTokens(tokeniser); + + // Load was successful, return the model + return model; + } + catch (parser::ParseException& e) + { + rError() << "[md5model] Parse failure. Exception was: " << e.what() << std::endl; + return model::IModelPtr(); + } } } // namespace md5 diff --git a/radiantcore/model/md5/MD5ModelLoader.h b/radiantcore/model/md5/MD5ModelLoader.h index a84578dd4c..ca835825e2 100644 --- a/radiantcore/model/md5/MD5ModelLoader.h +++ b/radiantcore/model/md5/MD5ModelLoader.h @@ -1,6 +1,7 @@ #pragma once #include "imodel.h" +#include "iarchive.h" #include "MD5Model.h" class ArchiveFile; @@ -21,6 +22,5 @@ class MD5ModelLoader : // Documentation: See imodel.h model::IModelPtr loadModelFromPath(const std::string& name) override; }; -typedef std::shared_ptr MD5ModelLoaderPtr; -} // namespace md5 +} // namespace diff --git a/radiantcore/model/picomodel/PicoModelLoader.cpp b/radiantcore/model/picomodel/PicoModelLoader.cpp index 48e31b101b..b069202943 100644 --- a/radiantcore/model/picomodel/PicoModelLoader.cpp +++ b/radiantcore/model/picomodel/PicoModelLoader.cpp @@ -74,14 +74,16 @@ scene::INodePtr PicoModelLoader::loadModel(const std::string& modelName) } // Load the given model from the VFS path -IModelPtr PicoModelLoader::loadModelFromPath(const std::string& name) +IModelPtr PicoModelLoader::loadModelFromPath(const std::string& path) { // Open an ArchiveFile to load - ArchiveFilePtr file = GlobalFileSystem().openFile(name); + auto file = path_is_absolute(path.c_str()) ? + GlobalFileSystem().openFileInAbsolutePath(path) : + GlobalFileSystem().openFile(path); if (!file) { - rError() << "Failed to load model " << name << std::endl; + rError() << "Failed to load model " << path << std::endl; return IModelPtr(); } @@ -111,7 +113,7 @@ IModelPtr PicoModelLoader::loadModelFromPath(const std::string& name) // Set the filename modelObj->setFilename(os::getFilename(file->getName())); - modelObj->setModelPath(name); + modelObj->setModelPath(path); PicoFreeModel(model); diff --git a/radiantcore/model/picomodel/PicoModelLoader.h b/radiantcore/model/picomodel/PicoModelLoader.h index c5f9067fb2..e4008c81cb 100644 --- a/radiantcore/model/picomodel/PicoModelLoader.h +++ b/radiantcore/model/picomodel/PicoModelLoader.h @@ -24,7 +24,7 @@ class PicoModelLoader : // Returns a new ModelNode for the given model name scene::INodePtr loadModel(const std::string& modelName) override; - // Load the given model from the VFS path + // Load the given model from the path, VFS or absolute IModelPtr loadModelFromPath(const std::string& name) override; }; typedef std::shared_ptr PicoModelLoaderPtr; diff --git a/radiantcore/rendersystem/OpenGLRenderSystem.cpp b/radiantcore/rendersystem/OpenGLRenderSystem.cpp index 77077c7c61..a53b407b27 100644 --- a/radiantcore/rendersystem/OpenGLRenderSystem.cpp +++ b/radiantcore/rendersystem/OpenGLRenderSystem.cpp @@ -261,6 +261,20 @@ void OpenGLRenderSystem::unrealise() } } +void OpenGLRenderSystem::onMaterialChanged(const std::string& materialName) +{ + auto existingShader = _shaders.find(materialName); + + if (existingShader == _shaders.end() || !_realised) + { + return; + } + + // Re-realise this shader + existingShader->second->unrealise(); + existingShader->second->realise(materialName); +} + GLProgramFactory& OpenGLRenderSystem::getGLProgramFactory() { return *_glProgramFactory; diff --git a/radiantcore/rendersystem/OpenGLRenderSystem.h b/radiantcore/rendersystem/OpenGLRenderSystem.h index acde5db919..09f7f39ffa 100644 --- a/radiantcore/rendersystem/OpenGLRenderSystem.h +++ b/radiantcore/rendersystem/OpenGLRenderSystem.h @@ -69,6 +69,8 @@ class OpenGLRenderSystem void realise() override; void unrealise() override; + void onMaterialChanged(const std::string& materialName) override; + GLProgramFactory& getGLProgramFactory(); std::size_t getTime() const override; diff --git a/radiantcore/rendersystem/backend/OpenGLShader.cpp b/radiantcore/rendersystem/backend/OpenGLShader.cpp index 147a364b73..2120999f32 100644 --- a/radiantcore/rendersystem/backend/OpenGLShader.cpp +++ b/radiantcore/rendersystem/backend/OpenGLShader.cpp @@ -18,9 +18,9 @@ namespace render struct OpenGLShader::DBSTriplet { // DBS layers - ShaderLayerPtr diffuse; - ShaderLayerPtr bump; - ShaderLayerPtr specular; + IShaderLayer::Ptr diffuse; + IShaderLayer::Ptr bump; + IShaderLayer::Ptr specular; // Need-depth-fill flag bool needDepthFill; @@ -255,7 +255,7 @@ void OpenGLShader::setGLTexturesFromTriplet(OpenGLState& pass, else { pass.texture0 = GlobalMaterialManager().getDefaultInteractionTexture( - ShaderLayer::DIFFUSE + IShaderLayer::DIFFUSE )->getGLTexNum(); } @@ -267,7 +267,7 @@ void OpenGLShader::setGLTexturesFromTriplet(OpenGLState& pass, else { pass.texture1 = GlobalMaterialManager().getDefaultInteractionTexture( - ShaderLayer::BUMP + IShaderLayer::BUMP )->getGLTexNum(); } @@ -279,7 +279,7 @@ void OpenGLShader::setGLTexturesFromTriplet(OpenGLState& pass, else { pass.texture2 = GlobalMaterialManager().getDefaultInteractionTexture( - ShaderLayer::SPECULAR + IShaderLayer::SPECULAR )->getGLTexNum(); } } @@ -288,7 +288,7 @@ void OpenGLShader::setGLTexturesFromTriplet(OpenGLState& pass, void OpenGLShader::appendInteractionLayer(const DBSTriplet& triplet) { // Set layer vertex colour mode and alphatest parameters - ShaderLayer::VertexColourMode vcolMode = ShaderLayer::VERTEX_COLOUR_NONE; + IShaderLayer::VertexColourMode vcolMode = IShaderLayer::VERTEX_COLOUR_NONE; double alphaTest = -1; if (triplet.diffuse) @@ -333,12 +333,12 @@ void OpenGLShader::appendInteractionLayer(const DBSTriplet& triplet) dbsPass.glProgram = _renderSystem.getGLProgramFactory().getBuiltInProgram("bumpMap"); - if (vcolMode != ShaderLayer::VERTEX_COLOUR_NONE) + if (vcolMode != IShaderLayer::VERTEX_COLOUR_NONE) { // Vertex colours allowed dbsPass.setRenderFlag(RENDER_VERTEX_COLOUR); - if (vcolMode == ShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY) + if (vcolMode == IShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY) { // Vertex colours are inverted dbsPass.setColourInverted(true); @@ -379,9 +379,9 @@ void OpenGLShader::constructLightingPassesFromMaterial() // least one DBS layer then reach the end of the layers. DBSTriplet triplet; - const ShaderLayerVector allLayers = _material->getAllLayers(); + const IShaderLayerVector allLayers = _material->getAllLayers(); - for (ShaderLayerVector::const_iterator i = allLayers.begin(); + for (IShaderLayerVector::const_iterator i = allLayers.begin(); i != allLayers.end(); ++i) { @@ -390,7 +390,7 @@ void OpenGLShader::constructLightingPassesFromMaterial() switch ((*i)->getType()) { - case ShaderLayer::DIFFUSE: + case IShaderLayer::DIFFUSE: if (triplet.diffuse) { appendInteractionLayer(triplet); @@ -399,7 +399,7 @@ void OpenGLShader::constructLightingPassesFromMaterial() triplet.diffuse = *i; break; - case ShaderLayer::BUMP: + case IShaderLayer::BUMP: if (triplet.bump) { appendInteractionLayer(triplet); @@ -408,7 +408,7 @@ void OpenGLShader::constructLightingPassesFromMaterial() triplet.bump = *i; break; - case ShaderLayer::SPECULAR: + case IShaderLayer::SPECULAR: if (triplet.specular) { appendInteractionLayer(triplet); @@ -417,7 +417,7 @@ void OpenGLShader::constructLightingPassesFromMaterial() triplet.specular = *i; break; - case ShaderLayer::BLEND: + case IShaderLayer::BLEND: if (triplet.specular || triplet.bump || triplet.diffuse) { appendInteractionLayer(triplet); @@ -440,15 +440,15 @@ void OpenGLShader::determineBlendModeForEditorPass(OpenGLState& pass) bool hasDiffuseLayer = false; // Determine alphatest from first diffuse layer - const ShaderLayerVector allLayers = _material->getAllLayers(); + const IShaderLayerVector allLayers = _material->getAllLayers(); - for (ShaderLayerVector::const_iterator i = allLayers.begin(); + for (IShaderLayerVector::const_iterator i = allLayers.begin(); i != allLayers.end(); ++i) { - const ShaderLayerPtr& layer = *i; + const IShaderLayer::Ptr& layer = *i; - if (layer->getType() == ShaderLayer::DIFFUSE) + if (layer->getType() == IShaderLayer::DIFFUSE) { hasDiffuseLayer = true; @@ -522,10 +522,12 @@ void OpenGLShader::constructEditorPreviewPassFromMaterial() } // Append a blend (non-interaction) layer -void OpenGLShader::appendBlendLayer(const ShaderLayerPtr& layer) +void OpenGLShader::appendBlendLayer(const IShaderLayer::Ptr& layer) { TexturePtr layerTex = layer->getTexture(); + if (!layerTex) return; + OpenGLState& state = appendDefaultPass(); state.setRenderFlag(RENDER_FILL); state.setRenderFlag(RENDER_BLEND); @@ -551,7 +553,7 @@ void OpenGLShader::appendBlendLayer(const ShaderLayerPtr& layer) // Set texture dimensionality (cube map or 2D) state.cubeMapMode = layer->getCubeMapMode(); - if (state.cubeMapMode == ShaderLayer::CUBE_MAP_CAMERA) + if (state.cubeMapMode == IShaderLayer::CUBE_MAP_CAMERA) { state.setRenderFlag(RENDER_TEXTURE_CUBEMAP); } diff --git a/radiantcore/rendersystem/backend/OpenGLShader.h b/radiantcore/rendersystem/backend/OpenGLShader.h index 5125a81269..ed9f8c6e48 100644 --- a/radiantcore/rendersystem/backend/OpenGLShader.h +++ b/radiantcore/rendersystem/backend/OpenGLShader.h @@ -48,7 +48,7 @@ class OpenGLShader : void constructNormalShader(const std::string& name); // Shader pass construction helpers - void appendBlendLayer(const ShaderLayerPtr& layer); + void appendBlendLayer(const IShaderLayer::Ptr& layer); struct DBSTriplet; void appendInteractionLayer(const DBSTriplet& triplet); diff --git a/radiantcore/rendersystem/backend/OpenGLShaderPass.cpp b/radiantcore/rendersystem/backend/OpenGLShaderPass.cpp index f7d5d92632..2236ea74ed 100644 --- a/radiantcore/rendersystem/backend/OpenGLShaderPass.cpp +++ b/radiantcore/rendersystem/backend/OpenGLShaderPass.cpp @@ -65,7 +65,7 @@ inline void setState(unsigned int state, } } -inline void evaluateStage(const ShaderLayerPtr& stage, std::size_t time, const IRenderEntity* entity) +inline void evaluateStage(const IShaderLayer::Ptr& stage, std::size_t time, const IRenderEntity* entity) { if (stage) { @@ -147,7 +147,7 @@ void OpenGLShaderPass::disableRenderBlend() debug::assertNoGlErrors(); } -void OpenGLShaderPass::setupTextureMatrix(GLenum textureUnit, const ShaderLayerPtr& stage) +void OpenGLShaderPass::setupTextureMatrix(GLenum textureUnit, const IShaderLayer::Ptr& stage) { // Set the texture matrix for the given unit glActiveTexture(textureUnit); @@ -155,60 +155,7 @@ void OpenGLShaderPass::setupTextureMatrix(GLenum textureUnit, const ShaderLayerP if (stage) { - static const Matrix4 transMinusHalf = Matrix4::getTranslation(Vector3(-0.5f, -0.5f, 0)); - static const Matrix4 transPlusHalf = Matrix4::getTranslation(Vector3(+0.5f, +0.5f, 0)); - - Matrix4 tex = Matrix4::getIdentity(); - - Vector2 scale = stage->getScale(); - - if (stage->getStageFlags() & ShaderLayer::FLAG_CENTERSCALE) - { - // Center scale, apply translation by -0.5 first, then scale, then translate back - tex.multiplyBy(transMinusHalf); - tex.multiplyBy(Matrix4::getScale(Vector3(scale.x(), scale.y(), 1))); - tex.multiplyBy(transPlusHalf); - } - else - { - // Regular scale, apply translation and scale - tex.multiplyBy(Matrix4::getScale(Vector3(scale.x(), scale.y(), 1))); - } - - Vector2 shear = stage->getShear(); - - if (shear.x() != 0 || shear.y() != 0) - { - Matrix4 shearMatrix = Matrix4::byColumns( - 1, shear.y(), 0, 0, - shear.x(), 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - ); - - tex.multiplyBy(transMinusHalf); - tex.multiplyBy(shearMatrix); - tex.multiplyBy(transPlusHalf); - } - - // Rotation - float rotate = stage->getRotation(); - - if (rotate != 0) - { - float angle = rotate * 2 * static_cast(c_pi); - - Matrix4 rot = Matrix4::getRotationAboutZ(angle); - - tex.multiplyBy(transMinusHalf); - tex.multiplyBy(rot); - tex.multiplyBy(transPlusHalf); - } - - // Apply translation as last step - Vector2 translation = stage->getTranslation(); - tex.multiplyBy(Matrix4::getTranslation(Vector3(translation.x(), translation.y(), 0))); - + auto tex = stage->getTextureTransform(); glLoadMatrixd(tex); } else @@ -655,7 +602,7 @@ void OpenGLShaderPass::setUpLightingCalculation(OpenGLState& current, assert(shader); const MaterialPtr& lightMat = shader->getMaterial(); - ShaderLayer* layer = lightMat ? lightMat->firstLayer() : nullptr; + IShaderLayer* layer = lightMat ? lightMat->firstLayer() : nullptr; if (!layer) return; // Calculate viewer location in object space diff --git a/radiantcore/rendersystem/backend/OpenGLShaderPass.h b/radiantcore/rendersystem/backend/OpenGLShaderPass.h index 8b75271beb..910bfd25fd 100644 --- a/radiantcore/rendersystem/backend/OpenGLShaderPass.h +++ b/radiantcore/rendersystem/backend/OpenGLShaderPass.h @@ -82,7 +82,7 @@ class OpenGLShaderPass // Returns true if the stage associated to this pass is active and should be rendered bool stateIsActive(); - void setupTextureMatrix(GLenum textureUnit, const ShaderLayerPtr& stage); + void setupTextureMatrix(GLenum textureUnit, const IShaderLayer::Ptr& stage); // Render all of the given TransformedRenderables void renderAllContained(const Renderables& renderables, diff --git a/radiantcore/shaders/CShader.cpp b/radiantcore/shaders/CShader.cpp index c02055b297..607902389f 100644 --- a/radiantcore/shaders/CShader.cpp +++ b/radiantcore/shaders/CShader.cpp @@ -26,6 +26,7 @@ CShader::CShader(const std::string& name, const ShaderDefinition& definition) : CShader::CShader(const std::string& name, const ShaderDefinition& definition, bool isInternal) : _isInternal(isInternal), + _originalTemplate(definition.shaderTemplate), _template(definition.shaderTemplate), _fileInfo(definition.file), _name(name), @@ -41,16 +42,34 @@ CShader::~CShader() { GetTextureManager().checkBindings(); } -int CShader::getSortRequest() const +float CShader::getSortRequest() const { return _template->getSortRequest(); } +void CShader::setSortRequest(float sortRequest) +{ + ensureTemplateCopy(); + _template->setSortRequest(sortRequest); +} + +void CShader::resetSortReqest() +{ + ensureTemplateCopy(); + _template->resetSortReqest(); +} + float CShader::getPolygonOffset() const { return _template->getPolygonOffset(); } +void CShader::setPolygonOffset(float offset) +{ + ensureTemplateCopy(); + _template->setPolygonOffset(offset); +} + TexturePtr CShader::getEditorImage() { if (!_editorTexture) @@ -74,9 +93,21 @@ IMapExpression::Ptr CShader::getLightFalloffExpression() return _template->getLightFalloff(); } -IMapExpression::Ptr CShader::getLightFalloffCubeMapExpression() +void CShader::setLightFalloffExpressionFromString(const std::string& expressionString) +{ + ensureTemplateCopy(); + _template->setLightFalloffExpressionFromString(expressionString); +} + +IShaderLayer::MapType CShader::getLightFalloffCubeMapType() { - return _template->getLightFalloffCubeMap(); + return _template->getLightFalloffCubeMapType(); +} + +void CShader::setLightFalloffCubeMapType(IShaderLayer::MapType type) +{ + ensureTemplateCopy(); + _template->setLightFalloffCubeMapType(type); } /* @@ -121,10 +152,17 @@ std::string CShader::getName() const return _name; } -std::string CShader::getDescription() const { +std::string CShader::getDescription() const +{ return _template->getDescription(); } +void CShader::setDescription(const std::string& description) +{ + ensureTemplateCopy(); + _template->setDescription(description); +} + bool CShader::IsInUse() const { return m_bInUse; } @@ -139,6 +177,18 @@ int CShader::getMaterialFlags() const return _template->getMaterialFlags(); } +void CShader::setMaterialFlag(Flags flag) +{ + ensureTemplateCopy(); + _template->setMaterialFlag(flag); +} + +void CShader::clearMaterialFlag(Flags flag) +{ + ensureTemplateCopy(); + _template->clearMaterialFlag(flag); +} + bool CShader::IsDefault() const { return _isInternal || _fileInfo.name.empty(); @@ -150,27 +200,57 @@ Material::CullType CShader::getCullType() const return _template->getCullType(); } +void CShader::setCullType(CullType type) +{ + ensureTemplateCopy(); + _template->setCullType(type); +} + ClampType CShader::getClampType() const { return _template->getClampType(); } +void CShader::setClampType(ClampType type) +{ + ensureTemplateCopy(); + _template->setClampType(type); +} + int CShader::getSurfaceFlags() const { return _template->getSurfaceFlags(); } +void CShader::setSurfaceFlag(Material::SurfaceFlags flag) +{ + ensureTemplateCopy(); + _template->setSurfaceFlag(flag); +} + +void CShader::clearSurfaceFlag(Material::SurfaceFlags flag) +{ + ensureTemplateCopy(); + _template->clearSurfaceFlag(flag); +} + Material::SurfaceType CShader::getSurfaceType() const { return _template->getSurfaceType(); } +void CShader::setSurfaceType(SurfaceType type) +{ + ensureTemplateCopy(); + _template->setSurfaceType(type); +} + Material::DeformType CShader::getDeformType() const { return _template->getDeformType(); } -IShaderExpressionPtr CShader::getDeformExpression(std::size_t index) +IShaderExpression::Ptr CShader::getDeformExpression(std::size_t index) { return _template->getDeformExpression(index); } @@ -185,6 +265,12 @@ int CShader::getSpectrum() const return _template->getSpectrum(); } +void CShader::setSpectrum(int spectrum) +{ + ensureTemplateCopy(); + _template->setSpectrum(spectrum); +} + Material::DecalInfo CShader::getDecalInfo() const { return _template->getDecalInfo(); @@ -216,6 +302,11 @@ int CShader::getParseFlags() const return _template->getParseFlags(); } +bool CShader::isModified() +{ + return _template != _originalTemplate; +} + std::string CShader::getRenderBumpArguments() { return _template->getRenderBumpArguments(); @@ -244,12 +335,9 @@ void CShader::unrealise() { // Parse and load image maps for this shader void CShader::realiseLighting() { - // Only realises extra layers (no diffuse/bump/specular) - for (ShaderTemplate::Layers::const_iterator i = _template->getLayers().begin(); - i != _template->getLayers().end(); - ++i) + for (const auto& layer : _template->getLayers()) { - _layers.push_back(*i); + _layers.push_back(layer); } } @@ -265,22 +353,75 @@ void CShader::setName(const std::string& name) { _name = name; } -ShaderLayer* CShader::firstLayer() const +IShaderLayer* CShader::firstLayer() const { if (_layers.empty()) { - return NULL; + return nullptr; } return _layers.front().get(); } -// Get all layers -const ShaderLayerVector& CShader::getAllLayers() const +const IShaderLayerVector& CShader::getAllLayers() const { return _layers; } +std::size_t CShader::addLayer(IShaderLayer::Type type) +{ + ensureTemplateCopy(); + + auto newIndex = _template->addLayer(type); + + unrealiseLighting(); + realiseLighting(); + + return newIndex; +} + +void CShader::removeLayer(std::size_t index) +{ + ensureTemplateCopy(); + + _template->removeLayer(index); + + unrealiseLighting(); + realiseLighting(); +} + +void CShader::swapLayerPosition(std::size_t first, std::size_t second) +{ + ensureTemplateCopy(); + + _template->swapLayerPosition(first, second); + + unrealiseLighting(); + realiseLighting(); +} + +std::size_t CShader::duplicateLayer(std::size_t index) +{ + ensureTemplateCopy(); + + auto newIndex = _template->duplicateLayer(index); + + unrealiseLighting(); + realiseLighting(); + + return newIndex; +} + +IEditableShaderLayer::Ptr CShader::getEditableLayer(std::size_t index) +{ + ensureTemplateCopy(); + + const auto& layers = _template->getLayers(); + assert(index >= 0 && index < layers.size()); + + return layers[index]; +} + /* Required Material light type predicates */ bool CShader::isAmbientLight() const { @@ -300,6 +441,31 @@ bool CShader::isCubicLight() const return _template->isCubicLight(); } +void CShader::setIsAmbientLight(bool newValue) +{ + ensureTemplateCopy(); + _template->setIsAmbientLight(newValue); +} + +void CShader::setIsBlendLight(bool newValue) +{ + ensureTemplateCopy(); + _template->setIsBlendLight(newValue); +} + +void CShader::setIsFogLight(bool newValue) +{ + ensureTemplateCopy(); + _template->setIsFogLight(newValue); +} + +void CShader::setIsCubicLight(bool newValue) +{ + ensureTemplateCopy(); + _template->setIsCubicLight(newValue); +} + + bool CShader::lightCastsShadows() const { int flags = getMaterialFlags(); @@ -333,6 +499,21 @@ void CShader::setVisible(bool visible) { _visible = visible; } +void CShader::ensureTemplateCopy() +{ + if (_template != _originalTemplate) + { + return; // copy is already in place + } + + _template = _originalTemplate->clone(); + + // We need to update that layer reference vector + // as long as it's there + unrealise(); + realise(); +} + bool CShader::m_lightingEnabled = false; } // namespace shaders diff --git a/radiantcore/shaders/CShader.h b/radiantcore/shaders/CShader.h index 4bd4af548e..30b2439579 100644 --- a/radiantcore/shaders/CShader.h +++ b/radiantcore/shaders/CShader.h @@ -15,6 +15,11 @@ class CShader final : private: bool _isInternal; + // The unmodified template + ShaderTemplatePtr _originalTemplate; + + // The template this material is working with - if this instance + // has not been altered, this is the same as _originalTemplate ShaderTemplatePtr _template; // The shader file name (i.e. the file where this one is defined) @@ -33,7 +38,7 @@ class CShader final : bool _visible; // Vector of shader layers - ShaderLayerVector _layers; + IShaderLayerVector _layers; public: static bool m_lightingEnabled; @@ -49,8 +54,11 @@ class CShader final : ~CShader(); /* Material implementation */ - int getSortRequest() const override; + float getSortRequest() const override; + void setSortRequest(float sortRequest) override; + void resetSortReqest() override; float getPolygonOffset() const override; + void setPolygonOffset(float offset) override; TexturePtr getEditorImage() override; bool isEditorImageNoTex() override; TexturePtr lightFalloffImage() override; @@ -58,35 +66,55 @@ class CShader final : bool IsInUse() const override; void SetInUse(bool bInUse) override; int getMaterialFlags() const override; + void setMaterialFlag(Flags flag) override; + void clearMaterialFlag(Flags flag) override; bool IsDefault() const override; const char* getShaderFileName() const override; const vfs::FileInfo& getShaderFileInfo() const override; CullType getCullType() const override; + void setCullType(CullType type) override; ClampType getClampType() const override; + void setClampType(ClampType type) override; int getSurfaceFlags() const override; + void setSurfaceFlag(Material::SurfaceFlags flag) override; + void clearSurfaceFlag(Material::SurfaceFlags flag) override; SurfaceType getSurfaceType() const override; + void setSurfaceType(SurfaceType type) override; DeformType getDeformType() const override; - IShaderExpressionPtr getDeformExpression(std::size_t index) override; + IShaderExpression::Ptr getDeformExpression(std::size_t index) override; std::string getDeformDeclName() override; int getSpectrum() const override; + void setSpectrum(int spectrum) override; DecalInfo getDecalInfo() const override; Coverage getCoverage() const override; std::string getDescription() const override; + void setDescription(const std::string& description) override; std::string getDefinition() override; bool isAmbientLight() const override; bool isBlendLight() const override; bool isCubicLight() const; bool isFogLight() const override; + void setIsAmbientLight(bool newValue) override; + void setIsBlendLight(bool newValue) override; + void setIsFogLight(bool newValue) override; + void setIsCubicLight(bool newValue) override; bool lightCastsShadows() const override; bool surfaceCastsShadow() const override; bool isDrawn() const override; bool isDiscrete() const override; bool isVisible() const override; void setVisible(bool visible) override; - const ShaderLayerVector& getAllLayers() const; + const IShaderLayerVector& getAllLayers() const; + std::size_t addLayer(IShaderLayer::Type type) override; + void removeLayer(std::size_t index) override; + void swapLayerPosition(std::size_t first, std::size_t second) override; + std::size_t duplicateLayer(std::size_t index) override; + IEditableShaderLayer::Ptr getEditableLayer(std::size_t index) override; IMapExpression::Ptr getLightFalloffExpression() override; - IMapExpression::Ptr getLightFalloffCubeMapExpression() override; + void setLightFalloffExpressionFromString(const std::string& expressionString) override; + IShaderLayer::MapType getLightFalloffCubeMapType() override; + void setLightFalloffCubeMapType(IShaderLayer::MapType type) override; std::string getRenderBumpArguments() override; std::string getRenderBumpFlatArguments() override; @@ -106,11 +134,14 @@ class CShader final : */ void setName(const std::string& name); - ShaderLayer* firstLayer() const; + IShaderLayer* firstLayer() const; int getParseFlags() const override; -}; // class CShader + bool isModified() override; +private: + void ensureTemplateCopy(); +}; typedef std::shared_ptr CShaderPtr; } // namespace shaders diff --git a/radiantcore/shaders/Doom3ShaderLayer.cpp b/radiantcore/shaders/Doom3ShaderLayer.cpp index 26c4c598b5..631ec48337 100644 --- a/radiantcore/shaders/Doom3ShaderLayer.cpp +++ b/radiantcore/shaders/Doom3ShaderLayer.cpp @@ -1,5 +1,7 @@ #include "Doom3ShaderLayer.h" #include "Doom3ShaderSystem.h" +#include "SoundMapExpression.h" +#include "VideoMapExpression.h" namespace shaders { @@ -74,55 +76,98 @@ BlendFunc blendFuncFromStrings(const StringPair& blendFunc) } } -// ShaderLayer implementation +StringPair getDefaultBlendFuncStringsForType(IShaderLayer::Type type) +{ + switch (type) + { + case IShaderLayer::DIFFUSE: return { "diffusemap" , "" }; + case IShaderLayer::BUMP: return { "bumpmap" , "" }; + case IShaderLayer::SPECULAR: return { "specularmap" , "" }; + } + + return { "gl_one", "gl_zero" }; // needs to be lowercase +} + +inline IShaderExpression::Ptr getDefaultExpressionForTransformType(IShaderLayer::TransformType type) +{ + if (type == IShaderLayer::TransformType::CenterScale || + type == IShaderLayer::TransformType::Scale) + { + return ShaderExpression::createConstant(1); + } + + return ShaderExpression::createConstant(0); +} -const IShaderExpressionPtr Doom3ShaderLayer::NULL_EXPRESSION; +// IShaderLayer implementation -Doom3ShaderLayer::Doom3ShaderLayer(ShaderTemplate& material, ShaderLayer::Type type, const NamedBindablePtr& btex) +const IShaderExpression::Ptr Doom3ShaderLayer::NULL_EXPRESSION; + +Doom3ShaderLayer::Doom3ShaderLayer(ShaderTemplate& material, IShaderLayer::Type type, const NamedBindablePtr& btex) : _material(material), _registers(NUM_RESERVED_REGISTERS), - _condition(REG_ONE), - _conditionExpression(NOT_DEFINED), + _expressionSlots(_registers), _bindableTex(btex), _type(type), _mapType(MapType::Map), - _blendFuncStrings("gl_one", "gl_zero"), // needs to be lowercase + _blendFuncStrings(getDefaultBlendFuncStringsForType(type)), _vertexColourMode(VERTEX_COLOUR_NONE), _cubeMapMode(CUBE_MAP_NONE), _stageFlags(0), _clampType(CLAMP_REPEAT), - _alphaTest(REG_ZERO), _texGenType(TEXGEN_NORMAL), + _textureMatrix(_expressionSlots, _registers), _privatePolygonOffset(0), - _parseFlags(0) + _parseFlags(0), + _enabled(true) { _registers[REG_ZERO] = 0; _registers[REG_ONE] = 1; - // Init the colour to 1,1,1,1 - _colIdx[0] = _colIdx[1] = _colIdx[2] = _colIdx[3] = REG_ONE; - _colExpression[0] = _colExpression[1] = _colExpression[2] = _colExpression[3] = NOT_DEFINED; - - // Scale is set to 1,1 by default - _scale[0] = _scale[1] = REG_ONE; - _scaleExpression[0] = _scaleExpression[1] = NOT_DEFINED; + _expressionSlots[Expression::AlphaTest].registerIndex = REG_ZERO; + _expressionSlots[Expression::Condition].registerIndex = REG_ONE; - // Translation is set to 0,0 by default - _translation[0] = _translation[1] = REG_ZERO; - _translationExpression[0] = _translationExpression[1] = NOT_DEFINED; - - // Rotation is set to 0 by default - _rotation = REG_ZERO; - _rotationExpression = NOT_DEFINED; + // Init the colour to 1,1,1,1 + _expressionSlots[Expression::ColourRed].registerIndex = REG_ONE; + _expressionSlots[Expression::ColourGreen].registerIndex = REG_ONE; + _expressionSlots[Expression::ColourBlue].registerIndex = REG_ONE; + _expressionSlots[Expression::ColourAlpha].registerIndex = REG_ONE; - // No shearing so far - _shear[0] = REG_ZERO; - _shear[1] = REG_ZERO; - _shearExpression[0] = _shearExpression[1] = NOT_DEFINED; + // Initialise the texture matrix to an identity transform + _textureMatrix.setIdentity(); - _texGenParams[0] = _texGenParams[1] = _texGenParams[2] = REG_ZERO; + _expressionSlots[Expression::TexGenParam1].registerIndex = REG_ZERO; + _expressionSlots[Expression::TexGenParam2].registerIndex = REG_ZERO; + _expressionSlots[Expression::TexGenParam3].registerIndex = REG_ZERO; } +Doom3ShaderLayer::Doom3ShaderLayer(const Doom3ShaderLayer& other, ShaderTemplate& material) : + _material(material), + _registers(other._registers), + _expressionSlots(other._expressionSlots, _registers), + _bindableTex(other._bindableTex), + _texture(other._texture), + _type(other._type), + _mapType(other._mapType), + _blendFuncStrings(other._blendFuncStrings), + _vertexColourMode(other._vertexColourMode), + _cubeMapMode(other._cubeMapMode), + _stageFlags(other._stageFlags), + _clampType(other._clampType), + _texGenType(other._texGenType), + _transformations(other._transformations), + _textureMatrix(_expressionSlots, _registers), // no copying necessary + _vertexProgram(other._vertexProgram), + _fragmentProgram(other._fragmentProgram), + _vertexParms(other._vertexParms), + _vertexParmDefinitions(other._vertexParmDefinitions), + _fragmentMaps(other._fragmentMaps), + _privatePolygonOffset(other._privatePolygonOffset), + _renderMapSize(other._renderMapSize), + _parseFlags(other._parseFlags), + _enabled(other._enabled) +{} + TexturePtr Doom3ShaderLayer::getTexture() const { // Bind texture to GL if needed @@ -142,8 +187,10 @@ BlendFunc Doom3ShaderLayer::getBlendFunc() const Colour4 Doom3ShaderLayer::getColour() const { // Resolve the register values - Colour4 colour(getRegisterValue(_colIdx[0]), getRegisterValue(_colIdx[1]), - getRegisterValue(_colIdx[2]), getRegisterValue(_colIdx[3])); + Colour4 colour(getRegisterValue(_expressionSlots[Expression::ColourRed].registerIndex), + getRegisterValue(_expressionSlots[Expression::ColourGreen].registerIndex), + getRegisterValue(_expressionSlots[Expression::ColourBlue].registerIndex), + getRegisterValue(_expressionSlots[Expression::ColourAlpha].registerIndex)); if (!colour.isValid()) { @@ -153,89 +200,71 @@ Colour4 Doom3ShaderLayer::getColour() const return colour; } -const IShaderExpressionPtr& Doom3ShaderLayer::getColourExpression(ColourComponentSelector component) +const IShaderExpression::Ptr& Doom3ShaderLayer::getColourExpression(ColourComponentSelector component) const { - std::size_t expressionIndex = NOT_DEFINED; - switch (component) { case COMP_RED: - expressionIndex = _colExpression[0]; - break; + return _expressionSlots[Expression::ColourRed].expression; case COMP_GREEN: - expressionIndex = _colExpression[1]; - break; + return _expressionSlots[Expression::ColourGreen].expression; case COMP_BLUE: - expressionIndex = _colExpression[2]; - break; + return _expressionSlots[Expression::ColourBlue].expression; case COMP_ALPHA: - expressionIndex = _colExpression[3]; - break; + return _expressionSlots[Expression::ColourAlpha].expression; case COMP_RGB: // Select if all RGB are using the same expression - if (_colExpression[0] == _colExpression[1] && _colExpression[1] == _colExpression[2]) + if (_expressionSlots[Expression::ColourRed].expression == _expressionSlots[Expression::ColourGreen].expression && + _expressionSlots[Expression::ColourGreen].expression == _expressionSlots[Expression::ColourBlue].expression) { - expressionIndex = _colExpression[0]; + return _expressionSlots[Expression::ColourRed].expression; } break; case COMP_RGBA: - // Select if all RGBA are using the same expression - if (_colExpression[0] == _colExpression[1] && - _colExpression[1] == _colExpression[2] && - _colExpression[2] == _colExpression[3]) + if (_expressionSlots[Expression::ColourRed].expression == _expressionSlots[Expression::ColourGreen].expression && + _expressionSlots[Expression::ColourGreen].expression == _expressionSlots[Expression::ColourBlue].expression && + _expressionSlots[Expression::ColourBlue].expression == _expressionSlots[Expression::ColourAlpha].expression) { - expressionIndex = _colExpression[0]; + return _expressionSlots[Expression::ColourRed].expression; } break; }; - return expressionIndex != NOT_DEFINED ? _expressions[expressionIndex] : NULL_EXPRESSION; + return NULL_EXPRESSION; } -void Doom3ShaderLayer::setColourExpression(ColourComponentSelector comp, const IShaderExpressionPtr& expr) +void Doom3ShaderLayer::setColourExpression(ColourComponentSelector comp, const IShaderExpression::Ptr& expr) { - // Store the expression and link it to our registers - auto expressionIndex = _expressions.size(); - _expressions.emplace_back(expr); - - std::size_t index = expr->linkToRegister(_registers); - // Now assign the index to our colour components switch (comp) { case COMP_RED: - _colIdx[0] = index; - _colExpression[0] = expressionIndex; + _expressionSlots.assign(Expression::ColourRed, expr, REG_ONE); break; case COMP_GREEN: - _colIdx[1] = index; - _colExpression[1] = expressionIndex; + _expressionSlots.assign(Expression::ColourGreen, expr, REG_ONE); break; case COMP_BLUE: - _colIdx[2] = index; - _colExpression[2] = expressionIndex; + _expressionSlots.assign(Expression::ColourBlue, expr, REG_ONE); break; case COMP_ALPHA: - _colIdx[3] = index; - _colExpression[3] = expressionIndex; + _expressionSlots.assign(Expression::ColourAlpha, expr, REG_ONE); break; case COMP_RGB: - _colIdx[0] = index; - _colIdx[1] = index; - _colIdx[2] = index; - _colExpression[0] = expressionIndex; - _colExpression[1] = expressionIndex; - _colExpression[2] = expressionIndex; + _expressionSlots.assign(Expression::ColourRed, expr, REG_ONE); + _expressionSlots[Expression::ColourGreen].registerIndex = _expressionSlots[Expression::ColourRed].registerIndex; + _expressionSlots[Expression::ColourGreen].expression = _expressionSlots[Expression::ColourRed].expression; + _expressionSlots[Expression::ColourBlue].registerIndex = _expressionSlots[Expression::ColourRed].registerIndex; + _expressionSlots[Expression::ColourBlue].expression = _expressionSlots[Expression::ColourRed].expression; break; case COMP_RGBA: - _colIdx[0] = index; - _colIdx[1] = index; - _colIdx[2] = index; - _colIdx[3] = index; - _colExpression[0] = expressionIndex; - _colExpression[1] = expressionIndex; - _colExpression[2] = expressionIndex; - _colExpression[3] = expressionIndex; + _expressionSlots.assign(Expression::ColourRed, expr, REG_ONE); + _expressionSlots[Expression::ColourGreen].registerIndex = _expressionSlots[Expression::ColourRed].registerIndex; + _expressionSlots[Expression::ColourGreen].expression = _expressionSlots[Expression::ColourRed].expression; + _expressionSlots[Expression::ColourBlue].registerIndex = _expressionSlots[Expression::ColourRed].registerIndex; + _expressionSlots[Expression::ColourBlue].expression = _expressionSlots[Expression::ColourRed].expression; + _expressionSlots[Expression::ColourAlpha].registerIndex = _expressionSlots[Expression::ColourRed].registerIndex; + _expressionSlots[Expression::ColourAlpha].expression = _expressionSlots[Expression::ColourRed].expression; break; }; } @@ -245,31 +274,64 @@ void Doom3ShaderLayer::setColour(const Vector4& col) // Assign all 3 components of the colour, allocating new registers on the fly where needed for (std::size_t i = 0; i < 4; ++i) { + auto slot = static_cast(Expression::ColourRed + i); + // Does this colour component refer to a reserved constant index? - if (_colIdx[i] < NUM_RESERVED_REGISTERS) + if (_expressionSlots[slot].registerIndex < NUM_RESERVED_REGISTERS) { // Yes, break this up by allocating a new register for this value - _colIdx[i] = getNewRegister(static_cast(col[i])); + _expressionSlots[slot].registerIndex = getNewRegister(static_cast(col[i])); } else { // Already using a custom register - setRegister(_colIdx[i], static_cast(col[i])); + setRegister(_expressionSlots[slot].registerIndex, static_cast(col[i])); } } } -ShaderLayer::VertexColourMode Doom3ShaderLayer::getVertexColourMode() const +void Doom3ShaderLayer::appendTransformation(const Transformation& transform) +{ + Transformation copy(transform); + + if (!copy.expression1) + { + copy.expression1 = getDefaultExpressionForTransformType(transform.type); + } + + if (!copy.expression2 && transform.type != TransformType::Rotate) + { + copy.expression2 = getDefaultExpressionForTransformType(transform.type); + } + + // Store this original transformation, we need it later + _transformations.emplace_back(copy); + + // Construct a transformation matrix and multiply it on top of the existing one + _textureMatrix.applyTransformation(copy); +} + +const std::vector& Doom3ShaderLayer::getTransformations() +{ + return _transformations; +} + +Matrix4 Doom3ShaderLayer::getTextureTransform() +{ + return _textureMatrix.getMatrix4(); +} + +IShaderLayer::VertexColourMode Doom3ShaderLayer::getVertexColourMode() const { return _vertexColourMode; } -ShaderLayer::CubeMapMode Doom3ShaderLayer::getCubeMapMode() const +IShaderLayer::CubeMapMode Doom3ShaderLayer::getCubeMapMode() const { return _cubeMapMode; } -ShaderLayer::MapType Doom3ShaderLayer::getMapType() const +IShaderLayer::MapType Doom3ShaderLayer::getMapType() const { return _mapType; } @@ -279,7 +341,7 @@ void Doom3ShaderLayer::setMapType(MapType type) _mapType = type; } -const Vector2& Doom3ShaderLayer::getRenderMapSize() +const Vector2& Doom3ShaderLayer::getRenderMapSize() const { return _renderMapSize; } @@ -291,15 +353,20 @@ void Doom3ShaderLayer::setRenderMapSize(const Vector2& size) bool Doom3ShaderLayer::hasAlphaTest() const { - return _alphaTest != REG_ZERO; + return _expressionSlots[Expression::AlphaTest].expression != nullptr; } float Doom3ShaderLayer::getAlphaTest() const { - return _registers[_alphaTest]; + return _registers[_expressionSlots[Expression::AlphaTest].registerIndex]; } -TexturePtr Doom3ShaderLayer::getFragmentMapTexture(int index) +const IShaderExpression::Ptr& Doom3ShaderLayer::getAlphaTestExpression() const +{ + return _expressionSlots[Expression::AlphaTest].expression; +} + +TexturePtr Doom3ShaderLayer::getFragmentMapTexture(int index) const { if (index < 0 || index >= static_cast(_fragmentMaps.size())) { @@ -309,14 +376,14 @@ TexturePtr Doom3ShaderLayer::getFragmentMapTexture(int index) return GetTextureManager().getBinding(std::dynamic_pointer_cast(_fragmentMaps[index].map)); } -const Doom3ShaderLayer::FragmentMap& Doom3ShaderLayer::getFragmentMap(int index) +const Doom3ShaderLayer::FragmentMap& Doom3ShaderLayer::getFragmentMap(int index) const { assert(index >= 0 && index < static_cast(_fragmentMaps.size())); return _fragmentMaps[index]; } -void Doom3ShaderLayer::addFragmentMap(const ShaderLayer::FragmentMap& fragmentMap) +void Doom3ShaderLayer::addFragmentMap(const IShaderLayer::FragmentMap& fragmentMap) { assert(fragmentMap.index >= 0); @@ -328,7 +395,7 @@ void Doom3ShaderLayer::addFragmentMap(const ShaderLayer::FragmentMap& fragmentMa _fragmentMaps[fragmentMap.index] = fragmentMap; } -std::string Doom3ShaderLayer::getMapImageFilename() +std::string Doom3ShaderLayer::getMapImageFilename() const { auto image = std::dynamic_pointer_cast(_bindableTex); @@ -340,12 +407,18 @@ std::string Doom3ShaderLayer::getMapImageFilename() return std::string(); } -IMapExpression::Ptr Doom3ShaderLayer::getMapExpression() +IMapExpression::Ptr Doom3ShaderLayer::getMapExpression() const { return std::dynamic_pointer_cast(_bindableTex); } -int Doom3ShaderLayer::getParseFlags() +void Doom3ShaderLayer::setMapExpressionFromString(const std::string& expression) +{ + _texture.reset(); + setBindableTexture(MapExpression::createForString(expression)); +} + +int Doom3ShaderLayer::getParseFlags() const { return _parseFlags; } @@ -355,7 +428,7 @@ void Doom3ShaderLayer::setParseFlag(ParseFlags flag) _parseFlags |= flag; } -Vector4 Doom3ShaderLayer::getVertexParmValue(int parm) +Vector4 Doom3ShaderLayer::getVertexParmValue(int parm) const { if (static_cast(parm) >= _vertexParms.size() / 4) { @@ -364,22 +437,26 @@ Vector4 Doom3ShaderLayer::getVertexParmValue(int parm) std::size_t offset = parm * 4; - return Vector4(_registers[_vertexParms[offset + 0]], _registers[_vertexParms[offset + 1]], - _registers[_vertexParms[offset + 2]], _registers[_vertexParms[offset + 3]]); + return Vector4(_registers[_vertexParms[offset + 0].registerIndex], + _registers[_vertexParms[offset + 1].registerIndex], + _registers[_vertexParms[offset + 2].registerIndex], + _registers[_vertexParms[offset + 3].registerIndex]); } -const ShaderLayer::VertexParm& Doom3ShaderLayer::getVertexParm(int parm) +const IShaderLayer::VertexParm& Doom3ShaderLayer::getVertexParm(int parm) const { return _vertexParmDefinitions[parm]; } -int Doom3ShaderLayer::getNumVertexParms() +int Doom3ShaderLayer::getNumVertexParms() const { return static_cast(_vertexParmDefinitions.size()); } void Doom3ShaderLayer::addVertexParm(const VertexParm& parm) { + assert(parm.expressions[0]); + if (_vertexParmDefinitions.size() <= parm.index) { _vertexParmDefinitions.resize(parm.index + 1); @@ -388,58 +465,156 @@ void Doom3ShaderLayer::addVertexParm(const VertexParm& parm) // Store the expressions in a separate location _vertexParmDefinitions[parm.index] = parm; - assert(parm.expressions[0]); - - _expressions.emplace_back(parm.expressions[0]); - std::size_t parm0Reg = parm.expressions[0]->linkToRegister(_registers); - + // Resize the parms array, it will take multiples of 4 if (_vertexParms.size() <= (parm.index + 1) * 4) { - _vertexParms.resize((parm.index + 1) * 4, REG_ZERO); + _vertexParms.resize((parm.index + 1) * 4); } auto offset = parm.index * 4; - _vertexParms[offset + 0] = parm0Reg; + + // Store the first expression + _vertexParms[offset + 0].expression = parm.expressions[0]; + + std::size_t parm0Reg = parm.expressions[0]->linkToRegister(_registers); + _vertexParms[offset + 0].registerIndex = parm0Reg; if (parm.expressions[1]) { - _expressions.emplace_back(parm.expressions[1]); - _vertexParms[offset + 1] = parm.expressions[1]->linkToRegister(_registers); + _vertexParms[offset + 1].expression = parm.expressions[1]; + _vertexParms[offset + 1].registerIndex = parm.expressions[1]->linkToRegister(_registers); if (parm.expressions[2]) { - _expressions.emplace_back(parm.expressions[2]); - _vertexParms[offset + 2] = parm.expressions[2]->linkToRegister(_registers); + _vertexParms[offset + 2].expression = parm.expressions[2]; + _vertexParms[offset + 2].registerIndex = parm.expressions[2]->linkToRegister(_registers); if (parm.expressions[3]) { - _expressions.emplace_back(parm.expressions[3]); - _vertexParms[offset + 3] = parm.expressions[3]->linkToRegister(_registers); + _vertexParms[offset + 3].expression = parm.expressions[3]; + _vertexParms[offset + 3].registerIndex = parm.expressions[3]->linkToRegister(_registers); } else { // No fourth parameter set, set w to 1 - _vertexParms[offset + 3] = REG_ONE; + _vertexParms[offset + 3].registerIndex = REG_ONE; } } else { // Only 2 expressions given, set z and w to 0 and 1, respectively. - _vertexParms[offset + 2] = REG_ZERO; - _vertexParms[offset + 3] = REG_ONE; + _vertexParms[offset + 2].registerIndex = REG_ZERO; + _vertexParms[offset + 3].registerIndex = REG_ONE; } } else { // no parm1 given, repeat the one we have 4 times => insert 3 more times - _vertexParms[offset + 1] = parm0Reg; - _vertexParms[offset + 2] = parm0Reg; - _vertexParms[offset + 3] = parm0Reg; + _vertexParms[offset + 1].registerIndex = parm0Reg; + _vertexParms[offset + 2].registerIndex = parm0Reg; + _vertexParms[offset + 3].registerIndex = parm0Reg; } // At this point the array needs to be empty or its size a multiple of 4 assert(_vertexParms.size() % 4 == 0); } +void Doom3ShaderLayer::recalculateTransformationMatrix() +{ + _textureMatrix.setIdentity(); + + for (const auto& transform : _transformations) + { + _textureMatrix.applyTransformation(transform); + } +} + +void Doom3ShaderLayer::setEnabled(bool enabled) +{ + _enabled = enabled; +} + +std::size_t Doom3ShaderLayer::addTransformation(TransformType type, const std::string& expression1, const std::string& expression2) +{ + _transformations.emplace_back(Transformation + { + type, + ShaderExpression::createFromString(expression1), + type != TransformType::Rotate ? ShaderExpression::createFromString(expression2) : IShaderExpression::Ptr() + }); + + recalculateTransformationMatrix(); + + return _transformations.size() - 1; +} + +void Doom3ShaderLayer::removeTransformation(std::size_t index) +{ + assert(index >= 0 && index < _transformations.size()); + + _transformations.erase(_transformations.begin() + index); + + recalculateTransformationMatrix(); +} + +void Doom3ShaderLayer::updateTransformation(std::size_t index, TransformType type, const std::string& expression1, const std::string& expression2) +{ + assert(index >= 0 && index < _transformations.size()); + + _transformations[index].type = type; + auto expr1 = ShaderExpression::createFromString(expression1); + _transformations[index].expression1 = expr1 ? expr1 : getDefaultExpressionForTransformType(type);; + + if (type != TransformType::Rotate) + { + auto expr2 = ShaderExpression::createFromString(expression2); + _transformations[index].expression2 = expr2 ? expr2 : getDefaultExpressionForTransformType(type); + } + else + { + _transformations[index].expression2.reset(); + } + + recalculateTransformationMatrix(); +} + +void Doom3ShaderLayer::setColourExpressionFromString(ColourComponentSelector component, const std::string& expression) +{ + if (expression.empty()) + { + setColourExpression(component, IShaderExpression::Ptr()); + return; + } + + auto expr = ShaderExpression::createFromString(expression); + + if (expr) + { + setColourExpression(component, expr); + } } +void Doom3ShaderLayer::setConditionExpressionFromString(const std::string& expression) +{ + _expressionSlots.assignFromString(Expression::Condition, expression, REG_ONE); +} + +void Doom3ShaderLayer::setTexGenExpressionFromString(std::size_t index, const std::string& expression) +{ + assert(index < 3); + + auto slot = static_cast(Expression::TexGenParam1 + index); + _expressionSlots.assignFromString(slot, expression, REG_ZERO); +} + +void Doom3ShaderLayer::setSoundMapWaveForm(bool waveForm) +{ + setBindableTexture(std::make_shared(waveForm)); +} + +void Doom3ShaderLayer::setVideoMapProperties(const std::string& filePath, bool looping) +{ + setBindableTexture(std::make_shared(filePath, looping)); +} + +} diff --git a/radiantcore/shaders/Doom3ShaderLayer.h b/radiantcore/shaders/Doom3ShaderLayer.h index 948316410d..0150c6bcac 100644 --- a/radiantcore/shaders/Doom3ShaderLayer.h +++ b/radiantcore/shaders/Doom3ShaderLayer.h @@ -6,6 +6,9 @@ #include "math/Vector4.h" #include "MapExpression.h" #include "NamedBindable.h" +#include "ShaderExpression.h" +#include "ExpressionSlots.h" +#include "TextureMatrix.h" namespace shaders { @@ -16,10 +19,10 @@ class ShaderTemplate; /** * \brief - * Implementation of ShaderLayer for Doom 3 shaders. + * Implementation of IShaderLayer for Doom 3 shaders. */ -class Doom3ShaderLayer -: public ShaderLayer +class Doom3ShaderLayer : + public IEditableShaderLayer { private: // The owning material template @@ -29,16 +32,11 @@ class Doom3ShaderLayer Registers _registers; // The expressions used in this stage - typedef std::vector Expressions; - Expressions _expressions; + ExpressionSlots _expressionSlots; - static const IShaderExpressionPtr NULL_EXPRESSION; + static const IShaderExpression::Ptr NULL_EXPRESSION; static const std::size_t NOT_DEFINED = std::numeric_limits::max(); - // The condition register for this stage. Points to a register to be interpreted as bool. - std::size_t _condition; - std::size_t _conditionExpression; - // The bindable texture for this stage NamedBindablePtr _bindableTex; @@ -54,11 +52,6 @@ class Doom3ShaderLayer // Blend function as strings (e.g. "gl_one", "gl_zero") StringPair _blendFuncStrings; - // Multiplicative layer colour (set with "red 0.6", "green 0.2" etc) - // The 4 numbers are indices into the registers array in the parent material - std::size_t _colIdx[4]; - std::size_t _colExpression[4]; - // Vertex colour blend mode VertexColourMode _vertexColourMode; @@ -71,29 +64,14 @@ class Doom3ShaderLayer // Per-stage clamping ClampType _clampType; - // Alpha test value, pointing into the register array. 0 means no test, otherwise must be within (0 - 1] - std::size_t _alphaTest; - // texgen normal, reflect, skybox, wobblesky TexGenType _texGenType; - std::size_t _texGenParams[3]; // 3 registers for wobblesky texgen - IShaderExpressionPtr _texGenExpressions[3]; // the 3 expressions - // The register indices of this stage's scale expressions - std::size_t _scale[2]; - std::size_t _scaleExpression[2]; + // The list of declared transformations + std::vector _transformations; - // The register indices of this stage's translate expressions - std::size_t _translation[2]; - std::size_t _translationExpression[2]; - - // The rotation register index - std::size_t _rotation; - std::size_t _rotationExpression; - - // The register indices of this stage's shear expressions - std::size_t _shear[2]; - std::size_t _shearExpression[2]; + // Handles the expressions used to calculcate the final texture matrix + TextureMatrix _textureMatrix; // The shader programs used in this stage std::string _vertexProgram; @@ -101,7 +79,7 @@ class Doom3ShaderLayer // A variable sized array of vertexParms (or rather their indices into the registers array) // since a single vertex parm consists of 4 values, the _vertexParms array is usually of size 0, 4, 8, etc. - std::vector _vertexParms; + std::vector _vertexParms; std::vector _vertexParmDefinitions; // The array of fragment maps @@ -114,14 +92,19 @@ class Doom3ShaderLayer int _parseFlags; + bool _enabled; + public: + using Ptr = std::shared_ptr; - // Constructor Doom3ShaderLayer(ShaderTemplate& material, - ShaderLayer::Type type = ShaderLayer::BLEND, + IShaderLayer::Type type = IShaderLayer::BLEND, const NamedBindablePtr& btex = NamedBindablePtr()); - /* ShaderLayer implementation */ + // Copy-constructor, needs the new owner template as argument + Doom3ShaderLayer(const Doom3ShaderLayer& other, ShaderTemplate& material); + + /* IShaderLayer implementation */ TexturePtr getTexture() const; BlendFunc getBlendFunc() const; Colour4 getColour() const; @@ -129,52 +112,85 @@ class Doom3ShaderLayer CubeMapMode getCubeMapMode() const; MapType getMapType() const override; - void setMapType(MapType type); + void setMapType(MapType type) override; - const Vector2& getRenderMapSize() override; + const Vector2& getRenderMapSize() const override; void setRenderMapSize(const Vector2& size); bool hasAlphaTest() const override; float getAlphaTest() const override; + const shaders::IShaderExpression::Ptr& getAlphaTestExpression() const override; + + void setAlphaTestExpressionFromString(const std::string& expression) override + { + _expressionSlots.assignFromString(Expression::AlphaTest, expression, REG_ZERO); + } // True if the condition for this stage is fulfilled // (expressions must have been evaluated before this call) - bool isVisible() const + bool isVisible() const override { - return _registers[_condition] != 0; + return _enabled && _registers[_expressionSlots[Expression::Condition].registerIndex] != 0; } - const shaders::IShaderExpressionPtr& getConditionExpression() override + bool isEnabled() const override { - return _conditionExpression != NOT_DEFINED ? _expressions[_conditionExpression] : NULL_EXPRESSION; + return _enabled; } - void setCondition(const IShaderExpressionPtr& conditionExpr) + const shaders::IShaderExpression::Ptr& getConditionExpression() const override { - // Store the expression in our list - _conditionExpression = _expressions.size(); - _expressions.emplace_back(conditionExpr); + return _expressionSlots[Expression::Condition].expression; + } - // Link the result to our local registers - _condition = conditionExpr->linkToRegister(_registers); + void setCondition(const IShaderExpression::Ptr& conditionExpr) + { + _expressionSlots.assign(Expression::Condition, conditionExpr, REG_ONE); } void evaluateExpressions(std::size_t time) { - for (const auto& i : _expressions) + for (const auto& slot : _expressionSlots) + { + if (slot.expression) + { + slot.expression->evaluate(time); + } + } + + for (const auto& parm : _vertexParms) { - i->evaluate(time); + if (parm.expression) + { + parm.expression->evaluate(time); + } } } void evaluateExpressions(std::size_t time, const IRenderEntity& entity) { - for (const auto& i : _expressions) + for (const auto& slot : _expressionSlots) + { + if (slot.expression) + { + slot.expression->evaluate(time, entity); + } + } + + for (const auto& parm : _vertexParms) { - i->evaluate(time, entity); + if (parm.expression) + { + parm.expression->evaluate(time, entity); + } } } + shaders::IShaderExpression::Ptr getExpression(Expression::Slot slot) override + { + return _expressionSlots[slot].expression; + } + /** * \brief * Set the bindable texture object. @@ -197,7 +213,7 @@ class Doom3ShaderLayer * \brief * Set the layer type. */ - void setLayerType(ShaderLayer::Type type) + void setLayerType(IShaderLayer::Type type) { _type = type; } @@ -206,7 +222,7 @@ class Doom3ShaderLayer * \brief * Get the layer type. */ - ShaderLayer::Type getType() const + IShaderLayer::Type getType() const { return _type; } @@ -221,12 +237,12 @@ class Doom3ShaderLayer _stageFlags = flags; } - void setStageFlag(ShaderLayer::Flags flag) + void setStageFlag(IShaderLayer::Flags flag) override { _stageFlags |= flag; } - void clearStageFlag(ShaderLayer::Flags flag) + void clearStageFlag(IShaderLayer::Flags flag) override { _stageFlags &= ~flag; } @@ -236,7 +252,7 @@ class Doom3ShaderLayer return _clampType; } - void setClampType(ClampType type) + void setClampType(ClampType type) override { _clampType = type; } @@ -246,7 +262,7 @@ class Doom3ShaderLayer return _texGenType; } - void setTexGenType(TexGenType type) + void setTexGenType(TexGenType type) override { _texGenType = type; } @@ -254,32 +270,50 @@ class Doom3ShaderLayer float getTexGenParam(std::size_t index) const override { assert(index < 3); - return _registers[_texGenParams[index]]; + auto slot = static_cast(Expression::TexGenParam1 + index); + return _registers[_expressionSlots[slot].registerIndex]; } - IShaderExpressionPtr getTexGenExpression(std::size_t index) const override + IShaderExpression::Ptr getTexGenExpression(std::size_t index) const override { assert(index < 3); - return _texGenExpressions[index]; + return _expressionSlots[static_cast(Expression::TexGenParam1 + index)].expression; } - void setTexGenExpression(std::size_t index, const IShaderExpressionPtr& expression) + void setTexGenExpression(std::size_t index, const IShaderExpression::Ptr& expression) { assert(index < 3); // Store the expression in our list - _expressions.push_back(expression); - _texGenExpressions[index] = expression; - _texGenParams[index] = expression->linkToRegister(_registers); + auto slot = static_cast(Expression::TexGenParam1 + index); + + _expressionSlots.assign(slot, expression, REG_ZERO); } /** * \brief * Set the blend function string. */ - void setBlendFuncStrings(const StringPair& func) + void setBlendFuncStrings(const StringPair& func) override { _blendFuncStrings = func; + + if (_blendFuncStrings.first == "diffusemap") + { + setLayerType(IShaderLayer::DIFFUSE); + } + else if (_blendFuncStrings.first == "bumpmap") + { + setLayerType(IShaderLayer::BUMP); + } + else if (_blendFuncStrings.first == "specularmap") + { + setLayerType(IShaderLayer::SPECULAR); + } + else + { + setLayerType(IShaderLayer::BLEND); + } } const StringPair& getBlendFuncStrings() const override @@ -291,7 +325,7 @@ class Doom3ShaderLayer * \brief * Set vertex colour mode. */ - void setVertexColourMode(VertexColourMode mode) + void setVertexColourMode(VertexColourMode mode) override { _vertexColourMode = mode; } @@ -304,13 +338,13 @@ class Doom3ShaderLayer */ void setColour(const Vector4& col); - const IShaderExpressionPtr& getColourExpression(ColourComponentSelector component) override; + const IShaderExpression::Ptr& getColourExpression(ColourComponentSelector component) const override; /** * Set the given colour component to use the given expression. This can be a single * component out of the 4 available ones (R, G, B, A) or one of the two combos RGB and RGBA. */ - void setColourExpression(ColourComponentSelector comp, const IShaderExpressionPtr& expr); + void setColourExpression(ColourComponentSelector comp, const IShaderExpression::Ptr& expr); /** * \brief @@ -322,123 +356,9 @@ class Doom3ShaderLayer _texture = tex; } - Vector2 getScale() - { - return Vector2(_registers[_scale[0]], _registers[_scale[1]]); - } - - const shaders::IShaderExpressionPtr& getScaleExpression(std::size_t index) override - { - assert(index < 2); - - if (getStageFlags() & FLAG_CENTERSCALE) - { - return NULL_EXPRESSION; - } - - auto expressionIndex = _scaleExpression[index]; - return expressionIndex != NOT_DEFINED ? _expressions[expressionIndex] : NULL_EXPRESSION; - } - - const shaders::IShaderExpressionPtr& getCenterScaleExpression(std::size_t index) override - { - assert(index < 2); - - if ((getStageFlags() & FLAG_CENTERSCALE) == 0) - { - return NULL_EXPRESSION; - } - - auto expressionIndex = _scaleExpression[index]; - return expressionIndex != NOT_DEFINED ? _expressions[expressionIndex] : NULL_EXPRESSION; - } - - /** - * Set the scale expressions of this stage, overwriting any previous scales. - */ - void setScale(const IShaderExpressionPtr& xExpr, const IShaderExpressionPtr& yExpr) - { - _scaleExpression[0] = _expressions.size(); - _expressions.emplace_back(xExpr); - _scaleExpression[1] = _expressions.size(); - _expressions.emplace_back(yExpr); - - _scale[0] = xExpr->linkToRegister(_registers); - _scale[1] = yExpr->linkToRegister(_registers); - } - - Vector2 getTranslation() - { - return Vector2(_registers[_translation[0]], _registers[_translation[1]]); - } - - const shaders::IShaderExpressionPtr& getTranslationExpression(std::size_t index) - { - assert(index < 2); - auto expressionIndex = _translationExpression[index]; - return expressionIndex != NOT_DEFINED ? _expressions[expressionIndex] : NULL_EXPRESSION; - } - - /** - * Set the "translate" expressions of this stage, overwriting any previous expressions. - */ - void setTranslation(const IShaderExpressionPtr& xExpr, const IShaderExpressionPtr& yExpr) - { - _translationExpression[0] = _expressions.size(); - _expressions.emplace_back(xExpr); - _translationExpression[1] = _expressions.size(); - _expressions.emplace_back(yExpr); - - _translation[0] = xExpr->linkToRegister(_registers); - _translation[1] = yExpr->linkToRegister(_registers); - } - - float getRotation() - { - return _registers[_rotation]; - } - - const shaders::IShaderExpressionPtr& getRotationExpression() override - { - return _rotationExpression != NOT_DEFINED ? _expressions[_rotationExpression] : NULL_EXPRESSION; - } - - /** - * Set the "rotate" expression of this stage, overwriting any previous one. - */ - void setRotation(const IShaderExpressionPtr& expr) - { - _rotationExpression = _expressions.size(); - _expressions.emplace_back(expr); - - _rotation = expr->linkToRegister(_registers); - } - - Vector2 getShear() - { - return Vector2(_registers[_shear[0]], _registers[_shear[1]]); - } - - const shaders::IShaderExpressionPtr& getShearExpression(std::size_t index) override - { - assert(index < 2); - auto expressionIndex = _shearExpression[index]; - return expressionIndex != NOT_DEFINED ? _expressions[expressionIndex] : NULL_EXPRESSION; - } - - /** - * Set the shear expressions of this stage, overwriting any previous ones. - */ - void setShear(const IShaderExpressionPtr& xExpr, const IShaderExpressionPtr& yExpr) - { - _shearExpression[0] = _expressions.size(); - _expressions.emplace_back(xExpr); - _shearExpression[1] = _expressions.size(); - _expressions.emplace_back(yExpr); - - _shear[0] = xExpr->linkToRegister(_registers); - _shear[1] = yExpr->linkToRegister(_registers); - } + void appendTransformation(const Transformation& transform) override; + const std::vector& getTransformations() override; + Matrix4 getTextureTransform() override; /** * \brief @@ -453,10 +373,9 @@ class Doom3ShaderLayer * \brief * Set alphatest expression */ - void setAlphaTest(const IShaderExpressionPtr& expr) + void setAlphaTest(const IShaderExpression::Ptr& expression) { - _expressions.push_back(expr); - _alphaTest = expr->linkToRegister(_registers); + _expressionSlots.assign(Expression::AlphaTest, expression, REG_ZERO); } // Returns the value of the given register @@ -480,7 +399,7 @@ class Doom3ShaderLayer } // Vertex program name - const std::string& getVertexProgram() + const std::string& getVertexProgram() const override { return _vertexProgram; } @@ -490,15 +409,15 @@ class Doom3ShaderLayer _vertexProgram = name; } - Vector4 getVertexParmValue(int parm) override; - const VertexParm& getVertexParm(int parm) override; + Vector4 getVertexParmValue(int parm) const override; + const VertexParm& getVertexParm(int parm) const override; - int getNumVertexParms() override; + int getNumVertexParms() const override; void addVertexParm(const VertexParm& parm); // Fragment program name - const std::string& getFragmentProgram() + const std::string& getFragmentProgram() const override { return _fragmentProgram; } @@ -508,40 +427,48 @@ class Doom3ShaderLayer _fragmentProgram = name; } - std::size_t getNumFragmentMaps() + std::size_t getNumFragmentMaps() const override { return _fragmentMaps.size(); } - const FragmentMap& getFragmentMap(int index) override; + const FragmentMap& getFragmentMap(int index) const override; - TexturePtr getFragmentMapTexture(int index) override; + TexturePtr getFragmentMapTexture(int index) const override; void addFragmentMap(const FragmentMap& fragmentMap); - float getPrivatePolygonOffset() + float getPrivatePolygonOffset() const override { return _privatePolygonOffset; } - void setPrivatePolygonOffset(float value) + void setPrivatePolygonOffset(double value) override { - _privatePolygonOffset = value; + _privatePolygonOffset = static_cast(value); } - std::string getMapImageFilename() override; + std::string getMapImageFilename() const override; + + shaders::IMapExpression::Ptr getMapExpression() const override; + void setMapExpressionFromString(const std::string& expression) override; - shaders::IMapExpression::Ptr getMapExpression() override; + void setEnabled(bool enabled) override; + std::size_t addTransformation(TransformType type, const std::string& expression1, const std::string& expression2) override; + void removeTransformation(std::size_t index) override; + void updateTransformation(std::size_t index, TransformType type, const std::string& expression1, const std::string& expression2) override; + void setColourExpressionFromString(ColourComponentSelector component, const std::string& expression) override; + void setConditionExpressionFromString(const std::string& expression) override; + void setTexGenExpressionFromString(std::size_t index, const std::string& expression) override; + void setSoundMapWaveForm(bool waveForm) override; + void setVideoMapProperties(const std::string& filePath, bool looping) override; - int getParseFlags() override; + int getParseFlags() const override; void setParseFlag(ParseFlags flag); -}; -/** - * \brief - * Pointer typedef for Doom3ShaderLayer. - */ -typedef std::shared_ptr Doom3ShaderLayerPtr; +private: + void recalculateTransformationMatrix(); +}; } diff --git a/radiantcore/shaders/Doom3ShaderSystem.cpp b/radiantcore/shaders/Doom3ShaderSystem.cpp index 210d6aafa9..1561453f48 100644 --- a/radiantcore/shaders/Doom3ShaderSystem.cpp +++ b/radiantcore/shaders/Doom3ShaderSystem.cpp @@ -245,19 +245,19 @@ GLTextureManager& Doom3ShaderSystem::getTextureManager() } // Get default textures -TexturePtr Doom3ShaderSystem::getDefaultInteractionTexture(ShaderLayer::Type type) +TexturePtr Doom3ShaderSystem::getDefaultInteractionTexture(IShaderLayer::Type type) { TexturePtr defaultTex; // Look up based on layer type switch (type) { - case ShaderLayer::DIFFUSE: - case ShaderLayer::SPECULAR: + case IShaderLayer::DIFFUSE: + case IShaderLayer::SPECULAR: defaultTex = _textureManager->getBinding(getBitmapsPath() + IMAGE_BLACK); break; - case ShaderLayer::BUMP: + case IShaderLayer::BUMP: defaultTex = _textureManager->getBinding(getBitmapsPath() + IMAGE_FLAT); break; default: @@ -296,7 +296,7 @@ TexturePtr Doom3ShaderSystem::loadTextureFromFile(const std::string& filename) return _textureManager->getBinding(filename); } -IShaderExpressionPtr Doom3ShaderSystem::createShaderExpressionFromString(const std::string& exprStr) +IShaderExpression::Ptr Doom3ShaderSystem::createShaderExpressionFromString(const std::string& exprStr) { return ShaderExpression::createFromString(exprStr); } @@ -353,7 +353,7 @@ void Doom3ShaderSystem::testShaderExpressionParsing() { // Test a few things std::string exprStr = "3"; - IShaderExpressionPtr expr; + IShaderExpression::Ptr expr; GET_EXPR_OR_RETURN; rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; diff --git a/radiantcore/shaders/Doom3ShaderSystem.h b/radiantcore/shaders/Doom3ShaderSystem.h index a043262c7b..a47ca9520f 100644 --- a/radiantcore/shaders/Doom3ShaderSystem.h +++ b/radiantcore/shaders/Doom3ShaderSystem.h @@ -104,9 +104,9 @@ class Doom3ShaderSystem : GLTextureManager& getTextureManager(); // Get default textures for D,B,S layers - TexturePtr getDefaultInteractionTexture(ShaderLayer::Type t) override; + TexturePtr getDefaultInteractionTexture(IShaderLayer::Type t) override; - IShaderExpressionPtr createShaderExpressionFromString(const std::string& exprStr) override; + IShaderExpression::Ptr createShaderExpressionFromString(const std::string& exprStr) override; MaterialPtr createDefaultMaterial(const std::string& name) override; diff --git a/radiantcore/shaders/ExpressionSlots.cpp b/radiantcore/shaders/ExpressionSlots.cpp new file mode 100644 index 0000000000..ec7a26af5b --- /dev/null +++ b/radiantcore/shaders/ExpressionSlots.cpp @@ -0,0 +1,97 @@ +#include "ExpressionSlots.h" + +#include "ShaderExpression.h" + +namespace shaders +{ + +ExpressionSlots::ExpressionSlots(Registers& registers) : + _registers(registers) +{ + resize(IShaderLayer::Expression::NumExpressionSlots); +} + +ExpressionSlots::ExpressionSlots(const ExpressionSlots& other, Registers& registers) : + std::vector(other.size()), + _registers(registers) +{ + for (auto i = 0; i < other.size(); ++i) + { + auto& thisSlot = at(i); + auto& otherSlot = other.at(i); + + thisSlot.registerIndex = otherSlot.registerIndex; + + if (otherSlot.expression) + { + thisSlot.expression = otherSlot.expression->clone(); + thisSlot.expression->linkToSpecificRegister(_registers, thisSlot.registerIndex); + } + } +} + +void ExpressionSlots::assign(IShaderLayer::Expression::Slot slot, const IShaderExpression::Ptr& newExpression, std::size_t defaultRegisterIndex) +{ + auto& expressionSlot = at(slot); + + if (!newExpression) + { + expressionSlot.expression.reset(); + expressionSlot.registerIndex = defaultRegisterIndex; + return; + } + + // Non-empty expression, overwrite if we have an existing expression in the slot + // Beware of the fact that some expressions could be shared across slots, before re-using the same register + if (expressionSlot.expression && !registerIsShared(expressionSlot.registerIndex)) + { + // We assume that if there was an expression in the slot, it shouldn't point to the default registers + assert(expressionSlot.registerIndex != defaultRegisterIndex); + + // Re-use the register index + expressionSlot.expression = newExpression; + expressionSlot.expression->linkToSpecificRegister(_registers, expressionSlot.registerIndex); + } + else + { + expressionSlot.expression = newExpression; + expressionSlot.registerIndex = expressionSlot.expression->linkToRegister(_registers); + } +} + +void ExpressionSlots::assignFromString(IShaderLayer::Expression::Slot slot, const std::string& expressionString, std::size_t defaultRegisterIndex) +{ + // An empty string will clear the expression + if (expressionString.empty()) + { + assign(slot, IShaderExpression::Ptr(), defaultRegisterIndex); + return; + } + + // Attempt to parse the string + auto expression = ShaderExpression::createFromString(expressionString); + + if (!expression) + { + return; // parsing failures will not overwrite the expression slot + } + + assign(slot, expression, defaultRegisterIndex); +} + +bool ExpressionSlots::registerIsShared(std::size_t index) const +{ + std::size_t useCount = 0; + + for (const auto& slot : *this) + { + if (slot.registerIndex == index && ++useCount > 1) + { + return true; + } + } + + return false; +} + +} diff --git a/radiantcore/shaders/ExpressionSlots.h b/radiantcore/shaders/ExpressionSlots.h new file mode 100644 index 0000000000..001410d388 --- /dev/null +++ b/radiantcore/shaders/ExpressionSlots.h @@ -0,0 +1,48 @@ +#pragma once + +#include "ishaderexpression.h" + +namespace shaders +{ + +struct ExpressionSlot +{ + // The register holding the evaluated float + std::size_t registerIndex; + + // The expression itself (empty if unused) + IShaderExpression::Ptr expression; + + ExpressionSlot() : + registerIndex(REG_ZERO) + {} +}; + +class ExpressionSlots : + public std::vector +{ +private: + Registers& _registers; + + static const IShaderExpression::Ptr NullExpression; + +public: + ExpressionSlots(Registers& registers); + + // Copy ctor + ExpressionSlots(const ExpressionSlots& other, Registers& registers); + + // Store the given expression in the slot + void assign(IShaderLayer::Expression::Slot slot, const IShaderExpression::Ptr& expression, std::size_t defaultRegisterIndex); + + // Try to parse the given expression string and store it in the slot + // An empty expression will clear the slot, setting it back to the defaultRegisterIndex + // Parsing failures of non-empty strings will not change the slot + void assignFromString(IShaderLayer::Expression::Slot slot, const std::string& expression, std::size_t defaultRegisterIndex); + +private: + // Returns true if the given register index is in use by more than one expression + bool registerIsShared(std::size_t index) const; +}; + +} diff --git a/radiantcore/shaders/MapExpression.cpp b/radiantcore/shaders/MapExpression.cpp index ba2e59a966..c2c2de09d5 100644 --- a/radiantcore/shaders/MapExpression.cpp +++ b/radiantcore/shaders/MapExpression.cpp @@ -94,8 +94,15 @@ MapExpressionPtr MapExpression::createForToken(DefTokeniser& token) MapExpressionPtr MapExpression::createForString(const std::string& str) { - parser::BasicDefTokeniser token(str); - return createForToken(token); + try + { + parser::BasicDefTokeniser token(str); + return createForToken(token); + } + catch (const parser::ParseException&) + { + return MapExpressionPtr(); + } } ImagePtr MapExpression::getResampled(const ImagePtr& input, std::size_t width, std::size_t height) diff --git a/radiantcore/shaders/ShaderExpression.cpp b/radiantcore/shaders/ShaderExpression.cpp index 6c7362cfbd..13cfebac4a 100644 --- a/radiantcore/shaders/ShaderExpression.cpp +++ b/radiantcore/shaders/ShaderExpression.cpp @@ -379,11 +379,11 @@ class ShaderExpressionParser } else if (token == "<") { - return std::make_shared(); + return std::make_shared(); } else if (token == "<=") { - return std::make_shared(); + return std::make_shared(); } else if (token == ">") { @@ -416,7 +416,7 @@ class ShaderExpressionParser } // namespace expressions -IShaderExpressionPtr ShaderExpression::createFromTokens(parser::DefTokeniser& tokeniser) +IShaderExpression::Ptr ShaderExpression::createFromTokens(parser::DefTokeniser& tokeniser) { // Create an adapter which takes care of splitting the tokens into finer grains // The incoming DefTokeniser is not splitting up expressions like "3*4" without any whitespace in them @@ -430,14 +430,34 @@ IShaderExpressionPtr ShaderExpression::createFromTokens(parser::DefTokeniser& to catch (parser::ParseException& ex) { rWarning() << "[shaders] " << ex.what() << std::endl; - return IShaderExpressionPtr(); + return IShaderExpression::Ptr(); } } -IShaderExpressionPtr ShaderExpression::createFromString(const std::string& exprStr) +IShaderExpression::Ptr ShaderExpression::createFromString(const std::string& exprStr) { parser::BasicDefTokeniser tokeniser(exprStr, parser::WHITESPACE, "{}(),"); return createFromTokens(tokeniser); } +IShaderExpression::Ptr ShaderExpression::createConstant(float constantValue) +{ + return std::make_shared(constantValue); +} + +IShaderExpression::Ptr ShaderExpression::createAddition(const IShaderExpression::Ptr& a, const IShaderExpression::Ptr& b) +{ + return std::make_shared(a, b); +} + +IShaderExpression::Ptr ShaderExpression::createMultiplication(const IShaderExpression::Ptr& a, const IShaderExpression::Ptr& b) +{ + return std::make_shared(a, b); +} + +IShaderExpression::Ptr ShaderExpression::createTableLookup(const TableDefinitionPtr& table, const IShaderExpression::Ptr& lookup) +{ + return std::make_shared(table, lookup); +} + } // namespace diff --git a/radiantcore/shaders/ShaderExpression.h b/radiantcore/shaders/ShaderExpression.h index 69bcb6dad8..218ff05278 100644 --- a/radiantcore/shaders/ShaderExpression.h +++ b/radiantcore/shaders/ShaderExpression.h @@ -22,6 +22,14 @@ class ShaderExpression : bool _surroundedByParentheses; +protected: + ShaderExpression(const ShaderExpression& other) : + ShaderExpression() // use default ctor to initialise the members + { + // Inherit the parentheses flag + _surroundedByParentheses = other._surroundedByParentheses; + } + public: ShaderExpression() : _index(-1), @@ -30,12 +38,12 @@ class ShaderExpression : {} // Base implementations - virtual float evaluate(std::size_t time) + virtual float evaluate(std::size_t time) override { // Evaluate this register and write it into the respective register index float val = getValue(time); - if (_registers != NULL) + if (_registers != nullptr) { (*_registers)[_index] = val; } @@ -43,12 +51,12 @@ class ShaderExpression : return val; } - virtual float evaluate(std::size_t time, const IRenderEntity& entity) + virtual float evaluate(std::size_t time, const IRenderEntity& entity) override { // Evaluate this register and write it into the respective register index float val = getValue(time, entity); - if (_registers != NULL) + if (_registers != nullptr) { (*_registers)[_index] = val; } @@ -56,7 +64,7 @@ class ShaderExpression : return val; } - std::size_t linkToRegister(Registers& registers) + std::size_t linkToRegister(Registers& registers) override { _registers = ®isters; @@ -69,9 +77,35 @@ class ShaderExpression : return _index; } - static IShaderExpressionPtr createFromString(const std::string& exprStr); + void linkToSpecificRegister(Registers& registers, std::size_t index) override + { + _registers = ®isters; + _index = static_cast(index); + } + + bool isLinked() const override + { + return _index != -1; + } + + std::size_t unlinkFromRegisters() override + { + _registers = nullptr; + + auto oldIndex = _index; + _index = -1; + + return static_cast(oldIndex); + } + + static IShaderExpression::Ptr createFromString(const std::string& exprStr); + + static IShaderExpression::Ptr createFromTokens(parser::DefTokeniser& tokeniser); - static IShaderExpressionPtr createFromTokens(parser::DefTokeniser& tokeniser); + static IShaderExpression::Ptr createConstant(float constantValue); + static IShaderExpression::Ptr createAddition(const IShaderExpression::Ptr& a, const IShaderExpression::Ptr& b); + static IShaderExpression::Ptr createMultiplication(const IShaderExpression::Ptr& a, const IShaderExpression::Ptr& b); + static IShaderExpression::Ptr createTableLookup(const TableDefinitionPtr& table, const IShaderExpression::Ptr& lookup); virtual std::string getExpressionString() override { @@ -99,12 +133,18 @@ class ShaderParmExpression : private: // The attached entity's shaderparm number to retrieve int _parmNum; + public: ShaderParmExpression(int parmNum) : ShaderExpression(), _parmNum(parmNum) {} + ShaderParmExpression(const ShaderParmExpression& other) : + ShaderExpression(other), + _parmNum(other._parmNum) + {} + virtual float getValue(std::size_t time) { // parmNN is 0 without entity @@ -120,6 +160,11 @@ class ShaderParmExpression : { return fmt::format("parm{0}", _parmNum); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; class GlobalShaderParmExpression : @@ -128,12 +173,18 @@ class GlobalShaderParmExpression : private: // The global shaderparm number to retrieve int _parmNum; + public: GlobalShaderParmExpression(int parmNum) : ShaderExpression(), _parmNum(parmNum) {} + GlobalShaderParmExpression(const GlobalShaderParmExpression& other) : + ShaderExpression(other), + _parmNum(other._parmNum) + {} + virtual float getValue(std::size_t time) { // globalNN is 0 without entity @@ -149,6 +200,11 @@ class GlobalShaderParmExpression : { return fmt::format("global{0}", _parmNum); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning the current (game) time as result @@ -160,6 +216,10 @@ class TimeExpression : ShaderExpression() {} + TimeExpression(const TimeExpression& other) : + ShaderExpression(other) + {} + virtual float getValue(std::size_t time) { return time / 1000.0f; // convert msecs to secs @@ -174,6 +234,11 @@ class TimeExpression : { return "time"; } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression representing a constant floating point number @@ -189,6 +254,11 @@ class ConstantExpression : _value(value) {} + ConstantExpression(const ConstantExpression& other) : + ShaderExpression(other), + _value(other._value) + {} + virtual float getValue(std::size_t time) { return _value; @@ -203,6 +273,11 @@ class ConstantExpression : { return fmt::format("{0}", _value); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression looking up a value in a table def @@ -211,12 +286,12 @@ class TableLookupExpression : { private: TableDefinitionPtr _tableDef; - IShaderExpressionPtr _lookupExpr; + IShaderExpression::Ptr _lookupExpr; public: // Pass the table and the expression used to perform the lookup TableLookupExpression(const TableDefinitionPtr& tableDef, - const IShaderExpressionPtr& lookupExpr) : + const IShaderExpression::Ptr& lookupExpr) : ShaderExpression(), _tableDef(tableDef), _lookupExpr(lookupExpr) @@ -225,6 +300,12 @@ class TableLookupExpression : assert(_lookupExpr); } + TableLookupExpression(const TableLookupExpression& other) : + ShaderExpression(other), + _tableDef(other._tableDef), + _lookupExpr(other._lookupExpr ? other._lookupExpr->clone() : Ptr()) + {} + virtual float getValue(std::size_t time) { float lookupVal = _lookupExpr->getValue(time); @@ -241,6 +322,11 @@ class TableLookupExpression : { return fmt::format("{0}[{1}]", _tableDef->getName(), _lookupExpr->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // Abstract base class for an expression taking two sub-expression as arguments @@ -264,31 +350,40 @@ class BinaryExpression : }; protected: - IShaderExpressionPtr _a; - IShaderExpressionPtr _b; + IShaderExpression::Ptr _a; + IShaderExpression::Ptr _b; Precedence _precedence; -public: +protected: BinaryExpression(Precedence precedence, - const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : ShaderExpression(), _a(a), _b(b), _precedence(precedence) {} + BinaryExpression(const BinaryExpression& other) : + ShaderExpression(other), + _a(other._a), + _b(other._b), + _precedence(other._precedence) + {} + +public: + Precedence getPrecedence() const { return _precedence; } - void setA(const IShaderExpressionPtr& a) + void setA(const IShaderExpression::Ptr& a) { _a = a; } - void setB(const IShaderExpressionPtr& b) + void setB(const IShaderExpression::Ptr& b) { _b = b; } @@ -300,11 +395,15 @@ class AddExpression : public BinaryExpression { public: - AddExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + AddExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(ADDITION, a, b) {} + AddExpression(const AddExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) + _b->getValue(time); @@ -319,6 +418,11 @@ class AddExpression : { return fmt::format("{0} + {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression subtracting the value of two expressions @@ -326,11 +430,15 @@ class SubtractExpression : public BinaryExpression { public: - SubtractExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + SubtractExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(SUBTRACTION, a, b) {} + SubtractExpression(const SubtractExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) - _b->getValue(time); @@ -345,6 +453,11 @@ class SubtractExpression : { return fmt::format("{0} - {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression multiplying the value of two expressions @@ -352,11 +465,15 @@ class MultiplyExpression : public BinaryExpression { public: - MultiplyExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + MultiplyExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(MULTIPLICATION, a, b) {} + MultiplyExpression(const MultiplyExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) * _b->getValue(time); @@ -371,6 +488,11 @@ class MultiplyExpression : { return fmt::format("{0} * {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression dividing the value of two expressions @@ -378,11 +500,15 @@ class DivideExpression : public BinaryExpression { public: - DivideExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + DivideExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(DIVISION, a, b) {} + DivideExpression(const DivideExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) / _b->getValue(time); @@ -397,6 +523,11 @@ class DivideExpression : { return fmt::format("{0} / {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning modulo of A % B @@ -404,11 +535,15 @@ class ModuloExpression : public BinaryExpression { public: - ModuloExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + ModuloExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(MODULO, a, b) {} + ModuloExpression(const ModuloExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return fmod(_a->getValue(time), _b->getValue(time)); @@ -423,18 +558,27 @@ class ModuloExpression : { return fmt::format("{0} % {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning 1 if A < B, otherwise 0 -class LesserThanExpression : +class LessThanExpression : public BinaryExpression { public: - LesserThanExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + LessThanExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(RELATIONAL_COMPARISON, a, b) {} + LessThanExpression(const LessThanExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) < _b->getValue(time) ? 1.0f : 0; @@ -449,18 +593,27 @@ class LesserThanExpression : { return fmt::format("{0} < {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning 1 if A <= B, otherwise 0 -class LesserThanOrEqualExpression : +class LessThanOrEqualExpression : public BinaryExpression { public: - LesserThanOrEqualExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + LessThanOrEqualExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(RELATIONAL_COMPARISON, a, b) {} + LessThanOrEqualExpression(const LessThanOrEqualExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) <= _b->getValue(time) ? 1.0f : 0; @@ -475,6 +628,11 @@ class LesserThanOrEqualExpression : { return fmt::format("{0} <= {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning 1 if A > B, otherwise 0 @@ -482,11 +640,15 @@ class GreaterThanExpression : public BinaryExpression { public: - GreaterThanExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + GreaterThanExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(RELATIONAL_COMPARISON, a, b) {} + GreaterThanExpression(const GreaterThanExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) > _b->getValue(time) ? 1.0f : 0; @@ -501,6 +663,11 @@ class GreaterThanExpression : { return fmt::format("{0} > {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning 1 if A >= B, otherwise 0 @@ -508,11 +675,15 @@ class GreaterThanOrEqualExpression : public BinaryExpression { public: - GreaterThanOrEqualExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + GreaterThanOrEqualExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(RELATIONAL_COMPARISON, a, b) {} + GreaterThanOrEqualExpression(const GreaterThanOrEqualExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) >= _b->getValue(time) ? 1.0f : 0; @@ -527,6 +698,11 @@ class GreaterThanOrEqualExpression : { return fmt::format("{0} >= {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning 1 if A == B, otherwise 0 @@ -534,11 +710,15 @@ class EqualityExpression : public BinaryExpression { public: - EqualityExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + EqualityExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(EQUALITY_COMPARISON, a, b) {} + EqualityExpression(const EqualityExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) == _b->getValue(time) ? 1.0f : 0; @@ -553,6 +733,11 @@ class EqualityExpression : { return fmt::format("{0} == {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning 1 if A != B, otherwise 0 @@ -560,11 +745,15 @@ class InequalityExpression : public BinaryExpression { public: - InequalityExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + InequalityExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(EQUALITY_COMPARISON, a, b) {} + InequalityExpression(const InequalityExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return _a->getValue(time) != _b->getValue(time) ? 1.0f : 0; @@ -579,6 +768,11 @@ class InequalityExpression : { return fmt::format("{0} != {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning 1 if both A and B are true (non-zero), otherwise 0 @@ -586,11 +780,15 @@ class LogicalAndExpression : public BinaryExpression { public: - LogicalAndExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + LogicalAndExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(LOGICAL_AND, a, b) {} + LogicalAndExpression(const LogicalAndExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return (_a->getValue(time) != 0 && _b->getValue(time) != 0) ? 1.0f : 0; @@ -605,6 +803,11 @@ class LogicalAndExpression : { return fmt::format("{0} && {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; // An expression returning 1 if either A or B are true (non-zero), otherwise 0 @@ -612,11 +815,15 @@ class LogicalOrExpression : public BinaryExpression { public: - LogicalOrExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + LogicalOrExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(LOGICAL_OR, a, b) {} + LogicalOrExpression(const LogicalOrExpression& other) : + BinaryExpression(other) + {} + virtual float getValue(std::size_t time) { return (_a->getValue(time) != 0 || _b->getValue(time) != 0) ? 1.0f : 0; @@ -631,6 +838,11 @@ class LogicalOrExpression : { return fmt::format("{0} || {1}", _a->getExpressionString(), _b->getExpressionString()); } + + virtual Ptr clone() const override + { + return std::make_shared(*this); + } }; } // namespace diff --git a/radiantcore/shaders/ShaderLibrary.cpp b/radiantcore/shaders/ShaderLibrary.cpp index 23650079a1..827e83f3cf 100644 --- a/radiantcore/shaders/ShaderLibrary.cpp +++ b/radiantcore/shaders/ShaderLibrary.cpp @@ -42,7 +42,7 @@ ShaderDefinition& ShaderLibrary::getDefinition(const std::string& name) // Add a diffuse layer to that template, using the given texture path MapExpressionPtr imgExpr(new ImageExpression(name)); - shaderTemplate->addLayer(ShaderLayer::DIFFUSE, imgExpr); + shaderTemplate->addLayer(IShaderLayer::DIFFUSE, imgExpr); // Take this empty shadertemplate and create a ShaderDefinition ShaderDefinition def(shaderTemplate, diff --git a/radiantcore/shaders/ShaderTemplate.cpp b/radiantcore/shaders/ShaderTemplate.cpp index 839a17ed07..cc19320635 100644 --- a/radiantcore/shaders/ShaderTemplate.cpp +++ b/radiantcore/shaders/ShaderTemplate.cpp @@ -2,6 +2,7 @@ #include "MapExpression.h" #include "CameraCubeMapDecl.h" +#include "MapExpression.h" #include "VideoMapExpression.h" #include "SoundMapExpression.h" @@ -21,6 +22,48 @@ namespace shaders { +ShaderTemplate::ShaderTemplate(const ShaderTemplate& other) : + _name(other._name), + _currentLayer(new Doom3ShaderLayer(*this)), + _lightFalloff(other._lightFalloff), + _lightFalloffCubeMapType(other._lightFalloffCubeMapType), + fogLight(other.fogLight), + ambientLight(other.ambientLight), + blendLight(other.blendLight), + _cubicLight(other._cubicLight), + description(other.description), + _materialFlags(other._materialFlags), + _cullType(other._cullType), + _clampType(other._clampType), + _surfaceFlags(other._surfaceFlags), + _surfaceType(other._surfaceType), + _deformType(other._deformType), + _deformExpressions(other._deformExpressions), + _deformDeclName(other._deformDeclName), + _spectrum(other._spectrum), + _sortReq(other._sortReq), + _polygonOffset(other._polygonOffset), + _decalInfo(other._decalInfo), + _coverage(other._coverage), + _renderBumpArguments(other._renderBumpArguments), + _renderBumpFlatArguments(other._renderBumpFlatArguments), + _blockContents(other._blockContents), + _parsed(other._parsed), + _parseFlags(other._parseFlags), + _guiDeclName(other._guiDeclName) +{ + // Clone the layers + for (const auto& otherLayer : other._layers) + { + _layers.emplace_back(std::make_shared(*otherLayer, *this)); + } +} + +std::shared_ptr ShaderTemplate::clone() const +{ + return std::make_shared(*this); +} + NamedBindablePtr ShaderTemplate::getEditorTexture() { if (!_parsed) @@ -29,7 +72,7 @@ NamedBindablePtr ShaderTemplate::getEditorTexture() return _editorTex; } -IShaderExpressionPtr ShaderTemplate::parseSingleExpressionTerm(parser::DefTokeniser& tokeniser) +IShaderExpression::Ptr ShaderTemplate::parseSingleExpressionTerm(parser::DefTokeniser& tokeniser) { std::string token = tokeniser.nextToken(); @@ -80,6 +123,8 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser, _parseFlags |= Material::PF_HasDecalMacro; _materialFlags |= Material::FLAG_TRANSLUCENT|Material::FLAG_NOSHADOWS; + _materialFlags |= Material::FLAG_HAS_SORT_DEFINED; + _materialFlags |= Material::FLAG_POLYGONOFFSET; _sortReq = Material::SORT_DECAL; _polygonOffset = 1.0f; _surfaceFlags |= Material::SURF_DISCRETE | Material::SURF_NONSOLID; @@ -89,6 +134,8 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser, _parseFlags |= Material::PF_HasTwoSidedDecalMacro; _materialFlags |= Material::FLAG_TRANSLUCENT | Material::FLAG_NOSHADOWS | Material::FLAG_NOSELFSHADOW; + _materialFlags |= Material::FLAG_HAS_SORT_DEFINED; + _materialFlags |= Material::FLAG_POLYGONOFFSET; _sortReq = Material::SORT_DECAL; _polygonOffset = 1.0f; _surfaceFlags |= Material::SURF_DISCRETE | Material::SURF_NOIMPACT | Material::SURF_NONSOLID; @@ -163,6 +210,7 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser, else if (token == "sort") { _parseFlags |= Material::PF_HasSortDefined; + _materialFlags |= Material::FLAG_HAS_SORT_DEFINED; auto sortVal = tokeniser.nextToken(); string::to_lower(sortVal); @@ -171,7 +219,7 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser, { if (sortVal == predefinedSortValue.first) { - _sortReq = predefinedSortValue.second; + _sortReq = static_cast(predefinedSortValue.second); return true; } } @@ -180,7 +228,7 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser, // Strip any quotes string::trim(sortVal, "\""); - _sortReq = string::convert(sortVal, SORT_UNDEFINED); // fall back to UNDEFINED in case of parsing failures + _sortReq = string::convert(sortVal, SORT_UNDEFINED); // fall back to UNDEFINED in case of parsing failures } else if (token == "noshadows") { @@ -430,11 +478,13 @@ bool ShaderTemplate::parseLightKeywords(parser::DefTokeniser& tokeniser, const s } else if (!fogLight && token == "lightfalloffimage") { + _lightFalloffCubeMapType = IShaderLayer::MapType::Map; _lightFalloff = MapExpression::createForToken(tokeniser); } else if (token == "lightfalloffcubemap") { - _lightFalloffCubeMap = MapExpression::createForToken(tokeniser); + _lightFalloffCubeMapType = IShaderLayer::MapType::CameraCubeMap; + _lightFalloff = MapExpression::createForToken(tokeniser); } else if (token == "spectrum") { @@ -470,15 +520,15 @@ bool ShaderTemplate::parseBlendShortcuts(parser::DefTokeniser& tokeniser, } else if (token == "diffusemap") { - addLayer(ShaderLayer::DIFFUSE, MapExpression::createForToken(tokeniser)); + addLayer(IShaderLayer::DIFFUSE, MapExpression::createForToken(tokeniser)); } else if (token == "specularmap") { - addLayer(ShaderLayer::SPECULAR, MapExpression::createForToken(tokeniser)); + addLayer(IShaderLayer::SPECULAR, MapExpression::createForToken(tokeniser)); } else if (token == "bumpmap") { - addLayer(ShaderLayer::BUMP, MapExpression::createForToken(tokeniser)); + addLayer(IShaderLayer::BUMP, MapExpression::createForToken(tokeniser)); } else { @@ -496,47 +546,27 @@ bool ShaderTemplate::parseBlendType(parser::DefTokeniser& tokeniser, const std:: { if (token == "blend") { - std::string blendType = string::to_lower_copy(tokeniser.nextToken()); + // Special blend type, either predefined like "add" or "modulate", + // or an explicit combination of GL blend modes + StringPair blendFuncStrings; + blendFuncStrings.first = string::to_lower_copy(tokeniser.nextToken()); - if (blendType == "diffusemap") - { - _currentLayer->setLayerType(ShaderLayer::DIFFUSE); - } - else if (blendType == "bumpmap") - { - _currentLayer->setLayerType(ShaderLayer::BUMP); - } - else if (blendType == "specularmap") - { - _currentLayer->setLayerType(ShaderLayer::SPECULAR); + if (blendFuncStrings.first.substr(0, 3) == "gl_") + { + // This is an explicit GL blend mode + tokeniser.assertNextToken(","); + blendFuncStrings.second = string::to_lower_copy(tokeniser.nextToken()); } else { - // Special blend type, either predefined like "add" or "modulate", - // or an explicit combination of GL blend modes - StringPair blendFuncStrings; - blendFuncStrings.first = blendType; - - if (blendType.substr(0,3) == "gl_") - { - // This is an explicit GL blend mode - tokeniser.assertNextToken(","); - blendFuncStrings.second = tokeniser.nextToken(); - } - else - { - blendFuncStrings.second = ""; - } - - _currentLayer->setBlendFuncStrings(blendFuncStrings); + blendFuncStrings.second = ""; } - } - else - { - return false; // unrecognised token, return false - } - return true; + _currentLayer->setBlendFuncStrings(blendFuncStrings); + return true; + } + + return false; // unrecognised token, return false } /* Searches for the map keyword in stage 2, expects token to be lowercase @@ -548,7 +578,7 @@ bool ShaderTemplate::parseBlendMaps(parser::DefTokeniser& tokeniser, const std:: _currentLayer->setBindableTexture( MapExpression::createForToken(tokeniser) ); - _currentLayer->setMapType(ShaderLayer::MapType::Map); + _currentLayer->setMapType(IShaderLayer::MapType::Map); } else if (token == "cameracubemap") { @@ -556,29 +586,29 @@ bool ShaderTemplate::parseBlendMaps(parser::DefTokeniser& tokeniser, const std:: _currentLayer->setBindableTexture( CameraCubeMapDecl::createForPrefix(cubeMapPrefix) ); - _currentLayer->setMapType(ShaderLayer::MapType::CameraCubeMap); - _currentLayer->setCubeMapMode(ShaderLayer::CUBE_MAP_CAMERA); + _currentLayer->setMapType(IShaderLayer::MapType::CameraCubeMap); + _currentLayer->setCubeMapMode(IShaderLayer::CUBE_MAP_CAMERA); } else if (token == "texgen") { std::string type = tokeniser.nextToken(); - _currentLayer->setParseFlag(ShaderLayer::PF_HasTexGenKeyword); + _currentLayer->setParseFlag(IShaderLayer::PF_HasTexGenKeyword); if (type == "skybox") { - _currentLayer->setTexGenType(ShaderLayer::TEXGEN_SKYBOX); + _currentLayer->setTexGenType(IShaderLayer::TEXGEN_SKYBOX); } else if (type == "reflect") { - _currentLayer->setTexGenType(ShaderLayer::TEXGEN_REFLECT); + _currentLayer->setTexGenType(IShaderLayer::TEXGEN_REFLECT); } else if (type == "normal") { - _currentLayer->setTexGenType(ShaderLayer::TEXGEN_NORMAL); + _currentLayer->setTexGenType(IShaderLayer::TEXGEN_NORMAL); } else if (type == "wobblesky") { - _currentLayer->setTexGenType(ShaderLayer::TEXGEN_WOBBLESKY); + _currentLayer->setTexGenType(IShaderLayer::TEXGEN_WOBBLESKY); // Parse the 3 wobblesky expressions _currentLayer->setTexGenExpression(0, parseSingleExpressionTerm(tokeniser)); @@ -590,26 +620,26 @@ bool ShaderTemplate::parseBlendMaps(parser::DefTokeniser& tokeniser, const std:: { // Parse the cubemap expression, but don't do anything with it for now _currentLayer->setBindableTexture(MapExpression::createForToken(tokeniser)); - _currentLayer->setMapType(ShaderLayer::MapType::CubeMap); - _currentLayer->setCubeMapMode(ShaderLayer::CUBE_MAP_OBJECT); + _currentLayer->setMapType(IShaderLayer::MapType::CubeMap); + _currentLayer->setCubeMapMode(IShaderLayer::CUBE_MAP_OBJECT); } else if (token == "videomap") { - _currentLayer->setMapType(ShaderLayer::MapType::VideoMap); + _currentLayer->setMapType(IShaderLayer::MapType::VideoMap); _currentLayer->setBindableTexture( VideoMapExpression::CreateForTokens(tokeniser) ); } else if (token == "soundmap") { - _currentLayer->setMapType(ShaderLayer::MapType::SoundMap); + _currentLayer->setMapType(IShaderLayer::MapType::SoundMap); _currentLayer->setBindableTexture( SoundMapExpression::CreateForTokens(tokeniser) ); } else if (token == "remoterendermap") { - _currentLayer->setMapType(ShaderLayer::MapType::RemoteRenderMap); + _currentLayer->setMapType(IShaderLayer::MapType::RemoteRenderMap); try { @@ -625,8 +655,8 @@ bool ShaderTemplate::parseBlendMaps(parser::DefTokeniser& tokeniser, const std:: } else if (token == "mirrorrendermap") { - _currentLayer->setMapType(ShaderLayer::MapType::MirrorRenderMap); - _currentLayer->setTexGenType(ShaderLayer::TexGenType::TEXGEN_SCREEN); + _currentLayer->setMapType(IShaderLayer::MapType::MirrorRenderMap); + _currentLayer->setTexGenType(IShaderLayer::TexGenType::TEXGEN_SCREEN); try { @@ -654,18 +684,18 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, if (token == "vertexcolor") { _currentLayer->setVertexColourMode( - ShaderLayer::VERTEX_COLOUR_MULTIPLY + IShaderLayer::VERTEX_COLOUR_MULTIPLY ); } else if (token == "inversevertexcolor") { _currentLayer->setVertexColourMode( - ShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY + IShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY ); } else if (token == "red") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -678,7 +708,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "green") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -691,7 +721,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "blue") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -704,7 +734,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "alpha") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -718,13 +748,13 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, else if (token == "color") { // color , , , - IShaderExpressionPtr red = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr red = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr green = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr green = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr blue = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr blue = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr alpha = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr alpha = ShaderExpression::createFromTokens(tokeniser); if (red && green && blue && alpha) { @@ -741,7 +771,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, else if (token == "rgb") { // Get the colour value - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -754,7 +784,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "rgba") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -781,7 +811,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "vertexparm") { - ShaderLayer::VertexParm parm; + IShaderLayer::VertexParm parm; // vertexParm [,] [,] [,] parm.index = string::convert(tokeniser.nextToken()); @@ -804,7 +834,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "fragmentmap") { - ShaderLayer::FragmentMap map; + IShaderLayer::FragmentMap map; // fragmentMap [options] map.index = string::convert(tokeniser.nextToken()); @@ -837,7 +867,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, else if (token == "alphatest") { // Get the alphatest expression - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -852,13 +882,18 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "scale") { - IShaderExpressionPtr xScaleExpr = ShaderExpression::createFromTokens(tokeniser); + auto xScaleExpr = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr yScaleExpr = ShaderExpression::createFromTokens(tokeniser); + auto yScaleExpr = ShaderExpression::createFromTokens(tokeniser); if (xScaleExpr && yScaleExpr) { - _currentLayer->setScale(xScaleExpr, yScaleExpr); + _currentLayer->appendTransformation(IShaderLayer::Transformation + { + IShaderLayer::TransformType::Scale, + xScaleExpr, + yScaleExpr + }); } else { @@ -867,14 +902,18 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "centerscale") { - IShaderExpressionPtr xScaleExpr = ShaderExpression::createFromTokens(tokeniser); + auto xScaleExpr = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr yScaleExpr = ShaderExpression::createFromTokens(tokeniser); + auto yScaleExpr = ShaderExpression::createFromTokens(tokeniser); if (xScaleExpr && yScaleExpr) { - _currentLayer->setScale(xScaleExpr, yScaleExpr); - _currentLayer->setStageFlag(ShaderLayer::FLAG_CENTERSCALE); // enable centerScale + _currentLayer->appendTransformation(IShaderLayer::Transformation + { + IShaderLayer::TransformType::CenterScale, + xScaleExpr, + yScaleExpr + }); } else { @@ -883,13 +922,18 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "translate" || token == "scroll") { - IShaderExpressionPtr xTranslateExpr = ShaderExpression::createFromTokens(tokeniser); + auto xTranslateExpr = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr yTranslateExpr = ShaderExpression::createFromTokens(tokeniser); + auto yTranslateExpr = ShaderExpression::createFromTokens(tokeniser); if (xTranslateExpr && yTranslateExpr) { - _currentLayer->setTranslation(xTranslateExpr, yTranslateExpr); + _currentLayer->appendTransformation(IShaderLayer::Transformation + { + IShaderLayer::TransformType::Translate, + xTranslateExpr, + yTranslateExpr + }); } else { @@ -898,13 +942,18 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "shear") { - IShaderExpressionPtr xShearExpr = ShaderExpression::createFromTokens(tokeniser); + auto xShearExpr = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr yShearExpr = ShaderExpression::createFromTokens(tokeniser); + auto yShearExpr = ShaderExpression::createFromTokens(tokeniser); if (xShearExpr && yShearExpr) { - _currentLayer->setShear(xShearExpr, yShearExpr); + _currentLayer->appendTransformation(IShaderLayer::Transformation + { + IShaderLayer::TransformType::Shear, + xShearExpr, + yShearExpr + }); } else { @@ -913,11 +962,15 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "rotate") { - IShaderExpressionPtr rotExpr = ShaderExpression::createFromTokens(tokeniser); + auto rotationExpr = ShaderExpression::createFromTokens(tokeniser); - if (rotExpr) + if (rotationExpr) { - _currentLayer->setRotation(rotExpr); + _currentLayer->appendTransformation(IShaderLayer::Transformation + { + IShaderLayer::TransformType::Rotate, + rotationExpr + }); } else { @@ -926,11 +979,11 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "ignorealphatest") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_IGNORE_ALPHATEST); + _currentLayer->setStageFlag(IShaderLayer::FLAG_IGNORE_ALPHATEST); } else if (token == "colored") { - _currentLayer->setParseFlag(ShaderLayer::PF_HasColoredKeyword); + _currentLayer->setParseFlag(IShaderLayer::PF_HasColoredKeyword); _currentLayer->setColourExpression(Doom3ShaderLayer::COMP_RED, ShaderExpression::createFromString("parm0")); _currentLayer->setColourExpression(Doom3ShaderLayer::COMP_GREEN, ShaderExpression::createFromString("parm1")); _currentLayer->setColourExpression(Doom3ShaderLayer::COMP_BLUE, ShaderExpression::createFromString("parm2")); @@ -951,49 +1004,49 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, else if (token == "noclamp") { _currentLayer->setClampType(CLAMP_REPEAT); - _currentLayer->setParseFlag(ShaderLayer::PF_HasNoclampKeyword); + _currentLayer->setParseFlag(IShaderLayer::PF_HasNoclampKeyword); } else if (token == "uncompressed" || token == "highquality") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_HIGHQUALITY); + _currentLayer->setStageFlag(IShaderLayer::FLAG_HIGHQUALITY); } else if (token == "forcehighquality") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_FORCE_HIGHQUALITY); + _currentLayer->setStageFlag(IShaderLayer::FLAG_FORCE_HIGHQUALITY); } else if (token == "nopicmip") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_NO_PICMIP); + _currentLayer->setStageFlag(IShaderLayer::FLAG_NO_PICMIP); } else if (token == "maskred") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_MASK_RED); + _currentLayer->setStageFlag(IShaderLayer::FLAG_MASK_RED); } else if (token == "maskgreen") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_MASK_GREEN); + _currentLayer->setStageFlag(IShaderLayer::FLAG_MASK_GREEN); } else if (token == "maskblue") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_MASK_BLUE); + _currentLayer->setStageFlag(IShaderLayer::FLAG_MASK_BLUE); } else if (token == "maskalpha") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_MASK_ALPHA); + _currentLayer->setStageFlag(IShaderLayer::FLAG_MASK_ALPHA); } else if (token == "maskcolor") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_MASK_RED); - _currentLayer->setStageFlag(ShaderLayer::FLAG_MASK_GREEN); - _currentLayer->setStageFlag(ShaderLayer::FLAG_MASK_BLUE); + _currentLayer->setStageFlag(IShaderLayer::FLAG_MASK_RED); + _currentLayer->setStageFlag(IShaderLayer::FLAG_MASK_GREEN); + _currentLayer->setStageFlag(IShaderLayer::FLAG_MASK_BLUE); } else if (token == "maskdepth") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_MASK_DEPTH); + _currentLayer->setStageFlag(IShaderLayer::FLAG_MASK_DEPTH); } else if (token == "ignoredepth") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_IGNORE_DEPTH); + _currentLayer->setStageFlag(IShaderLayer::FLAG_IGNORE_DEPTH); } else if (token == "privatepolygonoffset") { @@ -1001,11 +1054,11 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "nearest") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_FILTER_NEAREST); + _currentLayer->setStageFlag(IShaderLayer::FLAG_FILTER_NEAREST); } else if (token == "linear") { - _currentLayer->setStageFlag(ShaderLayer::FLAG_FILTER_LINEAR); + _currentLayer->setStageFlag(IShaderLayer::FLAG_FILTER_LINEAR); } else { @@ -1161,7 +1214,7 @@ bool ShaderTemplate::parseCondition(parser::DefTokeniser& tokeniser, const std:: if (token == "if") { // Parse condition - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); _currentLayer->setCondition(expr); @@ -1179,22 +1232,19 @@ bool ShaderTemplate::saveLayer() { // Append layer to list of all layers if (_currentLayer->getBindableTexture() || - _currentLayer->getMapType() == ShaderLayer::MapType::RemoteRenderMap || - _currentLayer->getMapType() == ShaderLayer::MapType::MirrorRenderMap || + _currentLayer->getMapType() == IShaderLayer::MapType::RemoteRenderMap || + _currentLayer->getMapType() == IShaderLayer::MapType::MirrorRenderMap || !_currentLayer->getVertexProgram().empty() || !_currentLayer->getFragmentProgram().empty()) { addLayer(_currentLayer); } // Clear the currentLayer structure for possible future layers - _currentLayer = Doom3ShaderLayerPtr(new Doom3ShaderLayer(*this)); + _currentLayer = std::make_shared(*this); return true; } -/* Parses a material definition for shader keywords and takes the according - * actions. - */ void ShaderTemplate::parseDefinition() { // Construct a local deftokeniser to parse the unparsed block @@ -1265,22 +1315,14 @@ void ShaderTemplate::parseDefinition() // Some blend materials get SORT_MEDIUM applied by default, diffuses get OPAQUE assigned, but lights do not, etc. if (_sortReq == SORT_UNDEFINED) { - // Translucent materials need to be drawn after opaque ones, if not explicitly specified otherwise - if (_materialFlags & Material::FLAG_TRANSLUCENT) - { - _sortReq = Material::SORT_MEDIUM; - } - else - { - _sortReq = Material::SORT_OPAQUE; - } + resetSortReqest(); } std::size_t numAmbientStages = 0; - for (Layers::const_iterator i = _layers.begin(); i != _layers.end(); ++i) + for (const auto& layer : _layers) { - if ((*i)->getType() == ShaderLayer::BLEND) + if (layer->getType() == IShaderLayer::BLEND) { numAmbientStages++; } @@ -1335,32 +1377,82 @@ void ShaderTemplate::parseDefinition() } } -void ShaderTemplate::addLayer(const Doom3ShaderLayerPtr& layer) +void ShaderTemplate::addLayer(const Doom3ShaderLayer::Ptr& layer) { // Add the layer - _layers.push_back(layer); + _layers.emplace_back(layer); // If there is no editor texture yet, use the bindable texture, but no Bump or speculars - if (!_editorTex && layer->getBindableTexture() != NULL && - layer->getType() != ShaderLayer::BUMP && layer->getType() != ShaderLayer::SPECULAR) + if (!_editorTex && layer->getBindableTexture() && + layer->getType() != IShaderLayer::BUMP && layer->getType() != IShaderLayer::SPECULAR) { _editorTex = layer->getBindableTexture(); } } -void ShaderTemplate::addLayer(ShaderLayer::Type type, const MapExpressionPtr& mapExpr) +void ShaderTemplate::addLayer(IShaderLayer::Type type, const MapExpressionPtr& mapExpr) { // Construct a layer out of this mapexpression and pass the call - addLayer(Doom3ShaderLayerPtr(new Doom3ShaderLayer(*this, type, mapExpr))); + addLayer(std::make_shared(*this, type, mapExpr)); +} + +std::size_t ShaderTemplate::addLayer(IShaderLayer::Type type) +{ + // Determine the default map expression to use for this type + std::shared_ptr map; + + switch (type) + { + case IShaderLayer::BUMP: + map = MapExpression::createForString("_flat"); + break; + case IShaderLayer::SPECULAR: + map = MapExpression::createForString("_black"); + break; + case IShaderLayer::DIFFUSE: + case IShaderLayer::BLEND: + default: + map = MapExpression::createForString("_white"); + break; + } + + addLayer(std::make_shared(*this, type, map)); + return _layers.size() - 1; +} + +void ShaderTemplate::removeLayer(std::size_t index) +{ + _layers.erase(_layers.begin() + index); +} + +void ShaderTemplate::swapLayerPosition(std::size_t first, std::size_t second) +{ + if (first >= _layers.size() || second >= _layers.size()) + { + return; + } + + _layers[first].swap(_layers[second]); +} + +std::size_t ShaderTemplate::duplicateLayer(std::size_t index) +{ + if (index >= _layers.size()) + { + throw std::runtime_error("Cannot duplicate this stage, index invalid"); + } + + _layers.emplace_back(std::make_shared(*_layers[index], *this)); + return _layers.size() - 1; } bool ShaderTemplate::hasDiffusemap() { if (!_parsed) parseDefinition(); - for (Layers::const_iterator i = _layers.begin(); i != _layers.end(); ++i) + for (const auto& layer : _layers) { - if ((*i)->getType() == ShaderLayer::DIFFUSE) + if (layer->getType() == IShaderLayer::DIFFUSE) { return true; } diff --git a/radiantcore/shaders/ShaderTemplate.h b/radiantcore/shaders/ShaderTemplate.h index 55f9e8c83a..0b524e1d3f 100644 --- a/radiantcore/shaders/ShaderTemplate.h +++ b/radiantcore/shaders/ShaderTemplate.h @@ -20,7 +20,7 @@ namespace shaders * class parses the decl using a tokeniser and stores the relevant information * internally, for later use by a CShader. */ -class ShaderTemplate +class ShaderTemplate final { private: static const int SORT_UNDEFINED = -99999; // undefined sort number, will be replaced after parsing @@ -29,22 +29,19 @@ class ShaderTemplate std::string _name; // Temporary current layer (used by the parsing functions) - Doom3ShaderLayerPtr _currentLayer; + Doom3ShaderLayer::Ptr _currentLayer; public: // Vector of LayerTemplates representing each stage in the material - typedef std::vector Layers; - -private: - Layers _layers; + std::vector _layers; // Editorimage texture NamedBindablePtr _editorTex; // Map expressions MapExpressionPtr _lightFalloff; - MapExpressionPtr _lightFalloffCubeMap; + IShaderLayer::MapType _lightFalloffCubeMapType; /* Light type booleans */ bool fogLight; @@ -70,14 +67,14 @@ class ShaderTemplate Material::SurfaceType _surfaceType; Material::DeformType _deformType; - std::vector _deformExpressions; + std::vector _deformExpressions; std::string _deformDeclName; // The spectrum this shader is responding to (or emitting in the case of light materials) int _spectrum; // Sort position (e.g. sort decal == 2) - int _sortReq; + float _sortReq; // Polygon offset float _polygonOffset; @@ -101,32 +98,36 @@ class ShaderTemplate // The string value specified by the guisurf keyword, if other than entity[2]3] std::string _guiDeclName; + // Private copy ctor, used for cloning + ShaderTemplate(const ShaderTemplate& other); + public: /** * \brief * Construct a ShaderTemplate. */ - ShaderTemplate(const std::string& name, const std::string& blockContents) - : _name(name), - _currentLayer(new Doom3ShaderLayer(*this)), - fogLight(false), - ambientLight(false), - blendLight(false), - _cubicLight(false), - _materialFlags(0), - _cullType(Material::CULL_BACK), - _clampType(CLAMP_REPEAT), - _surfaceFlags(0), - _surfaceType(Material::SURFTYPE_DEFAULT), - _deformType(Material::DEFORM_NONE), - _spectrum(0), - _sortReq(SORT_UNDEFINED), // will be set to default values after the shader has been parsed - _polygonOffset(0.0f), - _coverage(Material::MC_UNDETERMINED), - _blockContents(blockContents), - _parsed(false), - _parseFlags(0) + ShaderTemplate(const std::string& name, const std::string& blockContents) : + _name(name), + _currentLayer(new Doom3ShaderLayer(*this)), + _lightFalloffCubeMapType(IShaderLayer::MapType::Map), + fogLight(false), + ambientLight(false), + blendLight(false), + _cubicLight(false), + _materialFlags(0), + _cullType(Material::CULL_BACK), + _clampType(CLAMP_REPEAT), + _surfaceFlags(0), + _surfaceType(Material::SURFTYPE_DEFAULT), + _deformType(Material::DEFORM_NONE), + _spectrum(0), + _sortReq(SORT_UNDEFINED), // will be set to default values after the shader has been parsed + _polygonOffset(0.0f), + _coverage(Material::MC_UNDETERMINED), + _blockContents(blockContents), + _parsed(false), + _parseFlags(0) { _decalInfo.stayMilliSeconds = 0; _decalInfo.fadeMilliSeconds = 0; @@ -134,10 +135,13 @@ class ShaderTemplate _decalInfo.endColour = Vector4(0,0,0,0); } + // Clone a new instance from this template + std::shared_ptr clone() const; + /** * Get the name of this shader template. */ - std::string getName() const + const std::string& getName() const { return _name; } @@ -156,48 +160,96 @@ class ShaderTemplate return description; } + void setDescription(const std::string& newDescription) + { + if (!_parsed) parseDefinition(); + description = newDescription; + } + int getMaterialFlags() { if (!_parsed) parseDefinition(); return _materialFlags; } + void setMaterialFlag(Material::Flags flag) + { + if (!_parsed) parseDefinition(); + _materialFlags |= flag; + } + + void clearMaterialFlag(Material::Flags flag) + { + if (!_parsed) parseDefinition(); + _materialFlags &= ~flag; + } + Material::CullType getCullType() { if (!_parsed) parseDefinition(); return _cullType; } + void setCullType(Material::CullType type) + { + if (!_parsed) parseDefinition(); + _cullType = type; + } + ClampType getClampType() { if (!_parsed) parseDefinition(); return _clampType; } + void setClampType(ClampType type) + { + if (!_parsed) parseDefinition(); + _clampType = type; + } + int getSurfaceFlags() { if (!_parsed) parseDefinition(); return _surfaceFlags; } + void setSurfaceFlag(Material::SurfaceFlags flag) + { + if (!_parsed) parseDefinition(); + _surfaceFlags |= flag; + } + + void clearSurfaceFlag(Material::SurfaceFlags flag) + { + if (!_parsed) parseDefinition(); + _surfaceFlags &= ~flag; + } + Material::SurfaceType getSurfaceType() { if (!_parsed) parseDefinition(); return _surfaceType; } + void setSurfaceType(Material::SurfaceType type) + { + if (!_parsed) parseDefinition(); + _surfaceType = type; + } + Material::DeformType getDeformType() { if (!_parsed) parseDefinition(); return _deformType; } - IShaderExpressionPtr getDeformExpression(std::size_t index) + IShaderExpression::Ptr getDeformExpression(std::size_t index) { if (!_parsed) parseDefinition(); assert(index >= 0 && index < 3); - return index < _deformExpressions.size() ? _deformExpressions[index] : IShaderExpressionPtr(); + return index < _deformExpressions.size() ? _deformExpressions[index] : IShaderExpression::Ptr(); } std::string getDeformDeclName() @@ -212,6 +264,12 @@ class ShaderTemplate return _spectrum; } + void setSpectrum(int spectrum) + { + if (!_parsed) parseDefinition(); + _spectrum = spectrum; + } + const Material::DecalInfo& getDecalInfo() { if (!_parsed) parseDefinition(); @@ -224,7 +282,7 @@ class ShaderTemplate return _coverage; } - const Layers& getLayers() + const std::vector& getLayers() { if (!_parsed) parseDefinition(); return _layers; @@ -254,18 +312,74 @@ class ShaderTemplate return _cubicLight; } - int getSortRequest() + void setIsAmbientLight(bool newValue) + { + if (!_parsed) parseDefinition(); + ambientLight = newValue; + } + + void setIsBlendLight(bool newValue) + { + if (!_parsed) parseDefinition(); + blendLight = newValue; + } + + void setIsFogLight(bool newValue) + { + if (!_parsed) parseDefinition(); + fogLight = newValue; + } + + void setIsCubicLight(bool newValue) + { + if (!_parsed) parseDefinition(); + _cubicLight = newValue; + } + + float getSortRequest() { if (!_parsed) parseDefinition(); return _sortReq; } + void setSortRequest(float sortRequest) + { + if (!_parsed) parseDefinition(); + + _materialFlags |= Material::FLAG_HAS_SORT_DEFINED; + _sortReq = sortRequest; + } + + void resetSortReqest() + { + if (!_parsed) parseDefinition(); + + _materialFlags &= ~Material::FLAG_HAS_SORT_DEFINED; + + // Translucent materials need to be drawn after opaque ones, if not explicitly specified otherwise + if (_materialFlags & Material::FLAG_TRANSLUCENT) + { + _sortReq = Material::SORT_MEDIUM; + } + else + { + _sortReq = Material::SORT_OPAQUE; + } + } + float getPolygonOffset() { if (!_parsed) parseDefinition(); return _polygonOffset; } + void setPolygonOffset(float offset) + { + if (!_parsed) parseDefinition(); + setMaterialFlag(Material::FLAG_POLYGONOFFSET); + _polygonOffset = offset; + } + // Sets the raw block definition contents, will be parsed on demand void setBlockContents(const std::string& blockContents) { @@ -289,15 +403,32 @@ class ShaderTemplate if (!_parsed) parseDefinition(); return _lightFalloff; } + + void setLightFalloffExpressionFromString(const std::string& expressionString) + { + if (!_parsed) parseDefinition(); + _lightFalloff = MapExpression::createForString(expressionString); + } - const MapExpressionPtr& getLightFalloffCubeMap() - { - if (!_parsed) parseDefinition(); - return _lightFalloffCubeMap; - } + IShaderLayer::MapType getLightFalloffCubeMapType() + { + if (!_parsed) parseDefinition(); + return _lightFalloffCubeMapType; + } + + void setLightFalloffCubeMapType(IShaderLayer::MapType type) + { + if (!_parsed) parseDefinition(); + _lightFalloffCubeMapType = type; + } + + std::size_t addLayer(IShaderLayer::Type type); + void removeLayer(std::size_t index); + void swapLayerPosition(std::size_t first, std::size_t second); + std::size_t duplicateLayer(std::size_t index); // Add a specific layer to this template - void addLayer(ShaderLayer::Type type, const MapExpressionPtr& mapExpr); + void addLayer(IShaderLayer::Type type, const MapExpressionPtr& mapExpr); // Returns true if this shader template includes a diffusemap stage bool hasDiffusemap(); @@ -320,7 +451,7 @@ class ShaderTemplate private: // Add the given layer and assigns editor preview layer if applicable - void addLayer(const Doom3ShaderLayerPtr& layer); + void addLayer(const Doom3ShaderLayer::Ptr& layer); /** * Parse a Doom 3 material decl. This is the master parse function, it @@ -341,7 +472,7 @@ class ShaderTemplate bool parseSurfaceFlags(parser::DefTokeniser&, const std::string&); bool parseMaterialType(parser::DefTokeniser&, const std::string&); bool parseCondition(parser::DefTokeniser&, const std::string&); - IShaderExpressionPtr parseSingleExpressionTerm(parser::DefTokeniser& tokeniser); + IShaderExpression::Ptr parseSingleExpressionTerm(parser::DefTokeniser& tokeniser); bool saveLayer(); diff --git a/radiantcore/shaders/TextureMatrix.cpp b/radiantcore/shaders/TextureMatrix.cpp new file mode 100644 index 0000000000..4e40c560b9 --- /dev/null +++ b/radiantcore/shaders/TextureMatrix.cpp @@ -0,0 +1,189 @@ +#include "TextureMatrix.h" + +#include "ShaderExpression.h" +#include "Doom3ShaderSystem.h" + +namespace shaders +{ + +namespace +{ + inline void unlinkAndDeleteExpression(IShaderExpression::Ptr& expression) + { + if (expression) + { + expression->unlinkFromRegisters(); + expression.reset(); + } + } +} + +struct TextureMatrix::TemporaryMatrix +{ + IShaderExpression::Ptr xx; + IShaderExpression::Ptr yx; + IShaderExpression::Ptr tx; + IShaderExpression::Ptr xy; + IShaderExpression::Ptr yy; + IShaderExpression::Ptr ty; +}; + +TextureMatrix::TextureMatrix(ExpressionSlots& expressions, Registers& registers) : + _expressions(expressions), + _registers(registers) +{} + +void TextureMatrix::setIdentity() +{ + // Initialise the texture matrix to identity (set the diagonals to 1) + xx().registerIndex = REG_ONE; + yx().registerIndex = REG_ZERO; + tx().registerIndex = REG_ZERO; + xy().registerIndex = REG_ZERO; + yy().registerIndex = REG_ONE; + ty().registerIndex = REG_ZERO; + + unlinkAndDeleteExpression(xx().expression); + unlinkAndDeleteExpression(yx().expression); + unlinkAndDeleteExpression(tx().expression); + unlinkAndDeleteExpression(xy().expression); + unlinkAndDeleteExpression(yy().expression); + unlinkAndDeleteExpression(ty().expression); +} + +Matrix4 TextureMatrix::getMatrix4() +{ + auto matrix = Matrix4::getIdentity(); + + matrix.xx() = _registers[xx().registerIndex]; + matrix.yx() = _registers[yx().registerIndex]; + matrix.tx() = _registers[tx().registerIndex]; + matrix.xy() = _registers[xy().registerIndex]; + matrix.yy() = _registers[yy().registerIndex]; + matrix.ty() = _registers[ty().registerIndex]; + + return matrix; +} + +void TextureMatrix::applyTransformation(const IShaderLayer::Transformation& transformation) +{ + TemporaryMatrix matrix; + + switch (transformation.type) + { + case IShaderLayer::TransformType::Translate: + matrix.xx = ShaderExpression::createConstant(1); + matrix.yx = ShaderExpression::createConstant(0); + matrix.tx = transformation.expression1; + matrix.xy = ShaderExpression::createConstant(0); + matrix.yy = ShaderExpression::createConstant(1); + matrix.ty = transformation.expression2; + break; + case IShaderLayer::TransformType::Scale: + matrix.xx = transformation.expression1; + matrix.yx = ShaderExpression::createConstant(0); + matrix.tx = ShaderExpression::createConstant(0); + matrix.xy = ShaderExpression::createConstant(0); + matrix.yy = transformation.expression2; + matrix.ty = ShaderExpression::createConstant(0); + break; + case IShaderLayer::TransformType::CenterScale: + matrix.xx = transformation.expression1; + matrix.yx = ShaderExpression::createConstant(0); + matrix.tx = ShaderExpression::createAddition( + ShaderExpression::createConstant(0.5), + ShaderExpression::createMultiplication(ShaderExpression::createConstant(-0.5), transformation.expression1) + ); + matrix.xy = ShaderExpression::createConstant(0); + matrix.yy = transformation.expression2; + matrix.ty = ShaderExpression::createAddition( + ShaderExpression::createConstant(0.5), + ShaderExpression::createMultiplication(ShaderExpression::createConstant(-0.5), transformation.expression2) + ); + break; + case IShaderLayer::TransformType::Shear: + matrix.xx = ShaderExpression::createConstant(1); + matrix.yx = transformation.expression1; + matrix.tx = ShaderExpression::createMultiplication(ShaderExpression::createConstant(-0.5), transformation.expression1); + matrix.xy = transformation.expression2; + matrix.yy = ShaderExpression::createConstant(1); + matrix.ty = ShaderExpression::createMultiplication(ShaderExpression::createConstant(-0.5), transformation.expression2); + break; + case IShaderLayer::TransformType::Rotate: + { + auto sinTable = GetShaderSystem()->getTableForName("sinTable"); + auto cosTable = GetShaderSystem()->getTableForName("cosTable"); + + if (!sinTable || !cosTable) + { + rError() << "Cannot create rotate stage transform without sinTable and cosTable declarations" << std::endl; + return; + } + + // sin(expr) and cos(expr) shortcuts + auto sinExpr = ShaderExpression::createTableLookup(sinTable, transformation.expression1); + auto cosExpr = ShaderExpression::createTableLookup(cosTable, transformation.expression1); + + matrix.xx = ShaderExpression::createTableLookup(cosTable, transformation.expression1); + matrix.yx = ShaderExpression::createMultiplication( + ShaderExpression::createConstant(-1), + ShaderExpression::createTableLookup(sinTable, transformation.expression1) + ); + matrix.tx = ShaderExpression::createAddition( + ShaderExpression::createConstant(0.5), + ShaderExpression::createAddition( + ShaderExpression::createMultiplication(ShaderExpression::createConstant(-0.5), cosExpr), + ShaderExpression::createMultiplication(ShaderExpression::createConstant(+0.5), sinExpr) + ) + ); + matrix.xy = ShaderExpression::createTableLookup(sinTable, transformation.expression1); + matrix.yy = ShaderExpression::createTableLookup(cosTable, transformation.expression1); + matrix.ty = ShaderExpression::createAddition( + ShaderExpression::createConstant(0.5), + ShaderExpression::createAddition( + ShaderExpression::createMultiplication(ShaderExpression::createConstant(-0.5), sinExpr), + ShaderExpression::createMultiplication(ShaderExpression::createConstant(-0.5), cosExpr) + ) + ); + break; + } + default: + return; + }; + + multiplyMatrix(matrix); +} + +void TextureMatrix::multiplyMatrix(const TemporaryMatrix& matrix) +{ + auto xx = add(multiply(matrix.xx, this->xx()), multiply(matrix.yx, this->xy())); + auto xy = add(multiply(matrix.xy, this->xx()), multiply(matrix.yy, this->xy())); + auto yx = add(multiply(matrix.xx, this->yx()), multiply(matrix.yx, this->yy())); + auto yy = add(multiply(matrix.xy, this->yx()), multiply(matrix.yy, this->yy())); + auto tx = add(add(multiply(matrix.xx, this->tx()), multiply(matrix.yx, this->ty())), matrix.tx); + auto ty = add(add(multiply(matrix.xy, this->tx()), multiply(matrix.yy, this->ty())), matrix.ty); + + _expressions.assign(IShaderLayer::Expression::TextureMatrixRow0Col0, xx, REG_ONE); + _expressions.assign(IShaderLayer::Expression::TextureMatrixRow0Col1, yx, REG_ZERO); + _expressions.assign(IShaderLayer::Expression::TextureMatrixRow1Col1, yy, REG_ONE); + _expressions.assign(IShaderLayer::Expression::TextureMatrixRow1Col0, xy, REG_ZERO); + _expressions.assign(IShaderLayer::Expression::TextureMatrixRow0Col2, tx, REG_ZERO); + _expressions.assign(IShaderLayer::Expression::TextureMatrixRow1Col2, ty, REG_ZERO); +} + +IShaderExpression::Ptr TextureMatrix::add(const IShaderExpression::Ptr& a, const IShaderExpression::Ptr& b) +{ + assert(a); + assert(b); + return ShaderExpression::createAddition(a, b); +} + +IShaderExpression::Ptr TextureMatrix::multiply(const IShaderExpression::Ptr& a, ExpressionSlot& b) +{ + // Create a constant if there's no expression in the slot yet + auto bExpr = b.expression ? b.expression : ShaderExpression::createConstant(_registers[b.registerIndex]); + + return ShaderExpression::createMultiplication(a, bExpr); +} + +} diff --git a/radiantcore/shaders/TextureMatrix.h b/radiantcore/shaders/TextureMatrix.h new file mode 100644 index 0000000000..19dcc8ba07 --- /dev/null +++ b/radiantcore/shaders/TextureMatrix.h @@ -0,0 +1,58 @@ +#pragma once + +#include "itextstream.h" +#include "ExpressionSlots.h" + +namespace shaders +{ + +/** + * Encapsulates the texture matrix handling, connecting and nesting + * the expressions that are used to calculate the matrix components. + * + * Only the 6 relevant components of the texture matrix are linked to + * registers and possibly expressions: + * + * | m00 m01 0 m02 | + * | m10 m11 0 m12 | + * | 0 0 1 0 | + * | 0 0 0 1 | + */ +class TextureMatrix +{ +private: + ExpressionSlots& _expressions; + Registers& _registers; + + struct TemporaryMatrix; + +public: + TextureMatrix(ExpressionSlots& expressions, Registers& registers); + + TextureMatrix(const TextureMatrix& other) = delete; + + // Sets the expression slot bindings such that the matrix will evaluate to identity + void setIdentity(); + + // Return the matrix as stored in the registers + Matrix4 getMatrix4(); + + // pre-multiply the given transformation matrix to the existing one + void applyTransformation(const IShaderLayer::Transformation& transformation); + +private: + void multiplyMatrix(const TemporaryMatrix& matrix); + + IShaderExpression::Ptr add(const IShaderExpression::Ptr& a, const IShaderExpression::Ptr& b); + IShaderExpression::Ptr multiply(const IShaderExpression::Ptr& a, ExpressionSlot& b); + + // Shortcut accessors + ExpressionSlot& xx() { return _expressions[IShaderLayer::Expression::TextureMatrixRow0Col0]; } + ExpressionSlot& yx() { return _expressions[IShaderLayer::Expression::TextureMatrixRow0Col1]; } + ExpressionSlot& yy() { return _expressions[IShaderLayer::Expression::TextureMatrixRow1Col1]; } + ExpressionSlot& xy() { return _expressions[IShaderLayer::Expression::TextureMatrixRow1Col0]; } + ExpressionSlot& tx() { return _expressions[IShaderLayer::Expression::TextureMatrixRow0Col2]; } + ExpressionSlot& ty() { return _expressions[IShaderLayer::Expression::TextureMatrixRow1Col2]; } +}; + +} diff --git a/radiantcore/skins/Doom3SkinCache.cpp b/radiantcore/skins/Doom3SkinCache.cpp index ec58dfb550..e39b4ac579 100644 --- a/radiantcore/skins/Doom3SkinCache.cpp +++ b/radiantcore/skins/Doom3SkinCache.cpp @@ -42,6 +42,18 @@ const StringList& Doom3SkinCache::getAllSkins() return _allSkins; } +void Doom3SkinCache::addNamedSkin(const ModelSkinPtr& modelSkin) +{ + _namedSkins[modelSkin->getName()] = modelSkin; + _allSkins.emplace_back(modelSkin->getName()); +} + +void Doom3SkinCache::removeSkin(const std::string& name) +{ + _namedSkins.erase(name); + _allSkins.erase(std::find(_allSkins.begin(), _allSkins.end(), name)); +} + sigc::signal Doom3SkinCache::signal_skinsReloaded() { return _sigSkinsReloaded; diff --git a/radiantcore/skins/Doom3SkinCache.h b/radiantcore/skins/Doom3SkinCache.h index bbc8154c65..1b1f4060fe 100644 --- a/radiantcore/skins/Doom3SkinCache.h +++ b/radiantcore/skins/Doom3SkinCache.h @@ -21,7 +21,7 @@ class Doom3SkinCache : public ModelSkinCache { // Table of named skin objects - typedef std::map NamedSkinMap; + typedef std::map NamedSkinMap; NamedSkinMap _namedSkins; // List of all skins @@ -58,6 +58,9 @@ class Doom3SkinCache : */ const StringList& getAllSkins() override; + void addNamedSkin(const ModelSkinPtr& modelSkin) override; + void removeSkin(const std::string& name) override; + /** * greebo: Clears and reloads all skins. */ diff --git a/test/Materials.cpp b/test/Materials.cpp index 6c39cabc9c..54d0ff70f7 100644 --- a/test/Materials.cpp +++ b/test/Materials.cpp @@ -12,6 +12,8 @@ namespace test using MaterialsTest = RadiantTest; +constexpr double TestEpsilon = 0.0001; + TEST_F(MaterialsTest, MaterialFileInfo) { auto& materialManager = GlobalMaterialManager(); @@ -63,22 +65,22 @@ TEST_F(MaterialsTest, EnumerateMaterialLayers) EXPECT_EQ(layers.size(), 5); // First layer is the bump map in this particular material - EXPECT_EQ(layers.at(0)->getType(), ShaderLayer::BUMP); + EXPECT_EQ(layers.at(0)->getType(), IShaderLayer::BUMP); EXPECT_EQ(layers.at(0)->getMapImageFilename(), "models/md5/chars/monsters/spider/spider_local"); // Second layer is the diffuse map - EXPECT_EQ(layers.at(1)->getType(), ShaderLayer::DIFFUSE); + EXPECT_EQ(layers.at(1)->getType(), IShaderLayer::DIFFUSE); EXPECT_EQ(layers.at(1)->getMapImageFilename(), "models/md5/chars/monsters/spider_black"); // Third layer is the specular map - EXPECT_EQ(layers.at(2)->getType(), ShaderLayer::SPECULAR); + EXPECT_EQ(layers.at(2)->getType(), IShaderLayer::SPECULAR); EXPECT_EQ(layers.at(2)->getMapImageFilename(), "models/md5/chars/monsters/spider_s"); // Fourth layer is the additive "ambient method" stage - EXPECT_EQ(layers.at(3)->getType(), ShaderLayer::BLEND); + EXPECT_EQ(layers.at(3)->getType(), IShaderLayer::BLEND); EXPECT_EQ(layers.at(3)->getMapImageFilename(), "models/md5/chars/monsters/spider_black"); BlendFunc bf4 = layers.at(3)->getBlendFunc(); @@ -86,7 +88,7 @@ TEST_F(MaterialsTest, EnumerateMaterialLayers) EXPECT_EQ(bf4.dest, GL_ONE); // Fifth layer is another additive stage with a VFP - EXPECT_EQ(layers.at(4)->getType(), ShaderLayer::BLEND); + EXPECT_EQ(layers.at(4)->getType(), IShaderLayer::BLEND); EXPECT_EQ(layers.at(4)->getNumFragmentMaps(), 4); BlendFunc bf5 = layers.at(4)->getBlendFunc(); EXPECT_EQ(bf5.src, GL_ONE); @@ -181,6 +183,18 @@ TEST_F(MaterialsTest, MaterialParserSortRequest) material = materialManager.getMaterial("textures/parsertest/sortPredefined_decal_macro"); EXPECT_FALSE(material->getParseFlags() & Material::PF_HasSortDefined); // sort is not explicitly set EXPECT_EQ(material->getSortRequest(), Material::SORT_DECAL); + + material = materialManager.getMaterial("textures/parsertest/sort_custom"); + EXPECT_TRUE(material->getParseFlags() & Material::PF_HasSortDefined); + EXPECT_FLOAT_EQ(material->getSortRequest(), 34.56f); + + material = materialManager.getMaterial("textures/parsertest/sort_custom2"); + EXPECT_TRUE(material->getParseFlags() & Material::PF_HasSortDefined); + EXPECT_FLOAT_EQ(material->getSortRequest(), 34.56f); + + // Update the sort request + material->setSortRequest(78.45f); + EXPECT_FLOAT_EQ(material->getSortRequest(), 78.45f); } TEST_F(MaterialsTest, MaterialParserAmbientRimColour) @@ -299,61 +313,209 @@ TEST_F(MaterialsTest, MaterialParserDeform) EXPECT_FALSE(material->getDeformExpression(2)); } -TEST_F(MaterialsTest, MaterialParserStageTranslate) +TEST_F(MaterialsTest, MaterialParserStageNotransform) { auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/notransform"); - EXPECT_FALSE(material->getAllLayers().front()->getTranslationExpression(0)); - EXPECT_FALSE(material->getAllLayers().front()->getTranslationExpression(1)); + auto stage = material->getAllLayers().front(); + + EXPECT_EQ(stage->getTransformations().size(), 0); + EXPECT_TRUE(stage->getTextureTransform() == Matrix4::getIdentity()); +} + +TEST_F(MaterialsTest, MaterialParserStageTranslate) +{ + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/translation1"); + auto stage = material->getAllLayers().front(); - material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/translation1"); - EXPECT_EQ(material->getAllLayers().front()->getTranslationExpression(0)->getExpressionString(), "3.0"); - EXPECT_EQ(material->getAllLayers().front()->getTranslationExpression(1)->getExpressionString(), "parm3 * 3.0"); + EXPECT_EQ(stage->getTransformations().size(), 1); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::Translate); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "3.0"); + EXPECT_EQ(stage->getTransformations().at(0).expression2->getExpressionString(), "parm3 + 5.0"); + + stage->evaluateExpressions(1000); + EXPECT_TRUE(stage->getTextureTransform().isEqual(Matrix4::getTranslation(Vector3(3.0, 5.0, 0)), TestEpsilon)); material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/translation2"); - EXPECT_EQ(material->getAllLayers().front()->getTranslationExpression(0)->getExpressionString(), "time"); - EXPECT_EQ(material->getAllLayers().front()->getTranslationExpression(1)->getExpressionString(), "0.5"); + stage = material->getAllLayers().front(); + + EXPECT_EQ(stage->getTransformations().size(), 1); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::Translate); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "time"); + EXPECT_EQ(stage->getTransformations().at(0).expression2->getExpressionString(), "0.5"); + + stage->evaluateExpressions(1000); + EXPECT_TRUE(stage->getTextureTransform().isEqual(Matrix4::getTranslation(Vector3(1.0, 0.5, 0)), TestEpsilon)); } TEST_F(MaterialsTest, MaterialParserStageRotate) { - auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/notransform"); - EXPECT_FALSE(material->getAllLayers().front()->getRotationExpression()); - - material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/rotate1"); - EXPECT_EQ(material->getAllLayers().front()->getRotationExpression()->getExpressionString(), "0.03"); + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/rotate1"); + auto stage = material->getAllLayers().front(); + + EXPECT_EQ(stage->getTransformations().size(), 1); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::Rotate); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "0.03"); + EXPECT_FALSE(stage->getTransformations().at(0).expression2); + + // sintable and costable lookups are [0..1], translate them to [0..2pi] + auto cosValue = cos(0.03 * 2 * c_pi); + auto sinValue = sin(0.03 * 2 * c_pi); + + stage->evaluateExpressions(1000); + EXPECT_TRUE(stage->getTextureTransform().isEqual(Matrix4::byRows( + cosValue, -sinValue, 0, (-0.5*cosValue + 0.5*sinValue) + 0.5, + sinValue, cosValue, 0, (-0.5*sinValue - 0.5*cosValue) + 0.5, + 0, 0, 1, 0, + 0, 0, 0, 1 + ), TestEpsilon)); } TEST_F(MaterialsTest, MaterialParserStageScale) { - auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/notransform"); - EXPECT_FALSE(material->getAllLayers().front()->getScaleExpression(0)); - EXPECT_FALSE(material->getAllLayers().front()->getScaleExpression(1)); - - material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/scale1"); - EXPECT_EQ(material->getAllLayers().front()->getScaleExpression(0)->getExpressionString(), "4.0"); - EXPECT_EQ(material->getAllLayers().front()->getScaleExpression(1)->getExpressionString(), "time * 3.0"); + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/scale1"); + auto stage = material->getAllLayers().front(); + + EXPECT_EQ(stage->getTransformations().size(), 1); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::Scale); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "4.0"); + EXPECT_EQ(stage->getTransformations().at(0).expression2->getExpressionString(), "time * 3.0"); + + stage->evaluateExpressions(1000); + EXPECT_TRUE(stage->getTextureTransform().isEqual(Matrix4::byRows( + 4, 0, 0, 0, + 0, 3, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ), TestEpsilon)); } TEST_F(MaterialsTest, MaterialParserStageCenterScale) { - auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/notransform"); - EXPECT_FALSE(material->getAllLayers().front()->getCenterScaleExpression(0)); - EXPECT_FALSE(material->getAllLayers().front()->getCenterScaleExpression(1)); - - material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/centerscale1"); - EXPECT_EQ(material->getAllLayers().front()->getCenterScaleExpression(0)->getExpressionString(), "4.0"); - EXPECT_EQ(material->getAllLayers().front()->getCenterScaleExpression(1)->getExpressionString(), "time * 3.0"); + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/centerscale1"); + auto stage = material->getAllLayers().front(); + + EXPECT_EQ(stage->getTransformations().size(), 1); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::CenterScale); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "4.0"); + EXPECT_EQ(stage->getTransformations().at(0).expression2->getExpressionString(), "time * 3.0"); + + stage->evaluateExpressions(1000); + EXPECT_TRUE(stage->getTextureTransform().isEqual(Matrix4::byRows( + 4, 0, 0, 0.5 - 0.5 * 4, + 0, 3, 0, 0.5 - 0.5 * 3, + 0, 0, 1, 0, + 0, 0, 0, 1 + ), TestEpsilon)); } TEST_F(MaterialsTest, MaterialParserStageShear) { - auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/notransform"); - EXPECT_FALSE(material->getAllLayers().front()->getShearExpression(0)); - EXPECT_FALSE(material->getAllLayers().front()->getShearExpression(1)); + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/shear1"); + auto stage = material->getAllLayers().front(); + EXPECT_EQ(stage->getTransformations().size(), 1); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::Shear); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "global3 + 5.0"); + EXPECT_EQ(stage->getTransformations().at(0).expression2->getExpressionString(), "4.0"); + + stage->evaluateExpressions(1000); + EXPECT_TRUE(stage->getTextureTransform().isEqual(Matrix4::byRows( + 1, 5, 0, -0.5 * 5, + 4, 1, 0, -0.5 * 4, + 0, 0, 1, 0, + 0, 0, 0, 1 + ), TestEpsilon)); +} - material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/shear1"); - EXPECT_EQ(material->getAllLayers().front()->getShearExpression(0)->getExpressionString(), "global3"); - EXPECT_EQ(material->getAllLayers().front()->getShearExpression(1)->getExpressionString(), "4.0"); +TEST_F(MaterialsTest, MaterialParserStageTransforms) +{ + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/combined1"); + + auto stage = material->getAllLayers().front(); + EXPECT_EQ(stage->getTransformations().size(), 2); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::Translate); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "time"); + EXPECT_EQ(stage->getTransformations().at(0).expression2->getExpressionString(), "0.5"); + EXPECT_EQ(stage->getTransformations().at(1).type, IShaderLayer::TransformType::Translate); + EXPECT_EQ(stage->getTransformations().at(1).expression1->getExpressionString(), "0.7"); + EXPECT_EQ(stage->getTransformations().at(1).expression2->getExpressionString(), "0.5"); + + stage->evaluateExpressions(1000); + EXPECT_TRUE(stage->getTextureTransform().isEqual(Matrix4::getTranslation(Vector3(1, 0.5, 0) + Vector3(0.7, 0.5, 0)), TestEpsilon)); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/combined2"); + + stage = material->getAllLayers().front(); + EXPECT_EQ(stage->getTransformations().size(), 3); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::Translate); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "time"); + EXPECT_EQ(stage->getTransformations().at(0).expression2->getExpressionString(), "0.5"); + EXPECT_EQ(stage->getTransformations().at(1).type, IShaderLayer::TransformType::Scale); + EXPECT_EQ(stage->getTransformations().at(1).expression1->getExpressionString(), "0.6"); + EXPECT_EQ(stage->getTransformations().at(1).expression2->getExpressionString(), "0.2"); + EXPECT_EQ(stage->getTransformations().at(2).type, IShaderLayer::TransformType::Translate); + EXPECT_EQ(stage->getTransformations().at(2).expression1->getExpressionString(), "0.7"); + EXPECT_EQ(stage->getTransformations().at(2).expression2->getExpressionString(), "0.5"); + + stage->evaluateExpressions(1000); + auto combinedMatrix = Matrix4::getTranslation(Vector3(1, 0.5, 0)); + combinedMatrix.premultiplyBy(Matrix4::getScale(Vector3(0.6, 0.2, 1))); + combinedMatrix.premultiplyBy(Matrix4::getTranslation(Vector3(0.7, 0.5, 0))); + EXPECT_TRUE(stage->getTextureTransform().isEqual(combinedMatrix, TestEpsilon)); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/combined3"); + + stage = material->getAllLayers().front(); + EXPECT_EQ(stage->getTransformations().size(), 6); + EXPECT_EQ(stage->getTransformations().at(0).type, IShaderLayer::TransformType::Translate); + EXPECT_EQ(stage->getTransformations().at(0).expression1->getExpressionString(), "time"); + EXPECT_EQ(stage->getTransformations().at(0).expression2->getExpressionString(), "0.5"); + EXPECT_EQ(stage->getTransformations().at(1).type, IShaderLayer::TransformType::Shear); + EXPECT_EQ(stage->getTransformations().at(1).expression1->getExpressionString(), "0.9"); + EXPECT_EQ(stage->getTransformations().at(1).expression2->getExpressionString(), "0.8"); + EXPECT_EQ(stage->getTransformations().at(2).type, IShaderLayer::TransformType::Rotate); + EXPECT_EQ(stage->getTransformations().at(2).expression1->getExpressionString(), "0.22"); + EXPECT_FALSE(stage->getTransformations().at(2).expression2); + EXPECT_EQ(stage->getTransformations().at(3).type, IShaderLayer::TransformType::CenterScale); + EXPECT_EQ(stage->getTransformations().at(3).expression1->getExpressionString(), "0.2"); + EXPECT_EQ(stage->getTransformations().at(3).expression2->getExpressionString(), "0.1"); + EXPECT_EQ(stage->getTransformations().at(4).type, IShaderLayer::TransformType::Scale); + EXPECT_EQ(stage->getTransformations().at(4).expression1->getExpressionString(), "0.5"); + EXPECT_EQ(stage->getTransformations().at(4).expression2->getExpressionString(), "0.4"); + EXPECT_EQ(stage->getTransformations().at(5).type, IShaderLayer::TransformType::Translate); + EXPECT_EQ(stage->getTransformations().at(5).expression1->getExpressionString(), "1.0"); + EXPECT_EQ(stage->getTransformations().at(5).expression2->getExpressionString(), "1.0"); + + auto time = 750; + stage->evaluateExpressions(time); + auto timeSecs = time / 1000.0; + + combinedMatrix = Matrix4::getTranslation(Vector3(timeSecs, 0.5, 0)); + + auto shear = Matrix4::byColumns(1, 0.8, 0, 0, + 0.9, 1.0, 0, 0, + 0, 0, 1, 0, + -0.5*0.9, -0.5*0.8, 0, 1); + combinedMatrix.premultiplyBy(shear); + + // sintable and costable lookups are [0..1], translate them to [0..2pi] + auto cosValue = cos(0.22 * 2 * c_pi); + auto sinValue = sin(0.22 * 2 * c_pi); + + auto rotate = Matrix4::byRows(cosValue, -sinValue, 0, (-0.5*cosValue+0.5*sinValue) + 0.5, + sinValue, cosValue, 0, (-0.5*sinValue-0.5*cosValue) + 0.5, + 0, 0, 1, 0, + 0, 0, 0, 1); + combinedMatrix.premultiplyBy(rotate); + + auto centerScale = Matrix4::byColumns(0.2, 0, 0, 0, + 0, 0.1, 0, 0, + 0, 0, 1, 0, + 0.5 - 0.5*0.2, 0.5 - 0.5*0.1, 0, 1); + combinedMatrix.premultiplyBy(centerScale); + combinedMatrix.premultiplyBy(Matrix4::getScale(Vector3(0.5, 0.4, 1))); + combinedMatrix.premultiplyBy(Matrix4::getTranslation(Vector3(1, 1, 0))); + + EXPECT_TRUE(stage->getTextureTransform().isEqual(combinedMatrix, TestEpsilon)); } TEST_F(MaterialsTest, MaterialParserStageVertexProgram) @@ -522,4 +684,138 @@ TEST_F(MaterialsTest, MaterialParserGuiSurf) EXPECT_EQ(material->getGuiSurfArgument(), ""); } +TEST_F(MaterialsTest, MaterialParserRgbaExpressions) +{ + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr1"); + + auto diffuse = material->getAllLayers().front(); + auto time = 10; + auto timeSecs = time / 1000.0f; // 0.01 + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(timeSecs*3, 1, 1, 1)); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_RED)->getExpressionString(), "time * 3.0"); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr2"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(1, timeSecs*3, 1, 1)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_RED)); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)->getExpressionString(), "time * 3.0"); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr3"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(1, 1, timeSecs * 3, 1)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_RED)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)->getExpressionString(), "time * 3.0"); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr4"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(1, 1, 1, timeSecs * 3)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_RED)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)->getExpressionString(), "time * 3.0"); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr5"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(timeSecs * 3, timeSecs * 3, timeSecs * 3, 1)); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_RED)->getExpressionString(), "time * 3.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)->getExpressionString(), "time * 3.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)->getExpressionString(), "time * 3.0"); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr6"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(timeSecs * 3, timeSecs * 3, timeSecs * 3, timeSecs * 3)); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_RED)->getExpressionString(), "time * 3.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)->getExpressionString(), "time * 3.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)->getExpressionString(), "time * 3.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)->getExpressionString(), "time * 3.0"); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr7"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(timeSecs * 4, 1, 1, 1)); // second red expression overrules first + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_RED)->getExpressionString(), "time * 4.0"); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr8"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(timeSecs * 4, timeSecs * 3, timeSecs * 3, 1)); // red overrules rgb + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_RED)->getExpressionString(), "time * 4.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)->getExpressionString(), "time * 3.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)->getExpressionString(), "time * 3.0"); + EXPECT_FALSE(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr9"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(timeSecs * 3, timeSecs * 4, timeSecs * 3, timeSecs * 3)); // green overrules rgba + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_RED)->getExpressionString(), "time * 3.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)->getExpressionString(), "time * 4.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)->getExpressionString(), "time * 3.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)->getExpressionString(), "time * 3.0"); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/colourexpr10"); + + diffuse = material->getAllLayers().front(); + diffuse->evaluateExpressions(time); + + EXPECT_TRUE(diffuse->getColour() == Colour4(timeSecs * 4, timeSecs * 6, timeSecs * 5, timeSecs * 7)); // rgba is overridden + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_RED)->getExpressionString(), "time * 4.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_GREEN)->getExpressionString(), "time * 6.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_BLUE)->getExpressionString(), "time * 5.0"); + EXPECT_EQ(diffuse->getColourExpression(IShaderLayer::COMP_ALPHA)->getExpressionString(), "time * 7.0"); +} + +TEST_F(MaterialsTest, MaterialParserLightfallOff) +{ + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/lights/lightfalloff1"); + + EXPECT_EQ(material->getLightFalloffCubeMapType(), IShaderLayer::MapType::Map); + EXPECT_EQ(material->getLightFalloffExpression()->getExpressionString(), "makeIntensity(lights/squarelight1a.tga)"); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/lights/lightfalloff2"); + + EXPECT_EQ(material->getLightFalloffCubeMapType(), IShaderLayer::MapType::CameraCubeMap); + EXPECT_EQ(material->getLightFalloffExpression()->getExpressionString(), "lights/squarelight1a"); + + material = GlobalMaterialManager().getMaterial("textures/parsertest/lights/lightfalloff3"); + + // Second lightFallOff declaration overrides the first one in the material + EXPECT_EQ(material->getLightFalloffCubeMapType(), IShaderLayer::MapType::CameraCubeMap); + EXPECT_EQ(material->getLightFalloffExpression()->getExpressionString(), "lights/squarelight1a"); +} + } diff --git a/test/resources/tdm/materials/parsertest.mtr b/test/resources/tdm/materials/parsertest.mtr index 2a302ce61e..08a23d0a24 100644 --- a/test/resources/tdm/materials/parsertest.mtr +++ b/test/resources/tdm/materials/parsertest.mtr @@ -33,6 +33,8 @@ textures/parsertest/sortPredefined_afterfog { sORt aFteRfog } textures/parsertest/sortPredefined_postprocess { sORt pOstProcess } textures/parsertest/sortPredefined_portalsky { sORt pOrtAlsky } textures/parsertest/sortPredefined_decal_macro { DECAL_MACRO } +textures/parsertest/sort_custom { sort 34.56 } +textures/parsertest/sort_custom2 { sort portalsky sort 34.56 } textures/parsertest/withAmbientRimColor { @@ -138,7 +140,7 @@ textures/parsertest/transform/translation1 { { map _white - translate 3, parm3*3 + translate 3, parm3+5 } } @@ -170,7 +172,7 @@ textures/parsertest/transform/shear1 { { map _white - shear global3, 4 + shear global3 + 5, 4 } } @@ -182,6 +184,38 @@ textures/parsertest/transform/rotate1 } } +textures/parsertest/transform/combined1 +{ + { + map _white + translate time, .5 + translate 0.7, 0.5 + } +} + +textures/parsertest/transform/combined2 +{ + { + map _white + translate time, .5 + scale 0.6, 0.2 + translate 0.7, 0.5 + } +} + +textures/parsertest/transform/combined3 +{ + { + map _white + translate time, .5 + shear 0.9, 0.8 + rotate 0.22 + centerscale 0.2, 0.1 + scale 0.5, 0.4 + translate 1, 1 + } +} + textures/parsertest/program/vertexProgram1 { { @@ -320,4 +354,139 @@ textures/parsertest/guisurf4 discrete guiSurf entity3 playerclip -} \ No newline at end of file +} + +textures/parsertest/colourexpr1 +{ + { + blend diffusemap + map _white + red time*3 + } +} + +textures/parsertest/colourexpr2 +{ + { + blend diffusemap + map _white + green time*3 + } +} + +textures/parsertest/colourexpr3 +{ + { + blend diffusemap + map _white + blue time*3 + } +} + +textures/parsertest/colourexpr4 +{ + { + blend diffusemap + map _white + alpha time*3 + } +} + +textures/parsertest/colourexpr5 +{ + { + blend diffusemap + map _white + rgb time*3 + } +} + +textures/parsertest/colourexpr6 +{ + { + blend diffusemap + map _white + rgba time*3 + } +} + +textures/parsertest/colourexpr7 +{ + { + blend diffusemap + map _white + red time*3 + red time*4 + } +} + +textures/parsertest/colourexpr8 +{ + { + blend diffusemap + map _white + rgb time*3 + red time*4 + } +} + +textures/parsertest/colourexpr9 +{ + { + blend diffusemap + map _white + rgba time*3 + green time*4 + } +} + +textures/parsertest/colourexpr10 +{ + { + blend diffusemap + map _white + rgba time*3 + red time*4 + blue time*5 + green time*6 + alpha time*7 + } +} + +textures/parsertest/lights/lightfalloff1 +{ + lightFalloffImage makeintensity( lights/squarelight1a.tga ) + spectrum 2 + { + forceHighQuality + map lights/fullambient.tga + colored + zeroClamp + } +} + +textures/parsertest/lights/lightfalloff2 +{ + lightFalloffCubeMap lights/squarelight1a + spectrum 2 + { + forceHighQuality + map lights/fullambient.tga + colored + zeroClamp + } +} + +textures/parsertest/lights/lightfalloff3 +{ + lightFalloffImage makeintensity( lights/squarelight1a.tga ) + lightFalloffCubeMap lights/squarelight1a + spectrum 2 + { + forceHighQuality + map lights/fullambient.tga + colored + zeroClamp + } +} + diff --git a/test/resources/tdm/materials/tables.mtr b/test/resources/tdm/materials/tables.mtr new file mode 100644 index 0000000000..253139c31d --- /dev/null +++ b/test/resources/tdm/materials/tables.mtr @@ -0,0 +1,67 @@ +table sinTable { { +0.000000, 0.024541, 0.049068, 0.073565, 0.098017, 0.122411, 0.146730, 0.170962, +0.195090, 0.219101, 0.242980, 0.266713, 0.290285, 0.313682, 0.336890, 0.359895, +0.382683, 0.405241, 0.427555, 0.449611, 0.471397, 0.492898, 0.514103, 0.534998, +0.555570, 0.575808, 0.595699, 0.615232, 0.634393, 0.653173, 0.671559, 0.689541, +0.707107, 0.724247, 0.740951, 0.757209, 0.773010, 0.788346, 0.803208, 0.817585, +0.831470, 0.844854, 0.857729, 0.870087, 0.881921, 0.893224, 0.903989, 0.914210, +0.923880, 0.932993, 0.941544, 0.949528, 0.956940, 0.963776, 0.970031, 0.975702, +0.980785, 0.985278, 0.989177, 0.992480, 0.995185, 0.997290, 0.998795, 0.999699, +1.000000, 0.999699, 0.998795, 0.997290, 0.995185, 0.992480, 0.989177, 0.985278, +0.980785, 0.975702, 0.970031, 0.963776, 0.956940, 0.949528, 0.941544, 0.932993, +0.923880, 0.914210, 0.903989, 0.893224, 0.881921, 0.870087, 0.857729, 0.844854, +0.831470, 0.817585, 0.803208, 0.788346, 0.773010, 0.757209, 0.740951, 0.724247, +0.707107, 0.689541, 0.671559, 0.653173, 0.634393, 0.615232, 0.595699, 0.575808, +0.555570, 0.534998, 0.514103, 0.492898, 0.471397, 0.449611, 0.427555, 0.405241, +0.382683, 0.359895, 0.336890, 0.313682, 0.290285, 0.266713, 0.242980, 0.219101, +0.195090, 0.170962, 0.146730, 0.122411, 0.098017, 0.073565, 0.049068, 0.024541, +0.000000, -0.024541, -0.049068, -0.073565, -0.098017, -0.122411, -0.146730, -0.170962, +-0.195090, -0.219101, -0.242980, -0.266713, -0.290285, -0.313682, -0.336890, -0.359895, +-0.382683, -0.405241, -0.427555, -0.449611, -0.471397, -0.492898, -0.514103, -0.534998, +-0.555570, -0.575808, -0.595699, -0.615232, -0.634393, -0.653173, -0.671559, -0.689541, +-0.707107, -0.724247, -0.740951, -0.757209, -0.773010, -0.788346, -0.803208, -0.817585, +-0.831470, -0.844854, -0.857729, -0.870087, -0.881921, -0.893224, -0.903989, -0.914210, +-0.923880, -0.932993, -0.941544, -0.949528, -0.956940, -0.963776, -0.970031, -0.975702, +-0.980785, -0.985278, -0.989177, -0.992480, -0.995185, -0.997290, -0.998795, -0.999699, +-1.000000, -0.999699, -0.998795, -0.997290, -0.995185, -0.992480, -0.989177, -0.985278, +-0.980785, -0.975702, -0.970031, -0.963776, -0.956940, -0.949528, -0.941544, -0.932993, +-0.923880, -0.914210, -0.903989, -0.893224, -0.881921, -0.870087, -0.857729, -0.844854, +-0.831470, -0.817585, -0.803208, -0.788346, -0.773010, -0.757209, -0.740951, -0.724247, +-0.707107, -0.689541, -0.671559, -0.653173, -0.634393, -0.615232, -0.595699, -0.575808, +-0.555570, -0.534998, -0.514103, -0.492898, -0.471397, -0.449611, -0.427555, -0.405241, +-0.382683, -0.359895, -0.336890, -0.313682, -0.290285, -0.266713, -0.242980, -0.219101, +-0.195090, -0.170962, -0.146730, -0.122411, -0.098017, -0.073565, -0.049068, -0.024541 } } + +table cosTable { { +1.000000, 0.999699, 0.998795, 0.997290, 0.995185, 0.992480, 0.989177, 0.985278, +0.980785, 0.975702, 0.970031, 0.963776, 0.956940, 0.949528, 0.941544, 0.932993, +0.923880, 0.914210, 0.903989, 0.893224, 0.881921, 0.870087, 0.857729, 0.844854, +0.831470, 0.817585, 0.803208, 0.788346, 0.773010, 0.757209, 0.740951, 0.724247, +0.707107, 0.689541, 0.671559, 0.653173, 0.634393, 0.615232, 0.595699, 0.575808, +0.555570, 0.534998, 0.514103, 0.492898, 0.471397, 0.449611, 0.427555, 0.405241, +0.382683, 0.359895, 0.336890, 0.313682, 0.290285, 0.266713, 0.242980, 0.219101, +0.195090, 0.170962, 0.146730, 0.122411, 0.098017, 0.073565, 0.049068, 0.024541, +0.000000, -0.024541, -0.049068, -0.073565, -0.098017, -0.122411, -0.146730, -0.170962, +-0.195090, -0.219101, -0.242980, -0.266713, -0.290285, -0.313682, -0.336890, -0.359895, +-0.382683, -0.405241, -0.427555, -0.449611, -0.471397, -0.492898, -0.514103, -0.534998, +-0.555570, -0.575808, -0.595699, -0.615232, -0.634393, -0.653173, -0.671559, -0.689541, +-0.707107, -0.724247, -0.740951, -0.757209, -0.773010, -0.788346, -0.803208, -0.817585, +-0.831470, -0.844854, -0.857729, -0.870087, -0.881921, -0.893224, -0.903989, -0.914210, +-0.923880, -0.932993, -0.941544, -0.949528, -0.956940, -0.963776, -0.970031, -0.975702, +-0.980785, -0.985278, -0.989177, -0.992480, -0.995185, -0.997290, -0.998795, -0.999699, +-1.000000, -0.999699, -0.998795, -0.997290, -0.995185, -0.992480, -0.989177, -0.985278, +-0.980785, -0.975702, -0.970031, -0.963776, -0.956940, -0.949528, -0.941544, -0.932993, +-0.923880, -0.914210, -0.903989, -0.893224, -0.881921, -0.870087, -0.857729, -0.844854, +-0.831470, -0.817585, -0.803208, -0.788346, -0.773010, -0.757209, -0.740951, -0.724247, +-0.707107, -0.689541, -0.671559, -0.653173, -0.634393, -0.615232, -0.595699, -0.575808, +-0.555570, -0.534998, -0.514103, -0.492898, -0.471397, -0.449611, -0.427555, -0.405241, +-0.382683, -0.359895, -0.336890, -0.313682, -0.290285, -0.266713, -0.242980, -0.219101, +-0.195090, -0.170962, -0.146730, -0.122411, -0.098017, -0.073565, -0.049068, -0.024541, +0.000000, 0.024541, 0.049068, 0.073565, 0.098017, 0.122411, 0.146730, 0.170962, +0.195090, 0.219101, 0.242980, 0.266713, 0.290285, 0.313682, 0.336890, 0.359895, +0.382683, 0.405241, 0.427555, 0.449611, 0.471397, 0.492898, 0.514103, 0.534998, +0.555570, 0.575808, 0.595699, 0.615232, 0.634393, 0.653173, 0.671559, 0.689541, +0.707107, 0.724247, 0.740951, 0.757209, 0.773010, 0.788346, 0.803208, 0.817585, +0.831470, 0.844854, 0.857729, 0.870087, 0.881921, 0.893224, 0.903989, 0.914210, +0.923880, 0.932993, 0.941544, 0.949528, 0.956940, 0.963776, 0.970031, 0.975702, +0.980785, 0.985278, 0.989177, 0.992480, 0.995185, 0.997290, 0.998795, 0.999699 } } diff --git a/tools/msvc/DarkRadiant.vcxproj b/tools/msvc/DarkRadiant.vcxproj index afab44c42a..6b7b43d1ee 100644 --- a/tools/msvc/DarkRadiant.vcxproj +++ b/tools/msvc/DarkRadiant.vcxproj @@ -267,6 +267,7 @@ + @@ -459,8 +460,13 @@ + + + + + diff --git a/tools/msvc/DarkRadiant.vcxproj.filters b/tools/msvc/DarkRadiant.vcxproj.filters index d40eba2981..7adfb3d549 100644 --- a/tools/msvc/DarkRadiant.vcxproj.filters +++ b/tools/msvc/DarkRadiant.vcxproj.filters @@ -703,6 +703,9 @@ src\ui\common + + src\ui\materials + @@ -1347,6 +1350,21 @@ src\ui\materials + + src\ui\materials + + + src\ui\materials + + + src\ui\materials + + + src\ui\materials + + + src\ui\materials + diff --git a/tools/msvc/DarkRadiantCore.vcxproj b/tools/msvc/DarkRadiantCore.vcxproj index 93b47e306d..c3a0179bdb 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj +++ b/tools/msvc/DarkRadiantCore.vcxproj @@ -672,11 +672,13 @@ + + @@ -1006,6 +1008,7 @@ + @@ -1015,6 +1018,7 @@ + diff --git a/tools/msvc/DarkRadiantCore.vcxproj.filters b/tools/msvc/DarkRadiantCore.vcxproj.filters index 295173a565..7c41e18189 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj.filters +++ b/tools/msvc/DarkRadiantCore.vcxproj.filters @@ -1018,6 +1018,12 @@ src\eclass + + src\shaders + + + src\shaders + @@ -2079,5 +2085,11 @@ src\shaders + + src\shaders + + + src\shaders + \ No newline at end of file diff --git a/tools/msvc/include.vcxproj b/tools/msvc/include.vcxproj index b435c1eca5..0a91114120 100644 --- a/tools/msvc/include.vcxproj +++ b/tools/msvc/include.vcxproj @@ -187,6 +187,7 @@ + @@ -206,7 +207,6 @@ - diff --git a/tools/msvc/properties/DarkRadiant Base Debug Win32.props b/tools/msvc/properties/DarkRadiant Base Debug Win32.props index 6ae6c1804f..d913dc5981 100644 --- a/tools/msvc/properties/DarkRadiant Base Debug Win32.props +++ b/tools/msvc/properties/DarkRadiant Base Debug Win32.props @@ -8,12 +8,15 @@ -d vc14x_dll - + + true + DEBUG;_DEBUG;%(PreprocessorDefinitions) MultiThreadedDebugDLL Disabled + EditAndContinue diff --git a/tools/msvc/properties/DarkRadiant Base Debug x64.props b/tools/msvc/properties/DarkRadiant Base Debug x64.props index 86b73e0433..6a8677c8d8 100644 --- a/tools/msvc/properties/DarkRadiant Base Debug x64.props +++ b/tools/msvc/properties/DarkRadiant Base Debug x64.props @@ -8,7 +8,9 @@ -d vc14x_x64_dll - + + true + @@ -18,6 +20,7 @@ MultiThreadedDebugDLL Disabled + EditAndContinue