Update following the changes of blending&culling options
[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    { "GetTextureIndex"                 , MaterialApi::GetTextureIndex },
56    { "GetNumberOfTextures"             , MaterialApi::GetNumberOfTextures },
57 };
58
59 const unsigned int MaterialFunctionTableCount = sizeof(MaterialFunctionTable)/sizeof(MaterialFunctionTable[0]);
60 } //un-named space
61
62
63 MaterialWrapper::MaterialWrapper( const Dali::Material& material, GarbageCollectorInterface& gc )
64 :  HandleWrapper(  BaseWrappedObject::MATERIAL , material, gc )
65 {
66     mMaterial = material;
67 }
68
69 v8::Handle<v8::Object> MaterialWrapper::WrapMaterial(v8::Isolate* isolate, const Dali::Material& material )
70 {
71   v8::EscapableHandleScope handleScope( isolate );
72   v8::Local<v8::ObjectTemplate> objectTemplate;
73
74   objectTemplate = GetMaterialTemplate( isolate);
75
76   // create an instance of the template
77   v8::Local<v8::Object> localObject = objectTemplate->NewInstance();
78
79   // create the Material wrapper
80   MaterialWrapper* pointer =  new MaterialWrapper( material, Dali::V8Plugin::DaliWrapper::Get().GetDaliGarbageCollector() );
81
82   // assign the JavaScript object to the wrapper.
83   pointer->SetJavascriptObject( isolate, localObject );
84
85   return handleScope.Escape( localObject );
86 }
87
88 v8::Local<v8::ObjectTemplate> MaterialWrapper::GetMaterialTemplate( v8::Isolate* isolate)
89 {
90   v8::EscapableHandleScope handleScope( isolate );
91   v8::Local<v8::ObjectTemplate> objectTemplate;
92
93   if( mMaterialTemplate.IsEmpty() )
94   {
95     objectTemplate = MakeMaterialTemplate( isolate );
96     mMaterialTemplate.Reset( isolate, objectTemplate );
97   }
98   else
99   {
100     // get the object template
101     objectTemplate = v8::Local<v8::ObjectTemplate>::New( isolate, mMaterialTemplate );
102   }
103   return handleScope.Escape( objectTemplate );
104 }
105
106 v8::Handle<v8::ObjectTemplate> MaterialWrapper::MakeMaterialTemplate( v8::Isolate* isolate )
107 {
108   v8::EscapableHandleScope handleScope( isolate );
109
110   v8::Local<v8::ObjectTemplate> objTemplate = v8::ObjectTemplate::New();
111
112   // property handle intercepts property getters and setters and signals
113   HandleWrapper::AddInterceptsToTemplate( isolate, objTemplate );
114
115   objTemplate->SetInternalFieldCount( BaseWrappedObject::FIELD_COUNT );
116
117   // add our function properties
118   ObjectTemplateHelper::InstallFunctions( isolate, objTemplate, MaterialFunctionTable, MaterialFunctionTableCount );
119
120   return handleScope.Escape( objTemplate );
121 }
122
123 void MaterialWrapper::NewMaterial( const v8::FunctionCallbackInfo< v8::Value >& args)
124 {
125   v8::Isolate* isolate = args.GetIsolate();
126   v8::HandleScope handleScope( isolate);
127
128   if(!args.IsConstructCall())
129   {
130       DALI_SCRIPT_EXCEPTION( isolate, "Material constructor called without 'new'");
131       return;
132   }
133   Dali::Material material = MaterialApi::New( args );
134
135   if(material)
136   {
137     v8::Local<v8::Object> localObject = WrapMaterial( isolate, material );
138     args.GetReturnValue().Set( localObject );
139   }
140 }
141
142
143 Material MaterialWrapper::GetMaterial()
144 {
145   return mMaterial;
146 }
147
148
149 } // namespace V8Plugin
150
151 } // namespace Dali