mirror of https://github.com/axmolengine/axmol.git
127 lines
3.2 KiB
C++
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
|