- ActionsBuilder.Action[0] = { name: "SwitchBooleanAction", properties: directActionWidthPropertyPath(), description: "Switches a boolean value for a given parameter of the target object : true to false, or false to true" };
- ActionsBuilder.Action[1] = { name: "SetStateAction", properties: directActionTemplate(null, "value"), description: "Sets a new state value of the target object (i.e \"off\" or \"on\")" };
- ActionsBuilder.Action[2] = { name: "SetValueAction", properties: directActionWidthPropertyPath([{ text: "value", value: "value?" }]), description: "Sets a new value to the specified parameter of the object" };
- ActionsBuilder.Action[3] = { name: "SetParentAction", properties: directActionTemplate([{ text: "parent", value: "object name?" }]), description: "Sets a new parent for the target object" };
- ActionsBuilder.Action[4] = { name: "IncrementValueAction", properties: directActionWidthPropertyPath([{ text: "value", value: "value?" }]), description: "Increments the value of the given parameter for the target object. The value can be negative" };
- ActionsBuilder.FlowAction[1] = { name: "StateCondition", properties: directActionTemplate([{ text: "value", value: "value?" }]), description: "A condition, true if the target object state equals the given state" };
-This exporter is designed for 3ds Max 2013+. You just have to unzip the content of the archive to [3ds max folder\bin\assemblies]
+This exporter is designed for 3ds Max 2013, 2015 and 2016 (Use 2015 version for 3dsMax 2016). You just have to unzip the content of the archive to [3ds max folder\bin\assemblies]
-**After unzipping DLLs, you may have to go through all files, right-click on them, select the Properties menu and click on Unblock button to remove security protection enforce by Windows**
+**Before extracting, please go to downloaded .zip properties and click Unblock button**
If you right click on the scene, on a light, on a camera or on a mesh you fill have a [Babylon...] menu.
Разница между файлами не показана из-за своего большого размера
The [Blender export plugin](http://blogs.msdn.com/b/eternalcoding/archive/2013/06/28/babylon-js-how-to-load-a-babylon-file-produced-with-blender.aspx) supports the following features:
+For a discussion of Tower of Babel exporter, along with the difference this exporter, [See]{https://github.com/BabylonJS/Extensions/tree/master/TowerOfBabel)
* **Cameras**
* Name
* Position
@@ -14,6 +15,7 @@ The [Blender export plugin](http://blogs.msdn.com/b/eternalcoding/archive/2013/0
* Gravity
* Ellipsoid
* Animations
+ * 3D Camera Rigs
* All kind of Babylon.js cameras can be chosen from a custom dropdown list
* **Lights**
* Type (Point, directional (Sun), Spot, Hemispheric)
@@ -25,7 +27,7 @@ The [Blender export plugin](http://blogs.msdn.com/b/eternalcoding/archive/2013/0
* Energy
* Diffuse color
* Specular color
- * Shadow maps (For directional lights)
+ * Shadow maps, all types (For directional lights)
* Animations
* **Materials**
* Name
@@ -42,9 +44,12 @@ The [Blender export plugin](http://blogs.msdn.com/b/eternalcoding/archive/2013/0
* Reflection texture
* Emissive texture
* Bump texture
+ * Procedural Texture Baking
+ * Cycles Render Baking
* **Multi-materials**
* Name
* Child materials
+ * 32 bit vertex limit for multi-materials
* **Textures**
* Name
* Associated file
@@ -55,12 +60,14 @@ The [Blender export plugin](http://blogs.msdn.com/b/eternalcoding/archive/2013/0
* uAng / vAng / Wang
* WrapU / WrapV
* Coordinates index
+ * Texture in-lining to .babylon file
* **Meshes**
* Name
* Geometry (Positions & normals)
* Position
* Rotation
* Scaling
+ * FreezeWorldMatrix
* Texture coordinates (2 channels)
* Vertex colors
* Visibility
Разница между файлами не показана из-за своего большого размера
+ #pragma warning(disable : 4345) //warning C4345: behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized
+ inline int FBXSDK_sprintf(char* dst, size_t dstsize, const char* format, ...){ va_list vl; va_start(vl, format); int ret = vsprintf(dst, format, vl); va_end(vl); return ret; }
+ inline int FBXSDK_snprintf(char* dst, size_t dstsize, const char* format, ...){ va_list vl; va_start(vl, format); int ret = vsnprintf(dst, dstsize, format, vl); va_end(vl); return ret; }
+ inline int FBXSDK_vsprintf(char* dst, size_t dstsize, const char* format, va_list vl){ return vsprintf(dst, format, vl); }
+ inline int FBXSDK_vsnprintf(char* dst, size_t dstsize, const char* format, va_list vl){ return vsnprintf(dst, dstsize, format, vl); }
+ /** Append an element at the end of the array, growing the array by one element if capacity is not sufficient.
+ * \param pElement Element to append to the array.
+ * \return -1 if add failed, otherwise the position of the added element in the array. */
+ inline int AddCompact(const T& pElement)
+ {
+ return InsertAt(mSize, pElement, true);
+ }
+
+ /** Retrieve the number of element contained in the array. To increase the capacity without increasing the size, please use Reserve().
+ * \return The number of element in the array.
+ * \remark The size of the array cannot exceed its capacity. */
+ inline int Size() const { return mSize; }
+
+ /** Retrieve the current allocated memory capacity of the array.
+ * \return The capacity of the array in number of element.
+ * \remark The capacity will always be greater or equal to its size. */
+ inline int Capacity() const { return mCapacity; }
+
+ /** Retrieve a reference of the element at given index position in the array.
+ * \param pIndex Position of element in the array.
+ * \return A reference to the element at the specified position in the array.
+ * \remark No error will be thrown if the index is out of bounds. */
+ inline T& operator[](const int pIndex) const
+ {
+ #ifdef _DEBUG
+ FBX_ASSERT_MSG(pIndex >= 0, "Index is out of range!");
+ if( pIndex >= mSize )
+ {
+ if( pIndex < mCapacity )
+ {
+ FBX_ASSERT_NOW("Index is out of range, but not outside of capacity! Call SetAt() to use reserved memory.");
+ }
+ else FBX_ASSERT_NOW("Index is out of range!");
+ }
+ #endif
+ return (T&)mArray[pIndex];
+ }
+
+ /** Retrieve a copy of the element at given index position in the array.
+ * \param pIndex Position of element in the array.
+ * \return The value of the element at the specified position in the array.
+ * \remark No error will be thrown if the index is out of bounds. */
+ inline T GetAt(const int pIndex) const
+ {
+ return operator[](pIndex);
+ }
+
+ /** Retrieve a copy of the first element.
+ * \return Copy of the first element.
+ * \remark The array should have at least one element and no error will be thrown if the array is empty. */
+ inline T GetFirst() const
+ {
+ return GetAt(0);
+ }
+
+ /** Retrieve a copy of the last element.
+ * \return Copy of the last element.
+ * \remark The array should have at least one element and no error will be thrown if the array is empty. */
+ inline T GetLast() const
+ {
+ return GetAt(mSize-1);
+ }
+
+ /** Find first matching element, from first to last.
+ * \param pElement The element to be compared to each of the elements.
+ * \param pStartIndex The position to start searching from.
+ * \return Position of first matching element or -1 if there is no matching element. */
+ inline int Find(const T& pElement, const int pStartIndex=0) const
+ {
+ FBX_ASSERT_RETURN_VALUE(pStartIndex >= 0, -1);
+ for( int i = pStartIndex; i < mSize; ++i )
+ {
+ if( operator[](i) == pElement ) return i;
+ }
+ return -1;
+ }
+
+ /** Find first matching element, from last to first.
+ * \param pElement The element to be compared to each of the elements.
+ * \param pStartIndex The position to start searching from.
+ * \return Position of first matching element or -1 if there is no matching element. */
+ inline int FindReverse(const T& pElement, const int pStartIndex=FBXSDK_INT_MAX) const
+ {
+ for( int i = FbxMin(pStartIndex, mSize-1); i >= 0; --i )
+ {
+ if( operator[](i) == pElement ) return i;
+ }
+ return -1;
+ }
+
+ /** Request for allocation of additional memory without inserting new elements. After the memory has been reserved, please use SetAt() to initialize elements.
+ * \param pCapacity The number of additional element memory allocation requested.
+ * \return \c true if the memory allocation succeeded or if the capacity is unchanged, \c false otherwise.
+ * \remark If the requested capacity is less than or equal to the current capacity, this call has no effect. In either case, Size() is unchanged. */
+ /** Inserts or erases elements at the end such that Size() becomes pSize, increasing capacity if needed. Please use SetAt() to initialize any new elements.
+ * \param pSize The new count of elements to set the array to. Must be greater or equal to zero.
+ * \return \c true if the memory (re)allocation succeeded, \c false otherwise.
+ * \remark If the requested element count is less than or equal to the current count, elements are freed from memory. Otherwise, the array grows and elements are unchanged. */
+ /** Memory pool destructor. Upon destruction, all memory blocks of the pool will be de-allocated. */
+ ~FbxMemoryPool();
+
+ /** Free memory of all memory blocks from this memory pool, also effectively resetting the block count to zero.
+ * \remark The block size and alignment/resize/concurrent support will remain unchanged. */
+ void Reset();
+
+ /** Allocate or lock a memory block for usage.
+ * \return An memory block pointer that can be NULL if the memory pool cannot grow in size and no blocks are available. */
+ void* Allocate();
+
+ /** Dispose or unlock a memory block.
+ * \param pMemBlock A pointer to the memory block to release. This will not free the block's memory, instead simply putting it back in the available stack. */
+ * \return The class identification string name. */
+ const char* GetName() const;
+
+ /** Retrieve the parent ClassId.
+ * \return The parent ClassId. */
+ FbxClassId GetParent() const;
+
+ /** Create an instance of this class.
+ * \param pManager The FBX SDK Manager to be used to instantiate this object. This allow the object to use the same memory manager as the provided manager.
+ * \param pName The name to assign to this new object instance.
+ * \param pFrom An object to clone if it matches the same ClassId. This is an optional parameter.
+ * \return The newly created instance of this class. */
+ /** Test if this class is a hierarchical children of the specified class type. This is the standard method to differentiate object classes.
+ * \param pId The class type to test against self.
+ * \return True if the object is a hierarchical children of the type specified.
+ * \remark This function will perform a complete search until it reaches the top level class, but it will stop as soon as one ClassId matches the test. */
+ bool Is(const FbxClassId& pId) const;
+
+ /** Equivalence operator.
+ * \param pClassId The class type to test against self.
+ * \return \c true if the ClassId is exactly the same, \c false otherwise.
+ * \remark This function only perform direct equality test, and doesn't test hierarchic children. */