2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include "shader-api.h"
23 #include <dali/public-api/object/type-registry.h>
27 #include <rendering/shader-wrapper.h>
38 * Shaders allows custom vertex and color transformations in the GPU
43 * // this will match the default shaders for image
44 * var vertexShader = " void main() \
46 * gl_Position = uProjection * uModelView * vec4(aPosition, 1.0); \
47 * vTexCoord = aTexCoord; \
49 * var fragShader = " void main() \
51 * gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\
53 * var shaderOptions = {
54 * vertexShader: vertexShader,
55 * fragmentShader: fragShader
58 * var shader = new dali.Shader(shaderOptions);
64 namespace // unnamed namespace
67 typedef std::vector< std::string > HintsArray;
72 Shader::Hint::Value hint;
75 const ShaderHintPair ShaderHintTable[]=
77 {"outputIsTransparent", Shader::Hint::OUTPUT_IS_TRANSPARENT },
78 {"modifiesGeometry", Shader::Hint::MODIFIES_GEOMETRY },
81 const unsigned int ShaderHintTableCount = sizeof(ShaderHintTable)/sizeof(ShaderHintTable[0]);
83 struct ShaderParameters
86 : mHints( Shader::Hint::NONE )
90 Shader::Hint::Value GetShaderHint( const std::string& hint )
92 for( unsigned int i = 0 ; i < ShaderHintTableCount; ++i )
94 if( hint == ShaderHintTable[i].name )
96 return ShaderHintTable[i].hint;
99 return Shader::Hint::NONE;
102 void ProcessHintsArray( const HintsArray& hintsArray )
104 for( HintsArray::const_iterator iter = hintsArray.begin(); iter != hintsArray.end() ; ++iter )
106 mHints= static_cast<Shader::Hint::Value>( mHints | GetShaderHint( *iter ) );
112 return Shader::New( mVertex,
118 std::string mFragment;
119 Shader::Hint::Value mHints;
125 * Create a new Shader
129 * @param {Object} shaderOptions
130 * @param {String} [shaderOptions.vertexShader] VertexShader code for the shader. If not defined, the default version will be used
131 * @param {String} [shaderOptions.fragmentShader] FragmentShader code for the shader. If not defined, the default version will be used
132 * @param {Array} [shaderOptions.shaderHints] Hints for rendering/subdividing geometry, e.g. [ "requiresSelfDepthTest", "outputIsTransparent", "outputIsOpaque","modifiesGeometry" ]
133 * @return {Object} Shader
136 // this will match the default shaders for image
137 var vertexShader = " void main() \
139 gl_Position = uProjection * uModelView * vec4(aPosition, 1.0); \
140 vTexCoord = aTexCoord; \
143 var fragShader = " void main() \
145 gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\
148 var shaderOptions = {
149 vertexShader: vertexShader,
150 fragmentShader: fragShader
153 var shader = new dali.Shader(shaderOptions);
156 Shader ShaderApi::New( v8::Isolate* isolate, const v8::FunctionCallbackInfo< v8::Value >& args )
158 v8::HandleScope handleScope( isolate );
160 ShaderParameters shaderParams;
162 if( args[0]->IsObject() )
164 v8::Local<v8::Object > obj = args[0]->ToObject();
166 v8::Local<v8::Value> vertexValue = obj->Get(v8::String::NewFromUtf8( isolate, "vertexShader"));
167 if( vertexValue->IsString() )
169 shaderParams.mVertex = V8Utils::v8StringToStdString( vertexValue );
172 v8::Local<v8::Value> fragmentValue = obj->Get(v8::String::NewFromUtf8( isolate, "fragmentShader"));
173 if( fragmentValue->IsString() )
175 shaderParams.mFragment = V8Utils::v8StringToStdString( fragmentValue );
178 v8::Local<v8::Value> hints = obj->Get(v8::String::NewFromUtf8( isolate, "shaderHints"));
179 if( hints->IsArray() )
181 HintsArray hintsArray;
182 v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast( hints );
183 for( uint32_t i=0; i < array->Length(); ++i)
185 v8::Handle<v8::Value> entry = array->Get( v8::Integer::New( isolate, i) );
186 if( entry->IsString() )
188 std::string entryString = V8Utils::v8StringToStdString( entry );
189 hintsArray.push_back( entryString );
192 shaderParams.ProcessHintsArray( hintsArray );
196 return shaderParams.NewShader();
199 Shader ShaderApi::GetShaderFromParams( int paramIndex,
201 v8::Isolate* isolate,
202 const v8::FunctionCallbackInfo< v8::Value >& args )
206 v8::HandleScope handleScope( isolate );
207 BaseWrappedObject* wrappedObject = V8Utils::GetWrappedDaliObjectParameter( paramIndex, BaseWrappedObject::SHADER, isolate, args );
211 ShaderWrapper* wrapper = static_cast< ShaderWrapper *>(wrappedObject);
212 return wrapper->GetShader();
220 } // namespace V8Plugin