Преглед изворни кода

Added another manual, slight improvements to the API docs
Updated Mono to 4.4

BearishSun пре 9 година
родитељ
комит
f3cb2cfc93

+ 1 - 0
.gitignore

@@ -12,3 +12,4 @@ Builds
 Documentation/html
 *.aps
 *.opendb
+/Build/VS2015/BansheeEngine.VC.db

+ 2 - 1
Build/VS2015/BansheeEngine.sln

@@ -1,12 +1,13 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
+VisualStudioVersion = 14.0.25123.0
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Notes", "_Notes", "{1D081E5A-615A-4C06-B2DF-0D8D9390DE02}"
 	ProjectSection(SolutionItems) = preProject
 		..\..\Documentation\CompilingDependenciesManually.txt = ..\..\Documentation\CompilingDependenciesManually.txt
 		..\..\Documentation\Mono-3.8.0-IntegrationGuide.txt = ..\..\Documentation\Mono-3.8.0-IntegrationGuide.txt
+		Mono-4.4.0.40-IntegrationGuide.txt = Mono-4.4.0.40-IntegrationGuide.txt
 		..\..\Documentation\NVTTCompilationGuide.txt = ..\..\Documentation\NVTTCompilationGuide.txt
 	EndProjectSection
 EndProject

+ 54 - 0
Build/VS2015/Mono-4.4.0.40-IntegrationGuide.txt

@@ -0,0 +1,54 @@
+---------------------------------Compiling runtime-------------------------------------
+ - Retrieve mono sources using git:
+   - Make sure your git client has this set: "git config --global core.autocrlf input" as otherwise you'll have problems with line endings during later steps
+   - Clone mono from https://github.com/mono/mono (make sure to perform a RECURSIVE clone as there are sub-modules in the /external folder)
+     - Checkout mono-4.4.0-branch
+     - Checkout commit # febc509ab9a7d07734f5b694037bc2becbc97851 (later ones might, but might not work)
+ - Go to msvc/ folder to find mono.sln (Visual studio solution)
+ - Open in VS2012 as is, or open in later VS and upgrade all projects to latest toolkit (v120 and v140 tested and working)
+ - Expose "mono_class_bind_generic_parameters" to the public:
+  - In object-internals.h change:
+   MonoClass* mono_class_bind_generic_parameters (MonoClass *klass, int type_argc, MonoType **types, gboolean is_dynamic) MONO_INTERNAL; 
+   to:
+   MONO_API MonoClass* mono_class_bind_generic_parameters (MonoClass *klass, int type_argc, MonoType **types, mono_bool is_dynamic);
+   then move it to:
+   object.h
+  - In reflection.c modify:
+   MonoClass* mono_class_bind_generic_parameters (MonoClass *klass, int type_argc, MonoType **types, gboolean is_dynamic)
+   to:
+   MonoClass* mono_class_bind_generic_parameters (MonoClass *klass, int type_argc, MonoType **types, mono_bool is_dynamic)
+  - Add "mono_class_bind_generic_parameters" entry to mono/msvc/mono.def file
+ - Generate missing header files:
+   - First compile "genmdesc" project for desired configuration (debug/release, 32/64 bit)
+   - Then run "runmdesc x64\bin\Debug\genmdesc x64" located in /msvc folder
+     - Replace folder path to genmdesc you generated in the previous step
+	 - Replace x64 with Win32 for 32-bit builds
+ - Compile mono project with desired configuration (debug/release, 32/64 bit, SGen builds were not tested). You will receive mono-2.0.dll and mono-2.0.lib as output.
+   - Repeat the "genmdesc" step above for each configuration. Doing it once might be enough but be on the safe side.
+ - Add mono-2.0.dll to (BansheeRootDir)/bin/(Platform)/(Configuration)
+ - Add mono-2.0.lib to (BansheeRootDir)/Dependencies/lib/(Platform)/(Configuration)
+
+-----------------------------Compiling libraries & compiler-------------------------------------
+
+- Install Mono 4.2.3.4 (This is the latest binary release for Windows, you can use newer if there is one).
+- Add the "(InstallDir)\Mono\bin" to your PATH environment variable.
+- Install Cygwin 32-bit version using these command line parameters:
+ setup-x86.exe -qnNdO -R "C:\cygwin" -s "http://cygwin.mirror.constant.com" 
+  -l "C:\cygwin\var\cache\setup" -P autoconf -P automake -P bison -P gcc-core -P gcc-g++ -P mingw64-i686-runtime 
+  -P mingw64-i686-binutils -P mingw64-i686-gcc-core -P mingw64-i686-gcc-g++ -P mingw64-i686-headers -P mingw64-i686-pthreads
+  -P mingw64-i686-windows-default-manifest -P mingw64-i686-winpthreads -P w32api-headers -P w32api-runtime 
+  -P windows-default-manifest -P libtool -P make -P python -P gettext-devel -P gettext -P intltool -P libiconv 
+  -P pkg-config -P git -P wget -P curl
+
+- Go to your mono source directory (the one retrieved when compiling the runtime) in Cygwin and enter these commands in order:
+ - "./autogen.sh --prefix="(OutputDir)" --with-preview=yes"" (Replace (OutputDir) with a folder where you want to output the binaries, e.g. "C:\MonoInstall")
+ - "./configure --host=i686-w64-mingw32"
+ - "make"
+ - "make install"
+- Your built mono should now be output to (OutputDir) folder. (If it's not in that folder then check your Cygwin install folder under /usr/local)
+- Copy contents of (OutputDir)/include/mono/mono-2.0/mono to (BansheeRootDir)/Dependencies/Include/Mono
+  - Make sure to modify "object.h" as you did above when building the binaries
+- Copy folder (OutputDir)/etc to (BansheeRootDir)/bin/Mono
+- Copy assembly folders (OutputDir)/lib/mono/4.0 and (OutputDir)/lib/mono/4.5 to (BansheeRootDir)/bin/Mono/lib/mono/4.0 and (BansheeRootDir)/bin/Mono/lib/mono/4.5, respectively
+ - If you wish, you can clean up the assemblies within those folders are many might not be used. The minimum needed are "mscorlib.dll", "System.dll" and "System.Core.dll".
+- Copy the compiler (mcs.exe) from (OutputDir)/lib/mono/4.5 to (BansheeRootDir)/bin/Mono/compiler

+ 1 - 1
Documentation/GitHub/features.md

@@ -55,7 +55,7 @@ Current version: **v0.3**
 	* Collision filtering
 	* Discrete or continuous collision detection
 * __Scripting__
-  * C# 5.0
+  * C# 6.0
   * Separate high level engine API
   * Integrated runtime for maximum performance
   * Full access to .NET framework

+ 147 - 0
Documentation/Manuals/Native/coreThread.md

@@ -0,0 +1,147 @@
+Core Thread								{#coreThread}
+===============
+[TOC]
+
+Banshee is a multi-threaded engine that has two primary threads. One is the main thread on which the application is started, this is where your game code runs and what majority of users will be working with, we call this the **simulation** thread. The second thread is the rendering thread, this is where all calls to render API (like DirectX/OpenGL) are made. This thread also deals with the OS (like the main message loop). We call this the **core** thread.
+
+Various other operations can use threads other than the two primary ones (async resource loading, physics, etc.) in the form of worker threads or tasks. But we won't touch on those as they act as standard threads and the system using them has full control.
+
+Dealing with the core thread on the other hand requires some knowledge of how it interacts with the simulation thread. The core threads deals with:
+ - Render API calls (DirectX/OpenGL)
+ - Renderer
+ - OS functionality (window creation, main message loop)
+
+Here are some examples of when the simulation thread needs to interact with the core:
+ - You add a new renderable object to the scene. The simulation thread needs to notify the renderer.
+ - You modify a property on a renderable/camera/light object. The simulation thread needs to notify the renderer.
+ - You create a resource like a mesh or a texture. The simulation thread must schedule resource creation with the render API (i.e. creating vertex/pixel buffers for mesh, texture surfaces for texture).
+ - You destroy a resource like a mesh or texture. The simulation thread must call into render API to free the GPU portions of those objects.
+ - You create a new window and the simulation thread needs to schedule its creation on the core thread.
+ - You resize/move a window and the simulation thread needs to notify the core thread.
+ 
+As you can see the communication is one directional. Simulation thread calls into the core thread when it needs to notify it of a certain event. In rare cases the core thread needs to notify the simulation thread (e.g. when the user moves/resizes the window the simulation thread needs to be aware of the new position/size), but this is handled on a per-case basis using normal thread synchronization primitives, and we won't touch on it further.
+
+# Command queue {#coreThread_a}
+All the operations listed above happen with the help of a @ref BansheeEngine::CommandQueue<SyncPolicy> "CommandQueue". When simulation thread needs to notify the core thread about something it queues a command in the queue using @ref BansheeEngine::CommandQueue<SyncPolicy>::queue "CommandQueue::queue", which accepts a function to be executed. The core thread continually reads from the command queue and executes commands in the order of they are submitted.
+
+The main command queue can be accessed using @ref BansheeEngine::CoreThread::queueCommand "CoreThread::queueCommand", which is just a wrapper for the @ref BansheeEngine::CommandQueue<SyncPolicy>::queue "CommandQueue::queue" method mentioned above.
+
+## Returning values {#coreThread_a_a}
+Sometimes a queued command needs to return a value to the simulation thread (for example, when reading pixels from a texture). This can be performed by calling @ref BansheeEngine::CoreThread::queueReturnCommand "CoreThread::queueReturnCommand", which internally calls @ref BansheeEngine::CommandQueue<SyncPolicy>::queueReturn "CommandQueue::queueReturn". 
+
+Since the command was queued and we don't know when will the core thread execute, we have no guarantees when its return value will be available. Therefore this method will return an @ref BansheeEngine::AsyncOp "AsyncOp" object. This object can be used for checking if the return value is available by calling @ref BansheeEngine::AsyncOp::hasCompleted "AsyncOp::hasCompleted". If the return value is available you can retrieve it via @ref BansheeEngine::AsyncOp::getReturnValue<T> "AsyncOp::getReturnValue<T>".
+
+## Blocking {#coreThread_a_b}
+In certain cases you need to see the results of an operation right away. In such cases you can tell the simulation thread to wait until a certain command is done executing on the core thread. You can do this by setting the `blockUntilComplete` parameter of @ref BansheeEngine::CoreThread::queueCommand "CoreThread::queueCommand" and @ref BansheeEngine::CoreThread::queueReturnCommand "CoreThread::queueReturnCommand" to true.
+
+You can also block by calling @ref BansheeEngine::AsyncOp::blockUntilComplete "AsyncOp::blockUntilComplete". This is similar to blocking directly on the @ref BansheeEngine::CoreThread::queueReturnCommand "CoreThread::queueReturnCommand" call, but can be more useful if you're not sure immediately if you need to wait for the result or not.
+
+You should be very careful about blocking as it wastes CPU cycles since one thread is just sitting there doing nothing until the core thread reaches the command (which could be as long as a few dozen milliseconds).
+
+## Core accessors {#coreThread_a_c}
+Core accessors can be considered as light-weight command queues. They perform the same operations as @ref BansheeEngine::CoreThread::queueCommand "CoreThread::queueCommand" and @ref BansheeEngine::CoreThread::queueReturnCommand "CoreThread::queueReturnCommand". However core accessors can only be accessed from a single thread, while the methods just listed can be accessed from any thread. Accessors also don't submit their commands to the core thread immediately, instead they are submitted all together using a separate method.
+
+Because of these two reasons core accessors are much faster than the primary command queue, and you should always prefer to use them instead of directly queuing commands on the primary queue.
+
+Accessor for the current thread can be retrieved with @ref BansheeEngine::CoreThread::getAccessor "CoreThread::getAccessor". You queue the commands in the accessor by calling @ref BansheeEngine::CoreThreadAccessorBase::queueCommand "CoreThreadAccessor::queueCommand" and @ref BansheeEngine::CoreThreadAccessorBase::queueReturnCommand "CoreThreadAccessor::queueReturnCommand". Once you are done queuing commands you can submit them to the core thread by calling @ref BansheeEngine::CoreThread::submitAccessors "CoreThread::submitAccessors".
+
+Internally @ref BansheeEngine::CoreThread::submitAccessors "CoreThread::submitAccessors" uses the primary queue to submit a command that reads all the commands from the accessor and executes them in order. So esentially they are just built on top of the primary command queue, and if fact most of the threading functionality is.
+
+### Core accessor APIs {#coreThread_a_c_a}
+Although you can queue your own commands to the core accessor, many systems provide methods that automatically queue commands on the core accessor. For example take a look at @ref BansheeEngine::RenderAPI "RenderAPI" which allows you to interact directly with the render API from the simulation thread (something that is normally reserved for the core thread). Most of the methods accept a @ref BansheeEngine::CoreThreadAccessor<CommandQueueSyncPolicy> "CoreThreadAccessor", and internally just queue commands on it. This allows you to perform low level rendering operations from the simulation thread.
+
+@ref BansheeEngine::Mesh "Mesh", @ref BansheeEngine::Texture "Texture" and @ref BansheeEngine::RenderTarget "RenderTarget" also provide several methods for performing core thread operations from the simulation thread via the core accessors.
+
+It's important to remember these methods are just a convenience, and internally they use the same command queuing methods we described in the previous section.
+
+# Core objects {#coreThread_b}
+Core objects are objects that need to exist on both simulation and core threads. Although you could technically handle such cases manually by using the command queue, it is useful to provide an interface that allows the user to work normally with an object without needing to know about the threading internals, and this is where core objects come in.
+
+For example, a @ref BansheeEngine::Mesh "Mesh" is a core object because we want to allow the user to intuitively work with it on the simulation thread (without having to know about command queue or the core thread), but we also want to use it on the core thread (it needs to create index/vertex buffers on the GPU, and have a DirectX/OpenGL representation).
+
+Every core object is split into two interfaces:
+ - @ref BansheeEngine::CoreObject "CoreObject" - Implementations of this interface represents the simulation thread counterpart of the object.
+ - @ref BansheeEngine::CoreObjectCore "CoreObjectCore" - Implementations of this interface represents the core thread counterpart of the object.
+ 
+When a @ref BansheeEngine::CoreObject "CoreObject" is created it internally queues the creation of its @ref BansheeEngine::CoreObjectCore "CoreObjectCore" counterpart on the main command queue. Similar thing happens when it is destroyed, a destroy operation is queued and sent to the core thread.
+
+Aside from initialization/destruction, core objects also support synchronization of data between the two threads (e.g. a @ref BansheeEngine::Light "Light" is a core object, and when the user changes light radius, it is automatically synchronized to its core thread counterpart @ref BansheeEngine::LightCore "LightCore").
+
+## Creating your own core objects {#coreThread_b_a}
+To create a custom core object, you need to implement the @ref BansheeEngine::CoreObject "CoreObject" class, which by default requires no methods to be implemented. 
+
+When creating your core object its important to note they are only allowed to be referenced using specialized shared pointers, and require specific initialization steps. The shared pointer needs to be created using the @ref BansheeEngine::bs_core_ptr_new<T> "bs_core_ptr_new<T>" method, followed by calls to @ref BansheeEngine::CoreObject::_setThisPtr "CoreObject::_setThisPtr" and @ref BansheeEngine::CoreObject::initialize "CoreObject::initialized". Due to this complex initialization procedure it is highly suggested that you create a static `create` method for your core object, which does every step automatically. For example:
+~~~~~~~~~~~~~{.cpp}
+SPtr<MyCoreObject> MyCoreObject::create()
+{
+	SPtr<MyCoreObject> myCoreObj = bs_core_ptr_new<MyCoreObject>();
+	myCoreObj->_setThisPtr(myCoreObj);
+	myCoreObj->initialize();
+	
+	return myCoreObj;
+}
+~~~~~~~~~~~~~
+
+You will also want to override @ref BansheeEngine::CoreObject::createCore "CoreObject::createCore", which creates the core thread counterpart of your object. It should return a normal shared pointer to your implementation of @ref BansheeEngine::CoreObjectCore "CoreObjectCore".
+
+Once a core thread object is created you can use it as a normal object, while you can retrieve its core thread counterpart by calling @ref BansheeEngine::CoreObject::getCore "CoreObject::getCore", which you can use on the core thread. Object creation/destruction will happen automatically on the valid thread, and you also get the ability to synchronize information between the two (see below).
+
+### CoreObjectCore {#coreThread_b_a_a}
+To create the core thread counterpart of a @ref BansheeEngine::CoreObject "CoreObject" you must implement the @ref BansheeEngine::CoreObjectCore "CoreObjectCore" class. 
+
+This object provides an @ref BansheeEngine::CoreObject::initialize "CoreObject::initialize" method. You should perform any initialization in this method instead of the constructor, as it is guaranteed to be run on the core thread.
+
+The destructor is always assumed to be executed on the core thread. For this reason you must ensure never to store references to CoreObjectCore on the simulation thread, because if they go out of scope there it will trigger an error. Similar rule applies to @ref BansheeEngine::CoreObject "CoreObjects" as they shouldn't be stored on the core thread.
+
+### Synchronization {#coreThread_b_a_b}
+Earlier we mentioned that aside from handling construction/destruction the core objects also provide a way to synchronize between the two threads. The synchronization is always one way, from @ref BansheeEngine::CoreObject "CoreObject" to @ref BansheeEngine::CoreObjectCore "CoreObjectCore". 
+
+Synchronization should happen whenever some property on the @ref BansheeEngine::CoreObject "CoreObject" changes, that you would wish to make available on the core thread. To synchronize implement the @ref BansheeEngine::CoreObject::syncToCore(FrameAlloc*) "CoreObject::syncToCore" method, which generates the data for synchronization, and @ref BansheeEngine::CoreObjectCore::syncToCore "CoreObjectCore::syncToCore" which accepts it.
+
+The synchronized data is transfered between the objects in the form of raw bytes, within the @ref BansheeEngine::CoreSyncData "CoreSyncData" structure. You can use @ref BansheeEngine::rttiGetElemSize "rttiGetElemSize" and @ref BansheeEngine::rttiWriteElem "rttiWriteElem" to encode fields into raw memory, and @ref BansheeEngine::rttiReadElem "rttiReadElem" to decode them. See the manual about [rtti](@ref rtti) for more information about serialization. @ref BansheeEngine::CoreObject::syncToCore(FrameAlloc*) "CoreObject::syncToCore" is provided an instance of @ref BansheeEngine::FrameAlloc "FrameAlloc" which should be used for allocating the serialization buffer. This is an allocator that is fast and doesn't require explicit memory deallocation making it perfect for synchronization. A simple synchronization example would look like so:
+~~~~~~~~~~~~~{.cpp}
+// CoreObject (creates the synchronization data)
+CoreSyncData MyCoreObject::syncToCore(FrameAlloc* allocator) 
+{
+	UINT32 size = 0;
+	size += rttiGetElemSize(mField1);
+	size += rttiGetElemSize(mField2);
+
+	UINT8* buffer = allocator->alloc(size);
+
+	char* dataPtr = (char*)buffer;
+	dataPtr = rttiWriteElem(mField1, dataPtr);
+	dataPtr = rttiWriteElem(mField2, dataPtr);
+
+	return CoreSyncData(buffer, size);
+}
+
+// CoreObjectCore (receives the synchronization data)
+void MyCoreObjectCore::syncToCore(const CoreSyncData& data) 
+{
+	char* dataPtr = (char*)data.getBuffer();
+
+	dataPtr = rttiReadElem(mField1, dataPtr);
+	dataPtr = rttiReadElem(mField2, dataPtr); 
+	
+	// Potentially trigger something depending on new data
+}
+~~~~~~~~~~~~~
+
+Whenever you need to trigger synchronization you must call @ref BansheeEngine::CoreObject::markCoreDirty "CoreObject::markCoreDirty" which notifies the system that synchronization is required. This will in turn trigger a call to @ref BansheeEngine::CoreObject::syncToCore(FrameAlloc*) "CoreObject::syncToCore" method you implemented earlier. Synchronization happens automatically for all dirty core objects once per frame. Optionally you may call @ref BansheeEngine::CoreObject::syncToCore(CoreAccessor&) "CoreObject::syncToCore" to manually queue the synchronization.
+
+See implementation of @ref BansheeEngine::Light "Light" and @ref BansheeEngine::LightCore "LightCore" in "BsLight.cpp" for a simple example of synchronization.
+
+### Dependencies {#coreThread_b_a_c}
+Core objects might be dependant on other core objects. For example a @ref BansheeEngine::Material "Material" is dependant on a @ref BansheeEngine::Shader "Shader". Whenever the shader's object is marked as dirty the material might want need to perform synchronization as well. In general whenever a dependancy core object is marked as dirty, its dependant will be synchronized as well.
+
+To add dependencies implement the @ref BansheeEngine::CoreObject::getCoreDependencies "CoreObject::getCoreDependencies" method, which returns all currently valid dependencies. Whenever the dependencies change call @ref BansheeEngine::CoreObject::markDependenciesDirty "CoreObject::markDependenciesDirty" so the system can refresh its dependency list.
+
+## Other features {#coreThread_b_b}
+Core objects also have some other potentially useful features:
+ - @ref BansheeEngine::CoreObject::getInternalID "CoreObject::getInternalID" will return a globally unique ID for the core object
+ - @ref BansheeEngine::CoreObject::destroy "CoreObject::destroy" will destroy the core object and its core thread counterpart. You do not need to call this manually as it will be automatically called when the object goes out of scope (is no longer referenced). The core thread counterpart (@ref BansheeEngine::CoreObjectCore "CoreObjectCore") will not be destroyed if something on the core thread is still holding a reference to it.
+ - Override @ref BansheeEngine::CoreObject::initialize "CoreObject::initialize" or @ref BansheeEngine::CoreObject::destroy "CoreObject::destroy" methods if you need to perform some initialization/destruction operations not suitable for the constructor/destructor (e.g. calling virtual methods).
+ - You can construct a core object without a core thread counterpart. Simply don't override @ref BansheeEngine::CoreObject::createCore "CoreObject::createCore".
+ - You can construct a core object with a @ref BansheeEngine::CoreObjectCore "CoreObjectCore" that isn't initialized on the core thread by setting the @ref BansheeEngine::CoreObject "CoreObject" constructor parameter `requiresCoreInit` to false.
+ - Core objects always hold a shared pointer to themselves. Use @ref BansheeEngine::CoreObject::getThisPtr "CoreObject::getThisPtr" to access it.

+ 2 - 2
Documentation/Manuals/Native/import.md

@@ -4,13 +4,13 @@ Creating custom importers						{#customImporters}
 
 Importers process a raw resource in a third-party format (like FBX mesh or a PNG image) into an engine-ready format (e.g. a @ref BansheeEngine::Mesh "Mesh" or a @ref BansheeEngine::Texture "Texture"). Banshee has an extensible importer system so you may easily add your own, either for existing resource types, or for new ones. If you are also interested in creating new resource types check out [this manual](@ref customResources).
 
-On the user-facing level resource import works through the @ref BansheeEngine::Importer "Importer" module. You call its @ref BansheeEngine::Importer::import "Importer::import" method which takes a path to the resource you want to import, and the system automatically finds the necessary importer plugin (if one is available) and returns the resource in an engine ready format. Optionally you can also supply the importer with @ref BansheeEngine::ImportOptions "ImportOptions" to control resource import in more details.
+On the user-facing level resource import works through the @ref BansheeEngine::Importer "Importer" module. You call its @ref BansheeEngine::Importer::import "Importer::import" method which takes a path to the resource you want to import, and the system automatically finds the necessary importer plugin (if one is available) and returns the resource in an engine ready format. Optionally you can also supply the importer with @ref BansheeEngine::ImportOptions "ImportOptions" to control resource import in more detail.
 
 To implement your own importer you need to implement the @ref BansheeEngine::SpecificImporter "SpecificImporter" interface.
 
 # Implementing SpecificImporter # {#customImporters_a}
 Implementing this interface involves implementation of the following methods:
- * @ref BansheeEngine::SpecificImporter::isExtensionSupported "isExtensionSupported" - Receives an extension and return true or false depending if the importer can process that file. Used by the importer to find which importer plugin to use for import of a specific file.
+ * @ref BansheeEngine::SpecificImporter::isExtensionSupported "isExtensionSupported" - Receives an extension and returns true or false depending if the importer can process that file. Used by the importer to find which importer plugin to use for import of a specific file.
  * @ref BansheeEngine::SpecificImporter::isMagicNumberSupported "isMagicNumberSupported" - Similar to the method above, but receives a magic number (first few bytes of a file) instead of the extension, as this is the more common way of identifying files on non-Windows systems.
  * @ref BansheeEngine::SpecificImporter::import "import" - Receives a path to a file, as well as a set of import options. This is the meat of the importer where you will read the file and convert it into engine ready format. When done the method returns a @ref BansheeEngine::Resource "Resource" of a valid type, or null if it failed. The method should take into account the import options it was provided (if your importer supports any).
  

+ 5 - 4
Documentation/Manuals/Native/index.md

@@ -17,10 +17,11 @@ The manuals generally do not cover user-facing functionality, and focus more on
 # API Reference # {#mainpage_b}
 API reference provides a categorized and hierarchical view of all the engine's classes. 
 
-All classes are categorized into three primary groups:
- - **Layers** - Layers make up the core of the engine. Each layer is built directly on top of the previous one. This is what most people will be interested in.
- - **Plugins** - Plugins are various interchangeable libraries that contain high level systems built on top of abstractions defined in the layers.
- - **Implementation** - This contains all the helper types used for implementation. This is included due to a limitation in our documentation system, and the user should generally never need to access types here manually.
+All classes are categorized into two primary groups:
+ - **Layers** - Layers make up the core of the engine. Each layer is built directly on top of the previous one. This is what most people will be interested in. Each layer also contains an *[INTERNAL]* category which contains lower level classes that are not meant for normal use, but can be important for those modifying the engine.
+ - **Plugins** - Plugins are various interchangeable libraries that contain high level systems built on top of abstractions defined in the layers. If you are modifying the engine you might be interested in this documentation, but it can be skipped for most normal users. 
+ 
+A separate *[IMPLEMENTATION]* category is also provided which contains base classes and templates that are used in construction of other types. You will almost never need this documentation as those specialized types inherit the documentation from their parents. 
  
 You should read the [architecture](@ref architecture) manual for a more detailed breakdown of the architecture.
 

+ 4 - 4
Documentation/Manuals/Native/plugins.md

@@ -13,7 +13,7 @@ The default Banshee @ref BansheeEngine::CoreApplication "Application" supports p
  
 The supported plugins will be automatically loaded and unloaded by the application as needed, all you need to do is to provide names of their libraries to the @ref BansheeEngine::START_UP_DESC "START_UP_DESC" used to initialize the application. All plugins should be in the same folder as the main application executable. 
 
-Aside from the supported plugins you can also create a fully custom plugins that you load or unload manually.
+Aside from the supported plugins you can also create fully custom plugins that you load or unload manually.
 
 # Implementing supported plugins {#customPlugins_a}
 All supported plugins implement an informal interface through global "extern" methods. The interface supports three methods:
@@ -42,7 +42,7 @@ extern "C" BS_MYPLUGIN_EXPORT void unloadPlugin()
 
 ~~~~~~~~~~~~~
 
-It's important that all instances of types (classes/structs) from the plugin are deleted before plugin unload happens. If this doesn't happen, and an object instance is deleted after the plugin has been unloaded you will end up with a corrupt virtual function table and a crash. Normally this is handled for you, but is good to keep in mind depending on what your plugin is doing.
+It's important that all instances of types (classes/structs) from the plugin are deleted before plugin unload happens. If this doesn't happen, and an object instance is deleted after the plugin has been unloaded you will end up with a corrupt virtual function table and a crash. Normally this is handled for you, but it's good to keep in mind depending on what your plugin is doing.
 
 The exact implementations of these methods differ depending for which system are you implementing a plugin for, but we won't go into details for individual systems here. In most cases it just involves registering the plugin instance using some global manager. For example check "BsSLPlugin.cpp" in the @ref BansheeSL plugin, which registers a new importer that supports ".bsl" files.
 
@@ -50,8 +50,8 @@ The exact implementations of these methods differ depending for which system are
 Custom plugins can do whatever you wish, engine has no expectations from them so its up to your to load/unload them and to call their methods.
 
 To load a custom plugin you can use:
- - @ref BansheeEngine::CoreApplication::loadPlugin "loadPlugin" - Accepts the name of the plugin library and outputs the library. Optionally you may also pass a parameter to the `loadPlugin` method, if yours accepts one.
- - @ref BansheeEngine::CoreApplication::unloadPlugin "unloadPlugin" - To unload a previously loaded plugin. 
+ - @ref BansheeEngine::CoreApplication::loadPlugin "Application::loadPlugin" - Accepts the name of the plugin library and outputs the library object. Optionally you may also pass a parameter to the `loadPlugin` method, if yours accepts one.
+ - @ref BansheeEngine::CoreApplication::unloadPlugin "Application::unloadPlugin" - Unloads a previously loaded plugin. 
 
 Both of those methods internally call @ref BansheeEngine::DynLibManager "DynLibManager". You can use it directly if you do not need the plugin interface (`loadPlugin` and etc.), it has two methods:
  - @ref BansheeEngine::DynLibManager::load "DynLibManager::load" - Accepts a file name to the library, and returns the @ref BansheeEngine::DynLib "DynLib" object if the load is successful or null otherwise. 

+ 2 - 1
Documentation/Manuals/Native/rtti.md

@@ -238,9 +238,10 @@ Implementations of `RTTIType` can optionally implement `onSerializationStarted´
 Each of those methods accepts an `IReflectable` pointer to the object currently being processed. Each type that implements `IReflectable` also comes with a `mRTTIData` field which is of `Any` type, and can be used for storing temporary data during serialization/deserialization (primarily along the methods above).
 
 # Using RTTI  {#rtti_d}
-Once you have an object with a RTTI type fully implement it you can use it for various purposes:
+Once you have an object with a RTTI type fully implement it you can use it for various purposes.
 
 ## Getting object information  {#rtti_d_a}
+
 ~~~~~~~~~~~~~{.cpp}
 IReflectable* myObject = ...;
 

+ 1 - 2
Documentation/Mono-3.8.0-IntegrationGuide.txt

@@ -49,8 +49,7 @@ In mini-amd64.h:
  - "./configure --host=i686-pc-mingw32"
  - "make"
  - "make install"
-- Your built mono should now be output to (OutputDir) folder. (If it's not in that folder
-  then check your Cygwin install folder under /usr/local)
+- Your built mono should now be output to (OutputDir) folder. (If it's not in that folder then check your Cygwin install folder under /usr/local)
 - Copy contents of (OutputDir)/include/mono/mono-2.0/mono to (BansheeRootDir)/Dependencies/Include/Mono
   - Make sure to modify "object.h" as you did above when building the binaries
 - Copy folder (OutputDir)/etc to (BansheeRootDir)/bin/Mono

+ 1 - 1
Source/BansheeCore/Include/BsShader.h

@@ -223,7 +223,7 @@ namespace BansheeEngine
 	};
 
 	/**
-	 * Shader represents a collection of techniques. They are used in Materials, which can be considered as instances of a 
+	 * Shader represents a collection of techniques. They are used in Material%s, which can be considered as instances of a 
 	 * Shader. Multiple materials may share the same shader but provide different parameters to it.
 	 *
 	 * Shader will always choose the first supported technique based on the current render system, render manager and other

+ 1 - 1
Source/BansheeCore/Include/BsSpecificImporter.h

@@ -21,7 +21,7 @@ namespace BansheeEngine
 	};
 
 	/**
-	 * Abstract class that is to be specialized in convertinga certain asset type into an engine usable resource. 
+	 * Abstract class that is to be specialized for converting a certain asset type into an engine usable resource
 	 * (for example a .png file into an engine usable texture).
 	 * 			
 	 * On initialization this class must register itself with the Importer module, which delegates asset import calls to a 

+ 0 - 1
Source/BansheeMono/Include/BsMonoManager.h

@@ -16,7 +16,6 @@ namespace BansheeEngine
 	/**	Available Mono versions. */
 	enum class MonoVersion
 	{
-		v4_0,
 		v4_5
 	};
 

+ 1 - 2
Source/BansheeMono/Source/BsMonoManager.cpp

@@ -27,9 +27,8 @@ namespace BansheeEngine
 		String version;
 	};
 
-	static const MonoVersionData MONO_VERSION_DATA[2] =
+	static const MonoVersionData MONO_VERSION_DATA[1] =
 	{
-		{ MONO_LIB_DIR + "mono\\4.0", "v4.0.30128" },
 		{ MONO_LIB_DIR + "mono\\4.5", "v4.0.30319" }
 	};
 

+ 0 - 3
Source/MBansheeEngine/Physics/DistanceJoint.cs

@@ -176,12 +176,10 @@ namespace BansheeEngine
             else
                 newFlags &= ~flag;
 
-            Debug.Log("SET FLAG" + flag + " - " + enabled + " - " + newFlags + " - " + [email protected]);
             if (newFlags == [email protected])
                 return false;
 
             [email protected] = newFlags;
-            Debug.Log([email protected]);
             return true;
         }
 
@@ -196,7 +194,6 @@ namespace BansheeEngine
         /// <inheritdoc/>
         internal override NativeJoint CreateNative()
         {
-            Debug.Log("CREATE: " + [email protected]);
             NativeDistanceJoint joint = new NativeDistanceJoint(commonData.@internal, data.@internal);
 
             return joint;