included samplers dictionary for textures

pull/1015/head
Angelo Scandaliato 2016-09-30 17:23:38 -07:00
parent 7dd2e7011d
commit 0619232aef
5 changed files with 135 additions and 16 deletions

View File

@ -236,6 +236,32 @@ namespace glTF
BufferViewTarget_ELEMENT_ARRAY_BUFFER = 34963 BufferViewTarget_ELEMENT_ARRAY_BUFFER = 34963
}; };
//! Values for the Sampler::magFilter field
enum SamplerMagFilter
{
SamplerMagFilter_Nearest = 9728,
SamplerMagFilter_Linear = 9729
};
//! Values for the Sampler::minFilter field
enum SamplerMinFilter
{
SamplerMinFilter_Nearest = 9728,
SamplerMinFilter_Linear = 9729,
SamplerMinFilter_Nearest_Mipmap_Nearest = 9984,
SamplerMinFilter_Linear_Mipmap_Nearest = 9985,
SamplerMinFilter_Nearest_Mipmap_Linear = 9986,
SamplerMinFilter_Linear_Mipmap_Linear = 9987
};
//! Values for the Sampler::wrapS and Sampler::wrapT field
enum SamplerWrap
{
SamplerWrap_Clamp_To_Edge = 33071,
SamplerWrap_Mirrored_Repeat = 33648,
SamplerWrap_Repeat = 10497
};
//! Values for the Texture::format and Texture::internalFormat fields //! Values for the Texture::format and Texture::internalFormat fields
enum TextureFormat enum TextureFormat
{ {
@ -812,8 +838,14 @@ namespace glTF
struct Sampler : public Object struct Sampler : public Object
{ {
SamplerMagFilter magFilter; //!< The texture magnification filter. (required)
SamplerMinFilter minFilter; //!< The texture minification filter. (required)
SamplerWrap wrapS; //!< The texture wrapping in the S direction. (required)
SamplerWrap wrapT; //!< The texture wrapping in the T direction. (required)
Sampler() {} Sampler() {}
void Read(Value& obj, Asset& r); void Read(Value& obj, Asset& r);
void SetDefaults();
}; };
struct Scene : public Object struct Scene : public Object
@ -860,7 +892,7 @@ namespace glTF
//! A texture and its sampler. //! A texture and its sampler.
struct Texture : public Object struct Texture : public Object
{ {
//Ref<Sampler> source; //!< The ID of the sampler used by this texture. (required) Ref<Sampler> sampler; //!< The ID of the sampler used by this texture. (required)
Ref<Image> source; //!< The ID of the image used by this texture. (required) Ref<Image> source; //!< The ID of the image used by this texture. (required)
//TextureFormat format; //!< The texture's format. (default: TextureFormat_RGBA) //TextureFormat format; //!< The texture's format. (default: TextureFormat_RGBA)
@ -1049,7 +1081,7 @@ namespace glTF
LazyDict<Mesh> meshes; LazyDict<Mesh> meshes;
LazyDict<Node> nodes; LazyDict<Node> nodes;
//LazyDict<Program> programs; //LazyDict<Program> programs;
//LazyDict<Sampler> samplers; LazyDict<Sampler> samplers;
LazyDict<Scene> scenes; LazyDict<Scene> scenes;
//LazyDict<Shader> shaders; //LazyDict<Shader> shaders;
//LazyDict<Skin> skins; //LazyDict<Skin> skins;
@ -1074,7 +1106,7 @@ namespace glTF
, meshes (*this, "meshes") , meshes (*this, "meshes")
, nodes (*this, "nodes") , nodes (*this, "nodes")
//, programs (*this, "programs") //, programs (*this, "programs")
//, samplers (*this, "samplers") , samplers (*this, "samplers")
, scenes (*this, "scenes") , scenes (*this, "scenes")
//, shaders (*this, "shaders") //, shaders (*this, "shaders")
//, skins (*this, "skins") //, skins (*this, "skins")

View File

@ -665,12 +665,35 @@ inline void Image::SetData(uint8_t* data, size_t length, Asset& r)
} }
} }
inline void Sampler::Read(Value& obj, Asset& r)
{
SetDefaults();
ReadMember(obj, "magFilter", magFilter);
ReadMember(obj, "minFilter", minFilter);
ReadMember(obj, "wrapS", wrapS);
ReadMember(obj, "wrapT", wrapT);
}
inline void Sampler::SetDefaults()
{
magFilter = SamplerMagFilter_Linear;
minFilter = SamplerMinFilter_Linear;
wrapS = SamplerWrap_Repeat;
wrapT = SamplerWrap_Repeat;
}
inline void Texture::Read(Value& obj, Asset& r) inline void Texture::Read(Value& obj, Asset& r)
{ {
const char* sourcestr; const char* sourcestr;
if (ReadMember(obj, "source", sourcestr)) { if (ReadMember(obj, "source", sourcestr)) {
source = r.images.Get(sourcestr); source = r.images.Get(sourcestr);
} }
const char* samplerstr;
if (ReadMember(obj, "sampler", samplerstr)) {
sampler = r.samplers.Get(samplerstr);
}
} }
namespace { namespace {

View File

@ -333,7 +333,18 @@ namespace glTF {
inline void Write(Value& obj, Sampler& b, AssetWriter& w) inline void Write(Value& obj, Sampler& b, AssetWriter& w)
{ {
if (b.wrapS) {
obj.AddMember("wrapS", b.wrapS, w.mAl);
}
if (b.wrapT) {
obj.AddMember("wrapT", b.wrapT, w.mAl);
}
if (b.magFilter) {
obj.AddMember("magFilter", b.magFilter, w.mAl);
}
if (b.minFilter) {
obj.AddMember("minFilter", b.minFilter, w.mAl);
}
} }
inline void Write(Value& scene, Scene& s, AssetWriter& w) inline void Write(Value& scene, Scene& s, AssetWriter& w)
@ -361,6 +372,9 @@ namespace glTF {
if (tex.source) { if (tex.source) {
obj.AddMember("source", Value(tex.source->id, w.mAl).Move(), w.mAl); obj.AddMember("source", Value(tex.source->id, w.mAl).Move(), w.mAl);
} }
if (tex.sampler) {
obj.AddMember("sampler", Value(tex.sampler->id, w.mAl).Move(), w.mAl);
}
} }
inline void Write(Value& obj, Light& b, AssetWriter& w) inline void Write(Value& obj, Light& b, AssetWriter& w)

View File

@ -235,6 +235,52 @@ namespace {
} }
} }
void glTFExporter::GetTexSampler(const aiMaterial* mat, glTF::TexProperty& prop)
{
std::string samplerId = mAsset->FindUniqueID("", "sampler");
prop.texture->sampler = mAsset->samplers.Create(samplerId);
aiTextureMapMode mapU, mapV;
aiGetMaterialInteger(mat,AI_MATKEY_MAPPINGMODE_U_DIFFUSE(0),(int*)&mapU);
aiGetMaterialInteger(mat,AI_MATKEY_MAPPINGMODE_V_DIFFUSE(0),(int*)&mapV);
switch (mapU) {
case aiTextureMapMode_Wrap:
prop.texture->sampler->wrapS = SamplerWrap_Repeat;
break;
case aiTextureMapMode_Clamp:
prop.texture->sampler->wrapS = SamplerWrap_Clamp_To_Edge;
break;
case aiTextureMapMode_Mirror:
prop.texture->sampler->wrapS = SamplerWrap_Mirrored_Repeat;
break;
case aiTextureMapMode_Decal:
default:
prop.texture->sampler->wrapS = SamplerWrap_Repeat;
break;
};
switch (mapV) {
case aiTextureMapMode_Wrap:
prop.texture->sampler->wrapT = SamplerWrap_Repeat;
break;
case aiTextureMapMode_Clamp:
prop.texture->sampler->wrapT = SamplerWrap_Clamp_To_Edge;
break;
case aiTextureMapMode_Mirror:
prop.texture->sampler->wrapT = SamplerWrap_Mirrored_Repeat;
break;
case aiTextureMapMode_Decal:
default:
prop.texture->sampler->wrapT = SamplerWrap_Repeat;
break;
};
// Hard coded Texture filtering options because I do not know where to find them in the aiMaterial.
prop.texture->sampler->magFilter = SamplerMagFilter_Linear;
prop.texture->sampler->minFilter = SamplerMinFilter_Linear;
}
void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& prop, const char* propName, int type, int idx, aiTextureType tt) void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& prop, const char* propName, int type, int idx, aiTextureType tt)
{ {
aiString tex; aiString tex;
@ -274,6 +320,8 @@ void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& pr
else { else {
prop.texture->source->uri = path; prop.texture->source->uri = path;
} }
GetTexSampler(mat, prop);
} }
} }
} }
@ -284,6 +332,7 @@ void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& pr
} }
} }
void glTFExporter::ExportMaterials() void glTFExporter::ExportMaterials()
{ {
aiString aiName; aiString aiName;

View File

@ -94,6 +94,7 @@ namespace Assimp
void WriteBinaryData(IOStream* outfile, std::size_t sceneLength); void WriteBinaryData(IOStream* outfile, std::size_t sceneLength);
void GetTexSampler(const aiMaterial* mat, glTF::TexProperty& prop);
void GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& prop, const char* propName, int type, int idx, aiTextureType tt); void GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& prop, const char* propName, int type, int idx, aiTextureType tt);
void ExportMetadata(); void ExportMetadata();
void ExportMaterials(); void ExportMaterials();