4fc5a77816aca985839317205dc85b7093b41c99
[platform/core/uifw/dali-toolkit.git] / plugins / dali-script-v8 / src / rendering / material-wrapper.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include "material-wrapper.h"
20
21 // INTERNAL INCLUDES
22 #include <v8-utils.h>
23 #include <rendering/material-api.h>
24 #include <shared/api-function.h>
25 #include <shared/object-template-helper.h>
26 #include <dali-wrapper.h>
27
28 namespace Dali
29 {
30
31 namespace V8Plugin
32 {
33
34 v8::Persistent<v8::ObjectTemplate> MaterialWrapper::mMaterialTemplate;
35
36 namespace // un-named name space
37 {
38
39 /**
40  * Contains a list of all functions that can be called
41  */
42 const ApiFunction MaterialFunctionTable[]=
43 {
44     /**************************************
45     * Material API (in order of Material.h)
46     **************************************/
47
48    { "SetShader"                       , MaterialApi::SetShader },
49    { "GetShader"                       , MaterialApi::GetShader },
50    { "AddTexture"                      , MaterialApi::AddTexture },
51    { "RemoveTexture"                   , MaterialApi::RemoveTexture },
52    { "SetTextureImage"                 , MaterialApi::SetTextureImage },
53    { "SetTextureSampler"               , MaterialApi::SetTextureSampler },
54    { "SetTextureUniformName"           , MaterialApi::SetTextureUniformName },
55    { "SetTextureAffectsTransparency"   , MaterialApi::SetTextureAffectsTransparency },
56    { "GetTextureIndex"                 , MaterialApi::GetTextureIndex },
57    { "GetNumberOfTextures"             , MaterialApi::GetNumberOfTextures },
58    { "SetFaceCullingMode"              , MaterialApi::SetFaceCullingMode },
59    { "SetBlendMode"                    , MaterialApi::SetBlendMode },
60    { "GetBlendMode"                    , MaterialApi::GetBlendMode },
61    { "SetBlendFunc"                    , MaterialApi::SetBlendFunc },
62    { "GetBlendFunc"                    , MaterialApi::GetBlendFunc },
63    { "SetBlendEquation"                , MaterialApi::SetBlendEquation },
64    { "GetBlendEquation"                , MaterialApi::GetBlendEquation },
65 };
66
67 const unsigned int MaterialFunctionTableCount = sizeof(MaterialFunctionTable)/sizeof(MaterialFunctionTable[0]);
68 } //un-named space
69
70
71 MaterialWrapper::MaterialWrapper( const Dali::Material& material, GarbageCollectorInterface& gc )
72 :  HandleWrapper(  BaseWrappedObject::MATERIAL , material, gc )
73 {
74     mMaterial = material;
75 }
76
77 v8::Handle<v8::Object> MaterialWrapper::WrapMaterial(v8::Isolate* isolate, const Dali::Material& material )
78 {
79   v8::EscapableHandleScope handleScope( isolate );
80   v8::Local<v8::ObjectTemplate> objectTemplate;
81
82   objectTemplate = GetMaterialTemplate( isolate);
83
84   // create an instance of the template
85   v8::Local<v8::Object> localObject = objectTemplate->NewInstance();
86
87   // create the Material wrapper
88   MaterialWrapper* pointer =  new MaterialWrapper( material, Dali::V8Plugin::DaliWrapper::Get().GetDaliGarbageCollector() );
89
90   // assign the JavaScript object to the wrapper.
91   pointer->SetJavascriptObject( isolate, localObject );
92
93   return handleScope.Escape( localObject );
94 }
95
96 v8::Local<v8::ObjectTemplate> MaterialWrapper::GetMaterialTemplate( v8::Isolate* isolate)
97 {
98   v8::EscapableHandleScope handleScope( isolate );
99   v8::Local<v8::ObjectTemplate> objectTemplate;
100
101   if( mMaterialTemplate.IsEmpty() )
102   {
103     objectTemplate = MakeMaterialTemplate( isolate );
104     mMaterialTemplate.Reset( isolate, objectTemplate );
105   }
106   else
107   {
108     // get the object template
109     objectTemplate = v8::Local<v8::ObjectTemplate>::New( isolate, mMaterialTemplate );
110   }
111   return handleScope.Escape( objectTemplate );
112 }
113
114 v8::Handle<v8::ObjectTemplate> MaterialWrapper::MakeMaterialTemplate( v8::Isolate* isolate )
115 {
116   v8::EscapableHandleScope handleScope( isolate );
117
118   v8::Local<v8::ObjectTemplate> objTemplate = v8::ObjectTemplate::New();
119
120   // property handle intercepts property getters and setters and signals
121   HandleWrapper::AddInterceptsToTemplate( isolate, objTemplate );
122
123   objTemplate->SetInternalFieldCount( BaseWrappedObject::FIELD_COUNT );
124
125   // add our function properties
126   ObjectTemplateHelper::InstallFunctions( isolate, objTemplate, MaterialFunctionTable, MaterialFunctionTableCount );
127
128   return handleScope.Escape( objTemplate );
129 }
130
131 void MaterialWrapper::NewMaterial( const v8::FunctionCallbackInfo< v8::Value >& args)
132 {
133   v8::Isolate* isolate = args.GetIsolate();
134   v8::HandleScope handleScope( isolate);
135
136   if(!args.IsConstructCall())
137   {
138       DALI_SCRIPT_EXCEPTION( isolate, "Material constructor called without 'new'");
139       return;
140   }
141   Dali::Material material = MaterialApi::New( args );
142
143   if(material)
144   {
145     v8::Local<v8::Object> localObject = WrapMaterial( isolate, material );
146     args.GetReturnValue().Set( localObject );
147   }
148 }
149
150
151 Material MaterialWrapper::GetMaterial()
152 {
153   return mMaterial;
154 }
155
156
157 } // namespace V8Plugin
158
159 } // namespace Dali