blob: 2109b443469c039102867bd200638ce18730faf0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#include "ShaderManager.h"
#include <QOpenGLContext>
ShaderManager::ShaderManager(MOBase::IOrganizer* moInfo) : m_MOInfo{ moInfo }
{}
QOpenGLShaderProgram* ShaderManager::getProgram(ShaderType type)
{
if (type == None) {
return nullptr;
}
if (m_Programs[type] == nullptr) {
m_Programs[type] = loadProgram(type);
}
return m_Programs[type];
}
QOpenGLShaderProgram* ShaderManager::loadProgram(ShaderType type)
{
QString vert;
QString frag;
switch (type) {
case SKDefault:
vert = "default.vert";
frag = "sk_default.frag";
break;
case SKMSN:
vert = "sk_msn.vert";
frag = "sk_msn.frag";
break;
case SKMultilayer:
vert = "default.vert";
frag = "sk_multilayer.frag";
break;
case SKEffectShader:
vert = "sk_effectshader.vert";
frag = "sk_effectshader.frag";
break;
case FO4Default:
vert = "default.vert";
frag = "fo4_default.frag";
break;
case FO4EffectShader:
vert = "default.vert";
frag = "fo4_effectshader.frag";
break;
default:
return nullptr;
}
auto game = m_MOInfo->managedGame();
auto dataPath = MOBase::IOrganizer::getPluginDataPath();
auto vertexShader = QString("%1/shaders/%2").arg(dataPath).arg(vert);
auto fragmentShader = QString("%1/shaders/%2").arg(dataPath).arg(frag);
auto program = new QOpenGLShaderProgram(QOpenGLContext::currentContext());
program->addShaderFromSourceFile(QOpenGLShader::Vertex, vertexShader);
program->addShaderFromSourceFile(QOpenGLShader::Fragment, fragmentShader);
program->bindAttributeLocation("position", AttribPosition);
program->bindAttributeLocation("normal", AttribNormal);
program->bindAttributeLocation("tangent", AttribTangent);
program->bindAttributeLocation("bitangent", AttribBitangent);
program->bindAttributeLocation("texCoord", AttribTexCoord);
program->bindAttributeLocation("color", AttribColor);
program->link();
return program;
}
|