00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "KeosShadersLoader.h"
00022 #include "KeosRenderSystem.h"
00023 #include "KeosException.h"
00024
00025 namespace Keos
00026 {
00027
00028
00029
00030
00031
00032 CShadersLoader::CShadersLoader(TShaderType Type) :
00033 m_Type(Type)
00034 {
00035
00036 cgSetErrorCallback(&OnError);
00037
00038
00039 m_Context = cgCreateContext();
00040 }
00041
00042
00043 CShadersLoader::~CShadersLoader()
00044 {
00046
00047
00048 if (m_Context)
00049 cgDestroyContext(m_Context);
00050 }
00051
00052
00053 IShaderBase* CShadersLoader::LoadFromFile(const String& strFilename)
00054 {
00055 if (m_Type == SHADER_VERTEX && !Renderer->GetCapabilities()->HasCapability(CAP_VERTEX_PROGRAM))
00056 LOADINGFAILED_EXCEPT(strFilename, "Vertex programs (shaders) not supported !", "CShadersLoader::LoadFromFile");
00057
00058 if (m_Type == SHADER_PIXEL && !Renderer->GetCapabilities()->HasCapability(CAP_FRAGMENT_PROGRAM))
00059 LOADINGFAILED_EXCEPT(strFilename, "Fragment programs (pixel shaders) not supported !", "CShadersLoader::LoadFromFile");
00060
00061
00062 CGprogram Program;
00063 try
00064 {
00065 Program = cgCreateProgramFromFile(m_Context,
00066 CG_SOURCE,
00067 strFilename.c_str(),
00068 Renderer->GetShaderProfile(m_Type),
00069 "main",
00070 const_cast<const char**>(Renderer->GetShaderOptions(m_Type)));
00071 }
00072 catch (CException& E)
00073 {
00074 LOADINGFAILED_EXCEPT(strFilename, E.what() + std::string("\n") + cgGetLastListing(m_Context), "CShadersLoader::LoadFromFile");
00075 }
00076
00077 return Renderer->CreateShader(Program, m_Type);
00078 }
00079
00080
00081 void CShadersLoader::OnError()
00082 {
00083 throw CException(cgGetErrorString(cgGetError()));
00084 }
00085
00086
00087 }