Import basic material options

--HG--
branch : feature-export-assimp
This commit is contained in:
kaetemi 2015-09-20 21:08:30 +02:00
parent ac5d9272f1
commit c9aef7b5a4
6 changed files with 193 additions and 6 deletions

View file

@ -0,0 +1,143 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2015 Winch Gate Property Limited
// Author: Jan Boon <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <nel/misc/types_nl.h>
#include "assimp_shape.h"
#include <assimp/postprocess.h>
#include <assimp/scene.h>
#include <assimp/Importer.hpp>
#define NL_NODE_INTERNAL_TYPE aiNode
#define NL_SCENE_INTERNAL_TYPE aiScene
#include "scene_context.h"
#include <nel/misc/debug.h>
#include <nel/misc/path.h>
#include <nel/misc/tool_logger.h>
#include <nel/3d/mesh.h>
using namespace std;
using namespace NLMISC;
using namespace NL3D;
// http://assimp.sourceforge.net/lib_html/materials.html
inline CRGBA convColor(const aiColor3D &ac)
{
return CRGBA(ac.r * 255.99f, ac.g * 255.99f, ac.b * 255.99f);
}
inline CRGBA convColor(const aiColor4D &ac)
{
return CRGBA(ac.r * 255.99f, ac.g * 255.99f, ac.b * 255.99f, ac.a * 255.99f);
}
CSmartPtr<CMaterial> assimpMaterial(CMeshUtilsContext &context, const aiMaterial *am)
{
CSmartPtr<CMaterial> matp = new CMaterial();
CMaterial &mat = *matp;
mat.initLighted();
mat.setShader(CMaterial::Normal);
int i;
float f;
aiColor3D c3;
aiColor4D c4;
if (am->Get(AI_MATKEY_TWOSIDED, i) == aiReturn_SUCCESS)
mat.setDoubleSided(i != 0);
if (am->Get(AI_MATKEY_BLEND_FUNC, i) == aiReturn_SUCCESS) switch ((aiBlendMode)i)
{
case aiBlendMode_Default:
mat.setSrcBlend(CMaterial::srcalpha);
mat.setDstBlend(CMaterial::invsrcalpha);
break;
case aiBlendMode_Additive:
mat.setSrcBlend(CMaterial::one);
mat.setDstBlend(CMaterial::one);
break;
}
if (am->Get(AI_MATKEY_OPACITY, f) == aiReturn_SUCCESS)
mat.setOpacity(f * 255.99f);
if (am->Get(AI_MATKEY_SHININESS, f) == aiReturn_SUCCESS)
mat.setShininess(f); // OR (float)pow(2.0, shininess * 10.0) * 4.f ??
if (am->Get(AI_MATKEY_COLOR_DIFFUSE, c3) == aiReturn_SUCCESS)
{
CRGBA diffuse = convColor(c3);
diffuse.A = mat.getOpacity();
mat.setDiffuse(diffuse);
}
if (am->Get(AI_MATKEY_COLOR_AMBIENT, c3) == aiReturn_SUCCESS)
mat.setAmbient(convColor(c3));
if (am->Get(AI_MATKEY_COLOR_SPECULAR, c3) == aiReturn_SUCCESS)
{
CRGBA specular = convColor(c3);
if (am->Get(AI_MATKEY_SHININESS_STRENGTH, f) == aiReturn_SUCCESS)
{
CRGBAF fColor = specular;
fColor *= f;
uint8 a = specular.A;
specular = fColor;
specular.A = a;
}
mat.setSpecular(specular);
}
if (am->Get(AI_MATKEY_COLOR_EMISSIVE, c3) == aiReturn_SUCCESS)
mat.setEmissive(convColor(c3));
return matp;
}
void assimpMaterials(CMeshUtilsContext &context)
{
const aiScene *scene = context.InternalScene;
for (unsigned int mi = 0; mi < scene->mNumMaterials; ++mi)
{
const aiMaterial *am = scene->mMaterials[mi];
for (unsigned int pi = 0; pi < am->mNumProperties; ++pi) // DEBUG
{ // DEBUG
const aiMaterialProperty *amp = am->mProperties[pi];
printf("%s\n", amp->mKey.C_Str());
} // DEBUG
aiString amname;
if (am->Get(AI_MATKEY_NAME, amname) != aiReturn_SUCCESS)
{
tlerror(context.ToolLogger, context.Settings.SourceFilePath.c_str(),
"Material has no name");
continue;
}
if (context.SceneMeta.Materials.find(amname.C_Str())
== context.SceneMeta.Materials.end())
{
context.SceneMeta.Materials[amname.C_Str()] = assimpMaterial(context, am);
}
}
}
/* end of file */

View file

@ -0,0 +1,24 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2015 Winch Gate Property Limited
// Author: Jan Boon <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <nel/misc/types_nl.h>
struct CMeshUtilsContext;
void assimpMaterials(CMeshUtilsContext &context);
/* end of file */

View file

@ -32,6 +32,8 @@
#define NL_NODE_INTERNAL_TYPE aiNode #define NL_NODE_INTERNAL_TYPE aiNode
#define NL_SCENE_INTERNAL_TYPE aiScene #define NL_SCENE_INTERNAL_TYPE aiScene
#include "scene_context.h" #include "scene_context.h"
#include "assimp_material.h"
#include "assimp_shape.h" #include "assimp_shape.h"
CMeshUtilsSettings::CMeshUtilsSettings() CMeshUtilsSettings::CMeshUtilsSettings()
@ -269,9 +271,10 @@ int exportScene(const CMeshUtilsSettings &settings)
// ] // ]
// -- SKEL FLAG -- // -- SKEL FLAG --
// TODO // First import materials
// First import materials... assimpMaterials(context);
// Import shapes
importShapes(context, context.InternalScene->mRootNode); importShapes(context, context.InternalScene->mRootNode);
return EXIT_SUCCESS; return EXIT_SUCCESS;

View file

@ -27,6 +27,8 @@
#include <nel/misc/smart_ptr.h> #include <nel/misc/smart_ptr.h>
#include <nel/misc/matrix.h> #include <nel/misc/matrix.h>
#include <nel/3d/shape.h>
#ifndef NL_NODE_INTERNAL_TYPE #ifndef NL_NODE_INTERNAL_TYPE
#define NL_NODE_INTERNAL_TYPE void #define NL_NODE_INTERNAL_TYPE void
#endif #endif
@ -36,6 +38,7 @@
namespace NL3D { namespace NL3D {
class IShape; class IShape;
class CMaterial;
} }
struct CNodeContext struct CNodeContext
@ -51,7 +54,7 @@ struct CNodeContext
bool IsBone; bool IsBone;
// NLMISC::CMatrix Transform; // TODO // NLMISC::CMatrix Transform; // TODO
NLMISC::CRefPtr<NL3D::IShape> Shape; NLMISC::CSmartPtr<NL3D::IShape> Shape;
}; };
typedef std::map<NLMISC::CSString, CNodeContext> TNodeContextMap; typedef std::map<NLMISC::CSString, CNodeContext> TNodeContextMap;

View file

@ -22,6 +22,8 @@
#include <nel/misc/stream.h> #include <nel/misc/stream.h>
#include <nel/misc/file.h> #include <nel/misc/file.h>
#include <nel/3d/material.h>
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
@ -47,7 +49,7 @@ void CNodeMeta::serial(NLMISC::IStream &s)
} }
CSceneMeta::CSceneMeta() : CSceneMeta::CSceneMeta() :
DefaultInstanceGroup(false), ExportDefaultIG(false),
SkeletonMode(TSkelRoot) SkeletonMode(TSkelRoot)
{ {
@ -77,10 +79,11 @@ void CSceneMeta::serial(NLMISC::IStream &s)
{ {
uint version = s.serialVersion(1); uint version = s.serialVersion(1);
s.serial(DefaultInstanceGroup); s.serial(ExportDefaultIG);
s.serial((uint32 &)SkeletonMode); s.serial((uint32 &)SkeletonMode);
s.serialCont(Nodes); s.serialCont(Nodes);
s.serialPtrCont(Materials);
} }
/* end of file */ /* end of file */

View file

@ -20,11 +20,18 @@
#include <nel/misc/types_nl.h> #include <nel/misc/types_nl.h>
#include <nel/misc/sstring.h> #include <nel/misc/sstring.h>
#include <nel/misc/smart_ptr.h>
#include <nel/3d/material.h>
namespace NLMISC { namespace NLMISC {
class IStream; class IStream;
} }
namespace NL3D {
class CMaterial;
}
enum TMesh enum TMesh
{ {
TMeshDisabled = 0, TMeshDisabled = 0,
@ -56,6 +63,7 @@ struct CNodeMeta
std::string InstanceGroupName; std::string InstanceGroupName;
bool AutoAnim; bool AutoAnim;
// std::vector<NLMISC::CSString> Materials; // In case there's an issue with nameless materials in some format... Map to material entirely in the meta editor.
void serial(NLMISC::IStream &s); void serial(NLMISC::IStream &s);
}; };
@ -67,13 +75,16 @@ enum TSkel
TSkelFull = 2, // Include all connected child nodes in the skeleton TSkelFull = 2, // Include all connected child nodes in the skeleton
}; };
typedef std::map<NLMISC::CSString, NLMISC::CSmartPtr<NL3D::CMaterial> > TMaterialMap;
struct CSceneMeta struct CSceneMeta
{ {
CSceneMeta(); CSceneMeta();
bool DefaultInstanceGroup; // Export a default instance group from nodes the scene that do not have an instance group set bool ExportDefaultIG; // Export a default instance group from nodes the scene that do not have an instance group set
TSkel SkeletonMode; TSkel SkeletonMode;
std::map<NLMISC::CSString, CNodeMeta> Nodes; std::map<NLMISC::CSString, CNodeMeta> Nodes;
TMaterialMap Materials;
const std::string &metaFilePath() const { return m_MetaFilePath; } const std::string &metaFilePath() const { return m_MetaFilePath; }