Remove branch unrelated features (must backout this changeset after merging into parent feature branch)
--HG-- branch : opengl3hg/feature/opengl3
parent
267e7397c5
commit
4b4ac31a3d
@ -1,45 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DYN_MAT_LOADER_H
|
|
||||||
#define DYN_MAT_LOADER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
class CDynMaterial;
|
|
||||||
|
|
||||||
class CDynMatLoader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CDynMatLoader();
|
|
||||||
~CDynMatLoader();
|
|
||||||
|
|
||||||
bool loadFrom( const std::string &fileName );
|
|
||||||
|
|
||||||
CDynMaterial* getDynMat() const{ return mat; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
CDynMaterial *mat;
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DYN_MATERIAL_H
|
|
||||||
#define DYN_MATERIAL_H
|
|
||||||
|
|
||||||
#include "nel/misc/stream.h"
|
|
||||||
#include "nel/misc/variant.h"
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
/// Rendering property
|
|
||||||
struct SDynMaterialProp
|
|
||||||
{
|
|
||||||
enum EPropertyType
|
|
||||||
{
|
|
||||||
Color,
|
|
||||||
Vector4,
|
|
||||||
Float,
|
|
||||||
Double,
|
|
||||||
Int,
|
|
||||||
Uint,
|
|
||||||
Matrix4,
|
|
||||||
Texture
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Id of the property
|
|
||||||
std::string prop;
|
|
||||||
|
|
||||||
/// Label of the property ( user-friendly name )
|
|
||||||
std::string label;
|
|
||||||
|
|
||||||
/// type of the property ( see EPropertyType )
|
|
||||||
uint8 type;
|
|
||||||
|
|
||||||
NLMISC::CVariant value;
|
|
||||||
|
|
||||||
void serial( NLMISC::IStream &f );
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/// Rendering pass data, contains the rendering properties for the pass
|
|
||||||
struct SRenderPass
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void addProperty( const SDynMaterialProp &prop );
|
|
||||||
void removeProperty( const std::string &name );
|
|
||||||
bool changeProperty( const std::string &name, const SDynMaterialProp &prop );
|
|
||||||
void setName( const std::string &n ){ name = n; }
|
|
||||||
void getName( std::string &n ) const { n = name; }
|
|
||||||
void getShaderRef( std::string &s ) const{ s = shaderRef; }
|
|
||||||
void setShaderRef( const std::string &s ){ shaderRef = s; }
|
|
||||||
void serial( NLMISC::IStream &f );
|
|
||||||
|
|
||||||
/// Returns the number of properties this pass has
|
|
||||||
uint32 count(){ return properties.size(); }
|
|
||||||
|
|
||||||
/// Clears all properties
|
|
||||||
void clear(){ properties.clear(); }
|
|
||||||
|
|
||||||
const SDynMaterialProp* getProperty( uint32 i ) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector< SDynMaterialProp > properties;
|
|
||||||
std::string shaderRef;
|
|
||||||
std::string name;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Multi-pass material for rendering using user shaders
|
|
||||||
class CDynMaterial : public NLMISC::IStreamable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CDynMaterial();
|
|
||||||
~CDynMaterial();
|
|
||||||
CDynMaterial& operator=( const CDynMaterial &other );
|
|
||||||
|
|
||||||
/// Clears all passes, and then adds a new pass
|
|
||||||
void reconstruct();
|
|
||||||
|
|
||||||
/// Clears all passes
|
|
||||||
void clear();
|
|
||||||
void serial( NLMISC::IStream &f );
|
|
||||||
std::string getClassName(){ return "CDynMaterial"; }
|
|
||||||
|
|
||||||
void addPass( const SRenderPass &pass );
|
|
||||||
void removePass( const std::string &name );
|
|
||||||
void renamePass( const std::string &from, const std::string &to );
|
|
||||||
void movePassUp( const std::string &name );
|
|
||||||
void movePassDown( const std::string &name );
|
|
||||||
|
|
||||||
SRenderPass* getPass( const std::string &name );
|
|
||||||
SRenderPass* getPass( uint32 i );
|
|
||||||
uint32 getPassCount(){ return passes.size(); }
|
|
||||||
void getPassList( std::vector< std::string > &l );
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector< SRenderPass* > passes;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef SHAPE_MAT_SERIALIZER_H
|
|
||||||
#define SHAPE_MAT_SERIALIZER_H
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
class IShape;
|
|
||||||
|
|
||||||
class ShapeMatSerial
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ShapeMatSerial();
|
|
||||||
~ShapeMatSerial();
|
|
||||||
void setShape( IShape *s ){ shape = s; }
|
|
||||||
void serial( const char *sPath );
|
|
||||||
|
|
||||||
private:
|
|
||||||
IShape *shape;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,44 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADER_LOADER_H
|
|
||||||
#define SHADER_LOADER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
class CUsrShaderManager;
|
|
||||||
|
|
||||||
class CUsrShaderLoader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CUsrShaderLoader();
|
|
||||||
~CUsrShaderLoader();
|
|
||||||
void setManager( CUsrShaderManager *mgr ){ manager = mgr; }
|
|
||||||
void loadShaders( const std::string &directory );
|
|
||||||
|
|
||||||
private:
|
|
||||||
void loadShader( const std::string &file );
|
|
||||||
|
|
||||||
CUsrShaderManager *manager;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef USR_SHADER_MANAGER_H
|
|
||||||
#define USR_SHADER_MANAGER_H
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
class CUsrShaderProgram;
|
|
||||||
class IUsrShaderVisitor;
|
|
||||||
|
|
||||||
/// Manages user defined shaders ( add, remove, change )
|
|
||||||
class CUsrShaderManager
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CUsrShaderManager();
|
|
||||||
~CUsrShaderManager();
|
|
||||||
|
|
||||||
/// Throw away the currently loaded shaders
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
/// Returns a list of the currently loaded shaders
|
|
||||||
void getShaderList( std::vector< std::string > &v );
|
|
||||||
|
|
||||||
/// Adds a shader
|
|
||||||
bool addShader( CUsrShaderProgram *program );
|
|
||||||
|
|
||||||
/// Removes a shader
|
|
||||||
bool removeShader( const std::string &name );
|
|
||||||
|
|
||||||
/// Changes a shader
|
|
||||||
bool changeShader( const std::string &name, CUsrShaderProgram *program );
|
|
||||||
|
|
||||||
/// Looks up and returns a shader
|
|
||||||
bool getShader( const std::string &name, CUsrShaderProgram *program );
|
|
||||||
|
|
||||||
|
|
||||||
void visitShaders( IUsrShaderVisitor *visitor );
|
|
||||||
void visitShader( const std::string &name, IUsrShaderVisitor *visitor );
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::map< std::string, CUsrShaderProgram* > programs;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADER_PROGRAM_H
|
|
||||||
#define SHADER_PROGRAM_H
|
|
||||||
|
|
||||||
#include "nel/misc/stream.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
class CUsrShaderProgram : public NLMISC::IStreamable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CUsrShaderProgram();
|
|
||||||
|
|
||||||
~CUsrShaderProgram();
|
|
||||||
|
|
||||||
std::string getClassName(){ return "CUsrShaderProgram"; }
|
|
||||||
|
|
||||||
void serial( NLMISC::IStream &f );
|
|
||||||
|
|
||||||
void getName( std::string &n ) const{ n = name; }
|
|
||||||
void getDescription( std::string &d ) const{ d = description; }
|
|
||||||
void getVP( std::string &vp ) const{ vp = vertexProgram; }
|
|
||||||
void getFP( std::string &fp ) const{ fp = fragmentProgram; }
|
|
||||||
|
|
||||||
void setName( const std::string &n ){ name = n; }
|
|
||||||
void setDescription( const std::string &d ){ description = d; }
|
|
||||||
void setVP( const std::string &vp ){ vertexProgram = vp; }
|
|
||||||
void setFP( const std::string &fp ){ fragmentProgram = fp; }
|
|
||||||
|
|
||||||
uint32 getVPId() const{ return vpId; }
|
|
||||||
uint32 getFPId() const{ return fpId; }
|
|
||||||
uint32 getPId() const{ return pId; }
|
|
||||||
|
|
||||||
void setVPId( uint32 id ){ vpId = id; }
|
|
||||||
void setFPId( uint32 id ){ fpId = id;}
|
|
||||||
void setPid( uint32 id ){ pId = id; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
std::string vertexProgram;
|
|
||||||
std::string fragmentProgram;
|
|
||||||
|
|
||||||
|
|
||||||
uint32 vpId;
|
|
||||||
uint32 fpId;
|
|
||||||
uint32 pId;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef USR_SHADER_SAVER_H
|
|
||||||
#define USR_SHADER_SAVER_H
|
|
||||||
|
|
||||||
#include "nel/3d/usr_shader_visitor.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
class CUsrShaderProgram;
|
|
||||||
class CUsrShaderManager;
|
|
||||||
|
|
||||||
class CUsrShaderSaver : public IUsrShaderVisitor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CUsrShaderSaver();
|
|
||||||
~CUsrShaderSaver();
|
|
||||||
|
|
||||||
void setManager( CUsrShaderManager *mgr ){ manager = mgr; }
|
|
||||||
|
|
||||||
void visit( CUsrShaderProgram *program );
|
|
||||||
|
|
||||||
void saveShaders( const std::string &directory );
|
|
||||||
void saveShader( const std::string &directory, const std::string &name );
|
|
||||||
|
|
||||||
private:
|
|
||||||
CUsrShaderManager *manager;
|
|
||||||
std::string outputDir;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef USR_SHADER_VISITOR_H
|
|
||||||
#define USR_SHADER_VISITOR_H
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
class CUsrShaderProgram;
|
|
||||||
|
|
||||||
class IUsrShaderVisitor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
IUsrShaderVisitor(){}
|
|
||||||
~IUsrShaderVisitor(){}
|
|
||||||
|
|
||||||
virtual void visit( CUsrShaderProgram *program ) = 0;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
@ -1,109 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef NLVARIANT_H
|
|
||||||
#define NLVARIANT_H
|
|
||||||
|
|
||||||
#include "nel/misc/stream.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#define VARIANT_VVAL_END 16
|
|
||||||
|
|
||||||
namespace NLMISC
|
|
||||||
{
|
|
||||||
class CVariant : public IStreamable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
enum EVarType
|
|
||||||
{
|
|
||||||
Float,
|
|
||||||
Double,
|
|
||||||
Int,
|
|
||||||
UInt,
|
|
||||||
String,
|
|
||||||
Vector4,
|
|
||||||
Matrix4
|
|
||||||
};
|
|
||||||
|
|
||||||
CVariant();
|
|
||||||
~CVariant();
|
|
||||||
|
|
||||||
std::string getClassName(){ return "CVariant"; }
|
|
||||||
|
|
||||||
void serial( IStream &f );
|
|
||||||
|
|
||||||
void setDouble( double d ){
|
|
||||||
type = Double;
|
|
||||||
uvalue.dval = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setFloat( float f ){
|
|
||||||
type = Float;
|
|
||||||
uvalue.fval = f;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setInt( int i ){
|
|
||||||
type = Int;
|
|
||||||
uvalue.ival = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setUInt( unsigned int u ){
|
|
||||||
type = UInt;
|
|
||||||
uvalue.uval = u;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setString( const std::string &s ){
|
|
||||||
type = String;
|
|
||||||
sval = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setVector4( const float *v );
|
|
||||||
void setMatrix4( const float *m );
|
|
||||||
|
|
||||||
double toDouble() const{ return uvalue.dval; }
|
|
||||||
float toFloat() const{ return uvalue.fval; }
|
|
||||||
int toInt() const{ return uvalue.ival; }
|
|
||||||
unsigned int toUInt() const{ return uvalue.uval; }
|
|
||||||
std::string toString() const{ return sval; }
|
|
||||||
void getVector4( float *v ) const;
|
|
||||||
void getMatrix4( float *m ) const;
|
|
||||||
|
|
||||||
bool valueAsString( std::string &s ) const;
|
|
||||||
void fromString( const std::string &s, EVarType t );
|
|
||||||
|
|
||||||
EVarType getType() const{ return type; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
union{
|
|
||||||
double dval;
|
|
||||||
float fval;
|
|
||||||
int ival;
|
|
||||||
unsigned int uval;
|
|
||||||
float vval[ VARIANT_VVAL_END ];
|
|
||||||
}uvalue;
|
|
||||||
|
|
||||||
std::string sval;
|
|
||||||
|
|
||||||
EVarType type;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/3d/dyn_mat_loader.h"
|
|
||||||
#include "nel/3d/dynamic_material.h"
|
|
||||||
#include "nel/misc/file.h"
|
|
||||||
#include "nel/misc/i_xml.h"
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
CDynMatLoader::CDynMatLoader()
|
|
||||||
{
|
|
||||||
mat = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
CDynMatLoader::~CDynMatLoader()
|
|
||||||
{
|
|
||||||
mat = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CDynMatLoader::loadFrom( const std::string &fileName )
|
|
||||||
{
|
|
||||||
NLMISC::CIFile ifile;
|
|
||||||
if( !ifile.open( fileName, true ) )
|
|
||||||
{
|
|
||||||
nlinfo( "Error opening file %s", fileName.c_str() );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
NLMISC::CIXml xml;
|
|
||||||
if( !xml.init( ifile ) )
|
|
||||||
{
|
|
||||||
ifile.close();
|
|
||||||
nlinfo( "Error initializing XML stream for file %s", fileName.c_str() );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mat = new CDynMaterial();
|
|
||||||
mat->serial( xml );
|
|
||||||
|
|
||||||
ifile.close();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,383 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/3d/dynamic_material.h"
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
void SDynMaterialProp::serial( NLMISC::IStream &f )
|
|
||||||
{
|
|
||||||
f.xmlPush( "property" );
|
|
||||||
|
|
||||||
f.xmlPush( "id" );
|
|
||||||
f.serial( prop );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "label" );
|
|
||||||
f.serial( label );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "type" );
|
|
||||||
f.serial( type );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "value" );
|
|
||||||
f.serial( value );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SRenderPass::serial( NLMISC::IStream &f )
|
|
||||||
{
|
|
||||||
f.xmlPush( "pass" );
|
|
||||||
|
|
||||||
f.xmlPush( "name" );
|
|
||||||
f.serial( name );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "shader" );
|
|
||||||
f.serial( shaderRef );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "properties" );
|
|
||||||
|
|
||||||
if( !f.isReading() )
|
|
||||||
{
|
|
||||||
uint32 n = properties.size();
|
|
||||||
f.xmlPush( "count" );
|
|
||||||
f.serial( n );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
std::vector< SDynMaterialProp >::iterator itr = properties.begin();
|
|
||||||
while( itr != properties.end() )
|
|
||||||
{
|
|
||||||
itr->serial( f );
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint32 n;
|
|
||||||
f.xmlPush( "count" );
|
|
||||||
f.serial( n );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
for( uint32 i = 0; i < n; i++ )
|
|
||||||
{
|
|
||||||
SDynMaterialProp prop;
|
|
||||||
prop.serial( f );
|
|
||||||
properties.push_back( prop );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SRenderPass::addProperty( const SDynMaterialProp &prop )
|
|
||||||
{
|
|
||||||
std::vector< SDynMaterialProp >::const_iterator itr = properties.begin();
|
|
||||||
while( itr != properties.end() )
|
|
||||||
{
|
|
||||||
if( itr->prop == prop.prop )
|
|
||||||
break;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
if( itr != properties.end() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
properties.push_back( prop );
|
|
||||||
}
|
|
||||||
|
|
||||||
void SRenderPass::removeProperty( const std::string &name )
|
|
||||||
{
|
|
||||||
std::vector< SDynMaterialProp >::iterator itr = properties.begin();
|
|
||||||
while( itr != properties.end() )
|
|
||||||
{
|
|
||||||
if( itr->prop == name )
|
|
||||||
break;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
if( itr == properties.end() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
properties.erase( itr );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SRenderPass::changeProperty( const std::string &name, const SDynMaterialProp &prop )
|
|
||||||
{
|
|
||||||
std::vector< SDynMaterialProp >::iterator itr = properties.begin();
|
|
||||||
while( itr != properties.end() )
|
|
||||||
{
|
|
||||||
if( itr->prop == name )
|
|
||||||
break;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
if( itr == properties.end() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
itr->prop = prop.prop;
|
|
||||||
itr->label = prop.label;
|
|
||||||
itr->type = prop.type;
|
|
||||||
itr->value = prop.value;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const SDynMaterialProp* SRenderPass::getProperty( uint32 i ) const
|
|
||||||
{
|
|
||||||
if( i >= properties.size() )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return &( properties[ i ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
CDynMaterial::CDynMaterial()
|
|
||||||
{
|
|
||||||
reconstruct();
|
|
||||||
}
|
|
||||||
|
|
||||||
CDynMaterial::~CDynMaterial()
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
CDynMaterial& CDynMaterial::operator=( const CDynMaterial &other )
|
|
||||||
{
|
|
||||||
if( &other != this )
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
|
|
||||||
std::vector< SRenderPass* >::const_iterator itr = other.passes.begin();
|
|
||||||
while( itr != other.passes.end() )
|
|
||||||
{
|
|
||||||
SRenderPass *pass = new SRenderPass();
|
|
||||||
*pass = *(*itr);
|
|
||||||
passes.push_back( pass );
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::reconstruct()
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
SRenderPass *p = new SRenderPass();
|
|
||||||
p->setName( "pass1" );
|
|
||||||
passes.push_back( p );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::clear()
|
|
||||||
{
|
|
||||||
std::vector< SRenderPass* >::iterator itr = passes.begin();
|
|
||||||
while( itr != passes.end() )
|
|
||||||
{
|
|
||||||
delete *itr;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
passes.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::serial( NLMISC::IStream &f )
|
|
||||||
{
|
|
||||||
f.xmlPush( "Material" );
|
|
||||||
|
|
||||||
int version = f.serialVersion( 1 );
|
|
||||||
|
|
||||||
f.xmlPush( "passes" );
|
|
||||||
|
|
||||||
if( !f.isReading() )
|
|
||||||
{
|
|
||||||
uint32 n = passes.size();
|
|
||||||
f.xmlPush( "count" );
|
|
||||||
f.serial( n );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
std::vector< SRenderPass* >::iterator itr = passes.begin();
|
|
||||||
while( itr != passes.end() )
|
|
||||||
{
|
|
||||||
(*itr)->serial( f );
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
uint32 n;
|
|
||||||
f.xmlPush( "count" );
|
|
||||||
f.serial( n );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
for( uint32 i = 0; i < n; i++ )
|
|
||||||
{
|
|
||||||
SRenderPass *pass = new SRenderPass();
|
|
||||||
pass->serial( f );
|
|
||||||
passes.push_back( pass );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::addPass( const SRenderPass &pass )
|
|
||||||
{
|
|
||||||
std::string n;
|
|
||||||
std::string name;
|
|
||||||
pass.getName( name );
|
|
||||||
|
|
||||||
std::vector< SRenderPass* >::iterator itr = passes.begin();
|
|
||||||
while( itr != passes.end() )
|
|
||||||
{
|
|
||||||
(*itr)->getName( n );
|
|
||||||
if( n == name )
|
|
||||||
break;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
if( itr != passes.end() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
SRenderPass *p = new SRenderPass();
|
|
||||||
*p = pass;
|
|
||||||
passes.push_back( p );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::removePass( const std::string &name )
|
|
||||||
{
|
|
||||||
std::string n;
|
|
||||||
std::vector< SRenderPass* >::iterator itr = passes.begin();
|
|
||||||
while( itr != passes.end() )
|
|
||||||
{
|
|
||||||
(*itr)->getName( n );
|
|
||||||
if( n == name )
|
|
||||||
break;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( itr != passes.end() )
|
|
||||||
{
|
|
||||||
delete *itr;
|
|
||||||
passes.erase( itr );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::renamePass( const std::string &from, const std::string &to )
|
|
||||||
{
|
|
||||||
std::string n;
|
|
||||||
std::vector< SRenderPass* >::iterator itr = passes.begin();
|
|
||||||
while( itr != passes.end() )
|
|
||||||
{
|
|
||||||
(*itr)->getName( n );
|
|
||||||
if( n == from )
|
|
||||||
break;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( itr != passes.end() )
|
|
||||||
(*itr)->setName( to );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::movePassUp( const std::string &name )
|
|
||||||
{
|
|
||||||
std::string n;
|
|
||||||
uint32 i = 0;
|
|
||||||
for( i = 0; i < passes.size(); i++ )
|
|
||||||
{
|
|
||||||
passes[ i ]->getName( n );
|
|
||||||
if( n == name )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( i >= passes.size() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( i == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
SRenderPass *temp = passes[ i ];
|
|
||||||
passes[ i ] = passes[ i - 1 ];
|
|
||||||
passes[ i - 1 ] = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::movePassDown( const std::string &name )
|
|
||||||
{
|
|
||||||
std::string n;
|
|
||||||
uint32 i = 0;
|
|
||||||
for( i = 0; i < passes.size(); i++ )
|
|
||||||
{
|
|
||||||
passes[ i ]->getName( n );
|
|
||||||
if( n == name )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( i >= passes.size() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( i == ( passes.size() - 1 ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
SRenderPass *temp = passes[ i ];
|
|
||||||
passes[ i ] = passes[ i + 1 ];
|
|
||||||
passes[ i + 1 ] = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
SRenderPass* CDynMaterial::getPass( const std::string &name )
|
|
||||||
{
|
|
||||||
std::string n;
|
|
||||||
std::vector< SRenderPass* >::iterator itr = passes.begin();
|
|
||||||
while( itr != passes.end() )
|
|
||||||
{
|
|
||||||
(*itr)->getName( n );
|
|
||||||
if( n == name )
|
|
||||||
break;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
if( itr == passes.end() )
|
|
||||||
return NULL;
|
|
||||||
else
|
|
||||||
return *itr;
|
|
||||||
}
|
|
||||||
|
|
||||||
SRenderPass* CDynMaterial::getPass( uint32 i )
|
|
||||||
{
|
|
||||||
if( i >= passes.size() )
|
|
||||||
return NULL;
|
|
||||||
else
|
|
||||||
return passes[ i ];
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDynMaterial::getPassList( std::vector< std::string > &l )
|
|
||||||
{
|
|
||||||
std::vector< SRenderPass* >::iterator itr = passes.begin();
|
|
||||||
while( itr != passes.end() )
|
|
||||||
{
|
|
||||||
std::string name;
|
|
||||||
|
|
||||||
(*itr)->getName( name );
|
|
||||||
l.push_back( name );
|
|
||||||
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/3d/shape_material_serializer.h"
|
|
||||||
#include "nel/3d/shape.h"
|
|
||||||
#include "nel/3d/material.h"
|
|
||||||
#include "nel/3d/dynamic_material.h"
|
|
||||||
#include "nel/3d/mesh_base.h"
|
|
||||||
#include "nel/misc/file.h"
|
|
||||||
#include "nel/misc/o_xml.h"
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
ShapeMatSerial::ShapeMatSerial()
|
|
||||||
{
|
|
||||||
shape = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShapeMatSerial::~ShapeMatSerial()
|
|
||||||
{
|
|
||||||
shape = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShapeMatSerial::serial( const char *sPath )
|
|
||||||
{
|
|
||||||
if( shape == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
nlinfo( "Exporting materials of %s", sPath );
|
|
||||||
|
|
||||||
std::string path = sPath;
|
|
||||||
std::string fname;
|
|
||||||
std::string::size_type idx;
|
|
||||||
|
|
||||||
idx = path.find_last_of( '.' );
|
|
||||||
path = path.substr( 0, idx );
|
|
||||||
|
|
||||||
CMeshBase *mb = dynamic_cast< CMeshBase* >( shape );
|
|
||||||
if( mb != NULL )
|
|
||||||
{
|
|
||||||
uint n = mb->getNbMaterial();
|
|
||||||
nlinfo( "exporting %u materials", n );
|
|
||||||
|
|
||||||
for( int i = 0; i < n; i++ )
|
|
||||||
{
|
|
||||||
CMaterial &m = mb->getMaterial( i );
|
|
||||||
CDynMaterial *dm = m.getDynMat();
|
|
||||||
if( dm == NULL )
|
|
||||||
{
|
|
||||||
m.createDynMat();
|
|
||||||
dm = m.getDynMat();
|
|
||||||
}
|
|
||||||
|
|
||||||
fname = path + "_";
|
|
||||||
fname += char( '0' + i );
|
|
||||||
fname += ".nelmat";
|
|
||||||
|
|
||||||
nlinfo( "exporting to %s", fname.c_str() );
|
|
||||||
|
|
||||||
NLMISC::COFile o;
|
|
||||||
if( o.open( fname ) )
|
|
||||||
{
|
|
||||||
NLMISC::COXml xml;
|
|
||||||
if( xml.init( &o ) )
|
|
||||||
{
|
|
||||||
dm->serial( xml );
|
|
||||||
xml.flush();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nlerror( "Error initializing XML output stream for %s", fname.c_str() );
|
|
||||||
}
|
|
||||||
o.close();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nlerror( "Error creating file %s", fname.c_str() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/3d/usr_shader_loader.h"
|
|
||||||
#include "nel/3d/usr_shader_manager.h"
|
|
||||||
#include "nel/3d/usr_shader_program.h"
|
|
||||||
#include "nel/misc/file.h"
|
|
||||||
#include "nel/misc/path.h"
|
|
||||||
#include "nel/misc/i_xml.h"
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
CUsrShaderLoader::CUsrShaderLoader()
|
|
||||||
{
|
|
||||||
manager = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
CUsrShaderLoader::~CUsrShaderLoader()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderLoader::loadShaders( const std::string &directory )
|
|
||||||
{
|
|
||||||
if( manager == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::vector< std::string > files;
|
|
||||||
|
|
||||||
NLMISC::CPath::getPathContent( directory, true, false, true, files );
|
|
||||||
|
|
||||||
std::vector< std::string >::iterator itr = files.begin();
|
|
||||||
while( itr != files.end() )
|
|
||||||
{
|
|
||||||
if( NLMISC::CFile::getExtension( *itr ) == "nlshdr" )
|
|
||||||
{
|
|
||||||
loadShader( *itr );
|
|
||||||
}
|
|
||||||
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderLoader::loadShader( const std::string &file )
|
|
||||||
{
|
|
||||||
NLMISC::CIFile f;
|
|
||||||
if( !f.open( file, true ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
NLMISC::CIXml xml;
|
|
||||||
if( !xml.init( f ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CUsrShaderProgram *p = new CUsrShaderProgram();
|
|
||||||
p->serial( xml );
|
|
||||||
manager->addShader( p );
|
|
||||||
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,157 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/3d/usr_shader_manager.h"
|
|
||||||
#include "nel/3d/usr_shader_program.h"
|
|
||||||
#include "nel/3d/usr_shader_visitor.h"
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
CUsrShaderManager::CUsrShaderManager()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CUsrShaderManager::~CUsrShaderManager()
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CUsrShaderManager::clear()
|
|
||||||
{
|
|
||||||
std::map< std::string, CUsrShaderProgram* >::iterator itr = programs.begin();
|
|
||||||
while( itr != programs.end() )
|
|
||||||
{
|
|
||||||
delete itr->second;
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
programs.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderManager::getShaderList( std::vector< std::string > &v )
|
|
||||||
{
|
|
||||||
v.clear();
|
|
||||||
|
|
||||||
std::string n;
|
|
||||||
std::map< std::string, CUsrShaderProgram* >::iterator itr = programs.begin();
|
|
||||||
while( itr != programs.end() )
|
|
||||||
{
|
|
||||||
itr->second->getName( n );
|
|
||||||
v.push_back( n );
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CUsrShaderManager::addShader( CUsrShaderProgram *program )
|
|
||||||
{
|
|
||||||
std::string n;
|
|
||||||
program->getName( n );
|
|
||||||
|
|
||||||
std::map< std::string, CUsrShaderProgram* >::iterator itr
|
|
||||||
= programs.find( n );
|
|
||||||
if( itr != programs.end() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
programs[ n ] = program;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CUsrShaderManager::removeShader( const std::string &name )
|
|
||||||
{
|
|
||||||
std::map< std::string, CUsrShaderProgram* >::iterator itr
|
|
||||||
= programs.find( name );
|
|
||||||
if( itr == programs.end() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
delete itr->second;
|
|
||||||
itr->second = NULL;
|
|
||||||
programs.erase( itr );
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CUsrShaderManager::changeShader( const std::string &name, CUsrShaderProgram *program )
|
|
||||||
{
|
|
||||||
std::map< std::string, CUsrShaderProgram* >::iterator itr
|
|
||||||
= programs.find( name );
|
|
||||||
if( itr == programs.end() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
CUsrShaderProgram *p = itr->second;
|
|
||||||
std::string s;
|
|
||||||
|
|
||||||
program->getName( s );
|
|
||||||
p->setName( s );
|
|
||||||
|
|
||||||
program->getDescription( s );
|
|
||||||
p->setDescription( s );
|
|
||||||
|
|
||||||
program->getVP( s );
|
|
||||||
p->setVP( s );
|
|
||||||
|
|
||||||
program->getFP( s );
|
|
||||||
p->setFP( s );
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CUsrShaderManager::getShader( const std::string &name, CUsrShaderProgram *program )
|
|
||||||
{
|
|
||||||
std::map< std::string, CUsrShaderProgram* >::iterator itr
|
|
||||||
= programs.find( name );
|
|
||||||
if( itr == programs.end() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
CUsrShaderProgram *p = itr->second;
|
|
||||||
std::string s;
|
|
||||||
|
|
||||||
program->setName( name );
|
|
||||||
|
|
||||||
p->getDescription( s );
|
|
||||||
program->setDescription( s );
|
|
||||||
|
|
||||||
p->getVP( s );
|
|
||||||
program->setVP( s );
|
|
||||||
|
|
||||||
p->getFP( s );
|
|
||||||
program->setFP( s );
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderManager::visitShaders( IUsrShaderVisitor *visitor )
|
|
||||||
{
|
|
||||||
std::map< std::string, CUsrShaderProgram* >::iterator itr = programs.begin();
|
|
||||||
while( itr != programs.end() )
|
|
||||||
{
|
|
||||||
visitor->visit( itr->second );
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderManager::visitShader( const std::string &name, IUsrShaderVisitor *visitor )
|
|
||||||
{
|
|
||||||
std::map< std::string, CUsrShaderProgram* >::iterator itr =
|
|
||||||
programs.find( name );
|
|
||||||
if( itr == programs.end() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
visitor->visit( itr->second );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/3d/usr_shader_program.h"
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
CUsrShaderProgram::CUsrShaderProgram()
|
|
||||||
{
|
|
||||||
vpId = 0;
|
|
||||||
fpId = 0;
|
|
||||||
pId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
CUsrShaderProgram::~CUsrShaderProgram()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderProgram::serial( NLMISC::IStream &f )
|
|
||||||
{
|
|
||||||
f.xmlPush( "ShaderProgram" );
|
|
||||||
|
|
||||||
int version = f.serialVersion( 1 );
|
|
||||||
|
|
||||||
f.xmlPush( "Name" );
|
|
||||||
f.serial( name );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "Description" );
|
|
||||||
f.serial( description );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "VertexProgram" );
|
|
||||||
f.serial( vertexProgram );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "FragmentProgram" );
|
|
||||||
f.serial( fragmentProgram );
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/3d/usr_shader_saver.h"
|
|
||||||
#include "nel/3d/usr_shader_manager.h"
|
|
||||||
#include "nel/3d/usr_shader_program.h"
|
|
||||||
#include "nel/misc/file.h"
|
|
||||||
#include "nel/misc/o_xml.h"
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
CUsrShaderSaver::CUsrShaderSaver()
|
|
||||||
{
|
|
||||||
manager = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
CUsrShaderSaver::~CUsrShaderSaver()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderSaver::visit( CUsrShaderProgram *program )
|
|
||||||
{
|
|
||||||
std::string fn;
|
|
||||||
program->getName( fn );
|
|
||||||
fn += ".nlshdr";
|
|
||||||
|
|
||||||
fn = outputDir + "/" + fn;
|
|
||||||
|
|
||||||
NLMISC::COFile of;
|
|
||||||
if( !of.open( fn, false, true ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
NLMISC::COXml xml;
|
|
||||||
if( !xml.init( &of ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
program->serial( xml );
|
|
||||||
|
|
||||||
xml.flush();
|
|
||||||
of.close();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderSaver::saveShaders( const std::string &directory )
|
|
||||||
{
|
|
||||||
outputDir = directory;
|
|
||||||
manager->visitShaders( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CUsrShaderSaver::saveShader( const std::string &directory, const std::string &name )
|
|
||||||
{
|
|
||||||
outputDir = directory;
|
|
||||||
manager->visitShader( name, this );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,320 +0,0 @@
|
|||||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/variant.h"
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
|
|
||||||
namespace NLMISC
|
|
||||||
{
|
|
||||||
CVariant::CVariant()
|
|
||||||
{
|
|
||||||
std::fill( uvalue.vval, uvalue.vval + VARIANT_VVAL_END, 0.0f );
|
|
||||||
type = String;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVariant::~CVariant()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CVariant::serial( IStream &f )
|
|
||||||
{
|
|
||||||
uint v = f.serialVersion( 1 );
|
|
||||||
|
|
||||||
f.xmlPush( "type" );
|
|
||||||
|
|
||||||
if( !f.isReading() )
|
|
||||||
{
|
|
||||||
uint t = type;
|
|
||||||
f.serial( t );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint t;
|
|
||||||
f.serial( t );
|
|
||||||
type = EVarType( t );
|
|
||||||
}
|
|
||||||
|
|
||||||
f.xmlPop();
|
|
||||||
|
|
||||||
f.xmlPush( "value" );
|
|
||||||
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
case Double:
|
|
||||||
{
|
|
||||||
f.serial( uvalue.dval );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Float:
|
|
||||||
{
|
|
||||||
f.serial( uvalue.fval );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Int:
|
|
||||||
{
|
|
||||||
f.serial( uvalue.ival );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case UInt:
|
|
||||||
{
|
|
||||||
f.serial( uvalue.uval );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case String:
|
|
||||||
{
|
|
||||||
f.serial( sval );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( !f.isReading() )
|
|
||||||
{
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
case Vector4:
|
|
||||||
{
|
|
||||||
float fval;
|
|
||||||
for( int i = 0; i < 4; i++ )
|
|
||||||
{
|
|
||||||
fval = uvalue.vval[ i ];
|
|
||||||
f.serial( fval );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Matrix4:
|
|
||||||
{
|
|
||||||
float fval;
|
|
||||||
for( int i = 0; i < 16; i++ )
|
|
||||||
{
|
|
||||||
fval = uvalue.vval[ i ];
|
|
||||||
f.serial( fval );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
|
|
||||||
case Vector4:
|
|
||||||
{
|
|
||||||
float fval;
|
|
||||||
for( int i = 0; i < 4; i++ )
|
|
||||||
{
|
|
||||||
f.serial( fval );
|
|
||||||
uvalue.vval[ i ] = fval;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Matrix4:
|
|
||||||
{
|
|
||||||
float fval;
|
|
||||||
for( int i = 0; i < 16; i++ )
|
|
||||||
{
|
|
||||||
f.serial( fval );
|
|
||||||
uvalue.vval[ i ] = fval;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
f.xmlPop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CVariant::setVector4( const float *v )
|
|
||||||
{
|
|
||||||
for( int i = 0; i < 4; i++ )
|
|
||||||
uvalue.vval[ i ] = v[ i ];
|
|
||||||
type = Vector4;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CVariant::setMatrix4( const float *m )
|
|
||||||
{
|
|
||||||
for( int i = 0; i < 16; i++ )
|
|
||||||
uvalue.vval[ i ] = m[ i ];
|
|
||||||
type = Matrix4;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CVariant::getVector4( float *v ) const
|
|
||||||
{
|
|
||||||
for( int i = 0; i < 4; i++ )
|
|
||||||
v[ i ] = uvalue.vval[ i ];
|
|
||||||
}
|
|
||||||
|
|
||||||
void CVariant::getMatrix4( float *m ) const
|
|
||||||
{
|
|
||||||
for( int i = 0; i < 16; i++ )
|
|
||||||
m[ i ] = uvalue.vval[ i ];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CVariant::valueAsString( std::string &s ) const
|
|
||||||
{
|
|
||||||
std::stringstream ss;
|
|
||||||
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
case Double:
|
|
||||||
{
|
|
||||||
ss << uvalue.dval;
|
|
||||||
s = ss.str();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Float:
|
|
||||||
{
|
|
||||||
ss << uvalue.fval;
|
|
||||||
s = ss.str();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Int:
|
|
||||||
{
|
|
||||||
ss << uvalue.ival;
|
|
||||||
s = ss.str();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case UInt:
|
|
||||||
{
|
|
||||||
ss << uvalue.uval;
|
|
||||||
s = ss.str();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case String:
|
|
||||||
{
|
|
||||||
s = sval;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Vector4:
|
|
||||||
{
|
|
||||||
for( int i = 0; i < 4; i++ )
|
|
||||||
ss << uvalue.vval[ i ] << " ";
|
|
||||||
s = ss.str();
|
|
||||||
s.resize( s.size() - 1 );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Matrix4:
|
|
||||||
{
|
|
||||||
for( int i = 0; i < 16; i++ )
|
|
||||||
ss << uvalue.vval[ i ] << " ";
|
|
||||||
s = ss.str();
|
|
||||||
s.resize( s.size() - 1 );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CVariant::fromString( const std::string &s, EVarType t )
|
|
||||||
{
|
|
||||||
type = t;
|
|
||||||
sval = "";
|
|
||||||
std::fill( uvalue.vval, uvalue.vval + VARIANT_VVAL_END, 0.0 );
|
|
||||||
|
|
||||||
if( s.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch( t )
|
|
||||||
{
|
|
||||||
case Double:
|
|
||||||
{
|
|
||||||
uvalue.dval = strtod( s.c_str(), NULL );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Float:
|
|
||||||
{
|
|
||||||
uvalue.fval = strtod( s.c_str(), NULL );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Int:
|
|
||||||
{
|
|
||||||
uvalue.ival = strtod( s.c_str(), NULL );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case UInt:
|
|
||||||
{
|
|
||||||
uvalue.uval = strtod( s.c_str(), NULL );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case String:
|
|
||||||
{
|
|
||||||
sval = s;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Vector4:
|
|
||||||
{
|
|
||||||
std::stringstream ss( s );
|
|
||||||
|
|
||||||
for( int i = 0; i < 4; i++ )
|
|
||||||
{
|
|
||||||
ss >> uvalue.vval[ i ];
|
|
||||||
if( !ss.good() )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Matrix4:
|
|
||||||
{
|
|
||||||
std::stringstream ss( s );
|
|
||||||
|
|
||||||
for( int i = 0; i < 16; i++ )
|
|
||||||
{
|
|
||||||
ss >> uvalue.vval[ i ];
|
|
||||||
if( !ss.good() )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,120 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>ActionEditor</class>
|
|
||||||
<widget class="QWidget" name="ActionEditor">
|
|
||||||
<property name="windowModality">
|
|
||||||
<enum>Qt::ApplicationModal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>340</width>
|
|
||||||
<height>145</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Action Editor</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Handler</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QLineEdit" name="handlerEdit">
|
|
||||||
<property name="text">
|
|
||||||
<string>Handler</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Parameters</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLineEdit" name="paramsEdit">
|
|
||||||
<property name="text">
|
|
||||||
<string>Parameters</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Conditions</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QLineEdit" name="condEdit">
|
|
||||||
<property name="text">
|
|
||||||
<string>Conditions</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>11</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="okButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>OK</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="cancelButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Cancel</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>38</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
<zorder>verticalSpacer</zorder>
|
|
||||||
<zorder></zorder>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,79 +0,0 @@
|
|||||||
INCLUDE_DIRECTORIES(
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
${QT_INCLUDES}
|
|
||||||
)
|
|
||||||
|
|
||||||
FILE(GLOB SRC *.cpp *.h)
|
|
||||||
|
|
||||||
SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h)
|
|
||||||
|
|
||||||
SET(OVQT_PLUGIN_MATERIAL_EDITOR_HDR
|
|
||||||
material_editor_context.h
|
|
||||||
material_editor_plugin.h
|
|
||||||
material_editor_window.h
|
|
||||||
material_editor_core_listener.h
|
|
||||||
material_properties.h
|
|
||||||
material_property_editor.h
|
|
||||||
material_widget.h
|
|
||||||
material_splitter.h
|
|
||||||
render_passes.h
|
|
||||||
shader_editor.h
|
|
||||||
shader_widget.h
|
|
||||||
prop_browser_ctrl.h
|
|
||||||
viewport_widget.h
|
|
||||||
fog_widget.h
|
|
||||||
lights_widget.h
|
|
||||||
)
|
|
||||||
|
|
||||||
SET(OVQT_PLUGIN_MATERIAL_EDITOR_UIS
|
|
||||||
material_editor_window.ui
|
|
||||||
material_properties.ui
|
|
||||||
material_property_editor.ui
|
|
||||||
material_widget.ui
|
|
||||||
render_passes.ui
|
|
||||||
shader_editor.ui
|
|
||||||
shader_widget.ui
|
|
||||||
fog_widget.ui
|
|
||||||
lights_widget.ui
|
|
||||||
)
|
|
||||||
|
|
||||||
SET(QT_USE_QTGUI TRUE)
|
|
||||||
SET(QT_USE_QTOPENGL TRUE)
|
|
||||||
|
|
||||||
QT4_ADD_RESOURCES(OVQT_PLUGIN_MATERIAL_EDITOR_RC_SRCS ${OVQT_PLUGIN_MATERIAL_EDITOR_RCS})
|
|
||||||
QT4_WRAP_CPP(OVQT_PLUGIN_MATERIAL_EDITOR_MOC_SRC ${OVQT_PLUGIN_MATERIAL_EDITOR_HDR})
|
|
||||||
QT4_WRAP_UI(OVQT_PLUGIN_MATERIAL_EDITOR_UI_HDRS ${OVQT_PLUGIN_MATERIAL_EDITOR_UIS})
|
|
||||||
|
|
||||||
SOURCE_GROUP(QtResources FILES ${OVQT_PLUGIN_MATERIAL_EDITOR_UIS})
|
|
||||||
SOURCE_GROUP(QtGeneratedUiHdr FILES ${OVQT_PLUGIN_MATERIAL_EDITOR_UI_HDRS})
|
|
||||||
SOURCE_GROUP(QtGeneratedMocQrcSrc FILES ${OVQT_PLUGIN_MATERIAL_EDITOR_MOC_SRC} OVQT_PLUGIN_MATERIAL_EDITOR_RC_SRCS)
|
|
||||||
SOURCE_GROUP("Material Editor Plugin" FILES ${SRC})
|
|
||||||
SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC})
|
|
||||||
|
|
||||||
ADD_LIBRARY(ovqt_plugin_material_editor MODULE ${SRC}
|
|
||||||
${OVQT_PLUGIN_MATERIAL_EDITOR_MOC_SRC}
|
|
||||||
${OVQT_EXT_SYS_SRC}
|
|
||||||
${OVQT_PLUGIN_MATERIAL_EDITOR_UI_HDRS}
|
|
||||||
${OVQT_PLUGIN_MATERIAL_EDITOR_RC_SRCS}
|
|
||||||
)
|
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(
|
|
||||||
ovqt_plugin_material_editor
|
|
||||||
ovqt_plugin_core
|
|
||||||
qt_property_browser
|
|
||||||
nelmisc
|
|
||||||
nel3d
|
|
||||||
${QT_LIBRARIES}
|
|
||||||
${QT_QTOPENGL_LIBRARY}
|
|
||||||
)
|
|
||||||
|
|
||||||
NL_DEFAULT_PROPS(ovqt_plugin_material_editor "NeL, Tools, 3D: Object Viewer Qt Plugin: Material Editor")
|
|
||||||
NL_ADD_RUNTIME_FLAGS(ovqt_plugin_material_editor)
|
|
||||||
NL_ADD_LIB_SUFFIX(ovqt_plugin_material_editor)
|
|
||||||
|
|
||||||
ADD_DEFINITIONS(-DMATERIAL_EDITOR_LIBRARY -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS})
|
|
||||||
|
|
||||||
INSTALL(TARGETS ovqt_plugin_material_editor LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d)
|
|
File diff suppressed because it is too large
Load Diff
@ -1,116 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "fog_widget.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
#include <QColorDialog>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
FogWidget::FogWidget( QWidget *parent ) :
|
|
||||||
QWidget( parent )
|
|
||||||
{
|
|
||||||
iface = NULL;
|
|
||||||
setupUi( this );
|
|
||||||
setupConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
FogWidget::~FogWidget()
|
|
||||||
{
|
|
||||||
iface = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FogWidget::loadValues()
|
|
||||||
{
|
|
||||||
SFogSettings s;
|
|
||||||
iface->getFogSettings( s );
|
|
||||||
|
|
||||||
fogCB->setChecked( s.enable );
|
|
||||||
startSB->setValue( s.start );
|
|
||||||
endSB->setValue( s.end );
|
|
||||||
setColorButtonColor( s.color[ 0 ], s.color[ 1 ], s.color[ 2 ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
void FogWidget::setupConnections()
|
|
||||||
{
|
|
||||||
connect( fogCB, SIGNAL( clicked( bool ) ), this, SLOT( onFogCBClicked() ) );
|
|
||||||
connect( startSB, SIGNAL( valueChanged( double ) ), this, SLOT( onStartSBChanged() ) );
|
|
||||||
connect( endSB, SIGNAL( valueChanged( double ) ), this, SLOT( onEndSBChanged() ) );
|
|
||||||
connect( colorButton, SIGNAL( clicked( bool ) ), this, SLOT( onColorButtonClicked() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void FogWidget::onFogCBClicked()
|
|
||||||
{
|
|
||||||
SFogSettings s;
|
|
||||||
iface->getFogSettings( s );
|
|
||||||
|
|
||||||
s.enable = fogCB->isChecked();
|
|
||||||
|
|
||||||
iface->setFogSettings( s );
|
|
||||||
|
|
||||||
if( !s.enable )
|
|
||||||
iface->setBGColor( 255, 255, 255, 255 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void FogWidget::onStartSBChanged()
|
|
||||||
{
|
|
||||||
SFogSettings s;
|
|
||||||
iface->getFogSettings( s );
|
|
||||||
|
|
||||||
s.start = startSB->value();
|
|
||||||
|
|
||||||
iface->setFogSettings( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
void FogWidget::onEndSBChanged()
|
|
||||||
{
|
|
||||||
SFogSettings s;
|
|
||||||
iface->getFogSettings( s );
|
|
||||||
|
|
||||||
s.end = endSB->value();
|
|
||||||
|
|
||||||
iface->setFogSettings( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
void FogWidget::onColorButtonClicked()
|
|
||||||
{
|
|
||||||
QColor c = QColorDialog::getColor();
|
|
||||||
|
|
||||||
setColorButtonColor( c.red(), c.green(), c.blue() );
|
|
||||||
|
|
||||||
SFogSettings s;
|
|
||||||
iface->getFogSettings( s );
|
|
||||||
|
|
||||||
s.color[ 0 ] = c.red();
|
|
||||||
s.color[ 1 ] = c.green();
|
|
||||||
s.color[ 2 ] = c.blue();
|
|
||||||
s.color[ 3 ] = 255;
|
|
||||||
|
|
||||||
iface->setFogSettings( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
void FogWidget::setColorButtonColor( int r, int g, int b )
|
|
||||||
{
|
|
||||||
QString sh;
|
|
||||||
sh = QString( "background-color: rgb(%1, %2, %3);" ).arg( r ).arg( g ).arg( b );
|
|
||||||
colorButton->setStyleSheet( sh );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef FOG_WIDGET_H
|
|
||||||
#define FOG_WIDGET_H
|
|
||||||
|
|
||||||
#include "ui_fog_widget.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class CNel3DInterface;
|
|
||||||
|
|
||||||
class FogWidget : public QWidget, public Ui::FogWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
FogWidget( QWidget *parent = NULL );
|
|
||||||
~FogWidget();
|
|
||||||
|
|
||||||
void loadValues();
|
|
||||||
|
|
||||||
void setNl3DIface( CNel3DInterface *iface ){ this->iface = iface; }
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onFogCBClicked();
|
|
||||||
void onStartSBChanged();
|
|
||||||
void onEndSBChanged();
|
|
||||||
void onColorButtonClicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupConnections();
|
|
||||||
void setColorButtonColor( int r, int g, int b );
|
|
||||||
|
|
||||||
|
|
||||||
CNel3DInterface *iface;
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>FogWidget</class>
|
|
||||||
<widget class="QWidget" name="FogWidget">
|
|
||||||
<property name="windowModality">
|
|
||||||
<enum>Qt::ApplicationModal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>278</width>
|
|
||||||
<height>116</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Fog settings</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetMaximumSize</enum>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QCheckBox" name="fogCB">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable fog</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Start</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="startSB"/>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>End</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="endSB"/>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Color</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QPushButton" name="colorButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,270 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "lights_widget.h"
|
|
||||||
#include <QColorDialog>
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
enum LWLightTypes
|
|
||||||
{
|
|
||||||
DIRECTIONAL,
|
|
||||||
POINT,
|
|
||||||
SPOT
|
|
||||||
};
|
|
||||||
|
|
||||||
enum LWColorButton
|
|
||||||
{
|
|
||||||
AMBIENT,
|
|
||||||
DIFFUSE,
|
|
||||||
SPECULAR
|
|
||||||
};
|
|
||||||
|
|
||||||
void LightsWidget::setButtonColor( unsigned char butt, int r, int g, int b )
|
|
||||||
{
|
|
||||||
QString sh;
|
|
||||||
QPushButton *button;
|
|
||||||
|
|
||||||
if( butt > SPECULAR )
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch( butt )
|
|
||||||
{
|
|
||||||
case AMBIENT:
|
|
||||||
button = ambientButton;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DIFFUSE:
|
|
||||||
button = diffuseButton;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SPECULAR:
|
|
||||||
button = specularButton;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sh = QString( "background-color: rgb(%1, %2, %3);" ).arg( r ).arg( g ).arg( b );
|
|
||||||
button->setStyleSheet( sh );
|
|
||||||
|
|
||||||
buttonColors[ butt ][ 0 ] = r;
|
|
||||||
buttonColors[ butt ][ 1 ] = g;
|
|
||||||
buttonColors[ butt ][ 2 ] = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LightsWidget::LightsWidget( QWidget *parent ) :
|
|
||||||
QWidget( parent )
|
|
||||||
{
|
|
||||||
setupUi( this );
|
|
||||||
setupConnections();
|
|
||||||
|
|
||||||
typeCB->addItem( "Directional light" );
|
|
||||||
typeCB->addItem( "Point light" );
|
|
||||||
typeCB->addItem( "Spot light" );
|
|
||||||
}
|
|
||||||
|
|
||||||
LightsWidget::~LightsWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::loadValues()
|
|
||||||
{
|
|
||||||
disableChangeConnections();
|
|
||||||
|
|
||||||
unsigned char c = iface->getMaxLights();
|
|
||||||
|
|
||||||
lightList->clear();
|
|
||||||
|
|
||||||
for( unsigned char i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
QString s = "light";
|
|
||||||
s += QString::number( i );
|
|
||||||
lightList->addItem( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
lightList->setCurrentRow( 0 );
|
|
||||||
loadLight( 0 );
|
|
||||||
|
|
||||||
// loadLight enables it anyways
|
|
||||||
//setupChangeConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::setupConnections()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::setupChangeConnections()
|
|
||||||
{
|
|
||||||
connect( enableCB, SIGNAL( toggled( bool ) ), this, SLOT( onChanges() ) );
|
|
||||||
connect( ambientButton, SIGNAL( clicked( bool ) ), this, SLOT( onAmbButtonClicked() ) );
|
|
||||||
connect( diffuseButton, SIGNAL( clicked( bool ) ), this, SLOT( onDiffButtonClicked() ) );
|
|
||||||
connect( specularButton, SIGNAL( clicked( bool ) ), this, SLOT( onSpecButtonClicked() ) );
|
|
||||||
connect( lightList, SIGNAL( currentRowChanged( int ) ), this, SLOT( onLightChanged( int ) ) );
|
|
||||||
|
|
||||||
connect( typeCB, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onChanges() ) );
|
|
||||||
connect( xSB, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
connect( ySB, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
connect( zSB, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
connect( constAttnButton, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
connect( linearAttnButton, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
connect( quadAttnButton, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::disableChangeConnections()
|
|
||||||
{
|
|
||||||
disconnect( enableCB, SIGNAL( toggled( bool ) ), this, SLOT( onChanges() ) );
|
|
||||||
disconnect( ambientButton, SIGNAL( clicked( bool ) ), this, SLOT( onAmbButtonClicked() ) );
|
|
||||||
disconnect( diffuseButton, SIGNAL( clicked( bool ) ), this, SLOT( onDiffButtonClicked() ) );
|
|
||||||
disconnect( specularButton, SIGNAL( clicked( bool ) ), this, SLOT( onSpecButtonClicked() ) );
|
|
||||||
disconnect( lightList, SIGNAL( currentRowChanged( int ) ), this, SLOT( onLightChanged( int ) ) );
|
|
||||||
|
|
||||||
disconnect( typeCB, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onChanges() ) );
|
|
||||||
disconnect( xSB, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
disconnect( ySB, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
disconnect( zSB, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
disconnect( constAttnButton, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
disconnect( linearAttnButton, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
disconnect( quadAttnButton, SIGNAL( valueChanged( double ) ), this, SLOT( onChanges() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::onAmbButtonClicked()
|
|
||||||
{
|
|
||||||
QColor c = QColorDialog::getColor();
|
|
||||||
setButtonColor( AMBIENT, c.red(), c.green(), c.blue() );
|
|
||||||
applyChanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::onDiffButtonClicked()
|
|
||||||
{
|
|
||||||
QColor c = QColorDialog::getColor();
|
|
||||||
setButtonColor( DIFFUSE, c.red(), c.green(), c.blue() );
|
|
||||||
applyChanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::onSpecButtonClicked()
|
|
||||||
{
|
|
||||||
QColor c = QColorDialog::getColor();
|
|
||||||
setButtonColor( SPECULAR, c.red(), c.green(), c.blue() );
|
|
||||||
applyChanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::onLightChanged( int light )
|
|
||||||
{
|
|
||||||
loadLight( light );
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::onChanges()
|
|
||||||
{
|
|
||||||
applyChanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::loadLight( unsigned char light )
|
|
||||||
{
|
|
||||||
disableChangeConnections();
|
|
||||||
|
|
||||||
SLightInfo info;
|
|
||||||
iface->getLightInfo( light, info );
|
|
||||||
|
|
||||||
if( info.enabled )
|
|
||||||
enableCB->setChecked( true );
|
|
||||||
else
|
|
||||||
enableCB->setChecked( false );
|
|
||||||
|
|
||||||
switch( info.type )
|
|
||||||
{
|
|
||||||
case SLightInfo::Directional:
|
|
||||||
typeCB->setCurrentIndex( DIRECTIONAL );
|
|
||||||
break;
|
|
||||||
case SLightInfo::Point:
|
|
||||||
typeCB->setCurrentIndex( POINT );
|
|
||||||
break;
|
|
||||||
case SLightInfo::Spot:
|
|
||||||
typeCB->setCurrentIndex( SPOT );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
xSB->setValue( info.posOrDir[ 0 ] );
|
|
||||||
ySB->setValue( info.posOrDir[ 1 ] );
|
|
||||||
zSB->setValue( info.posOrDir[ 2 ] );
|
|
||||||
|
|
||||||
constAttnButton->setValue( info.constAttn );
|
|
||||||
linearAttnButton->setValue( info.linAttn );
|
|
||||||
quadAttnButton->setValue( info.quadAttn );
|
|
||||||
|
|
||||||
setButtonColor( AMBIENT, info.ambColor[ 0 ] * 255.0f,
|
|
||||||
info.ambColor[ 1 ] * 255.0f,
|
|
||||||
info.ambColor[ 2 ] * 255.0f );
|
|
||||||
|
|
||||||
setButtonColor( DIFFUSE, info.diffColor[ 0 ] * 255.0f,
|
|
||||||
info.diffColor[ 1 ] * 255.0f,
|
|
||||||
info.diffColor[ 2 ] * 255.0f );
|
|
||||||
|
|
||||||
setButtonColor( SPECULAR, info.specColor[ 0 ] * 255.0f,
|
|
||||||
info.specColor[ 1 ] * 255.0f,
|
|
||||||
info.specColor[ 2 ] * 255.0f );
|
|
||||||
|
|
||||||
setupChangeConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::saveLight( unsigned char light )
|
|
||||||
{
|
|
||||||
SLightInfo info;
|
|
||||||
|
|
||||||
info.enabled = enableCB->isChecked();
|
|
||||||
switch( typeCB->currentIndex() )
|
|
||||||
{
|
|
||||||
case DIRECTIONAL:
|
|
||||||
info.type = SLightInfo::Directional;
|
|
||||||
break;
|
|
||||||
case POINT:
|
|
||||||
info.type = SLightInfo::Point;
|
|
||||||
break;
|
|
||||||
case SPOT:
|
|
||||||
info.type = SLightInfo::Spot;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
info.posOrDir[ 0 ] = static_cast< float >( xSB->value() );
|
|
||||||
info.posOrDir[ 1 ] = static_cast< float >( ySB->value() );
|
|
||||||
info.posOrDir[ 2 ] = static_cast< float >( zSB->value() );
|
|
||||||
|
|
||||||
info.constAttn = static_cast< float >( constAttnButton->value() );
|
|
||||||
info.linAttn = static_cast< float >( linearAttnButton->value() );
|
|
||||||
info.quadAttn = static_cast< float >( quadAttnButton->value() );
|
|
||||||
|
|
||||||
info.ambColor[ 0 ] = buttonColors[ AMBIENT ][ 0 ] / 255.0f;
|
|
||||||
info.ambColor[ 1 ] = buttonColors[ AMBIENT ][ 1 ] / 255.0f;
|
|
||||||
info.ambColor[ 2 ] = buttonColors[ AMBIENT ][ 2 ] / 255.0f;
|
|
||||||
info.diffColor[ 0 ] = buttonColors[ DIFFUSE ][ 0 ] / 255.0f;
|
|
||||||
info.diffColor[ 1 ] = buttonColors[ DIFFUSE ][ 1 ] / 255.0f;
|
|
||||||
info.diffColor[ 2 ] = buttonColors[ DIFFUSE ][ 2 ] / 255.0f;
|
|
||||||
info.specColor[ 0 ] = buttonColors[ SPECULAR ][ 0 ] / 255.0f;
|
|
||||||
info.specColor[ 1 ] = buttonColors[ SPECULAR ][ 1 ] / 255.0f;
|
|
||||||
info.specColor[ 2 ] = buttonColors[ SPECULAR ][ 2 ] / 255.0f;
|
|
||||||
|
|
||||||
iface->setLightInfo( light, info );
|
|
||||||
}
|
|
||||||
|
|
||||||
void LightsWidget::applyChanges()
|
|
||||||
{
|
|
||||||
int row = lightList->currentRow();
|
|
||||||
saveLight( static_cast< unsigned char >( row ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LIGHTS_WIDGET_H
|
|
||||||
#define LIGHTS_WIDGET_H
|
|
||||||
|
|
||||||
#include "ui_lights_widget.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class CNel3DInterface;
|
|
||||||
|
|
||||||
class LightsWidget : public QWidget, public Ui::LightsWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setButtonColor( unsigned char butt, int r, int g, int b );
|
|
||||||
|
|
||||||
public:
|
|
||||||
LightsWidget( QWidget *parent = NULL );
|
|
||||||
~LightsWidget();
|
|
||||||
void setNL3DIface( CNel3DInterface *iface ){ this->iface = iface; }
|
|
||||||
void loadValues();
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onAmbButtonClicked();
|
|
||||||
void onDiffButtonClicked();
|
|
||||||
void onSpecButtonClicked();
|
|
||||||
void onLightChanged( int light );
|
|
||||||
void onChanges();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupConnections();
|
|
||||||
void setupChangeConnections();
|
|
||||||
void disableChangeConnections();
|
|
||||||
void loadLight( unsigned char light );
|
|
||||||
void saveLight( unsigned char light );
|
|
||||||
void applyChanges();
|
|
||||||
|
|
||||||
CNel3DInterface *iface;
|
|
||||||
|
|
||||||
enum LightType
|
|
||||||
{
|
|
||||||
Directional,
|
|
||||||
Point,
|
|
||||||
Spot
|
|
||||||
};
|
|
||||||
|
|
||||||
int buttonColors[ 3 ][ 3 ];
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
@ -1,229 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>LightsWidget</class>
|
|
||||||
<widget class="QWidget" name="LightsWidget">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>495</width>
|
|
||||||
<height>434</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Light settings</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
|
||||||
<item row="0" column="2">
|
|
||||||
<widget class="QCheckBox" name="enableCB">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QGroupBox" name="groupBox_4">
|
|
||||||
<property name="title">
|
|
||||||
<string>Type</string>
|
|
||||||
</property>
|
|
||||||
<widget class="QComboBox" name="typeCB">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>10</x>
|
|
||||||
<y>20</y>
|
|
||||||
<width>99</width>
|
|
||||||
<height>20</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QGroupBox" name="groupBox">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Direction or Position</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>X</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="xSB">
|
|
||||||
<property name="minimum">
|
|
||||||
<double>-9999.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>9999.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Y</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="ySB">
|
|
||||||
<property name="minimum">
|
|
||||||
<double>-9999.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>9999.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_4">
|
|
||||||
<property name="text">
|
|
||||||
<string>Z</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="zSB">
|
|
||||||
<property name="minimum">
|
|
||||||
<double>-9999.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>9999.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="2">
|
|
||||||
<widget class="QGroupBox" name="groupBox_3">
|
|
||||||
<property name="title">
|
|
||||||
<string>Attenuation</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_8">
|
|
||||||
<property name="text">
|
|
||||||
<string>Constant</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="constAttnButton"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_9">
|
|
||||||
<property name="text">
|
|
||||||
<string>Linear</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="linearAttnButton"/>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_10">
|
|
||||||
<property name="text">
|
|
||||||
<string>Quadratic</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="quadAttnButton"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="2" rowspan="2">
|
|
||||||
<widget class="QGroupBox" name="groupBox_2">
|
|
||||||
<property name="title">
|
|
||||||
<string>Color</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_2">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_5">
|
|
||||||
<property name="text">
|
|
||||||
<string>Ambient</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QPushButton" name="ambientButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_6">
|
|
||||||
<property name="text">
|
|
||||||
<string>Diffuse</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QPushButton" name="diffuseButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_7">
|
|
||||||
<property name="text">
|
|
||||||
<string>Specular</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QPushButton" name="specularButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0" rowspan="6">
|
|
||||||
<widget class="QListWidget" name="lightList">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,33 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef MATERIAL_EDITOR_CONSTANTS_H
|
|
||||||
#define MATERIAL_EDITOR_CONSTANTS_H
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
namespace Constants
|
|
||||||
{
|
|
||||||
|
|
||||||
const char * const GUI_EDITOR_PLUGIN = "MaterialEditor";
|
|
||||||
const char * const GUI_EDITOR_SECTION = "MaterialEditor";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "material_editor_context.h"
|
|
||||||
#include "material_editor_window.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
MaterialEditorContext::MaterialEditorContext( QObject *parent ) :
|
|
||||||
IContext( parent ),
|
|
||||||
m_materialEditorWindow( 0 )
|
|
||||||
{
|
|
||||||
m_materialEditorWindow = new MaterialEditorWindow();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorContext::open()
|
|
||||||
{
|
|
||||||
m_materialEditorWindow->onOpenClicked();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorContext::newDocument()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorContext::save()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorContext::saveAs()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorContext::close()
|
|
||||||
{
|
|
||||||
m_materialEditorWindow->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget *MaterialEditorContext::widget()
|
|
||||||
{
|
|
||||||
return m_materialEditorWindow;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MATERIAL_EDITOR_CONTEXT_H
|
|
||||||
#define MATERIAL_EDITOR_CONTEXT_H
|
|
||||||
|
|
||||||
#include "../core/icontext.h"
|
|
||||||
|
|
||||||
#include "nel/misc/app_context.h"
|
|
||||||
|
|
||||||
#include <QtCore/QObject>
|
|
||||||
#include <QtGui/QIcon>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class MaterialEditorWindow;
|
|
||||||
|
|
||||||
class MaterialEditorContext: public Core::IContext
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
MaterialEditorContext(QObject *parent = 0);
|
|
||||||
virtual ~MaterialEditorContext() {}
|
|
||||||
|
|
||||||
virtual QString id() const{ return QLatin1String("MaterialEditorContext"); }
|
|
||||||
|
|
||||||
virtual QString trName() const{ return tr("Material Editor"); }
|
|
||||||
|
|
||||||
virtual QIcon icon() const{ return QIcon(); }
|
|
||||||
|
|
||||||
void open();
|
|
||||||
|
|
||||||
void newDocument();
|
|
||||||
|
|
||||||
void save();
|
|
||||||
|
|
||||||
void saveAs();
|
|
||||||
|
|
||||||
void close();
|
|
||||||
|
|
||||||
virtual QUndoStack *undoStack(){ return NULL; }
|
|
||||||
|
|
||||||
virtual QWidget *widget();
|
|
||||||
|
|
||||||
MaterialEditorWindow *m_materialEditorWindow;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,28 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "material_editor_core_listener.h"
|
|
||||||
#include "material_editor_window.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
bool MaterialEditorCoreListener::closeMainWindow() const
|
|
||||||
{
|
|
||||||
return mainWindow->close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MATERIAL_EDITOR_CORE_LISTENER_H
|
|
||||||
#define MATERIAL_EDITOR_CORE_LISTENER_H
|
|
||||||
|
|
||||||
#include "../core/icore_listener.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class MaterialEditorWindow;
|
|
||||||
|
|
||||||
class MaterialEditorCoreListener : public Core::ICoreListener
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
MaterialEditorCoreListener( MaterialEditorWindow *mainWindow, QObject *parent = NULL ){ this->mainWindow = mainWindow; }
|
|
||||||
~MaterialEditorCoreListener(){}
|
|
||||||
bool closeMainWindow() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
MaterialEditorWindow *mainWindow;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MATERIAL_EDITOR_GLOBAL_H
|
|
||||||
#define MATERIAL_EDITOR_GLOBAL_H
|
|
||||||
|
|
||||||
#include <QtCore/qglobal.h>
|
|
||||||
|
|
||||||
#if defined( MATERIAL_EDITOR_LIBRARY )
|
|
||||||
# define MATERIAL_EDITOR_EXPORT Q_DECL_EXPORT
|
|
||||||
#else
|
|
||||||
# define MATERIAL_EDITOR_EXPORT Q_DECL_IMPORT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "material_editor_plugin.h"
|
|
||||||
#include "material_editor_window.h"
|
|
||||||
#include "material_editor_context.h"
|
|
||||||
#include "material_editor_core_listener.h"
|
|
||||||
|
|
||||||
#include "../core/icore.h"
|
|
||||||
#include "../core/core_constants.h"
|
|
||||||
|
|
||||||
#include "nel/misc/debug.h"
|
|
||||||
|
|
||||||
#include <QtCore/QObject>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
MaterialEditorPlugin::~MaterialEditorPlugin()
|
|
||||||
{
|
|
||||||
Q_FOREACH(QObject *obj, m_autoReleaseObjects)
|
|
||||||
{
|
|
||||||
m_plugMan->removeObject(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
qDeleteAll(m_autoReleaseObjects);
|
|
||||||
m_autoReleaseObjects.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MaterialEditorPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString)
|
|
||||||
{
|
|
||||||
Q_UNUSED(errorString);
|
|
||||||
m_plugMan = pluginManager;
|
|
||||||
MaterialEditorContext *context = new MaterialEditorContext( this );
|
|
||||||
MaterialEditorWindow *window = static_cast< MaterialEditorWindow* >( context->widget() );
|
|
||||||
|
|
||||||
addAutoReleasedObject( context );
|
|
||||||
addAutoReleasedObject( new MaterialEditorCoreListener( window, this ) );
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorPlugin::extensionsInitialized()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorPlugin::shutdown()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorPlugin::setNelContext(NLMISC::INelContext *nelContext)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef NL_OS_WINDOWS
|
|
||||||
// Ensure that a context doesn't exist yet.
|
|
||||||
// This only applies to platforms without PIC, e.g. Windows.
|
|
||||||
nlassert(!NLMISC::INelContext::isContextInitialised());
|
|
||||||
#endif // NL_OS_WINDOWS
|
|
||||||
m_libContext = new NLMISC::CLibraryContext(*nelContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorPlugin::addAutoReleasedObject(QObject *obj)
|
|
||||||
{
|
|
||||||
m_plugMan->addObject(obj);
|
|
||||||
m_autoReleaseObjects.prepend(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_EXPORT_PLUGIN(MaterialEditor::MaterialEditorPlugin)
|
|
@ -1,69 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef MATERIAL_EDITOR_PLUGIN_H
|
|
||||||
#define MATERIAL_EDITOR_PLUGIN_H
|
|
||||||
|
|
||||||
#include "material_editor_constants.h"
|
|
||||||
#include "../../extension_system/iplugin.h"
|
|
||||||
#include "../core/icontext.h"
|
|
||||||
|
|
||||||
#include "nel/misc/app_context.h"
|
|
||||||
|
|
||||||
#include <QtCore/QObject>
|
|
||||||
#include <QtGui/QIcon>
|
|
||||||
|
|
||||||
namespace NLMISC
|
|
||||||
{
|
|
||||||
class CLibraryContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace ExtensionSystem
|
|
||||||
{
|
|
||||||
class IPluginSpec;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class MaterialEditorWindow;
|
|
||||||
|
|
||||||
class MaterialEditorPlugin : public QObject, public ExtensionSystem::IPlugin
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_INTERFACES(ExtensionSystem::IPlugin)
|
|
||||||
public:
|
|
||||||
virtual ~MaterialEditorPlugin();
|
|
||||||
|
|
||||||
bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString);
|
|
||||||
|
|
||||||
void extensionsInitialized();
|
|
||||||
|
|
||||||
void shutdown();
|
|
||||||
|
|
||||||
void setNelContext(NLMISC::INelContext *nelContext);
|
|
||||||
|
|
||||||
void addAutoReleasedObject(QObject *obj);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
NLMISC::CLibraryContext *m_libContext;
|
|
||||||
|
|
||||||
private:
|
|
||||||
ExtensionSystem::IPluginManager *m_plugMan;
|
|
||||||
QList<QObject *> m_autoReleaseObjects;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,381 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "material_editor_window.h"
|
|
||||||
#include "material_editor_constants.h"
|
|
||||||
#include "material_splitter.h"
|
|
||||||
#include "shader_widget.h"
|
|
||||||
#include "render_passes.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
#include "viewport_widget.h"
|
|
||||||
#include "fog_widget.h"
|
|
||||||
#include "lights_widget.h"
|
|
||||||
|
|
||||||
#include "../core/icore.h"
|
|
||||||
#include "../core/core_constants.h"
|
|
||||||
#include "../core/core.h"
|
|
||||||
#include "../core/menu_manager.h"
|
|
||||||
|
|
||||||
#include <nel/misc/debug.h>
|
|
||||||
|
|
||||||
#include <QSplitter>
|
|
||||||
#include <QDockWidget>
|
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QTimer>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
MaterialEditorWindow::MaterialEditorWindow(QWidget *parent) :
|
|
||||||
QMainWindow(parent)
|
|
||||||
{
|
|
||||||
m_ui.setupUi(this);
|
|
||||||
|
|
||||||
nl3dIface = new CNel3DInterface();
|
|
||||||
viewPort = new ViewPortWidget();
|
|
||||||
viewPort->setNel3DInterface( nl3dIface );
|
|
||||||
shaderWidget = new ShaderWidget();
|
|
||||||
shaderWidget->setNel3DInterface( nl3dIface );
|
|
||||||
materialSplitter = new MaterialSplitter();
|
|
||||||
materialSplitter->setNel3DIface( nl3dIface );
|
|
||||||
passesWidget = new RenderPassesWidget();
|
|
||||||
passesWidget->setMaterialObserver( materialSplitter );
|
|
||||||
passesWidget->setNel3dIface( nl3dIface );
|
|
||||||
fogWidget = new FogWidget();
|
|
||||||
fogWidget->setNl3DIface( nl3dIface );
|
|
||||||
lightsWidget = new LightsWidget();
|
|
||||||
lightsWidget->setNL3DIface( nl3dIface );
|
|
||||||
|
|
||||||
//passesWidget->onMaterialLoaded();
|
|
||||||
//materialSplitter->onMaterialLoaded();
|
|
||||||
|
|
||||||
createMenus();
|
|
||||||
createDockWidgets();
|
|
||||||
setupConnections();
|
|
||||||
|
|
||||||
setCentralWidget( viewPort );
|
|
||||||
|
|
||||||
QTimer::singleShot( 1, this, SLOT( onStartup() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
MaterialEditorWindow::~MaterialEditorWindow()
|
|
||||||
{
|
|
||||||
delete fogWidget;
|
|
||||||
fogWidget = NULL;
|
|
||||||
delete lightsWidget;
|
|
||||||
lightsWidget = NULL;
|
|
||||||
delete shaderWidget;
|
|
||||||
shaderWidget = NULL;
|
|
||||||
delete passesWidget;
|
|
||||||
passesWidget = NULL;
|
|
||||||
viewPort = NULL;
|
|
||||||
delete nl3dIface;
|
|
||||||
nl3dIface = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onOpenClicked()
|
|
||||||
{
|
|
||||||
if( lastShapeDir.isEmpty() )
|
|
||||||
lastShapeDir = "/";
|
|
||||||
|
|
||||||
QString fn = QFileDialog::getOpenFileName(
|
|
||||||
this,
|
|
||||||
tr( "Open model" ),
|
|
||||||
lastShapeDir,
|
|
||||||
tr( "Shape files ( *.shape )" )
|
|
||||||
);
|
|
||||||
|
|
||||||
if( fn.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QFileInfo info;
|
|
||||||
info.setFile( fn );
|
|
||||||
lastShapeDir = info.absolutePath();
|
|
||||||
|
|
||||||
std::string fname = fn.toUtf8().data();
|
|
||||||
bool ok = nl3dIface->loadShape( fname );
|
|
||||||
if( !ok )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Error loading shape file" ),
|
|
||||||
tr( "There was an error while loading the shape file." )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
materialSplitter->onShapeChanged();
|
|
||||||
viewPort->startTimedUpdates( 20 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onNewMaterialClicked()
|
|
||||||
{
|
|
||||||
nl3dIface->newMaterial();
|
|
||||||
materialSplitter->onMaterialLoaded();
|
|
||||||
passesWidget->onMaterialLoaded();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onOpenMaterialClicked()
|
|
||||||
{
|
|
||||||
if( lastMatDir.isEmpty() )
|
|
||||||
lastMatDir = "/";
|
|
||||||
|
|
||||||
QString fn = QFileDialog::getOpenFileName(
|
|
||||||
this,
|
|
||||||
tr( "Open material" ),
|
|
||||||
lastMatDir,
|
|
||||||
tr( "Material files ( *.nelmat )" )
|
|
||||||
);
|
|
||||||
|
|
||||||
if( fn.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QFileInfo info;
|
|
||||||
info.setFile( fn );
|
|
||||||
lastMatDir = info.absolutePath();
|
|
||||||
|
|
||||||
bool ok = nl3dIface->loadMaterial( fn.toUtf8().data() );
|
|
||||||
if( !ok )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Error opening material file" ),
|
|
||||||
tr( "There was an error while trying to open the material file specified!" ),
|
|
||||||
QMessageBox::Ok
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
passesWidget->onMaterialLoaded();
|
|
||||||
materialSplitter->onMaterialLoaded();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onSaveMaterialClicked()
|
|
||||||
{
|
|
||||||
QString fn = QFileDialog::getSaveFileName(
|
|
||||||
this,
|
|
||||||
tr( "Save material" ),
|
|
||||||
"/",
|
|
||||||
tr( "Material files ( *.nelmat )" )
|
|
||||||
);
|
|
||||||
|
|
||||||
if( fn.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
bool ok = nl3dIface->saveMaterial( fn.toUtf8().data() );
|
|
||||||
if( !ok )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Error saving material file" ),
|
|
||||||
tr( "There was an error while trying to open the material file specified!" ),
|
|
||||||
QMessageBox::Ok
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onGenMaterialsClicked()
|
|
||||||
{
|
|
||||||
nl3dIface->genMaterials();
|
|
||||||
passesWidget->onMaterialLoaded();
|
|
||||||
materialSplitter->onMaterialLoaded();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onShadersClicked()
|
|
||||||
{
|
|
||||||
shaderWidget->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onPassesClicked()
|
|
||||||
{
|
|
||||||
passesWidget->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onStartup()
|
|
||||||
{
|
|
||||||
nl3dIface->loadShaders();
|
|
||||||
shaderWidget->load();
|
|
||||||
viewPort->init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onAddCubeClicked()
|
|
||||||
{
|
|
||||||
if( !nl3dIface->addCube() )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Error adding primitive" ),
|
|
||||||
tr( "There was an error while adding this primitive" )
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
materialSplitter->onShapeChanged();
|
|
||||||
viewPort->startTimedUpdates( 20 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onAddSphereClicked()
|
|
||||||
{
|
|
||||||
if( !nl3dIface->addSphere() )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Error adding primitive" ),
|
|
||||||
tr( "There was an error while adding this primitive" )
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
materialSplitter->onShapeChanged();
|
|
||||||
viewPort->startTimedUpdates( 20 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onAddCylinderClicked()
|
|
||||||
{
|
|
||||||
if( !nl3dIface->addCylinder() )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Error adding primitive" ),
|
|
||||||
tr( "There was an error while adding this primitive" )
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
materialSplitter->onShapeChanged();
|
|
||||||
viewPort->startTimedUpdates( 20 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onAddTeaPotClicked()
|
|
||||||
{
|
|
||||||
if( !nl3dIface->addTeaPot() )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Error adding primitive" ),
|
|
||||||
tr( "There was an error while adding this primitive" )
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
materialSplitter->onShapeChanged();
|
|
||||||
viewPort->startTimedUpdates( 20 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onClearSceneClicked()
|
|
||||||
{
|
|
||||||
nl3dIface->clearScene();
|
|
||||||
materialSplitter->onSceneCleared();
|
|
||||||
viewPort->stopTimedUpdates();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onFogClicked()
|
|
||||||
{
|
|
||||||
fogWidget->loadValues();
|
|
||||||
fogWidget->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::onLightsClicked()
|
|
||||||
{
|
|
||||||
lightsWidget->loadValues();
|
|
||||||
lightsWidget->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::createMenus()
|
|
||||||
{
|
|
||||||
Core::MenuManager *mm = Core::ICore::instance()->menuManager();
|
|
||||||
|
|
||||||
QMenu *menu = mm->menu( Core::Constants::M_TOOLS );
|
|
||||||
if( menu != NULL )
|
|
||||||
{
|
|
||||||
QMenu *m = menu->addMenu( tr( "Material Editor" ) );
|
|
||||||
QAction *a;
|
|
||||||
|
|
||||||
QMenu *mm = m->addMenu( tr( "Material" ) );
|
|
||||||
{
|
|
||||||
a = new QAction( tr( "New material" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onNewMaterialClicked() ) );
|
|
||||||
mm->addAction( a );
|
|
||||||
|
|
||||||
a = new QAction( tr( "Open material" ) , NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onOpenMaterialClicked() ) );
|
|
||||||
mm->addAction( a );
|
|
||||||
|
|
||||||
a = new QAction( tr( "Save material" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onSaveMaterialClicked() ) );
|
|
||||||
mm->addAction( a );
|
|
||||||
|
|
||||||
a = new QAction( tr( "Generate materials" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onGenMaterialsClicked() ) );
|
|
||||||
mm->addAction( a );
|
|
||||||
}
|
|
||||||
|
|
||||||
mm = m->addMenu( tr( "Scene" ) );
|
|
||||||
{
|
|
||||||
QMenu *mmm = mm->addMenu( tr( "Add primitive" ) );
|
|
||||||
|
|
||||||
a = new QAction( tr( "Cube" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onAddCubeClicked() ) );
|
|
||||||
mmm->addAction( a );
|
|
||||||
a = new QAction( tr( "Sphere" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onAddSphereClicked() ) );
|
|
||||||
mmm->addAction( a );
|
|
||||||
a = new QAction( tr( "Cylinder" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onAddCylinderClicked() ) );
|
|
||||||
mmm->addAction( a );
|
|
||||||
a = new QAction( tr( "Tea pot" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onAddTeaPotClicked() ) );
|
|
||||||
mmm->addAction( a );
|
|
||||||
|
|
||||||
a = new QAction( tr( "Clear scene" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onClearSceneClicked() ) );
|
|
||||||
mm->addAction( a );
|
|
||||||
|
|
||||||
a = new QAction( tr( "Fog" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onFogClicked() ) );
|
|
||||||
mm->addAction( a );
|
|
||||||
|
|
||||||
a = new QAction( tr( "Lights" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onLightsClicked() ) );
|
|
||||||
mm->addAction( a );
|
|
||||||
}
|
|
||||||
|
|
||||||
a = new QAction( tr( "Shaders" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onShadersClicked() ) );
|
|
||||||
m->addAction( a );
|
|
||||||
|
|
||||||
a = new QAction( tr( "Render passes" ), NULL );
|
|
||||||
connect( a, SIGNAL( triggered( bool ) ), this, SLOT( onPassesClicked() ) );
|
|
||||||
m->addAction( a );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::createDockWidgets()
|
|
||||||
{
|
|
||||||
QDockWidget *dock = new QDockWidget( tr( "Material" ), this );
|
|
||||||
dock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
|
|
||||||
dock->setWidget( materialSplitter );
|
|
||||||
addDockWidget( Qt::RightDockWidgetArea, dock );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialEditorWindow::setupConnections()
|
|
||||||
{
|
|
||||||
connect( shaderWidget, SIGNAL( shaderAdded( const QString& ) ),
|
|
||||||
materialSplitter, SLOT( onShaderAdded( const QString& ) ) );
|
|
||||||
|
|
||||||
connect( shaderWidget, SIGNAL( shaderRemoved( const QString& ) ),
|
|
||||||
materialSplitter, SLOT( onShaderRemoved( const QString& ) ) );
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,83 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef MATERIAL_EDITOR_WINDOW_H
|
|
||||||
#define MATERIAL_EDITOR_WINDOW_H
|
|
||||||
|
|
||||||
#include "ui_material_editor_window.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
|
|
||||||
class ShaderWidget;
|
|
||||||
class RenderPassesWidget;
|
|
||||||
class CNel3DInterface;
|
|
||||||
class MaterialSplitter;
|
|
||||||
class ViewPortWidget;
|
|
||||||
class FogWidget;
|
|
||||||
class LightsWidget;
|
|
||||||
|
|
||||||
class MaterialEditorWindow: public QMainWindow
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
MaterialEditorWindow( QWidget *parent = NULL );
|
|
||||||
~MaterialEditorWindow();
|
|
||||||
|
|
||||||
void onOpenClicked();
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onNewMaterialClicked();
|
|
||||||
void onOpenMaterialClicked();
|
|
||||||
void onSaveMaterialClicked();
|
|
||||||
void onGenMaterialsClicked();
|
|
||||||
void onShadersClicked();
|
|
||||||
void onPassesClicked();
|
|
||||||
void onStartup();
|
|
||||||
|
|
||||||
void onAddCubeClicked();
|
|
||||||
void onAddSphereClicked();
|
|
||||||
void onAddCylinderClicked();
|
|
||||||
void onAddTeaPotClicked();
|
|
||||||
|
|
||||||
void onClearSceneClicked();
|
|
||||||
void onFogClicked();
|
|
||||||
void onLightsClicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void createMenus();
|
|
||||||
void createDockWidgets();
|
|
||||||
void setupConnections();
|
|
||||||
|
|
||||||
CNel3DInterface *nl3dIface;
|
|
||||||
|
|
||||||
ShaderWidget *shaderWidget;
|
|
||||||
RenderPassesWidget *passesWidget;
|
|
||||||
MaterialSplitter *materialSplitter;
|
|
||||||
ViewPortWidget *viewPort;
|
|
||||||
FogWidget *fogWidget;
|
|
||||||
LightsWidget *lightsWidget;
|
|
||||||
|
|
||||||
Ui::MaterialEditorWindow m_ui;
|
|
||||||
|
|
||||||
QString lastShapeDir;
|
|
||||||
QString lastMatDir;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>MaterialEditorWindow</class>
|
|
||||||
<widget class="QMainWindow" name="MaterialEditorWindow">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>800</width>
|
|
||||||
<height>600</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>MainWindow</string>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="centralwidget">
|
|
||||||
<layout class="QGridLayout" name="gridLayout"/>
|
|
||||||
</widget>
|
|
||||||
<widget class="QToolBar" name="toolBar">
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>toolBar</string>
|
|
||||||
</property>
|
|
||||||
<attribute name="toolBarArea">
|
|
||||||
<enum>TopToolBarArea</enum>
|
|
||||||
</attribute>
|
|
||||||
<attribute name="toolBarBreak">
|
|
||||||
<bool>false</bool>
|
|
||||||
</attribute>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,43 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef MATERIAL_OBSERVER_H
|
|
||||||
#define MATERIAL_OBSERVER_H
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
/// Observes material changes
|
|
||||||
class CMaterialObserver
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CMaterialObserver(){}
|
|
||||||
virtual ~CMaterialObserver(){}
|
|
||||||
|
|
||||||
virtual void onNewMaterial() = 0;
|
|
||||||
virtual void onMaterialLoaded() = 0;
|
|
||||||
|
|
||||||
virtual void onPassAdded( const char *name ) = 0;
|
|
||||||
virtual void onPassRemoved( const char *name ) = 0;
|
|
||||||
virtual void onPassMovedUp( const char *name ) = 0;
|
|
||||||
virtual void onPassMovedDown( const char *name ) = 0;
|
|
||||||
virtual void onPassRenamed( const char *from, const char *to ) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,274 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "material_properties.h"
|
|
||||||
#include "material_property_editor.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
|
|
||||||
#include <QMessageBox>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
|
|
||||||
MatPropWidget::MatPropWidget( QWidget *parent ) :
|
|
||||||
QDialog( parent )
|
|
||||||
{
|
|
||||||
setupUi( this );
|
|
||||||
matPropEditWidget = new MatPropEditWidget();
|
|
||||||
setupConnections();
|
|
||||||
edit = false;
|
|
||||||
changed = false;
|
|
||||||
proxy = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
MatPropWidget::~MatPropWidget()
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
|
|
||||||
delete matPropEditWidget;
|
|
||||||
matPropEditWidget = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::load( CRenderPassProxy *proxy )
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
changed = false;
|
|
||||||
this->proxy = new CRenderPassProxy( *proxy );
|
|
||||||
|
|
||||||
std::string n;
|
|
||||||
proxy->getName( n );
|
|
||||||
nameEdit->setText( n.c_str() );
|
|
||||||
|
|
||||||
std::vector< SMatProp > v;
|
|
||||||
proxy->getProperties( v );
|
|
||||||
|
|
||||||
std::vector< SMatProp >::iterator itr = v.begin();
|
|
||||||
while( itr != v.end() )
|
|
||||||
{
|
|
||||||
SMatProp &mp = *itr;
|
|
||||||
QTreeWidgetItem *item = new QTreeWidgetItem();
|
|
||||||
|
|
||||||
item->setData( 0, Qt::DisplayRole, QString( mp.id.c_str() ) );
|
|
||||||
item->setData( 1, Qt::DisplayRole, QString( mp.label.c_str() ) );
|
|
||||||
|
|
||||||
QString type = SMatProp::typeIdToString( mp.type ).c_str();
|
|
||||||
item->setData( 2, Qt::DisplayRole, type );
|
|
||||||
|
|
||||||
item->setData( 3, Qt::DisplayRole, mp.value.c_str() );
|
|
||||||
|
|
||||||
treeWidget->addTopLevelItem( item );
|
|
||||||
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::clear()
|
|
||||||
{
|
|
||||||
treeWidget->clear();
|
|
||||||
nameEdit->clear();
|
|
||||||
if( this->proxy != NULL )
|
|
||||||
{
|
|
||||||
delete this->proxy;
|
|
||||||
this->proxy = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::onOKClicked()
|
|
||||||
{
|
|
||||||
if( proxy != NULL )
|
|
||||||
{
|
|
||||||
std::vector< SMatProp > v;
|
|
||||||
SMatProp p;
|
|
||||||
QTreeWidgetItem *item = NULL;
|
|
||||||
std::string s;
|
|
||||||
|
|
||||||
for( int i = 0; i < treeWidget->topLevelItemCount(); i++ )
|
|
||||||
{
|
|
||||||
item = treeWidget->topLevelItem( i );
|
|
||||||
p.id = item->text( 0 ).toUtf8().data();
|
|
||||||
p.label = item->text( 1 ).toUtf8().data();
|
|
||||||
|
|
||||||
s = item->text( 2 ).toUtf8().data();
|
|
||||||
p.type = SMatProp::typeStringToId( s );
|
|
||||||
|
|
||||||
p.value = item->text( 3 ).toUtf8().data();
|
|
||||||
|
|
||||||
v.push_back( p );
|
|
||||||
}
|
|
||||||
|
|
||||||
proxy->setProperties( v );
|
|
||||||
}
|
|
||||||
|
|
||||||
clear();
|
|
||||||
setResult( QDialog::Accepted );
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::onCancelClicked()
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
setResult( QDialog::Rejected );
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::onAddClicked()
|
|
||||||
{
|
|
||||||
edit = false;
|
|
||||||
changed = true;
|
|
||||||
matPropEditWidget->clear();
|
|
||||||
matPropEditWidget->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::onEditClicked()
|
|
||||||
{
|
|
||||||
QTreeWidgetItem *item = treeWidget->currentItem();
|
|
||||||
if( item == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MaterialProperty prop;
|
|
||||||
prop.prop = item->data( 0, Qt::DisplayRole ).toString();
|
|
||||||
prop.label = item->data( 1, Qt::DisplayRole ).toString();
|
|
||||||
prop.type = item->data( 2, Qt::DisplayRole ).toString();
|
|
||||||
|
|
||||||
edit = true;
|
|
||||||
matPropEditWidget->setProperty( prop );
|
|
||||||
matPropEditWidget->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::onRemoveClicked()
|
|
||||||
{
|
|
||||||
QTreeWidgetItem *item = treeWidget->currentItem();
|
|
||||||
if( item == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
delete item;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::onEditorOKClicked()
|
|
||||||
{
|
|
||||||
MaterialProperty prop;
|
|
||||||
matPropEditWidget->getProperty( prop );
|
|
||||||
|
|
||||||
if( edit )
|
|
||||||
{
|
|
||||||
QTreeWidgetItem *item = treeWidget->currentItem();
|
|
||||||
|
|
||||||
MaterialProperty old;
|
|
||||||
old.prop = item->text( 0 );
|
|
||||||
old.label = item->text( 1 );
|
|
||||||
old.type = item->text( 2 );
|
|
||||||
|
|
||||||
if( old == prop )
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
if( idExists( prop.prop ) )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Property Id" ),
|
|
||||||
tr( "A property with that Id already exists" )
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( labelExists( prop.label ) )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Property label" ),
|
|
||||||
tr( "A property with that label already exists" )
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
item->setData( 0, Qt::DisplayRole, prop.prop );
|
|
||||||
item->setData( 1, Qt::DisplayRole, prop.label );
|
|
||||||
item->setData( 2, Qt::DisplayRole, prop.type );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
if( idExists( prop.prop ) )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Property Id" ),
|
|
||||||
tr( "A property with that Id already exists" )
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( labelExists( prop.label ) )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Property label" ),
|
|
||||||
tr( "A property with that label already exists" )
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem *item = new QTreeWidgetItem();
|
|
||||||
item->setData( 0, Qt::DisplayRole, prop.prop );
|
|
||||||
item->setData( 1, Qt::DisplayRole, prop.label );
|
|
||||||
item->setData( 2, Qt::DisplayRole, prop.type );
|
|
||||||
treeWidget->addTopLevelItem( item );
|
|
||||||
}
|
|
||||||
changed = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropWidget::setupConnections()
|
|
||||||
{
|
|
||||||
connect( okButton, SIGNAL( clicked( bool ) ), this, SLOT( onOKClicked() ) );
|
|
||||||
connect( cancelButton, SIGNAL( clicked( bool ) ), this, SLOT( onCancelClicked() ) );
|
|
||||||
connect( addButton, SIGNAL( clicked( bool ) ), this, SLOT( onAddClicked() ) );
|
|
||||||
connect( editButton, SIGNAL( clicked( bool ) ), this, SLOT( onEditClicked() ) );
|
|
||||||
connect( removeButton, SIGNAL( clicked( bool ) ), this, SLOT( onRemoveClicked() ) );
|
|
||||||
connect( matPropEditWidget, SIGNAL( okClicked() ), this, SLOT( onEditorOKClicked() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MatPropWidget::idExists( const QString &id )
|
|
||||||
{
|
|
||||||
int c = treeWidget->topLevelItemCount();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
if( id == treeWidget->topLevelItem( i )->text( 0 ) )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MatPropWidget::labelExists( const QString &label )
|
|
||||||
{
|
|
||||||
int c = treeWidget->topLevelItemCount();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
if( label == treeWidget->topLevelItem( i )->text( 1 ) )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef MATERIAL_PROPERTIES_H
|
|
||||||
#define MATERIAL_PROPERTIES_H
|
|
||||||
|
|
||||||
#include "ui_material_properties.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
|
|
||||||
class MatPropEditWidget;
|
|
||||||
class CRenderPassProxy;
|
|
||||||
|
|
||||||
class MatPropWidget : public QDialog, public Ui::MatPropWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
MatPropWidget( QWidget *parent = NULL );
|
|
||||||
~MatPropWidget();
|
|
||||||
void load( CRenderPassProxy *proxy );
|
|
||||||
void clear();
|
|
||||||
bool getChanged() const{ return changed; }
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onOKClicked();
|
|
||||||
void onCancelClicked();
|
|
||||||
void onAddClicked();
|
|
||||||
void onEditClicked();
|
|
||||||
void onRemoveClicked();
|
|
||||||
void onEditorOKClicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupConnections();
|
|
||||||
bool idExists( const QString &id );
|
|
||||||
bool labelExists( const QString &id );
|
|
||||||
|
|
||||||
|
|
||||||
bool edit;
|
|
||||||
bool changed;
|
|
||||||
MatPropEditWidget *matPropEditWidget;
|
|
||||||
CRenderPassProxy *proxy;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,183 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>MatPropWidget</class>
|
|
||||||
<widget class="QDialog" name="MatPropWidget">
|
|
||||||
<property name="windowModality">
|
|
||||||
<enum>Qt::ApplicationModal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>685</width>
|
|
||||||
<height>441</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Rendering pass properties</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Pass name</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="nameEdit">
|
|
||||||
<property name="readOnly">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QGroupBox" name="groupBox">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Pass properties</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_2">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QTreeWidget" name="treeWidget">
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Property</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Label</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Type</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="addButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Add</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="removeButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Remove</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="editButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Edit</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="okButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>OK</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="cancelButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Cancel</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,73 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "material_property_editor.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
MatPropEditWidget::MatPropEditWidget( QWidget *parent ) :
|
|
||||||
QWidget( parent )
|
|
||||||
{
|
|
||||||
setupUi( this );
|
|
||||||
setupConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
MatPropEditWidget::~MatPropEditWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropEditWidget::getProperty( MaterialProperty &prop )
|
|
||||||
{
|
|
||||||
prop.prop = propertyEdit->text();
|
|
||||||
prop.label = labelEdit->text();
|
|
||||||
prop.type = typeCB->currentText();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropEditWidget::setProperty( const MaterialProperty &prop )
|
|
||||||
{
|
|
||||||
propertyEdit->setText( prop.prop );
|
|
||||||
labelEdit->setText( prop.label );
|
|
||||||
int i = typeCB->findText( prop.type );
|
|
||||||
if( i != -1 )
|
|
||||||
typeCB->setCurrentIndex( i );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropEditWidget::clear()
|
|
||||||
{
|
|
||||||
propertyEdit->clear();
|
|
||||||
labelEdit->clear();
|
|
||||||
typeCB->setCurrentIndex( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropEditWidget::onOKClicked()
|
|
||||||
{
|
|
||||||
close();
|
|
||||||
Q_EMIT okClicked();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropEditWidget::onCancelClicked()
|
|
||||||
{
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatPropEditWidget::setupConnections()
|
|
||||||
{
|
|
||||||
connect( okButton, SIGNAL( clicked( bool ) ), this, SLOT( onOKClicked() ) );
|
|
||||||
connect( cancelButton, SIGNAL( clicked( bool ) ), this, SLOT( onCancelClicked() ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef MATERIAL_PROPERTY_EDITOR_H
|
|
||||||
#define MATERIAL_PROPERTY_EDITOR_H
|
|
||||||
|
|
||||||
#include "ui_material_property_editor.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
|
|
||||||
struct MaterialProperty
|
|
||||||
{
|
|
||||||
QString prop;
|
|
||||||
QString label;
|
|
||||||
QString type;
|
|
||||||
|
|
||||||
bool operator==( const MaterialProperty &o )
|
|
||||||
{
|
|
||||||
if( o.prop != prop )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if( o.label != label )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if( o.type != type )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class MatPropEditWidget : public QWidget, public Ui::MatPropEditWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
MatPropEditWidget( QWidget *parent = NULL );
|
|
||||||
~MatPropEditWidget();
|
|
||||||
void getProperty( MaterialProperty &prop );
|
|
||||||
void setProperty( const MaterialProperty &prop );
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void okClicked();
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onOKClicked();
|
|
||||||
void onCancelClicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupConnections();
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,140 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>MatPropEditWidget</class>
|
|
||||||
<widget class="QWidget" name="MatPropEditWidget">
|
|
||||||
<property name="windowModality">
|
|
||||||
<enum>Qt::ApplicationModal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>300</width>
|
|
||||||
<height>145</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Material property editor</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Property</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1" colspan="2">
|
|
||||||
<widget class="QLineEdit" name="propertyEdit"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Label</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1" colspan="2">
|
|
||||||
<widget class="QLineEdit" name="labelEdit"/>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Type</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1" colspan="2">
|
|
||||||
<widget class="QComboBox" name="typeCB">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Color</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Vector4</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Float</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Int</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>UInt</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Double</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Matrix4</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Texture</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QPushButton" name="okButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>OK</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QPushButton" name="cancelButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Cancel</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="2">
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>117</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,141 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "material_splitter.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
#include "material_widget.h"
|
|
||||||
#include "prop_browser_ctrl.h"
|
|
||||||
#include "3rdparty/qtpropertybrowser/qttreepropertybrowser.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
MaterialSplitter::MaterialSplitter( QWidget *parent ) :
|
|
||||||
QSplitter( parent )
|
|
||||||
{
|
|
||||||
materialWidget = new MaterialWidget();
|
|
||||||
browserCtrl = new CPropBrowserCtrl();
|
|
||||||
browser = new QtTreePropertyBrowser();
|
|
||||||
browserCtrl->setBrowser( browser );
|
|
||||||
|
|
||||||
setup();
|
|
||||||
setupConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
MaterialSplitter::~MaterialSplitter()
|
|
||||||
{
|
|
||||||
delete browserCtrl;
|
|
||||||
browserCtrl = NULL;
|
|
||||||
nl3dIface = NULL;
|
|
||||||
materialWidget = NULL;
|
|
||||||
browser = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::setupConnections()
|
|
||||||
{
|
|
||||||
connect( materialWidget, SIGNAL( propsChanged() ), this, SLOT( onPropsChanged() ) );
|
|
||||||
connect( materialWidget, SIGNAL( passChanged( const QString& ) ), this, SLOT( onPassChanged( const QString& ) ) );
|
|
||||||
connect( materialWidget, SIGNAL( subMatChanged( int ) ), this, SLOT( onSubMatChanged( int ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::setup()
|
|
||||||
{
|
|
||||||
setOrientation( Qt::Vertical );
|
|
||||||
addWidget( materialWidget );
|
|
||||||
addWidget( browser );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::setNel3DIface( CNel3DInterface *iface )
|
|
||||||
{
|
|
||||||
nl3dIface = iface;
|
|
||||||
materialWidget->setNel3DIface( iface );
|
|
||||||
browserCtrl->setNel3DIface( iface );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onNewMaterial()
|
|
||||||
{
|
|
||||||
materialWidget->onNewMaterial();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onMaterialLoaded()
|
|
||||||
{
|
|
||||||
materialWidget->onMaterialLoaded();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onSceneCleared()
|
|
||||||
{
|
|
||||||
materialWidget->onSceneCleared();
|
|
||||||
browserCtrl->onSceneCleared();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onShapeChanged()
|
|
||||||
{
|
|
||||||
materialWidget->onShapeChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onPassAdded( const char *name )
|
|
||||||
{
|
|
||||||
materialWidget->onPassAdded( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onPassRemoved( const char *name )
|
|
||||||
{
|
|
||||||
materialWidget->onPassRemoved( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onPassMovedUp( const char *name )
|
|
||||||
{
|
|
||||||
materialWidget->onPassMovedUp( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onPassMovedDown( const char *name )
|
|
||||||
{
|
|
||||||
materialWidget->onPassMovedDown( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onPassRenamed( const char *from, const char *to )
|
|
||||||
{
|
|
||||||
materialWidget->onPassRenamed( from, to );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onShaderAdded( const QString &name )
|
|
||||||
{
|
|
||||||
materialWidget->onShaderAdded( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onShaderRemoved( const QString &name )
|
|
||||||
{
|
|
||||||
materialWidget->onShaderRemoved( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onPropsChanged()
|
|
||||||
{
|
|
||||||
QString pass;
|
|
||||||
materialWidget->getCurrentPass( pass );
|
|
||||||
browserCtrl->onPropsChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onPassChanged( const QString &pass )
|
|
||||||
{
|
|
||||||
browserCtrl->loadPropsForPass( pass );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialSplitter::onSubMatChanged( int i )
|
|
||||||
{
|
|
||||||
browserCtrl->loadPropsForPass( 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MATERIAL_SPLITTER_H
|
|
||||||
#define MATERIAL_SPLITTER_H
|
|
||||||
|
|
||||||
#include <QSplitter>
|
|
||||||
#include "material_observer.h"
|
|
||||||
|
|
||||||
class QtTreePropertyBrowser;
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class CNel3DInterface;
|
|
||||||
class MaterialWidget;
|
|
||||||
class CPropBrowserCtrl;
|
|
||||||
|
|
||||||
class MaterialSplitter : public QSplitter, public CMaterialObserver
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
MaterialSplitter( QWidget *parent = NULL );
|
|
||||||
~MaterialSplitter();
|
|
||||||
|
|
||||||
void setupConnections();
|
|
||||||
|
|
||||||
void setup();
|
|
||||||
|
|
||||||
void setNel3DIface( CNel3DInterface *iface );
|
|
||||||
|
|
||||||
void onNewMaterial();
|
|
||||||
void onMaterialLoaded();
|
|
||||||
void onSceneCleared();
|
|
||||||
void onShapeChanged();
|
|
||||||
void onPassAdded( const char *name );
|
|
||||||
void onPassRemoved( const char *name );
|
|
||||||
void onPassMovedUp( const char *name );
|
|
||||||
void onPassMovedDown( const char *name );
|
|
||||||
void onPassRenamed( const char *from, const char *to );
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
void onShaderAdded( const QString &name );
|
|
||||||
void onShaderRemoved( const QString &name );
|
|
||||||
|
|
||||||
private:
|
|
||||||
CNel3DInterface *nl3dIface;
|
|
||||||
MaterialWidget *materialWidget;
|
|
||||||
CPropBrowserCtrl *browserCtrl;
|
|
||||||
QtTreePropertyBrowser *browser;
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onPropsChanged();
|
|
||||||
void onPassChanged( const QString &pass );
|
|
||||||
void onSubMatChanged( int i );
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,270 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "material_widget.h"
|
|
||||||
#include "shader_editor.h"
|
|
||||||
#include "material_properties.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
MaterialWidget::MaterialWidget( QWidget *parent ) :
|
|
||||||
QWidget( parent )
|
|
||||||
{
|
|
||||||
setupUi( this );
|
|
||||||
shaderEditorWidget = new ShaderEditorWidget();
|
|
||||||
matPropWidget = new MatPropWidget();
|
|
||||||
setNel3DIface( NULL );
|
|
||||||
setupConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
MaterialWidget::~MaterialWidget()
|
|
||||||
{
|
|
||||||
delete shaderEditorWidget;
|
|
||||||
shaderEditorWidget = NULL;
|
|
||||||
delete matPropWidget;
|
|
||||||
matPropWidget = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onSceneCleared()
|
|
||||||
{
|
|
||||||
passCB->clear();
|
|
||||||
subMatCB->clear();
|
|
||||||
passCB->setEnabled( false );
|
|
||||||
subMatCB->setEnabled( false );
|
|
||||||
shaderCB->setEnabled( false );
|
|
||||||
passButton->setEnabled( false );
|
|
||||||
shaderButton->setEnabled( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onNewMaterial()
|
|
||||||
{
|
|
||||||
passCB->clear();
|
|
||||||
passButton->setEnabled( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onMaterialLoaded()
|
|
||||||
{
|
|
||||||
CNelMaterialProxy mat = nl3dIface->getMaterial();
|
|
||||||
if( mat.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::vector< std::string > l;
|
|
||||||
mat.getPassList( l );
|
|
||||||
|
|
||||||
passCB->clear();
|
|
||||||
|
|
||||||
std::vector< std::string >::const_iterator itr = l.begin();
|
|
||||||
while( itr != l.end() )
|
|
||||||
{
|
|
||||||
passCB->addItem( itr->c_str() );
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( passCB->count() > 0 )
|
|
||||||
passButton->setEnabled( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onShapeChanged()
|
|
||||||
{
|
|
||||||
unsigned long c = nl3dIface->getShapeMatCount();
|
|
||||||
subMatCB->clear();
|
|
||||||
subMatCB->addItem( "0" );
|
|
||||||
|
|
||||||
for( unsigned long i = 1; i < c; i++ )
|
|
||||||
subMatCB->addItem( QString::number( i ) );
|
|
||||||
|
|
||||||
passCB->setEnabled( true );
|
|
||||||
passButton->setEnabled( true );
|
|
||||||
shaderCB->setEnabled( true );
|
|
||||||
|
|
||||||
subMatCB->setCurrentIndex( 0 );
|
|
||||||
|
|
||||||
if( subMatCB->count() > 1 )
|
|
||||||
subMatCB->setEnabled( true );
|
|
||||||
else
|
|
||||||
subMatCB->setEnabled( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onPassAdded( const char *name )
|
|
||||||
{
|
|
||||||
passCB->addItem( name );
|
|
||||||
passButton->setEnabled( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onPassRemoved( const char *name )
|
|
||||||
{
|
|
||||||
int i = passCB->findText( name );
|
|
||||||
if( i == -1 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
passCB->removeItem( i );
|
|
||||||
if( passCB->count() == 0 )
|
|
||||||
passButton->setEnabled( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onPassMovedUp( const char *name )
|
|
||||||
{
|
|
||||||
int i = passCB->findText( name );
|
|
||||||
if( i == -1 )
|
|
||||||
return;
|
|
||||||
if( i == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QString t = passCB->itemText( i - 1 );
|
|
||||||
passCB->setItemText( i - 1, name );
|
|
||||||
passCB->setItemText( i, t );
|
|
||||||
passCB->setCurrentIndex( i - 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onPassMovedDown( const char *name )
|
|
||||||
{
|
|
||||||
int i = passCB->findText( name );
|
|
||||||
if( i == -1 )
|
|
||||||
return;
|
|
||||||
if( i == ( passCB->count() - 1 ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QString t = passCB->itemText( i + 1 );
|
|
||||||
passCB->setItemText( i + 1, name );
|
|
||||||
passCB->setItemText( i, t );
|
|
||||||
passCB->setCurrentIndex( i + 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onPassRenamed( const char *from, const char *to )
|
|
||||||
{
|
|
||||||
int i = passCB->findText( from );
|
|
||||||
if( i == -1 )
|
|
||||||
return;
|
|
||||||
passCB->setItemText( i, to );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onShaderAdded( const QString &name )
|
|
||||||
{
|
|
||||||
shaderCB->addItem( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onShaderRemoved( const QString &name )
|
|
||||||
{
|
|
||||||
int i = shaderCB->findText( name );
|
|
||||||
if( i < 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
shaderCB->removeItem( i );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::setNel3DIface( CNel3DInterface *iface )
|
|
||||||
{
|
|
||||||
nl3dIface = iface;
|
|
||||||
shaderEditorWidget->setNel3DInterface( iface );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::getCurrentPass( QString &pass )
|
|
||||||
{
|
|
||||||
pass = passCB->currentText();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::setupConnections()
|
|
||||||
{
|
|
||||||
connect( passButton, SIGNAL( clicked( bool ) ), this, SLOT( onPassEditClicked() ) );
|
|
||||||
connect( shaderButton, SIGNAL( clicked( bool ) ), this, SLOT( onShaderEditClicked() ) );
|
|
||||||
connect( subMatCB, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onSubMatCBChanged( int ) ) );
|
|
||||||
connect( passCB, SIGNAL( currentIndexChanged( const QString& ) ), this, SLOT( onPassCBChanged( const QString& ) ) );
|
|
||||||
connect( shaderCB, SIGNAL( currentIndexChanged( const QString& ) ), this, SLOT( onShaderCBChanged( const QString& ) ) );
|
|
||||||
|
|
||||||
connect( shaderEditorWidget, SIGNAL( okClicked() ), this, SLOT( onShaderEditOKClicked() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onPassEditClicked()
|
|
||||||
{
|
|
||||||
if( passCB->count() == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CNelMaterialProxy m = nl3dIface->getMaterial();
|
|
||||||
if( m.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CRenderPassProxy p = m.getPass( passCB->currentText().toUtf8().data() );
|
|
||||||
matPropWidget->load( &p );
|
|
||||||
matPropWidget->exec();
|
|
||||||
if( matPropWidget->getChanged() )
|
|
||||||
Q_EMIT propsChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onShaderEditClicked()
|
|
||||||
{
|
|
||||||
if( shaderCB->currentIndex() == 0 )
|
|
||||||
return;
|
|
||||||
if( !shaderEditorWidget->load( shaderCB->currentText() ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
int result = shaderEditorWidget->exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onSubMatCBChanged( int i )
|
|
||||||
{
|
|
||||||
// Update the material to the current submaterial
|
|
||||||
bool ok = nl3dIface->selectSubMaterial( i );
|
|
||||||
if( !ok )
|
|
||||||
{
|
|
||||||
subMatCB->setCurrentIndex( 0 );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
onMaterialLoaded();
|
|
||||||
Q_EMIT subMatChanged( i );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onPassCBChanged( const QString &text )
|
|
||||||
{
|
|
||||||
if( text.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CNelMaterialProxy m = nl3dIface->getMaterial();
|
|
||||||
if( m.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CRenderPassProxy pass = m.getPass( text.toUtf8().data() );
|
|
||||||
std::string s;
|
|
||||||
pass.getShaderRef( s );
|
|
||||||
|
|
||||||
int i = shaderCB->findText( s.c_str() );
|
|
||||||
if( i > 0 )
|
|
||||||
shaderCB->setCurrentIndex( i );
|
|
||||||
else
|
|
||||||
shaderCB->setCurrentIndex( 0 );
|
|
||||||
|
|
||||||
Q_EMIT passChanged( text );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaterialWidget::onShaderCBChanged( const QString &text )
|
|
||||||
{
|
|
||||||
QString p = passCB->currentText();
|
|
||||||
|
|
||||||
CNelMaterialProxy m = nl3dIface->getMaterial();
|
|
||||||
if( m.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CRenderPassProxy pass = m.getPass( p.toUtf8().data() );
|
|
||||||
pass.setShaderRef( text.toUtf8().data() );
|
|
||||||
|
|
||||||
if( !text.isEmpty() )
|
|
||||||
shaderButton->setEnabled( true );
|
|
||||||
else
|
|
||||||
shaderButton->setEnabled( false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef MATERIAL_WIDGET_H
|
|
||||||
#define MATERIAL_WIDGET_H
|
|
||||||
|
|
||||||
#include "ui_material_widget.h"
|
|
||||||
#include "material_observer.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class ShaderEditorWidget;
|
|
||||||
class MatPropWidget;
|
|
||||||
class CNel3DInterface;
|
|
||||||
|
|
||||||
class MaterialWidget : public QWidget, public Ui::MaterialWidget, public CMaterialObserver
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
MaterialWidget( QWidget *parent = NULL );
|
|
||||||
~MaterialWidget();
|
|
||||||
|
|
||||||
void onSceneCleared();
|
|
||||||
void onNewMaterial();
|
|
||||||
void onMaterialLoaded();
|
|
||||||
void onShapeChanged();
|
|
||||||
|
|
||||||
void onPassAdded( const char *name );
|
|
||||||
void onPassRemoved( const char *name );
|
|
||||||
void onPassMovedUp( const char *name );
|
|
||||||
void onPassMovedDown( const char *name );
|
|
||||||
void onPassRenamed( const char *from, const char *to );
|
|
||||||
|
|
||||||
void onShaderAdded( const QString &name );
|
|
||||||
void onShaderRemoved( const QString &name );
|
|
||||||
|
|
||||||
void setNel3DIface( CNel3DInterface *iface );
|
|
||||||
|
|
||||||
void getCurrentPass( QString &pass );
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void propsChanged();
|
|
||||||
void passChanged( const QString &pass );
|
|
||||||
void subMatChanged( int i );
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupConnections();
|
|
||||||
ShaderEditorWidget *shaderEditorWidget;
|
|
||||||
MatPropWidget *matPropWidget;
|
|
||||||
CNel3DInterface *nl3dIface;
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onPassEditClicked();
|
|
||||||
void onShaderEditClicked();
|
|
||||||
void onSubMatCBChanged( int i );
|
|
||||||
void onPassCBChanged( const QString &text );
|
|
||||||
void onShaderCBChanged( const QString &text );
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,126 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>MaterialWidget</class>
|
|
||||||
<widget class="QWidget" name="MaterialWidget">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>255</width>
|
|
||||||
<height>179</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Material</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Sub-material</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QComboBox" name="subMatCB">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>0</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Pass</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QComboBox" name="passCB">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="passButton">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Edit</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Shader</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QComboBox" name="shaderCB">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="shaderButton">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Edit</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1">
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>18</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,743 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "nel3d_interface.h"
|
|
||||||
#include "nel/3d/dynamic_material.h"
|
|
||||||
#include "nel/3d/usr_shader_manager.h"
|
|
||||||
#include "nel/3d/usr_shader_program.h"
|
|
||||||
#include "nel/3d/usr_shader_loader.h"
|
|
||||||
#include "nel/3d/usr_shader_saver.h"
|
|
||||||
#include "nel/3d/driver_user.h"
|
|
||||||
#include "nel/3d/scene_user.h"
|
|
||||||
#include "nel/3d/u_camera.h"
|
|
||||||
#include "nel/3d/u_instance.h"
|
|
||||||
#include "nel/3d/u_light.h"
|
|
||||||
#include "nel/3d/u_3d_mouse_listener.h"
|
|
||||||
#include "nel/misc/i_xml.h"
|
|
||||||
#include "nel/misc/o_xml.h"
|
|
||||||
#include "nel/misc/file.h"
|
|
||||||
#include "nel/misc/path.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
|
|
||||||
NL3D::UInstance currentShape;
|
|
||||||
|
|
||||||
const char *SMatProp::idToString[] =
|
|
||||||
{
|
|
||||||
"Color",
|
|
||||||
"Vector4",
|
|
||||||
"Float",
|
|
||||||
"Double",
|
|
||||||
"Int",
|
|
||||||
"Uint",
|
|
||||||
"Matrix4",
|
|
||||||
"Texture"
|
|
||||||
};
|
|
||||||
|
|
||||||
const NLMISC::CVariant::EVarType evartypes[] =
|
|
||||||
{
|
|
||||||
NLMISC::CVariant::Vector4,
|
|
||||||
NLMISC::CVariant::Vector4,
|
|
||||||
NLMISC::CVariant::Float,
|
|
||||||
NLMISC::CVariant::Double,
|
|
||||||
NLMISC::CVariant::Int,
|
|
||||||
NLMISC::CVariant::UInt,
|
|
||||||
NLMISC::CVariant::Matrix4,
|
|
||||||
NLMISC::CVariant::String
|
|
||||||
};
|
|
||||||
|
|
||||||
NLMISC::CVariant::EVarType toEVarType( uint8 t )
|
|
||||||
{
|
|
||||||
NLMISC::CVariant::EVarType rt = NLMISC::CVariant::Float;
|
|
||||||
|
|
||||||
unsigned long s = sizeof( evartypes ) / sizeof( NLMISC::CVariant::EVarType );
|
|
||||||
|
|
||||||
if( t >= s )
|
|
||||||
return rt;
|
|
||||||
else
|
|
||||||
rt = evartypes[ t ];
|
|
||||||
|
|
||||||
return rt;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string SMatProp::typeIdToString( unsigned char id )
|
|
||||||
{
|
|
||||||
if( id >= EType_count )
|
|
||||||
return std::string();
|
|
||||||
else
|
|
||||||
return std::string( idToString[ id ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char SMatProp::typeStringToId( const std::string &s )
|
|
||||||
{
|
|
||||||
for( unsigned char i = 0; i < EType_count; i++ )
|
|
||||||
if( s == idToString[ i ] )
|
|
||||||
return i;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CRenderPassProxy::getProperties( std::vector< SMatProp > &v )
|
|
||||||
{
|
|
||||||
uint32 count = pass->count();
|
|
||||||
for( uint32 i = 0; i < count; i++ )
|
|
||||||
{
|
|
||||||
const NL3D::SDynMaterialProp &p = *( pass->getProperty( i ) );
|
|
||||||
|
|
||||||
SMatProp prop;
|
|
||||||
prop.id = p.prop;
|
|
||||||
prop.label = p.label;
|
|
||||||
prop.type = p.type;
|
|
||||||
p.value.valueAsString( prop.value );
|
|
||||||
|
|
||||||
v.push_back( prop );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CRenderPassProxy::setProperties( std::vector< SMatProp > &v )
|
|
||||||
{
|
|
||||||
pass->clear();
|
|
||||||
NL3D::SDynMaterialProp p;
|
|
||||||
|
|
||||||
std::vector< SMatProp >::iterator itr = v.begin();
|
|
||||||
while( itr != v.end() )
|
|
||||||
{
|
|
||||||
p.prop = itr->id;
|
|
||||||
p.label = itr->label;
|
|
||||||
p.type = itr->type;
|
|
||||||
p.value.fromString( itr->value, toEVarType( p.type ) );
|
|
||||||
|
|
||||||
pass->addProperty( p );
|
|
||||||
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CRenderPassProxy::getName( std::string &name )
|
|
||||||
{
|
|
||||||
pass->getName( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CRenderPassProxy::setName( const std::string &name )
|
|
||||||
{
|
|
||||||
pass->setName( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CRenderPassProxy::getShaderRef( std::string &s )
|
|
||||||
{
|
|
||||||
pass->getShaderRef( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CRenderPassProxy::setShaderRef( const std::string &s )
|
|
||||||
{
|
|
||||||
pass->setShaderRef( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CRenderPassProxy::getProperty( const std::string &name, SMatProp &p )
|
|
||||||
{
|
|
||||||
uint32 count = pass->count();
|
|
||||||
uint32 i = 0;
|
|
||||||
|
|
||||||
for( i = 0; i < count; i++ )
|
|
||||||
{
|
|
||||||
if( pass->getProperty( i )->prop == name )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( i == count )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const NL3D::SDynMaterialProp *prop = pass->getProperty( i );
|
|
||||||
p.id = prop->prop;
|
|
||||||
p.label = prop->label;
|
|
||||||
p.type = prop->type;
|
|
||||||
prop->value.valueAsString( p.value );
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CRenderPassProxy::changeProperty( const SMatProp &p )
|
|
||||||
{
|
|
||||||
NL3D::SDynMaterialProp prop;
|
|
||||||
prop.prop = p.id;
|
|
||||||
prop.label = p.label;
|
|
||||||
prop.type = p.type;
|
|
||||||
prop.value.fromString( p.value, toEVarType( prop.type ) );
|
|
||||||
|
|
||||||
return pass->changeProperty( prop.prop, prop );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNelMaterialProxy::getPassList( std::vector< std::string > &l )
|
|
||||||
{
|
|
||||||
material->getPassList( l );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNelMaterialProxy::addPass( const char *name )
|
|
||||||
{
|
|
||||||
NL3D::SRenderPass pass;
|
|
||||||
pass.setName( name );
|
|
||||||
material->addPass( pass );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNelMaterialProxy::removePass( const char *name )
|
|
||||||
{
|
|
||||||
material->removePass( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNelMaterialProxy::movePassUp( const char *name )
|
|
||||||
{
|
|
||||||
material->movePassUp( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNelMaterialProxy::movePassDown( const char *name )
|
|
||||||
{
|
|
||||||
material->movePassDown( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNelMaterialProxy::renamePass( const char *from, const char *to )
|
|
||||||
{
|
|
||||||
material->renamePass( from, to );
|
|
||||||
}
|
|
||||||
|
|
||||||
CRenderPassProxy CNelMaterialProxy::getPass( unsigned long i )
|
|
||||||
{
|
|
||||||
if( i >= material->getPassCount() )
|
|
||||||
return CRenderPassProxy( NULL );
|
|
||||||
else
|
|
||||||
return CRenderPassProxy( material->getPass( i ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
CRenderPassProxy CNelMaterialProxy::getPass( const char *name )
|
|
||||||
{
|
|
||||||
return CRenderPassProxy( material->getPass( name ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CNel3DInterface::CNel3DInterface()
|
|
||||||
{
|
|
||||||
shaderManager = new NL3D::CUsrShaderManager();
|
|
||||||
driver = NULL;
|
|
||||||
scene = NULL;
|
|
||||||
mouseListener = NULL;
|
|
||||||
subMatId = 0;
|
|
||||||
std::fill( bgColor, bgColor + 4, 255 );
|
|
||||||
}
|
|
||||||
|
|
||||||
CNel3DInterface::~CNel3DInterface()
|
|
||||||
{
|
|
||||||
delete shaderManager;
|
|
||||||
shaderManager = NULL;
|
|
||||||
killViewPort();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::loadMaterial( const char *fname )
|
|
||||||
{
|
|
||||||
if( currentShape.empty() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
NLMISC::CIFile file;
|
|
||||||
if( !file.open( fname, true ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
NLMISC::CIXml xml;
|
|
||||||
if( !xml.init( file ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
NL3D::CDynMaterial *mat = currentShape.getMaterial( subMatId ).getObjectPtr()->getDynMat();
|
|
||||||
if( mat != NULL )
|
|
||||||
mat->clear();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentShape.getMaterial( subMatId ).getObjectPtr()->createCleanDynMat();
|
|
||||||
mat = currentShape.getMaterial( subMatId ).getObjectPtr()->getDynMat();
|
|
||||||
}
|
|
||||||
|
|
||||||
mat->serial( xml );
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::saveMaterial( const char *fname )
|
|
||||||
{
|
|
||||||
if( currentShape.empty() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
NLMISC::COFile file;
|
|
||||||
if( !file.open( fname, false, true ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
NLMISC::COXml xml;
|
|
||||||
if( !xml.init( &file ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
currentShape.getMaterial( subMatId ).getObjectPtr()->getDynMat()->serial( xml );
|
|
||||||
|
|
||||||
xml.flush();
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::genMaterials()
|
|
||||||
{
|
|
||||||
int c = currentShape.getNumMaterials();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
currentShape.getMaterial( i ).getObjectPtr()->createDynMat();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::newMaterial()
|
|
||||||
{
|
|
||||||
if( currentShape.empty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
for( int i = 0; i < currentShape.getNumMaterials(); i++ )
|
|
||||||
currentShape.getMaterial( i ).getObjectPtr()->createCleanDynMat();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::selectSubMaterial( int id )
|
|
||||||
{
|
|
||||||
if( currentShape.empty() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if( currentShape.getNumMaterials() < id )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
subMatId = id;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
CNelMaterialProxy CNel3DInterface::getMaterial()
|
|
||||||
{
|
|
||||||
NL3D::CDynMaterial *mat = NULL;
|
|
||||||
if( !currentShape.empty() && ( currentShape.getNumMaterials() > 0 ) )
|
|
||||||
mat = currentShape.getMaterial( subMatId ).getObjectPtr()->getDynMat();
|
|
||||||
|
|
||||||
return CNelMaterialProxy( mat );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::getShaderList( std::vector< std::string > &v )
|
|
||||||
{
|
|
||||||
shaderManager->getShaderList( v );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::getShaderInfo( const std::string &name, SShaderInfo &info )
|
|
||||||
{
|
|
||||||
NL3D::CUsrShaderProgram program;
|
|
||||||
bool ok = shaderManager->getShader( name, &program );
|
|
||||||
if( !ok )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
std::string s;
|
|
||||||
info.name = name;
|
|
||||||
|
|
||||||
program.getDescription( s );
|
|
||||||
info.description = s;
|
|
||||||
|
|
||||||
program.getVP( s );
|
|
||||||
info.vp = s;
|
|
||||||
|
|
||||||
program.getFP( s );
|
|
||||||
info.fp = s;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::updateShaderInfo( const SShaderInfo &info )
|
|
||||||
{
|
|
||||||
NL3D::CUsrShaderProgram program;
|
|
||||||
program.setName( info.name );
|
|
||||||
program.setDescription( info.description );
|
|
||||||
program.setVP( info.vp );
|
|
||||||
program.setFP( info.fp );
|
|
||||||
|
|
||||||
return shaderManager->changeShader( info.name, &program );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::addShader( const SShaderInfo &info )
|
|
||||||
{
|
|
||||||
NL3D::CUsrShaderProgram *program = new NL3D::CUsrShaderProgram();
|
|
||||||
|
|
||||||
program->setName( info.name );
|
|
||||||
program->setDescription( info.description );
|
|
||||||
program->setVP( info.vp );
|
|
||||||
program->setFP( info.fp );
|
|
||||||
|
|
||||||
bool ok = shaderManager->addShader( program );
|
|
||||||
if( !ok )
|
|
||||||
{
|
|
||||||
delete program;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::removeShader( const std::string &name )
|
|
||||||
{
|
|
||||||
return shaderManager->removeShader( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::loadShaders()
|
|
||||||
{
|
|
||||||
NL3D::CUsrShaderLoader loader;
|
|
||||||
loader.setManager( shaderManager );
|
|
||||||
loader.loadShaders( "./shaders" );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::saveShader( const std::string &name )
|
|
||||||
{
|
|
||||||
NL3D::CUsrShaderSaver saver;
|
|
||||||
saver.setManager( shaderManager );
|
|
||||||
saver.saveShader( "./shaders", name );
|
|
||||||
NL3D::CDriverUser *d = dynamic_cast< NL3D::CDriverUser* >( driver );
|
|
||||||
if( d != NULL )
|
|
||||||
d->getDriver()->reloadUserShaders();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::deleteShader( const std::string &name )
|
|
||||||
{
|
|
||||||
NLMISC::CFile::deleteFile( "./shaders/" + name + ".nlshdr" );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::initViewPort( unsigned long wnd, unsigned long w, unsigned long h )
|
|
||||||
{
|
|
||||||
//driver = NL3D::UDriver::createDriver( 0, false, 0 );
|
|
||||||
driver = NL3D::UDriver::createDriver( 0, NL3D::UDriver::OpenGl3, 0 );
|
|
||||||
nlassert( driver != NULL );
|
|
||||||
driver->setDisplay( (nlWindow)wnd, NL3D::UDriver::CMode( w, h, 32 ) );
|
|
||||||
|
|
||||||
scene = driver->createScene( true );
|
|
||||||
|
|
||||||
|
|
||||||
driver->enableFog( true );
|
|
||||||
driver->setupFog( 5.0f, 15.0f, NLMISC::CRGBA::White );
|
|
||||||
|
|
||||||
|
|
||||||
NL3D::ULight *ld;
|
|
||||||
|
|
||||||
/*
|
|
||||||
// Let's add a directional light!
|
|
||||||
ld = NL3D::ULight::createLight();
|
|
||||||
ld->setMode( NL3D::ULight::DirectionalLight );
|
|
||||||
ld->setDirection( NLMISC::CVector( -100.0f, 100.0f, 100.0f ) );
|
|
||||||
ld->setAmbiant( NLMISC::CRGBA::CRGBA( 0.1f, 0.1f, 0.1f, 0.1f ) );
|
|
||||||
ld->setSpecular( NLMISC::CRGBA::White );
|
|
||||||
ld->setDiffuse( NLMISC::CRGBA::White );
|
|
||||||
driver->setLight( 0, *ld );
|
|
||||||
driver->enableLight( 0, true );
|
|
||||||
delete ld;
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Let's add a point light as well!
|
|
||||||
ld = NL3D::ULight::createLight();
|
|
||||||
ld->setMode( NL3D::ULight::PointLight );
|
|
||||||
ld->setPosition( NLMISC::CVector( 0.0f, 0.0f, 0.0f ) );
|
|
||||||
ld->setAmbiant( NLMISC::CRGBA::CRGBA( 0.1f, 0.1f, 0.1f, 0.1f ) );
|
|
||||||
ld->setSpecular( NLMISC::CRGBA::White );
|
|
||||||
ld->setDiffuse( NLMISC::CRGBA::White );
|
|
||||||
ld->setConstantAttenuation( 1.0f );
|
|
||||||
ld->setLinearAttenuation( 0.0f );
|
|
||||||
ld->setQuadraticAttenuation( 0.0f );
|
|
||||||
driver->setLight( 0, *ld );
|
|
||||||
driver->enableLight( 0, true );
|
|
||||||
delete ld;
|
|
||||||
ld = NULL;
|
|
||||||
|
|
||||||
scene->enableLightingSystem( false );
|
|
||||||
|
|
||||||
|
|
||||||
mouseListener = driver->create3dMouseListener();
|
|
||||||
mouseListener->setMouseMode( NL3D::U3dMouseListener::nelStyle );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::killViewPort()
|
|
||||||
{
|
|
||||||
driver->deleteScene( scene );
|
|
||||||
scene = NULL;
|
|
||||||
driver->delete3dMouseListener( mouseListener );
|
|
||||||
mouseListener = NULL;
|
|
||||||
delete driver;
|
|
||||||
driver = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::resizeViewPort( unsigned long w, unsigned long h )
|
|
||||||
{
|
|
||||||
if( scene != NULL )
|
|
||||||
{
|
|
||||||
scene->getCam().setPerspective( 90.0f, w / (float)h, 0.1f, 1000.0f );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::addCube()
|
|
||||||
{
|
|
||||||
return loadShape( "primitives/cube.shape" );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::addSphere()
|
|
||||||
{
|
|
||||||
return loadShape( "primitives/sphere.shape" );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::addCylinder()
|
|
||||||
{
|
|
||||||
return loadShape( "primitives/cylinder.shape" );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::addTeaPot()
|
|
||||||
{
|
|
||||||
return loadShape( "primitives/teapot.shape" );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CNel3DInterface::loadShape( const std::string &fileName )
|
|
||||||
{
|
|
||||||
NLMISC::CPath::addSearchPath( NLMISC::CFile::getPath( fileName ), false, false );
|
|
||||||
NL3D::UInstance instance = scene->createInstance( fileName );
|
|
||||||
if( instance.empty() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
clearScene();
|
|
||||||
currentShape = instance;
|
|
||||||
|
|
||||||
subMatId = 0;
|
|
||||||
|
|
||||||
setupCamera();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::clearScene()
|
|
||||||
{
|
|
||||||
if( scene != NULL )
|
|
||||||
{
|
|
||||||
if( currentShape.empty() )
|
|
||||||
return;
|
|
||||||
scene->deleteInstance( currentShape );
|
|
||||||
currentShape = NL3D::UInstance();
|
|
||||||
subMatId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( driver == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
NLMISC::CRGBA c;
|
|
||||||
c.R = bgColor[ 0 ];
|
|
||||||
c.G = bgColor[ 1 ];
|
|
||||||
c.B = bgColor[ 2 ];
|
|
||||||
c.A = bgColor[ 3 ];
|
|
||||||
|
|
||||||
driver->clearBuffers( c );
|
|
||||||
driver->swapBuffers();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::updateInput()
|
|
||||||
{
|
|
||||||
driver->EventServer.pump();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::renderScene()
|
|
||||||
{
|
|
||||||
if( scene != NULL )
|
|
||||||
{
|
|
||||||
scene->getCam().setTransformMode( NL3D::UTransformable::DirectMatrix );
|
|
||||||
scene->getCam().setMatrix( mouseListener->getViewMatrix() );
|
|
||||||
|
|
||||||
NLMISC::CRGBA c;
|
|
||||||
c.R = bgColor[ 0 ];
|
|
||||||
c.G = bgColor[ 1 ];
|
|
||||||
c.B = bgColor[ 2 ];
|
|
||||||
c.A = bgColor[ 3 ];
|
|
||||||
|
|
||||||
driver->clearBuffers( c );
|
|
||||||
scene->render();
|
|
||||||
driver->swapBuffers();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long CNel3DInterface::getShapeMatCount() const
|
|
||||||
{
|
|
||||||
if( currentShape.empty() )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return currentShape.getNumMaterials();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::getFogSettings( SFogSettings &s )
|
|
||||||
{
|
|
||||||
s.enable = driver->fogEnabled();
|
|
||||||
s.start = driver->getFogStart();
|
|
||||||
s.end = driver->getFogEnd();
|
|
||||||
|
|
||||||
NLMISC::CRGBA c = driver->getFogColor();
|
|
||||||
s.color[ 0 ] = c.R;
|
|
||||||
s.color[ 1 ] = c.G;
|
|
||||||
s.color[ 2 ] = c.B;
|
|
||||||
s.color[ 3 ] = c.A;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::setFogSettings( const SFogSettings &s )
|
|
||||||
{
|
|
||||||
driver->enableFog( s.enable );
|
|
||||||
NLMISC::CRGBA c;
|
|
||||||
c.R = s.color[ 0 ];
|
|
||||||
c.G = s.color[ 1 ];
|
|
||||||
c.B = s.color[ 2 ];
|
|
||||||
c.A = 255;
|
|
||||||
driver->setupFog( s.start, s.end, c );
|
|
||||||
setBGColor( c.R, c.G, c.B, c.A );
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char CNel3DInterface::getMaxLights() const
|
|
||||||
{
|
|
||||||
return driver->getMaxDriverLights();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::getLightInfo( unsigned char light, SLightInfo &info )
|
|
||||||
{
|
|
||||||
info.enabled = driver->isLightEnabled( light );
|
|
||||||
|
|
||||||
NL3D::ULight *u = driver->getLight( light );
|
|
||||||
info.ambColor[ 0 ] = u->getAmbiant().R / 255.0f;
|
|
||||||
info.ambColor[ 1 ] = u->getAmbiant().G / 255.0f;
|
|
||||||
info.ambColor[ 2 ] = u->getAmbiant().B / 255.0f;
|
|
||||||
info.ambColor[ 3 ] = u->getAmbiant().A / 255.0f;
|
|
||||||
|
|
||||||
info.diffColor[ 0 ] = u->getDiffuse().R / 255.0f;
|
|
||||||
info.diffColor[ 1 ] = u->getDiffuse().G / 255.0f;
|
|
||||||
info.diffColor[ 2 ] = u->getDiffuse().B / 255.0f;
|
|
||||||
info.diffColor[ 3 ] = u->getDiffuse().A / 255.0f;
|
|
||||||
|
|
||||||
info.specColor[ 0 ] = u->getSpecular().R / 255.0f;
|
|
||||||
info.specColor[ 1 ] = u->getSpecular().G / 255.0f;
|
|
||||||
info.specColor[ 2 ] = u->getSpecular().B / 255.0f;
|
|
||||||
info.specColor[ 3 ] = u->getSpecular().A / 255.0f;
|
|
||||||
|
|
||||||
info.constAttn = u->getConstantAttenuation();
|
|
||||||
info.linAttn = u->getLinearAttenuation();
|
|
||||||
info.quadAttn = u->getQuadraticAttenuation();
|
|
||||||
|
|
||||||
switch( u->getMode() )
|
|
||||||
{
|
|
||||||
case NL3D::ULight::DirectionalLight:
|
|
||||||
info.type = SLightInfo::Directional;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NL3D::ULight::PointLight:
|
|
||||||
info.type = SLightInfo::Point;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NL3D::ULight::SpotLight:
|
|
||||||
info.type = SLightInfo::Spot;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( info.type == SLightInfo::Directional )
|
|
||||||
{
|
|
||||||
info.posOrDir[ 0 ] = u->getDirection().x;
|
|
||||||
info.posOrDir[ 1 ] = u->getDirection().y;
|
|
||||||
info.posOrDir[ 2 ] = u->getDirection().z;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info.posOrDir[ 0 ] = u->getPosition().x;
|
|
||||||
info.posOrDir[ 1 ] = u->getPosition().y;
|
|
||||||
info.posOrDir[ 2 ] = u->getPosition().z;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete u;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::setLightInfo( unsigned char light, const SLightInfo &info )
|
|
||||||
{
|
|
||||||
NL3D::ULight *u = NL3D::ULight::createLight();
|
|
||||||
|
|
||||||
NLMISC::CRGBA c;
|
|
||||||
c.R = info.ambColor[ 0 ] * 255.0f;
|
|
||||||
c.G = info.ambColor[ 1 ] * 255.0f;
|
|
||||||
c.B = info.ambColor[ 2 ] * 255.0f;
|
|
||||||
c.A = 255;
|
|
||||||
u->setAmbiant( c );
|
|
||||||
|
|
||||||
c.R = info.diffColor[ 0 ] * 255.0f;
|
|
||||||
c.G = info.diffColor[ 1 ] * 255.0f;
|
|
||||||
c.B = info.diffColor[ 2 ] * 255.0f;
|
|
||||||
u->setDiffuse( c );
|
|
||||||
|
|
||||||
c.R = info.specColor[ 0 ] * 255.0f;
|
|
||||||
c.G = info.specColor[ 1 ] * 255.0f;
|
|
||||||
c.B = info.specColor[ 2 ] * 255.0f;
|
|
||||||
u->setSpecular( c );
|
|
||||||
|
|
||||||
switch( info.type )
|
|
||||||
{
|
|
||||||
case SLightInfo::Directional:
|
|
||||||
u->setMode( NL3D::ULight::DirectionalLight );
|
|
||||||
break;
|
|
||||||
case SLightInfo::Point:
|
|
||||||
u->setMode( NL3D::ULight::PointLight );
|
|
||||||
break;
|
|
||||||
case SLightInfo::Spot:
|
|
||||||
u->setMode( NL3D::ULight::SpotLight );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( info.type == SLightInfo::Directional )
|
|
||||||
u->setDirection( NLMISC::CVector( info.posOrDir[ 0 ], info.posOrDir[ 1 ], info.posOrDir[ 2 ] ) );
|
|
||||||
else
|
|
||||||
u->setPosition( NLMISC::CVector( info.posOrDir[ 0 ], info.posOrDir[ 1 ], info.posOrDir[ 2 ] ) );
|
|
||||||
|
|
||||||
u->setConstantAttenuation( info.constAttn );
|
|
||||||
u->setLinearAttenuation( info.linAttn );
|
|
||||||
u->setQuadraticAttenuation( info.quadAttn );
|
|
||||||
|
|
||||||
driver->setLight( light, *u );
|
|
||||||
driver->enableLight( light, info.enabled );
|
|
||||||
|
|
||||||
delete u;
|
|
||||||
u = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CNel3DInterface::setupCamera()
|
|
||||||
{
|
|
||||||
NLMISC::CAABBox bbox;
|
|
||||||
currentShape.getShapeAABBox( bbox );
|
|
||||||
|
|
||||||
NLMISC::CVector center = bbox.getCenter();
|
|
||||||
NLMISC::CQuat q( 0.0f, 0.0f, 0.0f, 0.0f );
|
|
||||||
currentShape.getDefaultRotQuat( q );
|
|
||||||
|
|
||||||
NLMISC::CVector max_radius = bbox.getHalfSize();
|
|
||||||
float radius = std::max( max_radius.x, std::max( max_radius.y, max_radius.z ) );
|
|
||||||
float distance = radius / tan( 45.0f );
|
|
||||||
|
|
||||||
NLMISC::CVector axis = q.getAxis();
|
|
||||||
if( axis.isNull() || ( axis == NLMISC::CVector::I ) )
|
|
||||||
axis = NLMISC::CVector::J;
|
|
||||||
else
|
|
||||||
if( axis == -NLMISC::CVector::K )
|
|
||||||
axis = -NLMISC::CVector::J;
|
|
||||||
|
|
||||||
NLMISC::CVector eye = center - axis * ( radius + distance );
|
|
||||||
scene->getCam().lookAt( eye, center );
|
|
||||||
|
|
||||||
mouseListener->setHotSpot( center );
|
|
||||||
mouseListener->setMatrix( scene->getCam().getMatrix() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,331 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef NEL3D_INTERFACE_H
|
|
||||||
#define NEL3D_INTERFACE_H
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace NL3D
|
|
||||||
{
|
|
||||||
class CDynMaterial;
|
|
||||||
struct SRenderPass;
|
|
||||||
class CUsrShaderManager;
|
|
||||||
class UDriver;
|
|
||||||
class UScene;
|
|
||||||
class U3dMouseListener;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
/// Material Property, holds the user shader parameters as string ( for the editor )
|
|
||||||
struct SMatProp
|
|
||||||
{
|
|
||||||
enum EType
|
|
||||||
{
|
|
||||||
Color,
|
|
||||||
Vector4,
|
|
||||||
Float,
|
|
||||||
Double,
|
|
||||||
Int,
|
|
||||||
Uint,
|
|
||||||
Matrix4,
|
|
||||||
Texture,
|
|
||||||
EType_count
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Creates a string representation of the type id
|
|
||||||
static std::string typeIdToString( unsigned char type );
|
|
||||||
|
|
||||||
/// Turns the type id string back to Id
|
|
||||||
static unsigned char typeStringToId( const std::string &s );
|
|
||||||
|
|
||||||
std::string id;
|
|
||||||
std::string label;
|
|
||||||
unsigned char type;
|
|
||||||
std::string value;
|
|
||||||
|
|
||||||
private:
|
|
||||||
static const char *idToString[];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/// Proxy class for the rendering pass
|
|
||||||
class CRenderPassProxy
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CRenderPassProxy( NL3D::SRenderPass *p )
|
|
||||||
{
|
|
||||||
pass = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
~CRenderPassProxy(){}
|
|
||||||
|
|
||||||
/// Retrieves the rendering properties as a vector
|
|
||||||
void getProperties( std::vector< SMatProp > &v );
|
|
||||||
|
|
||||||
/// Clears the properties and then copies the ones from the vector specified
|
|
||||||
void setProperties( std::vector< SMatProp > &v );
|
|
||||||
|
|
||||||
/// Retrieves the name of the pass
|
|
||||||
void getName( std::string &name );
|
|
||||||
|
|
||||||
/// Sets the name of the pass
|
|
||||||
void setName( const std::string &name );
|
|
||||||
|
|
||||||
/// Returns the reference ( just a string ) to the user shader associated
|
|
||||||
void getShaderRef( std::string &s );
|
|
||||||
|
|
||||||
/// Sets the reference ( just a string ) to the user shader associated
|
|
||||||
void setShaderRef( const std::string &s );
|
|
||||||
|
|
||||||
/// Retrieves a single rendering property
|
|
||||||
bool getProperty( const std::string &name, SMatProp &p );
|
|
||||||
|
|
||||||
/// Changes a single rendering property
|
|
||||||
bool changeProperty( const SMatProp &p );
|
|
||||||
|
|
||||||
private:
|
|
||||||
NL3D::SRenderPass *pass;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Proxy class for the dynamic material
|
|
||||||
class CNelMaterialProxy
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CNelMaterialProxy( NL3D::CDynMaterial *mat )
|
|
||||||
{
|
|
||||||
material = mat;
|
|
||||||
}
|
|
||||||
|
|
||||||
~CNelMaterialProxy(){}
|
|
||||||
|
|
||||||
/// Retrieves the list of rendering passes
|
|
||||||
void getPassList( std::vector< std::string > &l );
|
|
||||||
|
|
||||||
/// Adds a new pass
|
|
||||||
void addPass( const char *name );
|
|
||||||
|
|
||||||
/// Removes the specified pass, if exists
|
|
||||||
void removePass( const char *name );
|
|
||||||
|
|
||||||
/// Moves the pass up by one position
|
|
||||||
void movePassUp( const char *name );
|
|
||||||
|
|
||||||
/// Moves the pass down by one position
|
|
||||||
void movePassDown( const char *name );
|
|
||||||
|
|
||||||
/// Renames the specified pass
|
|
||||||
void renamePass( const char *from, const char *to );
|
|
||||||
|
|
||||||
/// Retrieves the specified pass, by position
|
|
||||||
CRenderPassProxy getPass( unsigned long i );
|
|
||||||
|
|
||||||
/// Retrieves the specified pass, by name
|
|
||||||
CRenderPassProxy getPass( const char *name );
|
|
||||||
|
|
||||||
bool isEmpty() const{
|
|
||||||
if( material == NULL )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
NL3D::CDynMaterial *material;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct SShaderInfo
|
|
||||||
{
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
std::string vp;
|
|
||||||
std::string fp;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SFogSettings
|
|
||||||
{
|
|
||||||
bool enable;
|
|
||||||
float start;
|
|
||||||
float end;
|
|
||||||
unsigned char color[ 4 ];
|
|
||||||
|
|
||||||
SFogSettings()
|
|
||||||
{
|
|
||||||
enable = false;
|
|
||||||
start = 0.0f;
|
|
||||||
end = 0.0f;
|
|
||||||
color[ 0 ] = 0.0f;
|
|
||||||
color[ 1 ] = 0.0f;
|
|
||||||
color[ 2 ] = 0.0f;
|
|
||||||
color[ 3 ] = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SLightInfo
|
|
||||||
{
|
|
||||||
enum LightType
|
|
||||||
{
|
|
||||||
Directional,
|
|
||||||
Point,
|
|
||||||
Spot
|
|
||||||
};
|
|
||||||
|
|
||||||
bool enabled;
|
|
||||||
unsigned char type;
|
|
||||||
float posOrDir[ 3 ];
|
|
||||||
float ambColor[ 3 ];
|
|
||||||
float diffColor[ 3 ];
|
|
||||||
float specColor[ 3 ];
|
|
||||||
float constAttn;
|
|
||||||
float linAttn;
|
|
||||||
float quadAttn;
|
|
||||||
|
|
||||||
SLightInfo()
|
|
||||||
{
|
|
||||||
enabled = true;
|
|
||||||
type = Directional;
|
|
||||||
posOrDir[ 0 ] = posOrDir[ 1 ] = posOrDir[ 2 ] = 0.0f;
|
|
||||||
ambColor[ 0 ] = ambColor[ 1 ] = ambColor[ 2 ] = 255;
|
|
||||||
diffColor[ 0 ] = diffColor[ 1 ] = diffColor[ 2 ] = 255;
|
|
||||||
specColor[ 0 ] = specColor[ 1 ] = specColor[ 2 ] = 255;
|
|
||||||
constAttn = 1.0f;
|
|
||||||
linAttn = quadAttn = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Proxy class for Nel3D, so the material editor and Nel3D can interface
|
|
||||||
class CNel3DInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CNel3DInterface();
|
|
||||||
~CNel3DInterface();
|
|
||||||
|
|
||||||
/// Load a material for the current (sub)object
|
|
||||||
bool loadMaterial( const char *fname );
|
|
||||||
|
|
||||||
/// Save the current (sub)object's material
|
|
||||||
bool saveMaterial( const char *fname );
|
|
||||||
|
|
||||||
/// Generate materials from the current (sub)object(s) "old" material(s)
|
|
||||||
void genMaterials();
|
|
||||||
|
|
||||||
/// Creates new material(s) for the current (sub)object(s)
|
|
||||||
void newMaterial();
|
|
||||||
|
|
||||||
/// Makes the specified sub-material current
|
|
||||||
bool selectSubMaterial( int id );
|
|
||||||
|
|
||||||
/// Returns a proxy object to the current sub-material
|
|
||||||
CNelMaterialProxy getMaterial();
|
|
||||||
|
|
||||||
/// Retrieves a list of user shaders loaded
|
|
||||||
void getShaderList( std::vector< std::string > &v );
|
|
||||||
|
|
||||||
/// Retrieves the specified user shader if exists
|
|
||||||
bool getShaderInfo( const std::string &name, SShaderInfo &info );
|
|
||||||
|
|
||||||
/// Updates a user shader
|
|
||||||
bool updateShaderInfo( const SShaderInfo &info );
|
|
||||||
|
|
||||||
/// Adds a new user shader
|
|
||||||
bool addShader( const SShaderInfo &info );
|
|
||||||
|
|
||||||
/// Removes a user shader
|
|
||||||
bool removeShader( const std::string &name );
|
|
||||||
|
|
||||||
/// Loads the user shaders
|
|
||||||
void loadShaders();
|
|
||||||
|
|
||||||
/// Saves the specified user shader
|
|
||||||
void saveShader( const std::string &name );
|
|
||||||
|
|
||||||
/// Deletes the specified user shader
|
|
||||||
void deleteShader( const std::string &name );
|
|
||||||
|
|
||||||
/// Sets up the viewport widget
|
|
||||||
void initViewPort( unsigned long wnd, unsigned long w, unsigned long h );
|
|
||||||
|
|
||||||
/// Shuts down the viewport widget
|
|
||||||
void killViewPort();
|
|
||||||
|
|
||||||
/// Resizes the viewport widget
|
|
||||||
void resizeViewPort( unsigned long w, unsigned long h );
|
|
||||||
NL3D::UDriver* getDriver(){ return driver; }
|
|
||||||
|
|
||||||
/// Clears the scene then adds a cube
|
|
||||||
bool addCube();
|
|
||||||
|
|
||||||
/// Clears the scene then adds a sphere
|
|
||||||
bool addSphere();
|
|
||||||
|
|
||||||
/// Clears the scene then add a cylinder
|
|
||||||
bool addCylinder();
|
|
||||||
|
|
||||||
/// Clears the scene the adds a teapot
|
|
||||||
bool addTeaPot();
|
|
||||||
|
|
||||||
|
|
||||||
/// Clears the scene then loads a shape
|
|
||||||
bool loadShape( const std::string &fileName );
|
|
||||||
|
|
||||||
/// Clears the scene, as the name suggests
|
|
||||||
void clearScene();
|
|
||||||
|
|
||||||
/// Sends the input events to Nel3D
|
|
||||||
void updateInput();
|
|
||||||
|
|
||||||
/// Renders the scene
|
|
||||||
void renderScene();
|
|
||||||
|
|
||||||
unsigned long getShapeMatCount() const;
|
|
||||||
|
|
||||||
void getFogSettings( SFogSettings &s );
|
|
||||||
void setFogSettings( const SFogSettings &s );
|
|
||||||
|
|
||||||
unsigned char getMaxLights() const;
|
|
||||||
void getLightInfo( unsigned char light, SLightInfo &info );
|
|
||||||
void setLightInfo( unsigned char light, const SLightInfo &info );
|
|
||||||
|
|
||||||
void setBGColor( unsigned char R, unsigned char G, unsigned char B, unsigned char A ){
|
|
||||||
bgColor[ 0 ] = R;
|
|
||||||
bgColor[ 1 ] = G;
|
|
||||||
bgColor[ 2 ] = B;
|
|
||||||
bgColor[ 3 ] = A;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupCamera();
|
|
||||||
|
|
||||||
unsigned long subMatId;
|
|
||||||
|
|
||||||
NL3D::CUsrShaderManager *shaderManager;
|
|
||||||
NL3D::UDriver *driver;
|
|
||||||
NL3D::UScene *scene;
|
|
||||||
NL3D::U3dMouseListener *mouseListener;
|
|
||||||
unsigned char bgColor[ 4 ];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
<plugin-spec>
|
|
||||||
<library-name>ovqt_plugin_material_editor</library-name>
|
|
||||||
<name>Material Editor</name>
|
|
||||||
<version>0.0.1</version>
|
|
||||||
<vendor>Ryzom Core</vendor>
|
|
||||||
<description>Material Editor plugin.</description>
|
|
||||||
<dependencies>
|
|
||||||
<dependency plugin-name="Core" version="0.8"/>
|
|
||||||
</dependencies>
|
|
||||||
</plugin-spec>
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,394 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "prop_browser_ctrl.h"
|
|
||||||
#include "3rdparty/qtpropertybrowser/qttreepropertybrowser.h"
|
|
||||||
#include "3rdparty/qtpropertybrowser/qtvariantproperty.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#include <QMatrix4x4>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
bool QStringToQMatrix4x4( const QString &s, QMatrix4x4 &m )
|
|
||||||
{
|
|
||||||
QString ms = s;
|
|
||||||
bool ok = false;
|
|
||||||
bool success = true;
|
|
||||||
double da[ 16 ];
|
|
||||||
|
|
||||||
QStringList sl = ms.split( " " );
|
|
||||||
QStringListIterator it( sl );
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
while( it.hasNext() )
|
|
||||||
{
|
|
||||||
double d = it.next().toDouble( &ok );
|
|
||||||
|
|
||||||
if( ok )
|
|
||||||
{
|
|
||||||
da[ i ] = d;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
da[ i ] = 0.0;
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
m = QMatrix4x4( da );
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int propToQVariant( unsigned char t )
|
|
||||||
{
|
|
||||||
int type = 0;
|
|
||||||
|
|
||||||
switch( t )
|
|
||||||
{
|
|
||||||
case SMatProp::Color:
|
|
||||||
type = QVariant::Color;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Double:
|
|
||||||
type = QVariant::Double;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Float:
|
|
||||||
type = QVariant::Double;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Int:
|
|
||||||
type = QVariant::Int;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Matrix4:
|
|
||||||
type = QVariant::String;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Texture:
|
|
||||||
type = QVariant::String;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Uint:
|
|
||||||
type = QVariant::Int;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Vector4:
|
|
||||||
type = QVariant::String;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
type = QVariant::String;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
void propValToQVariant( const SMatProp &p, QVariant &v )
|
|
||||||
{
|
|
||||||
bool ok = false;
|
|
||||||
QString s;
|
|
||||||
|
|
||||||
switch( p.type )
|
|
||||||
{
|
|
||||||
case SMatProp::Color:
|
|
||||||
{
|
|
||||||
std::stringstream ss = p.value;
|
|
||||||
float c[ 4 ];
|
|
||||||
std::fill( c, c + 4, 0.0f );
|
|
||||||
|
|
||||||
for( int i = 0; i < 4; i++ )
|
|
||||||
{
|
|
||||||
ss >> c[ i ];
|
|
||||||
if( !ss.good() )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
QColor color;
|
|
||||||
color.setRedF( c[ 0 ] / 255.0f );
|
|
||||||
color.setGreenF( c[ 1 ] / 255.0f );
|
|
||||||
color.setBlueF( c[ 2 ] / 255.0f );
|
|
||||||
color.setAlphaF( c[ 3 ] / 255.0f );
|
|
||||||
|
|
||||||
v = color;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SMatProp::Double:
|
|
||||||
double d;
|
|
||||||
|
|
||||||
s = p.value.c_str();
|
|
||||||
d = s.toDouble( &ok );
|
|
||||||
if( ok )
|
|
||||||
v = d;
|
|
||||||
else
|
|
||||||
v = 0.0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Float:
|
|
||||||
float f;
|
|
||||||
|
|
||||||
s = p.value.c_str();
|
|
||||||
f = s.toFloat( &ok );
|
|
||||||
if( ok )
|
|
||||||
v = f;
|
|
||||||
else
|
|
||||||
v = 0.0f;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Int:
|
|
||||||
int i;
|
|
||||||
|
|
||||||
s = p.value.c_str();
|
|
||||||
i = s.toInt( &ok );
|
|
||||||
if( ok )
|
|
||||||
v = i;
|
|
||||||
else
|
|
||||||
v = 0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Matrix4:
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
QMatrix4x4 m;
|
|
||||||
m.fill( 0.0 );
|
|
||||||
QStringToQMatrix4x4( p.value.c_str(), m );
|
|
||||||
v = QVariant( m );
|
|
||||||
*/
|
|
||||||
v = p.value.c_str();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Texture:
|
|
||||||
v = p.value.c_str();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Uint:
|
|
||||||
unsigned int u;
|
|
||||||
|
|
||||||
s = p.value.c_str();
|
|
||||||
u = s.toUInt( &ok );
|
|
||||||
if( ok )
|
|
||||||
v = u;
|
|
||||||
else
|
|
||||||
v = 0u;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMatProp::Vector4:
|
|
||||||
v = p.value.c_str();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
v = "";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CPropBrowserCtrl::CPropBrowserCtrl( QObject *parent ) :
|
|
||||||
QObject( parent )
|
|
||||||
{
|
|
||||||
browser = NULL;
|
|
||||||
nel3dIface = NULL;
|
|
||||||
manager = new QtVariantPropertyManager();
|
|
||||||
factory = new QtVariantEditorFactory();
|
|
||||||
|
|
||||||
setupConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
CPropBrowserCtrl::~CPropBrowserCtrl()
|
|
||||||
{
|
|
||||||
browser = NULL;
|
|
||||||
nel3dIface = NULL;
|
|
||||||
delete manager;
|
|
||||||
manager = NULL;
|
|
||||||
delete factory;
|
|
||||||
factory = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::setBrowser( QtTreePropertyBrowser *b )
|
|
||||||
{
|
|
||||||
browser = b;
|
|
||||||
browser->setFactoryForManager( manager, factory );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::setNel3DIface( CNel3DInterface *iface )
|
|
||||||
{
|
|
||||||
nel3dIface = iface;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::setupConnections()
|
|
||||||
{
|
|
||||||
connect( manager, SIGNAL( valueChanged( QtProperty*, const QVariant& ) ),
|
|
||||||
this, SLOT( onValueChanged( QtProperty*, const QVariant& ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::onSceneCleared()
|
|
||||||
{
|
|
||||||
clearProps();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::onPropsChanged()
|
|
||||||
{
|
|
||||||
clearProps();
|
|
||||||
loadPropsForPass( currentPass );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::clearProps()
|
|
||||||
{
|
|
||||||
browser->clear();
|
|
||||||
propToId.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::loadPropsForPass( const QString &pass )
|
|
||||||
{
|
|
||||||
currentPass = pass;
|
|
||||||
clearProps();
|
|
||||||
|
|
||||||
if( pass.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CNelMaterialProxy m = nel3dIface->getMaterial();
|
|
||||||
if( m.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CRenderPassProxy p = m.getPass( pass.toUtf8().data() );
|
|
||||||
|
|
||||||
std::vector< SMatProp > v;
|
|
||||||
p.getProperties( v );
|
|
||||||
|
|
||||||
QtVariantProperty *vp = NULL;
|
|
||||||
int type = 0;
|
|
||||||
QVariant qv;
|
|
||||||
|
|
||||||
std::vector< SMatProp >::const_iterator itr = v.begin();
|
|
||||||
while( itr != v.end() )
|
|
||||||
{
|
|
||||||
const SMatProp &prop = *itr;
|
|
||||||
|
|
||||||
type = propToQVariant( prop.type );
|
|
||||||
|
|
||||||
vp = manager->addProperty( type, prop.label.c_str() );
|
|
||||||
|
|
||||||
if( vp != NULL )
|
|
||||||
{
|
|
||||||
propValToQVariant( prop, qv );
|
|
||||||
vp->setValue( qv );
|
|
||||||
browser->addProperty( vp );
|
|
||||||
propToId[ vp ] = prop.id;
|
|
||||||
}
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::loadPropsForPass( int i )
|
|
||||||
{
|
|
||||||
clearProps();
|
|
||||||
|
|
||||||
CNelMaterialProxy m = nel3dIface->getMaterial();
|
|
||||||
if( m.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CRenderPassProxy p = m.getPass( i );
|
|
||||||
|
|
||||||
std::string n;
|
|
||||||
p.getName( n );
|
|
||||||
currentPass = n.c_str();
|
|
||||||
|
|
||||||
std::vector< SMatProp > v;
|
|
||||||
p.getProperties( v );
|
|
||||||
|
|
||||||
QtVariantProperty *vp = NULL;
|
|
||||||
int type = 0;
|
|
||||||
QVariant qv;
|
|
||||||
|
|
||||||
std::vector< SMatProp >::const_iterator itr = v.begin();
|
|
||||||
while( itr != v.end() )
|
|
||||||
{
|
|
||||||
const SMatProp &prop = *itr;
|
|
||||||
|
|
||||||
type = propToQVariant( prop.type );
|
|
||||||
|
|
||||||
vp = manager->addProperty( type, prop.label.c_str() );
|
|
||||||
|
|
||||||
if( vp != NULL )
|
|
||||||
{
|
|
||||||
propValToQVariant( prop, qv );
|
|
||||||
vp->setValue( qv );
|
|
||||||
browser->addProperty( vp );
|
|
||||||
propToId[ vp ] = prop.id;
|
|
||||||
}
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPropBrowserCtrl::onValueChanged( QtProperty *p, const QVariant &v )
|
|
||||||
{
|
|
||||||
QString label = p->propertyName();
|
|
||||||
std::string value = p->valueText().toUtf8().data();
|
|
||||||
|
|
||||||
if( v.type() == QVariant::Color )
|
|
||||||
{
|
|
||||||
QColor c = v.value< QColor >();
|
|
||||||
value.clear();
|
|
||||||
QString val = "%1 %2 %3 %4";
|
|
||||||
val = val.arg( c.red() ).arg( c.green() ).arg( c.blue() ).arg( c.alpha() );
|
|
||||||
value = val.toUtf8().data();
|
|
||||||
}
|
|
||||||
|
|
||||||
CNelMaterialProxy m = nel3dIface->getMaterial();
|
|
||||||
if( m.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
CRenderPassProxy pass = m.getPass( currentPass.toUtf8().data() );
|
|
||||||
|
|
||||||
std::map< QtProperty*, std::string >::const_iterator itr
|
|
||||||
= propToId.find( p );
|
|
||||||
if( itr == propToId.end() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
SMatProp prop;
|
|
||||||
bool ok = pass.getProperty( itr->second, prop );
|
|
||||||
if( !ok )
|
|
||||||
return;
|
|
||||||
|
|
||||||
prop.value = value;
|
|
||||||
pass.changeProperty( prop );
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef PROP_BROWSER_CTRL_H
|
|
||||||
#define PROP_BROWSER_CTRL_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QVariant>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
class QtTreePropertyBrowser;
|
|
||||||
class QtVariantPropertyManager;
|
|
||||||
class QtVariantEditorFactory;
|
|
||||||
class QtProperty;
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class CNel3DInterface;
|
|
||||||
|
|
||||||
class CPropBrowserCtrl : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
CPropBrowserCtrl( QObject *parent = NULL );
|
|
||||||
~CPropBrowserCtrl();
|
|
||||||
void setBrowser( QtTreePropertyBrowser *b );
|
|
||||||
void setNel3DIface( CNel3DInterface *iface );
|
|
||||||
void setupConnections();
|
|
||||||
void onSceneCleared();
|
|
||||||
void onPropsChanged();
|
|
||||||
void clearProps();
|
|
||||||
void loadPropsForPass( const QString &pass );
|
|
||||||
void loadPropsForPass( int i );
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onValueChanged( QtProperty *p, const QVariant &v );
|
|
||||||
|
|
||||||
private:
|
|
||||||
QtTreePropertyBrowser *browser;
|
|
||||||
QtVariantPropertyManager *manager;
|
|
||||||
QtVariantEditorFactory *factory;
|
|
||||||
|
|
||||||
CNel3DInterface *nel3dIface;
|
|
||||||
QString currentPass;
|
|
||||||
|
|
||||||
std::map< QtProperty*, std::string > propToId;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,257 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "render_passes.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
#include "material_observer.h"
|
|
||||||
#include <QInputDialog>
|
|
||||||
#include <QMessageBox>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
RenderPassesWidget::RenderPassesWidget( QWidget *parent ) :
|
|
||||||
QWidget( parent )
|
|
||||||
{
|
|
||||||
setupUi( this );
|
|
||||||
setupConnections();
|
|
||||||
nl3dIface = NULL;
|
|
||||||
observer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
RenderPassesWidget::~RenderPassesWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::fillList( const QStringList &list )
|
|
||||||
{
|
|
||||||
listWidget->clear();
|
|
||||||
|
|
||||||
QStringListIterator itr( list );
|
|
||||||
while( itr.hasNext() )
|
|
||||||
{
|
|
||||||
listWidget->addItem( itr.next() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::getList( QStringList &list )
|
|
||||||
{
|
|
||||||
for( int i = 0; i < listWidget->count(); i++ )
|
|
||||||
{
|
|
||||||
list.push_back( listWidget->item( i )->text() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::clear()
|
|
||||||
{
|
|
||||||
listWidget->clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::onMaterialLoaded()
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
CNelMaterialProxy m = nl3dIface->getMaterial();
|
|
||||||
if( m.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::vector< std::string > pl;
|
|
||||||
m.getPassList( pl );
|
|
||||||
|
|
||||||
std::vector< std::string >::const_iterator itr = pl.begin();
|
|
||||||
while( itr != pl.end() )
|
|
||||||
{
|
|
||||||
listWidget->addItem( QString( itr->c_str() ) );
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::setupConnections()
|
|
||||||
{
|
|
||||||
connect( okButton, SIGNAL( clicked( bool ) ), this, SLOT( onOKClicked() ) );
|
|
||||||
connect( addButton, SIGNAL( clicked( bool ) ), this, SLOT( onAddClicked() ) );
|
|
||||||
connect( removeButton, SIGNAL( clicked( bool ) ), this, SLOT( onRemoveClicked() ) );
|
|
||||||
connect( editButton, SIGNAL( clicked( bool ) ), this, SLOT( onEditClicked() ) );
|
|
||||||
connect( upButton, SIGNAL( clicked( bool ) ), this, SLOT( onUpClicked() ) );
|
|
||||||
connect( downButton, SIGNAL( clicked( bool ) ), this, SLOT( onDownClicked() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RenderPassesWidget::passExists( const QString &label )
|
|
||||||
{
|
|
||||||
int c = listWidget->count();
|
|
||||||
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
if( label == listWidget->item( i )->text() )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::onOKClicked()
|
|
||||||
{
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::onAddClicked()
|
|
||||||
{
|
|
||||||
QString label =
|
|
||||||
QInputDialog::getText(
|
|
||||||
NULL,
|
|
||||||
tr( "Pass label" ),
|
|
||||||
tr( "Please enter the new pass' label" )
|
|
||||||
);
|
|
||||||
|
|
||||||
if( label.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( passExists( label ) )
|
|
||||||
{
|
|
||||||
QMessageBox::warning(
|
|
||||||
NULL,
|
|
||||||
tr( "Pass label" ),
|
|
||||||
tr( "Pass label already exists!" )
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
listWidget->addItem( label );
|
|
||||||
|
|
||||||
CNelMaterialProxy material = nl3dIface->getMaterial();
|
|
||||||
material.addPass( label.toUtf8().data() );
|
|
||||||
|
|
||||||
if( observer != NULL )
|
|
||||||
observer->onPassAdded( label.toUtf8().data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::onRemoveClicked()
|
|
||||||
{
|
|
||||||
int row = listWidget->currentRow();
|
|
||||||
if( row == -1 )
|
|
||||||
return;
|
|
||||||
QString pass;
|
|
||||||
|
|
||||||
QListWidgetItem *item = listWidget->takeItem( row );
|
|
||||||
pass = item->text();
|
|
||||||
delete item;
|
|
||||||
|
|
||||||
CNelMaterialProxy material = nl3dIface->getMaterial();
|
|
||||||
if( material.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
material.removePass( pass.toUtf8().data() );
|
|
||||||
|
|
||||||
if( observer != NULL )
|
|
||||||
observer->onPassRemoved( pass.toUtf8().data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::onEditClicked()
|
|
||||||
{
|
|
||||||
QListWidgetItem *item = listWidget->currentItem();
|
|
||||||
if( item == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QString from = item->text();
|
|
||||||
QString to =
|
|
||||||
QInputDialog::getText(
|
|
||||||
NULL,
|
|
||||||
tr( "Editing pass label" ),
|
|
||||||
tr( "Please enter the new label" ),
|
|
||||||
QLineEdit::Normal,
|
|
||||||
from
|
|
||||||
);
|
|
||||||
|
|
||||||
if( to.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( from == to )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( passExists( to ) )
|
|
||||||
{
|
|
||||||
QMessageBox::warning(
|
|
||||||
NULL,
|
|
||||||
tr( "Pass label" ),
|
|
||||||
tr( "Pass label already exists!" )
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
item->setText( to );
|
|
||||||
|
|
||||||
CNelMaterialProxy material = nl3dIface->getMaterial();
|
|
||||||
if( material.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
material.renamePass( from.toUtf8().data(), to.toUtf8().data() );
|
|
||||||
|
|
||||||
if( observer != NULL )
|
|
||||||
observer->onPassRenamed( from.toUtf8().data(), to.toUtf8().data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::onUpClicked()
|
|
||||||
{
|
|
||||||
QListWidgetItem *item = listWidget->currentItem();
|
|
||||||
if( item == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
int row = listWidget->currentRow();
|
|
||||||
if( row == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
item = listWidget->takeItem( row );
|
|
||||||
listWidget->insertItem( row - 1, item );
|
|
||||||
listWidget->setCurrentRow( row - 1 );
|
|
||||||
|
|
||||||
QString s = item->text();
|
|
||||||
|
|
||||||
CNelMaterialProxy material = nl3dIface->getMaterial();
|
|
||||||
if( material.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
material.movePassUp( s.toUtf8().data() );
|
|
||||||
|
|
||||||
if( observer != NULL )
|
|
||||||
observer->onPassMovedUp( s.toUtf8().data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderPassesWidget::onDownClicked()
|
|
||||||
{
|
|
||||||
QListWidgetItem *item = listWidget->currentItem();
|
|
||||||
if( item == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
int row = listWidget->currentRow();
|
|
||||||
if( row == ( listWidget->count() - 1 ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
item = listWidget->takeItem( row );
|
|
||||||
listWidget->insertItem( row + 1, item );
|
|
||||||
listWidget->setCurrentRow( row + 1 );
|
|
||||||
|
|
||||||
QString s = item->text();
|
|
||||||
|
|
||||||
CNelMaterialProxy material = nl3dIface->getMaterial();
|
|
||||||
if( material.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
material.movePassDown( s.toUtf8().data() );
|
|
||||||
|
|
||||||
if( observer != NULL )
|
|
||||||
observer->onPassMovedDown( s.toUtf8().data() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
#ifndef RENDER_PASSES_H
|
|
||||||
#define RENDER_PASSES_H
|
|
||||||
|
|
||||||
#include "ui_render_passes.h"
|
|
||||||
#include <QStringList>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class CNel3DInterface;
|
|
||||||
class CMaterialObserver;
|
|
||||||
|
|
||||||
class RenderPassesWidget : public QWidget, public Ui::RenderPassesWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
RenderPassesWidget( QWidget *parent = NULL );
|
|
||||||
~RenderPassesWidget();
|
|
||||||
void fillList( const QStringList &list );
|
|
||||||
void getList( QStringList &list );
|
|
||||||
void clear();
|
|
||||||
void onMaterialLoaded();
|
|
||||||
void setNel3dIface( CNel3DInterface *iface ){ nl3dIface = iface; }
|
|
||||||
void setMaterialObserver( CMaterialObserver *obs ){ observer = obs; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupConnections();
|
|
||||||
bool passExists( const QString &label );
|
|
||||||
|
|
||||||
CNel3DInterface *nl3dIface;
|
|
||||||
CMaterialObserver *observer;
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onOKClicked();
|
|
||||||
void onAddClicked();
|
|
||||||
void onRemoveClicked();
|
|
||||||
void onEditClicked();
|
|
||||||
void onUpClicked();
|
|
||||||
void onDownClicked();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>RenderPassesWidget</class>
|
|
||||||
<widget class="QWidget" name="RenderPassesWidget">
|
|
||||||
<property name="windowModality">
|
|
||||||
<enum>Qt::ApplicationModal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>498</width>
|
|
||||||
<height>297</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Rendering passes</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QListWidget" name="listWidget"/>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="addButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Add</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="removeButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Remove</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="editButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Edit</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="upButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Up</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="downButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Down</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="okButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>OK</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,90 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "shader_editor.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
ShaderEditorWidget::ShaderEditorWidget( QDialog *parent ) :
|
|
||||||
QDialog( parent )
|
|
||||||
{
|
|
||||||
setupUi( this );
|
|
||||||
nl3dIface = NULL;
|
|
||||||
setupConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
ShaderEditorWidget::~ShaderEditorWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderEditorWidget::getDescription( QString &desc )
|
|
||||||
{
|
|
||||||
desc = descriptionEdit->toPlainText();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderEditorWidget::setupConnections()
|
|
||||||
{
|
|
||||||
connect( okButton, SIGNAL( clicked( bool ) ), this, SLOT( onOKClicked() ) ) ;
|
|
||||||
connect( cancelButton, SIGNAL( clicked( bool ) ), this, SLOT( onCancelClicked() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderEditorWidget::onOKClicked()
|
|
||||||
{
|
|
||||||
SShaderInfo info;
|
|
||||||
info.name = nameEdit->text().toUtf8().data();
|
|
||||||
info.description = descriptionEdit->toPlainText().toUtf8().data();
|
|
||||||
info.vp = vsEdit->toPlainText().toUtf8().data();
|
|
||||||
info.fp = fsEdit->toPlainText().toUtf8().data();
|
|
||||||
|
|
||||||
bool ok = nl3dIface->updateShaderInfo( info );
|
|
||||||
if( ok )
|
|
||||||
nl3dIface->saveShader( info.name );
|
|
||||||
|
|
||||||
accept();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderEditorWidget::onCancelClicked()
|
|
||||||
{
|
|
||||||
reject();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderEditorWidget::reset()
|
|
||||||
{
|
|
||||||
QString empty;
|
|
||||||
nameEdit->setText( empty );
|
|
||||||
descriptionEdit->setPlainText( empty );
|
|
||||||
vsEdit->setPlainText( empty );
|
|
||||||
fsEdit->setPlainText( empty );
|
|
||||||
setResult( QDialog::Rejected );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ShaderEditorWidget::load( const QString &name )
|
|
||||||
{
|
|
||||||
SShaderInfo info;
|
|
||||||
if( !nl3dIface->getShaderInfo( name.toUtf8().data(), info ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
nameEdit->setText( info.name.c_str() );
|
|
||||||
descriptionEdit->setPlainText( info.description.c_str() );
|
|
||||||
vsEdit->setPlainText( info.vp.c_str() );
|
|
||||||
fsEdit->setPlainText( info.fp.c_str() );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADER_EDITOR_H
|
|
||||||
#define SHADER_EDITOR_H
|
|
||||||
|
|
||||||
#include "ui_shader_editor.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class CNel3DInterface;
|
|
||||||
|
|
||||||
class ShaderEditorWidget : public QDialog, public Ui::ShaderEditorWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
ShaderEditorWidget( QDialog *parent = NULL );
|
|
||||||
~ShaderEditorWidget();
|
|
||||||
|
|
||||||
void getDescription( QString &desc );
|
|
||||||
|
|
||||||
void setNel3DInterface( CNel3DInterface *iface ){ nl3dIface = iface; }
|
|
||||||
|
|
||||||
void reset();
|
|
||||||
bool load( const QString &name );
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onOKClicked();
|
|
||||||
void onCancelClicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupConnections();
|
|
||||||
CNel3DInterface *nl3dIface;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,127 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>ShaderEditorWidget</class>
|
|
||||||
<widget class="QDialog" name="ShaderEditorWidget">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>861</width>
|
|
||||||
<height>735</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Shader Editor</string>
|
|
||||||
</property>
|
|
||||||
<property name="modal">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="nameLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Name</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="nameEdit">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<layout class="QVBoxLayout" name="descrLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Description</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPlainTextEdit" name="descriptionEdit"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<layout class="QVBoxLayout" name="vsLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Vertex Shader</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPlainTextEdit" name="vsEdit"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<layout class="QVBoxLayout" name="fsLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_4">
|
|
||||||
<property name="text">
|
|
||||||
<string>Fragment Shader</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPlainTextEdit" name="fsEdit"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="okButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>OK</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="cancelButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Cancel</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>468</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,220 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "shader_widget.h"
|
|
||||||
#include "shader_editor.h"
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QInputDialog>
|
|
||||||
#include <QMessageBox>
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
ShaderWidget::ShaderWidget( QWidget *parent ) :
|
|
||||||
QWidget( parent )
|
|
||||||
{
|
|
||||||
setupUi( this );
|
|
||||||
setupConnections();
|
|
||||||
|
|
||||||
shaderEditorWidget = new ShaderEditorWidget();
|
|
||||||
nl3dIface = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShaderWidget::~ShaderWidget()
|
|
||||||
{
|
|
||||||
delete shaderEditorWidget;
|
|
||||||
shaderEditorWidget = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::setNel3DInterface( CNel3DInterface *iface )
|
|
||||||
{
|
|
||||||
nl3dIface = iface;
|
|
||||||
shaderEditorWidget->setNel3DInterface( iface );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::load()
|
|
||||||
{
|
|
||||||
std::vector< std::string > v;
|
|
||||||
|
|
||||||
nl3dIface->getShaderList( v );
|
|
||||||
|
|
||||||
shaderList->clear();
|
|
||||||
|
|
||||||
QString name;
|
|
||||||
|
|
||||||
std::vector< std::string >::const_iterator itr = v.begin();
|
|
||||||
while( itr != v.end() )
|
|
||||||
{
|
|
||||||
name = itr->c_str();
|
|
||||||
shaderList->addItem( name );
|
|
||||||
Q_EMIT shaderAdded( name );
|
|
||||||
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::setupConnections()
|
|
||||||
{
|
|
||||||
connect( okButton, SIGNAL( clicked( bool ) ), this, SLOT( onOKClicked() ) );
|
|
||||||
|
|
||||||
connect( addButton, SIGNAL( clicked( bool ) ), this, SLOT( onAddClicked() ) );
|
|
||||||
connect( removeButton, SIGNAL( clicked( bool ) ), this, SLOT( onRemoveClicked() ) );
|
|
||||||
connect( editButton, SIGNAL( clicked( bool ) ), this, SLOT( onEditClicked() ) );
|
|
||||||
|
|
||||||
connect( shaderList, SIGNAL( currentRowChanged( int ) ), this, SLOT( onRowChanged( int ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::onOKClicked()
|
|
||||||
{
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ShaderWidget::nameExists( const QString &name )
|
|
||||||
{
|
|
||||||
for( int i = 0; i < shaderList->count(); i++ )
|
|
||||||
{
|
|
||||||
if( shaderList->item( i )->text() == name )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::nameExistsMessage()
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Shader already exists" ),
|
|
||||||
tr( "A shader with that name already exists!" ),
|
|
||||||
QMessageBox::Ok
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::onAddClicked()
|
|
||||||
{
|
|
||||||
QString name =
|
|
||||||
QInputDialog::getText(
|
|
||||||
this,
|
|
||||||
tr( "New shader" ),
|
|
||||||
tr( "Enter the new shader's name" )
|
|
||||||
);
|
|
||||||
|
|
||||||
if( name.isEmpty() )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "New shader" ),
|
|
||||||
tr( "You must enter a name for the new shader" ),
|
|
||||||
QMessageBox::Ok
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( nameExists( name ) )
|
|
||||||
{
|
|
||||||
nameExistsMessage();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SShaderInfo info;
|
|
||||||
info.name = name.toUtf8().data();
|
|
||||||
bool ok = nl3dIface->addShader( info );
|
|
||||||
nl3dIface->saveShader( info.name );
|
|
||||||
if( !ok )
|
|
||||||
{
|
|
||||||
QMessageBox::critical(
|
|
||||||
this,
|
|
||||||
tr( "Error adding shader" ),
|
|
||||||
tr( "There was an error while trying to add the shader" )
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
shaderList->addItem( name );
|
|
||||||
|
|
||||||
Q_EMIT shaderAdded( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::onRemoveClicked()
|
|
||||||
{
|
|
||||||
int i = shaderList->currentRow();
|
|
||||||
if( i < 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
int selection =
|
|
||||||
QMessageBox::question(
|
|
||||||
this,
|
|
||||||
tr( "Removing shader" ),
|
|
||||||
tr( "Are you sure you want to remove this shader?" ),
|
|
||||||
QMessageBox::Yes,
|
|
||||||
QMessageBox::Cancel
|
|
||||||
);
|
|
||||||
|
|
||||||
if( selection == QMessageBox::Yes )
|
|
||||||
{
|
|
||||||
QListWidgetItem *item = shaderList->takeItem( i );
|
|
||||||
QString name = item->text();
|
|
||||||
std::string n = name.toUtf8().data();
|
|
||||||
delete item;
|
|
||||||
|
|
||||||
nl3dIface->removeShader( n );
|
|
||||||
nl3dIface->deleteShader( n );
|
|
||||||
|
|
||||||
if( shaderList->count() == 0 )
|
|
||||||
description->setPlainText( "" );
|
|
||||||
|
|
||||||
Q_EMIT shaderRemoved( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::onEditClicked()
|
|
||||||
{
|
|
||||||
int i = shaderList->currentRow();
|
|
||||||
if( i < 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QString name = shaderList->item( i )->text();
|
|
||||||
|
|
||||||
shaderEditorWidget->reset();
|
|
||||||
shaderEditorWidget->load( name );
|
|
||||||
|
|
||||||
int res = shaderEditorWidget->exec();
|
|
||||||
if( res == QDialog::Rejected )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QString descr;
|
|
||||||
shaderEditorWidget->getDescription( descr );
|
|
||||||
description->setPlainText( descr );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderWidget::onRowChanged( int i )
|
|
||||||
{
|
|
||||||
if( i < 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::string s = shaderList->item( i )->text().toUtf8().data();
|
|
||||||
|
|
||||||
SShaderInfo info;
|
|
||||||
bool ok = nl3dIface->getShaderInfo( s, info );
|
|
||||||
if( !ok )
|
|
||||||
return;
|
|
||||||
|
|
||||||
description->setPlainText( info.description.c_str() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADER_WIDGET_H
|
|
||||||
#define SHADER_WIDGET_H
|
|
||||||
|
|
||||||
#include "ui_shader_widget.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class ShaderEditorWidget;
|
|
||||||
class CNel3DInterface;
|
|
||||||
|
|
||||||
class ShaderWidget : public QWidget, public Ui::ShaderWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
ShaderWidget( QWidget *parent = NULL );
|
|
||||||
~ShaderWidget();
|
|
||||||
|
|
||||||
void setNel3DInterface( CNel3DInterface *iface );
|
|
||||||
void load();
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void shaderAdded( const QString &name );
|
|
||||||
void shaderRemoved( const QString &name );
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupConnections();
|
|
||||||
bool nameExists( const QString &name );
|
|
||||||
void nameExistsMessage();
|
|
||||||
|
|
||||||
ShaderEditorWidget *shaderEditorWidget;
|
|
||||||
CNel3DInterface *nl3dIface;
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onOKClicked();
|
|
||||||
void onAddClicked();
|
|
||||||
void onRemoveClicked();
|
|
||||||
void onEditClicked();
|
|
||||||
void onRowChanged( int i );
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,116 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>ShaderWidget</class>
|
|
||||||
<widget class="QWidget" name="ShaderWidget">
|
|
||||||
<property name="windowModality">
|
|
||||||
<enum>Qt::ApplicationModal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>502</width>
|
|
||||||
<height>401</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Shaders</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Shaders</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0" rowspan="4" colspan="2">
|
|
||||||
<widget class="QListWidget" name="shaderList"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QPushButton" name="addButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Add</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QPushButton" name="removeButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Remove</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="2">
|
|
||||||
<widget class="QPushButton" name="editButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Edit</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="2" rowspan="3">
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>123</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Description</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0" colspan="2">
|
|
||||||
<widget class="QPlainTextEdit" name="description"/>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="0">
|
|
||||||
<widget class="QPushButton" name="okButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>OK</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="1" colspan="2">
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>664</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,154 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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 "viewport_widget.h"
|
|
||||||
#include <QResizeEvent>
|
|
||||||
#include "nel3d_interface.h"
|
|
||||||
#include "nel/3d/driver.h"
|
|
||||||
#include "nel/3d/driver_user.h"
|
|
||||||
|
|
||||||
#ifdef NL_OS_WINDOWS
|
|
||||||
#include <Windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
ViewPortWidget::ViewPortWidget( QWidget *parent ) :
|
|
||||||
QWidget( parent )
|
|
||||||
{
|
|
||||||
nl3dIface = NULL;
|
|
||||||
timerId = 0;
|
|
||||||
setAttribute( Qt::WA_PaintOnScreen );
|
|
||||||
}
|
|
||||||
|
|
||||||
ViewPortWidget::~ViewPortWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewPortWidget::init()
|
|
||||||
{
|
|
||||||
nl3dIface->initViewPort( (unsigned long)winId(), width(), height() );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewPortWidget::resizeEvent( QResizeEvent *evnt )
|
|
||||||
{
|
|
||||||
uint32 w = evnt->size().width();
|
|
||||||
uint32 h = evnt->size().height();
|
|
||||||
|
|
||||||
nl3dIface->resizeViewPort( w, h );
|
|
||||||
|
|
||||||
QWidget::resizeEvent( evnt );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewPortWidget::startTimedUpdates( int interval )
|
|
||||||
{
|
|
||||||
if( interval == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
timerId = startTimer( interval );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewPortWidget::stopTimedUpdates()
|
|
||||||
{
|
|
||||||
killTimer( timerId );
|
|
||||||
timerId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViewPortWidget::timerEvent( QTimerEvent *evnt )
|
|
||||||
{
|
|
||||||
int id = evnt->timerId();
|
|
||||||
if( id == timerId )
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined( NL_OS_WINDOWS )
|
|
||||||
|
|
||||||
typedef bool ( *winProc )( NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
|
|
||||||
|
|
||||||
bool ViewPortWidget::winEvent( MSG *message, long *result )
|
|
||||||
{
|
|
||||||
NL3D::UDriver *udriver = nl3dIface->getDriver();
|
|
||||||
if( ( udriver != NULL ) && udriver->isActive() )
|
|
||||||
{
|
|
||||||
NL3D::IDriver *driver = dynamic_cast< NL3D::CDriverUser* >( udriver )->getDriver();
|
|
||||||
if( driver != NULL )
|
|
||||||
{
|
|
||||||
winProc proc = (winProc)driver->getWindowProc();
|
|
||||||
return proc( driver, message->hwnd, message->message, message->wParam, message->lParam );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined( NL_OS_MAC )
|
|
||||||
|
|
||||||
typedef bool ( *cocoaProc )( NL3D::IDriver *, const void *e );
|
|
||||||
|
|
||||||
bool ViewPortWidget::macEvent( EventHandlerCallRef caller, EventRef event )
|
|
||||||
{
|
|
||||||
if( caller )
|
|
||||||
nlerror("You are using QtCarbon! Only QtCocoa supported, please upgrade Qt");
|
|
||||||
|
|
||||||
NL3D::UDriver *udriver = nl3dIface->getDriver();
|
|
||||||
if( ( udriver != NULL ) && udriver->isActive() )
|
|
||||||
{
|
|
||||||
NL3D::IDriver *driver = dynamic_cast< NL3D::CDriverUser* >( udriver )->getDriver();
|
|
||||||
if( driver != NULL )
|
|
||||||
{
|
|
||||||
cocoaProc proc = ( cocoaProc )driver->getWindowProc();
|
|
||||||
proc( driver, event );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined( NL_OS_UNIX )
|
|
||||||
|
|
||||||
typedef bool ( *x11Proc )( NL3D::IDriver *drv, XEvent *e );
|
|
||||||
|
|
||||||
bool ViewPortWidget::x11Event( XEvent *event )
|
|
||||||
{
|
|
||||||
NL3D::UDriver *udriver = nl3dIface->getDriver();
|
|
||||||
|
|
||||||
if( ( udriver != NULL ) && udriver->isActive() )
|
|
||||||
{
|
|
||||||
NL3D::IDriver *driver = dynamic_cast< NL3D::CDriverUser* >( udriver )->getDriver();
|
|
||||||
if( driver != NULL )
|
|
||||||
{
|
|
||||||
x11Proc proc = ( x11Proc )driver->getWindowProc();
|
|
||||||
proc( driver, event );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ViewPortWidget::update()
|
|
||||||
{
|
|
||||||
nl3dIface->updateInput();
|
|
||||||
nl3dIface->renderScene();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
|||||||
// Object Viewer Qt Material Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// 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/>.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef VIEWPORT_WIDGET_H
|
|
||||||
#define VIEWPORT_WIDGET_H
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
#include "nel/misc/types_nl.h"
|
|
||||||
#include "nel/misc/event_emitter.h"
|
|
||||||
|
|
||||||
namespace MaterialEditor
|
|
||||||
{
|
|
||||||
class CNel3DInterface;
|
|
||||||
|
|
||||||
class ViewPortWidget : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
ViewPortWidget( QWidget *parent = NULL );
|
|
||||||
~ViewPortWidget();
|
|
||||||
void setNel3DInterface( CNel3DInterface *iface ){ nl3dIface = iface; }
|
|
||||||
void init();
|
|
||||||
|
|
||||||
void resizeEvent( QResizeEvent *evnt );
|
|
||||||
|
|
||||||
QPaintEngine* paintEngine() const{ return NULL; }
|
|
||||||
|
|
||||||
void startTimedUpdates( int interval );
|
|
||||||
void stopTimedUpdates();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
void timerEvent( QTimerEvent *evnt );
|
|
||||||
|
|
||||||
#if defined ( NL_OS_WINDOWS )
|
|
||||||
bool winEvent( MSG *message, long *result );
|
|
||||||
#elif defined( NL_OS_MAC )
|
|
||||||
bool macEvent( EventHandlerCallRef caller, EventRef event ) ;
|
|
||||||
#elif defined( NL_OS_UNIX )
|
|
||||||
bool x11Event( XEvent *event );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
private:
|
|
||||||
void update();
|
|
||||||
|
|
||||||
CNel3DInterface *nl3dIface;
|
|
||||||
int timerId;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue