Ivan Safrin 9 лет назад
Родитель
Сommit
a8677d6e67

+ 4 - 0
build/osx/TemplateApp/TemplateApp.xcodeproj/project.pbxproj

@@ -12,6 +12,7 @@
 		6D90506B1CCC057C00D0E80A /* liblua.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D90506A1CCC057C00D0E80A /* liblua.a */; };
 		6DCDD7251C724726007E90E1 /* main_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 6DCDD7241C724726007E90E1 /* main_icon.png */; };
 		6DD2D0B61BEEDC150026D85C /* libportaudio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DD2D0B51BEEDC150026D85C /* libportaudio.a */; };
+		8A7E202F1CD7D11A00EFC3CB /* rotate.js in Resources */ = {isa = PBXBuildFile; fileRef = 8A7E202E1CD7D11A00EFC3CB /* rotate.js */; };
 		8A825F271B82A2680039E823 /* libportaudio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A825F261B82A2680039E823 /* libportaudio.a */; };
 		8A825F291B82A29B0039E823 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A825F281B82A29B0039E823 /* CoreAudio.framework */; };
 		8A825F2E1B82A2C80039E823 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A825F2C1B82A2B10039E823 /* AudioUnit.framework */; };
@@ -40,6 +41,7 @@
 		6D90506A1CCC057C00D0E80A /* liblua.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblua.a; path = ../../../../lib/osx/liblua.a; sourceTree = "<group>"; };
 		6DCDD7241C724726007E90E1 /* main_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = main_icon.png; path = ../../../../assets/icons/main_icon.png; sourceTree = "<group>"; };
 		6DD2D0B51BEEDC150026D85C /* libportaudio.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libportaudio.a; path = ../../../../lib/osx/libportaudio.a; sourceTree = "<group>"; };
+		8A7E202E1CD7D11A00EFC3CB /* rotate.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = rotate.js; sourceTree = "<group>"; };
 		8A825F261B82A2680039E823 /* libportaudio.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libportaudio.a; path = ../../../../lib/osx/libportaudio.a; sourceTree = "<group>"; };
 		8A825F281B82A29B0039E823 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
 		8A825F2A1B82A2A50039E823 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
@@ -121,6 +123,7 @@
 				8A8653351B72931C009F94DD /* AppDelegate.h */,
 				8A8653361B72931C009F94DD /* AppDelegate.m */,
 				6D6FD3E01BF122A2005AA8E9 /* PolycodeView.mm */,
+				8A7E202E1CD7D11A00EFC3CB /* rotate.js */,
 				8A86536E1B72C301009F94DD /* PolycodeView.h */,
 				6D904FD21CC2AEB400D0E80A /* rotate.lua */,
 				8ADFECF91C8E0852007B57A2 /* default.pak */,
@@ -212,6 +215,7 @@
 				8A86533B1B72931C009F94DD /* Images.xcassets in Resources */,
 				8A8653961B752DBE009F94DD /* main_icon.png in Resources */,
 				8ADFECFA1C8E0852007B57A2 /* default.pak in Resources */,
+				8A7E202F1CD7D11A00EFC3CB /* rotate.js in Resources */,
 				8A86533E1B72931C009F94DD /* MainMenu.xib in Resources */,
 				6D904FD31CC2AEB400D0E80A /* rotate.lua in Resources */,
 				8ADFECF61C8E07FB007B57A2 /* hdr.pak in Resources */,

+ 1 - 5
build/osx/TemplateApp/TemplateApp/PolycodeTemplateApp.mm

@@ -25,7 +25,7 @@ PolycodeTemplateApp::PolycodeTemplateApp(PolycodeView *view) {
     
    // scene->setOverrideMaterial((Material*)globalPool->getResource(Resource::RESOURCE_MATERIAL, "Unlit"));
     
-    for(int i=0; i  < 5000; i++) {
+    for(int i=0; i  < 3; i++) {
         test = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 0.5, 0.5);
         test->setMaterialByName("Unlit");
         test->attachScript(rotateScript);
@@ -57,10 +57,6 @@ bool PolycodeTemplateApp::Update() {
     Number elapsed = core->getElapsed();
     
     
-    for(int i=0; i < tests.size(); i++) {
-        tests[i]->Roll(elapsed * 20.0);
-    }
-    
     ++numFrames;
     counter += elapsed;
     if(counter >= 1.0) {

+ 13 - 12
build/osx/TemplateApp/TemplateApp/rotate.js

@@ -1,16 +1,17 @@
--- test script
 
-Rotator = {}
-Rotator.__index = Rotator
 
-function Rotator.init(entity)
-	local rotator = {}
-	rotator.entity = entity
-	return rotator
-end
+var test = "Testing"
 
-function Rotator:update(elapsed)
-	Entity.Roll(self.entity, elapsed * 100.0)
-end
+var Rotator = function() {
+    
+}
 
-return Rotator
+Rotator.prototype.init = function(entity) {
+    this.entity = entity
+}
+
+Rotator.prototype.update = function(elapsed) {
+    entity_Roll(this.entity, elapsed * 30.0)
+}
+
+new Rotator()

+ 1 - 1
include/polycode/core/PolyScript.h

@@ -71,7 +71,7 @@ namespace Polycode {
     
     class JSScriptInstance : public ScriptInstance {
     public:
-        int tableRef;
+        void *objectRef;
     };
     
     class JSScript : public Script {

+ 10 - 0
src/core/PolyResourceManager.cpp

@@ -369,6 +369,13 @@ Resource *ProgramResourceLoader::loadResource(const String &path, ResourcePool *
     return newProgram;
 }
 
+duk_ret_t entity_Roll(duk_context *context) {
+    Entity *entity = (Entity*)duk_to_pointer(context, 0);
+    Number amt = duk_to_number(context, 1);
+    entity->Roll(amt);
+    return 0;
+}
+
 ScriptResourceLoader::ScriptResourceLoader() {
     luaState =  luaL_newstate();
     luaL_openlibs(luaState);
@@ -379,6 +386,9 @@ ScriptResourceLoader::ScriptResourceLoader() {
     
     duktapeContext = duk_create_heap_default();
     
+    duk_push_c_function(duktapeContext, entity_Roll, 2);
+    duk_put_global_string(duktapeContext, "entity_Roll");
+    
     extensions.push_back("lua");
     extensions.push_back("js");
     

+ 22 - 1
src/core/PolyScript.cpp

@@ -22,6 +22,7 @@
 
 #include "polycode/core/PolyScript.h"
 #include "polycode/core/PolyEntity.h"
+#include "polycode/core/PolyLogger.h"
 
 using namespace Polycode;
 
@@ -35,12 +36,32 @@ JSScript::JSScript(duk_context *context, const String &path) : Script(path) {
 
 ScriptInstance *JSScript::callInit(Entity *entity) {
     JSScriptInstance *scriptInstance = new JSScriptInstance();
+    
+    if(duk_peval_file(context, getResourcePath().c_str()) != 0) {
+        Logger::log("JAVASCRIPT ERROR: [%s]\n", duk_safe_to_string(context, -1));
+    }
+    
+    scriptInstance->objectRef = duk_get_heapptr(context, -1);
     scriptInstance->script = this;
+    
+    duk_push_heapptr(context, scriptInstance->objectRef);
+    duk_get_prop_string(context, -1, "init");
+    duk_push_pointer(context, entity);
+    if(duk_pcall(context, 1) != 0) {
+        Logger::log("JAVASCRIPT ERROR: [%s]\n", duk_safe_to_string(context, -1));
+    }
+    duk_pop_2(context);
     return scriptInstance;
 }
 
 void JSScript::callUpdate(ScriptInstance *instance, Entity *entity, Number elapsed) {
-    
+    duk_push_heapptr(context, ((JSScriptInstance*)instance)->objectRef);
+    duk_get_prop_string(context, -1, "update");
+    duk_push_number(context, elapsed);
+    if(duk_pcall(context, 1) != 0) {
+        Logger::log("JAVASCRIPT ERROR: [%s]\n", duk_safe_to_string(context, -1));
+    }
+    duk_pop_2(context);
 }
 
 LuaScript::LuaScript(lua_State *state, const String &path) : Script(path) {