// SSPHH/Fluxions/Unicornfish/Viperfish/Hatchetfish/Sunfish/KASL/GLUT Extensions
// Copyright (C) 2017 Jonathan Metzgar
// All rights reserved.
//
// 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 <https://www.gnu.org/licenses/>.
//
// For any other type of licensing, please contact me at [email protected]
#ifndef FLUXIONS_SIMPLE_MATERIALS_HPP
#define FLUXIONS_SIMPLE_MATERIALS_HPP
#include <fluxions_stdcxx.hpp>
#include <fluxions_fileio.hpp>
#include <fluxions_simple_texture.hpp>
#include <fluxions_resource_manager.hpp>
#include <fluxions_simple_property.hpp>
namespace Fluxions
{
using namespace std;
struct SimpleMaterial
{
Vector3f Kd;
Vector3f Ks;
Vector3f Ke;
Vector3f Ka;
Vector3f Tf; // Translucency; // Tf
float Tr = 0.0f; // TranslucencyLevel -- same as (1 - d)
Vector3f Refract;
Vector3f Opacity;
float Ns = 0.0f; // Specular exponent [0 <= Ns <= 1000]
float Ni = 0.0f;
float d = 1.0f; // dissolved -- same as (1 - Tr)
float PBm = 0.0f; // for roughness
float PBk = 0.0f; // for metals
float PBKdm = 0.0f; // for diffuse roughness (Oren-Nayer)
float PBKsm = 0.0f; // for specular roughness (Cook-Torrance)
float PBior = 0.0f; // for Fresnel reflection (Cook-Torrance)
float PBGGXgamma = 0.11f; // for GGX BRDF (0.0 - 1.0 maps to 1.0 to 10.0 in the shader)
string PBmap;
float EmissionGlossiness;
float ReflectFresnel;
float RefractGlossiness;
float ReflectGlossiness;
float AnisotropyAmount;
float AnisotropyRotation;
Vector3f AttenuationColor;
float AttenuationDistance;
Vector3f ScatteringAlbedo;
float MeanCosine;
vector<string> RefractMode;
bool HasRoundedCorners = false;
float RoundedCorners;
bool IsPortal = false;
bool HasIesProfile = false;
string IesProfileFilename;
Matrix4f IesProfileMatrix;
bool IesProfileKeepSharp;
vector<string> Invisible;
string map_Ka;
string map_Kd;
string map_Ks;
string map_Ke;
string map_d;
string map_opacity;
string map_Ns;
string map_Ni;
string map_Tr;// translucency;
string map_Tf;//Tf translucencyLevel;
string map_refract;
string map_anisotropy;
string map_anisorotation;
string map_scatteringAlbedo;
string map_attenuation;
string map_normal;
string map_bump;
SimpleAssociativePropertyList Properties;
};
struct SimpleMap
{
string mapName;
GLuint mapId;
string pathname;
string shader;
GLuint textureId;
GLuint samplerId;
GLint unitId; // we're not using GLenum here because unitId can be < 0 and no overflow is expected.
GLint map_loc;
GLint map_mix_loc;
SimpleTexture textureObject;
};
ostream & WriteMaterial(ostream &ostr, const SimpleMaterial &mtl);
istream & ReadMaterial(istream &istr, SimpleMaterial &mtl);
void SetMaterialDefaults(SimpleMaterial &mtl);
struct SimpleMaterialLibrary
{
TResourceManager<SimpleMap> maps;
TResourceManager<SimpleMaterial> mtls;
FilePathInfo fpi;
string name;
SimpleMaterialLibrary() { }
~SimpleMaterialLibrary() { }
};
class SimpleMaterialSystem
{
private:
string defaultName = "<INVALIDMATERIAL>";
string currentMtlLibName;
GLuint currentMtlLibId = 0;
string currentMtlName;
GLuint currentMtlId = 0;
SimpleMaterialLibrary *currentMtlLibPtr = nullptr;
SimpleMaterial *currentMtlPtr = nullptr;
TResourceManager<SimpleMaterialLibrary> mtllibs;
TResourceManager<string> shaderMaps;
map<string, string> maps_paths;
string defaultMapPath = "<UNKNOWN>";
void SynchronizeIds();
public:
SimpleMaterialSystem();
~SimpleMaterialSystem();
void Clear();
auto begin() -> decltype(mtllibs.begin()) { return mtllibs.begin(); }
auto end() -> decltype(mtllibs.end()) { return mtllibs.end(); }
auto size() -> decltype(mtllibs.size()) { return mtllibs.size(); }
bool Save(const string &path);
bool Load(const string &mtllibName, const string &filename);
bool Save(const string &mtllibName, const string &filename);
SimpleMaterialLibrary *CreateLibrary(const string &name);
SimpleMaterial *CreateMaterial(const string &name);
void DeleteLibrary(const string &name);
void DeleteMaterial(const string &name);
void DeleteLibraryMaterial(const string &mtllibName, const string &mtlName);
SimpleMaterialLibrary *SetLibrary(const string &name);
SimpleMaterial *SetMaterial(const string &name);
SimpleMaterial *SetLibraryMaterial(const string &mtllibName, const string &mtlName);
const SimpleMaterial *GetLibraryMaterial(const string &mtllibName, const string &mtlName) const;
SimpleMaterial *GetCurrentMaterial() { return currentMtlPtr; }
const string & GetLibraryName();
const string & GetMaterialName();
const string & GetMaterialName(GLuint id);
GLuint GetLibraryId();
GLuint GetMaterialId();
GLuint GetLibraryId(const string &name);
GLuint GetMaterialId(const string &name);
GLuint GetLibraryMaterialId(const string &mtllibName, const string &mtlName);
bool AddMap(const string &path, const string &filename);
bool AddMapShader(const string &name, const string &shader);
void LoadMaps();
SimpleMap *GetTextureMap(const string &name);
const SimpleMap *GetTextureMap(const string &name) const;
const string & GetMapPath(const string & mapName) const;
};
}
#endif
Comments