Mesh Loaderの書き込み

Custom Meshフォーマットを使用したい場合は、新しいMesh Loaderを使用して、Atomsを拡張できます。 Atomsは、Atoms MeshとAlembic Meshフォーマット(バージョン2.0以降)をサポートします。新しいMeshフォーマットを追加する場合は、

Atoms :: BaseMeshLoaderを拡張する新しいクラス定義を作成した後、その新しいローダークラスをAtomsプラグイン内に登録する必要があります。


クラス定義

#include <Atoms/Globals.h>
#include <AtomsCore/Metadata/MapMetadata.h>
#include <Atoms/Loaders/BaseMeshLoader.h>

#define kFooMeshLoaderId 101

namespace Atoms
{
	class ATOMSPLUGIN_EXPORT FooMeshLoader : public BaseMeshLoader
	{
	public:
		//! Type string
		/*!
		\return Class type string
		*/
		std::string typeStr() const;

		//! Class static type string. This is also the file extension of your file format
		static std::string const staticTypeStr;

		//! Type id
		/*!
		\return Class type id
		*/
		unsigned int typeId() const;

		//! Class static type id
		static const unsigned int staticTypeId;

		//! Constructor
		FooMeshLoader();

		//! Destructor
		~FooMeshLoader();

		//! Creator function
		/*!
		\return Return a new AlembicMeshLoader object
		*/
		static AtomsPtr<BaseMeshLoader> creator();

		//! load
		/*!
		Load an atoms file
		*/
		AtomsPtr<AtomsCore::MapMetadata> load(const std::string &filePath, const std::string& filter = "*");
	};
}

namespace Atoms
{
std::string const FooMeshLoader::staticTypeStr = "foo"; // the file extension

std::string FooMeshLoader::typeStr() const
{
	return FooMeshLoader::staticTypeStr;
}

const unsigned int FooMeshLoader::staticTypeId = kFooMeshLoaderId;

unsigned int FooMeshLoader::typeId() const
{
	return FooMeshLoader::staticTypeId;
}

FooMeshLoader::FooMeshLoader() :
	BaseMeshLoader()
{
}

FooMeshLoader::~FooMeshLoader()
{
}

AtomsPtr<BaseMeshLoader> FooMeshLoader::creator()
{
	return std::dynamic_pointer_cast<BaseMeshLoader>(std::make_shared<FooMeshLoader>());
}

AtomsPtr<AtomsCore::MapMetadata> FooMeshLoader::load(const std::string &filePath, const std::string& filter = "*")
{
	AtomsPtr<AtomsCore::MapMetadata>  skinMeshMetadata(new AtomsCore::MapMetadata);
	std::string fullPath = AtomsUtils::solvePath(filePath);
	std::vector<std::string> filterVec;
	if ((filter != "*") || (filter != ""))
	{
		AtomsUtils::splitString(AtomsUtils::eraseFromString(filter, ' '), ',', filterVec);
	}

	//load your mesh file here and start to fill the mapmetadata
	for (const std::string& geoName: fooGeoFileList)
	{
		//Check if the current geo is passing the filter
		if ((filterVec.size() > 0) && (!AtomsUtils::filterNames(filterVec, geoName)))
			continue;
	}

	...
	return skinMeshMetadata;
}
}


Atomsは、load関数を呼び出して新しいMeshフォーマットを読み込みます。この関数は、Meshファイルから読み込んだデータをMapMetadataに入力して返す必要があります。
このMapMetadataは複数のメッシュを含むことができ、次の構造に従う必要があります。

MapMetadata{
	"geo1":
	MapMetadata{
		"geo": MeshMetadata(), //This is the render/preview geo geo

		"cloth": MeshMetadata(), //If the mesh is a cloth mesh then fill this entry instead the geo

		"jointIndices": (optional)
		ArrayMetadata[ // skin joint ids per vertex, this must have the same length of the points array
			IntArrayMetadata(), // array of joint (influence) indices for the current vertex
			IntArrayMetadata(),
			...
		],

		"jointWeights": (optional)
		ArrayMetadata[ // skin joint weights per vertex, this must have the same length of the points array
			DoubleArrayMetadata(), // array of joint (influence) weight for the current vertex
			DoubleArrayMetadata(),
			...
		],

		"blendShapes": // Blend shapes data (optional)
		ArrayMetadata[
			MapMetadata{
				"id":IntMetadata(), // index of the current blend shape, this index is used at render/preview time to get the target weight from the agent metadata
				"name":StringMetadata(), // name of the target
				"P":Vector3ArrayMetadata(),
				"N":Vector3ArrayMetadata()
			},
			MapMetadata{
				"id":IntMetadata(),
				"name":StringMetadata(),
				"P":Vector3ArrayMetadata(),
				"N":Vector3ArrayMetadata()
			},
			...
		],

		"atoms":
		MapMetadata{ //Custom data. This data is written on the mesh sent to the renderer. You can use these attributes to drive shader attributes from he mesh. The mesh attribute on the arnold/rman/vray mesh will use the atoms_ prefix. (optional)
			"fooattr":DobuleMetadata(),
			"fooattr1":StringMetadata(),
			...
		},
		"arnold":
		MapMetadata{ // These attributes are converted to arnold polymesh node attributes (optional)
			"fooattr":DobuleMetadata(),
			"fooattr1":StringMetadata(),
			...
		},
		"rman":
		MapMetadata{ // These attributes are converted to rman mesh node attributes (optional)
			"fooattr":DobuleMetadata(),
			"fooattr1":StringMetadata(),
			...
		},
		"vray":
		MapMetadata{ // These attributes are converted to vray mesh node attributes (optional)
			"fooattr":DobuleMetadata(),
			"fooattr1":StringMetadata(),
			...
		}

		"xgen_Pref":Vector3ArrayMetadata(), // xgen pref point attribute (optional)
		"__Pref":Vector3ArrayMetadata(), // renderman pref point attribute (optional)
		"__WPref":Vector3ArrayMetadata(), // renderman wpref point attribute (optional)
		"__Nref":Vector3ArrayMetadata(), // renderman nref point attribute (optional)
		"__WNref":Vector3ArrayMetadata(), // renderman nwref point attribute (optional)


		"color":Vector3Metadata(), // Color used for preview without the textures by the skin mode (optional)
		"colorTexture":ImageMetadata(), // Texture used for preview by the skin mode (optional)
		"specularColor":Vector3Metadata(), // Specular color used for preview without the textures by the skin mode (optional)
		"specularColorTexture":ImageMetadata(), // Specular texture used for preview by the skin mode (optional)
	},

	"geo2":
	MapMetadata{...},
		
	"geo3":
	MapMetadata{...},

	...
}


新しいローダーをAtomsに登録する場合は:

extern "C"
{
	ATOMSPLUGIN_EXPORT bool initializePlugin()
	{
		MeshLoaderFactory& factory = MeshLoaderFactory::instance();
		factory.registerMeshLoader(FooMeshLoader::staticTypeStr, &FooMeshLoader::creator);
	}
}


Behaviour モジュールをコンパイルする

loaderは、プロシージャルでも使用されているので、新しいプラグインを2回コンパイルする必要があります。 Atoms.so / libライブラリへの初めてのリンクと、2回目はAtomsProcedural.so / libライブラリにリンクします。


Windows:

Visual Studioでdllプロジェクトを作成し、atom、tbbおよびopenexr includesを追加して、BUILD_ATOMSPLUGIN、WIN、_CRT_ECURE_NO_WARNINGS、_CRT_N NSTDC_NO_DEPRECATE、およびFBXSDK SHAREDをプリプロセッサ定義に追加します。
次に、別のターゲットを作成し、Atomsをリンクする代わりにAtomsProceduralをリンクします。


Linux:

Atoms、tbbおよびopendexr includesとBUILD_ATOMSPLUGINをプリプロセッサ定義に追加して、共有オブジェクトとしてコンパイルします。
次に、別のターゲットを作成し、Atomsをリンクする代わりにAtomsProceduralをリンクします。


プラグインの使用

ATOMS_PLUGINS_PATH環境変数では、Atomsに対してライブラリがコンパイルされるフォルダが追加され、ATOMS_PROCEDURAL_PLUGINS_ATH env変数では、AtomsProceduralに対して、コンパイルされたライブラリが配置されるパスが追加されます。

Copyright © 2017, Toolchefs LTD.