#include "shader.h" #include using namespace v8; using namespace node; Persistent Shader::constructor; //---------------------------------------------------------------------- Shader::Shader(Compiler* compiler, int type, const char* source) { if (compiler) { _binding = glslopt_optimize(compiler->getBinding(), (glslopt_shader_type)type, source, 0); _compiled = glslopt_get_status(_binding); } else { _binding = 0; _compiled = false; } } //---------------------------------------------------------------------- Shader::~Shader() { release(); } //---------------------------------------------------------------------- void Shader::release() { if (_binding) { glslopt_shader_delete(_binding); _binding = 0; _compiled = false; } } //---------------------------------------------------------------------- const char* Shader::getOutput() const { return (_compiled) ? glslopt_get_output(_binding) : ""; } //---------------------------------------------------------------------- const char* Shader::getRawOutput() const { return (_compiled) ? glslopt_get_raw_output(_binding) : ""; } //---------------------------------------------------------------------- const char* Shader::getLog() const { return (_compiled) ? glslopt_get_log(_binding) : ""; } //---------------------------------------------------------------------- void Shader::Init(Handle exports) { NanScope(); // Prepare constructor template Local tpl = NanNew(New); tpl->SetClassName(NanNew("Shader")); tpl->InstanceTemplate()->SetInternalFieldCount(1); // Prototype NanSetPrototypeTemplate(tpl, "dispose", NanNew(Dispose)); NanSetPrototypeTemplate(tpl, "compiled", NanNew(Compiled)); NanSetPrototypeTemplate(tpl, "output", NanNew(Output)); NanSetPrototypeTemplate(tpl, "rawOutput", NanNew(RawOutput)); NanSetPrototypeTemplate(tpl, "log", NanNew(Log)); // Export the class NanAssignPersistent(constructor, tpl->GetFunction()); exports->Set(NanNew("Shader"), tpl->GetFunction()); } //---------------------------------------------------------------------- Handle Shader::New(const Arguments& args) { NanScope(); if (args.Length() == 3) { // Check the first parameter (compiler) Local args0 = args[0]; if (args0->IsObject()) { // Check the second parameter (shader type) Local args1 = args[1]; if (args1->IsInt32()) { // Check the third parameter (source code) Local args2 = args[2]; if (args2->IsString()) { Compiler* compiler = ObjectWrap::Unwrap(args0->ToObject()); int type = args1->Int32Value(); String::Utf8Value sourceCode(args2->ToString()); Shader* obj = new Shader(compiler, type, *sourceCode); obj->Wrap(args.This()); return args.This(); } } } } // Couldn't create the Shader NanThrowError("Invalid arguments"); } //---------------------------------------------------------------------- NAN_METHOD(Shader::Dispose) { NanScope(); Shader* obj = ObjectWrap::Unwrap(args.This()); obj->release(); NanReturnUndefined(); } //---------------------------------------------------------------------- NAN_METHOD(Shader::Compiled) { NanScope(); Shader* obj = ObjectWrap::Unwrap(args.This()); NanReturnValue(NanNew(obj->isCompiled())); } //---------------------------------------------------------------------- NAN_METHOD(Shader::Output) { NanScope(); Shader* obj = ObjectWrap::Unwrap(args.This()); NanReturnValue(NanNew(obj->getOutput())); } //---------------------------------------------------------------------- NAN_METHOD(Shader::RawOutput) { NanScope(); Shader* obj = ObjectWrap::Unwrap(args.This()); NanReturnValue(NanNew(obj->getRawOutput())); } //---------------------------------------------------------------------- NAN_METHOD(Shader::Log) { NanScope(); Shader* obj = ObjectWrap::Unwrap(args.This()); NanReturnValue(NanNew(obj->getLog())); }