axmol/extensions/Effekseer/EffekseerMaterialCompiler/OpenGL/EffekseerMaterialCompilerGL...

127 lines
3.2 KiB
C++

#include "EffekseerMaterialCompilerGL.h"
#include <iostream>
#include "../GLSLGenerator/ShaderGenerator.h"
namespace Effekseer
{
static const int InstanceCount = 10;
class CompiledMaterialBinaryGL : public CompiledMaterialBinary, public ReferenceObject
{
private:
std::array<std::vector<uint8_t>, static_cast<int32_t>(MaterialShaderType::Max)> vertexShaders_;
std::array<std::vector<uint8_t>, static_cast<int32_t>(MaterialShaderType::Max)> pixelShaders_;
public:
CompiledMaterialBinaryGL()
{
}
virtual ~CompiledMaterialBinaryGL()
{
}
void SetVertexShaderData(MaterialShaderType type, const std::vector<uint8_t>& data)
{
vertexShaders_.at(static_cast<int>(type)) = data;
}
void SetPixelShaderData(MaterialShaderType type, const std::vector<uint8_t>& data)
{
pixelShaders_.at(static_cast<int>(type)) = data;
}
const uint8_t* GetVertexShaderData(MaterialShaderType type) const override
{
return vertexShaders_.at(static_cast<int>(type)).data();
}
int32_t GetVertexShaderSize(MaterialShaderType type) const override
{
return static_cast<int32_t>(vertexShaders_.at(static_cast<int>(type)).size());
}
const uint8_t* GetPixelShaderData(MaterialShaderType type) const override
{
return pixelShaders_.at(static_cast<int>(type)).data();
}
int32_t GetPixelShaderSize(MaterialShaderType type) const override
{
return static_cast<int32_t>(pixelShaders_.at(static_cast<int>(type)).size());
}
int AddRef() override
{
return ReferenceObject::AddRef();
}
int Release() override
{
return ReferenceObject::Release();
}
int GetRef() override
{
return ReferenceObject::GetRef();
}
};
CompiledMaterialBinary* MaterialCompilerGL::Compile(MaterialFile* materialFile, int32_t maximumUniformCount, int32_t maximumTextureCount)
{
auto binary = new CompiledMaterialBinaryGL();
auto convertToVector = [](const std::string& str) -> std::vector<uint8_t> {
std::vector<uint8_t> ret;
ret.resize(str.size() + 1);
memcpy(ret.data(), str.data(), str.size());
ret[str.size()] = 0;
return ret;
};
auto saveBinary = [&materialFile, &binary, &convertToVector, &maximumUniformCount, &maximumTextureCount](MaterialShaderType type) {
GLSL::ShaderGenerator generator;
auto shader = generator.GenerateShader(materialFile, type, maximumUniformCount, maximumTextureCount, false, false, false, false, 0, false, false, InstanceCount);
binary->SetVertexShaderData(type, convertToVector(shader.CodeVS));
binary->SetPixelShaderData(type, convertToVector(shader.CodePS));
};
if (materialFile->GetHasRefraction())
{
saveBinary(MaterialShaderType::Refraction);
saveBinary(MaterialShaderType::RefractionModel);
}
saveBinary(MaterialShaderType::Standard);
saveBinary(MaterialShaderType::Model);
return binary;
}
CompiledMaterialBinary* MaterialCompilerGL::Compile(MaterialFile* materialFile)
{
return Compile(materialFile, Effekseer::UserUniformSlotMax, Effekseer::UserTextureSlotMax);
}
} // namespace Effekseer
#ifdef __SHARED_OBJECT__
extern "C"
{
#ifdef _WIN32
#define EFK_EXPORT __declspec(dllexport)
#else
#define EFK_EXPORT
#endif
EFK_EXPORT Effekseer::MaterialCompiler* EFK_STDCALL CreateCompiler()
{
return new Effekseer::MaterialCompilerGL();
}
}
#endif