Browse Source

optimized runtime generated atlasses
removed class Options from oxygine
added more comments

Denis Muratshin 12 years ago
parent
commit
31494c38b2

+ 1 - 0
.hgignore

@@ -77,5 +77,6 @@ examples/GameTemplate/build_gametemplate_src_vc11
 examples/Match3/build_match3_src_vc11/
 
 oxygine-framework.zip
+examples/TutorialResources/build_tutorialresources_vc11/
 syntax: regexp
 ^build/

+ 1 - 0
doc.bat

@@ -0,0 +1 @@
+doxygen

BIN
doc.zip


+ 34 - 0
examples/Demo/demo.mkb

@@ -0,0 +1,34 @@
+#!/usr/bin/env mkb
+
+options
+{
+	module_path="../../oxygine/marmalade/"
+	enable-exceptions=1
+}
+
+includepath src
+
+files
+{
+	[src]
+	(src)
+	"*.h"
+	"*.cpp"
+}
+
+subprojects
+{
+	oxygine-framework
+	iwgl 
+}
+
+assets
+{
+	(data)
+}
+#### AUTO GENERATED deployment settings from DeployTool.exe. Do not edit below this line ####
+deployments
+{
+	["Default"]
+	android-manifest='AndroidManifest.xml'
+}

+ 29 - 0
examples/DemoBox2D/Box2D.mkb

@@ -0,0 +1,29 @@
+#!/usr/bin/env mkb
+
+options
+{
+	module_path="../../oxygine/marmalade/"
+	enable-exceptions=1
+}
+
+includepath src
+
+files
+{
+	[src]
+	(src)
+	"*.h"
+	"*.cpp"
+}
+
+subprojects
+{
+	oxygine-framework
+	iwgl 
+	box2d/box2d
+}
+
+assets
+{
+	(data)
+}

+ 28 - 0
examples/GameTemplate/GameTemplate.mkb

@@ -0,0 +1,28 @@
+#!/usr/bin/env mkb
+
+options
+{
+	module_path="../../oxygine/marmalade/"
+	enable-exceptions=1	
+}
+
+includepath src
+
+files
+{
+	[src]
+	(src)
+	"*.h"
+	"*.cpp"
+}
+
+subprojects
+{
+	oxygine-framework
+	iwgl
+}
+
+assets
+{
+	(data)
+}

+ 1 - 1
examples/GameTemplate/data/development.icf

@@ -36,7 +36,7 @@ DeviceUniqueIDInt              = Type=int, Default="01234567890", Value = "01234
 FileTotalStorageSize           = Type=int, Min=0.000000, Max=2147483648.000000, Default="67108864", Value = "67108864"
 FileUseSeparateRomRam          = Type=bool, Default="true", Value = "true"
 FileUseTotalStorageSize        = Type=bool, Default="false", Value = "false"
-GLAPI                          = Type=string, Allowed="None" "GLES 1.0 Common-Lite Profile from Imagination POWERVR(TM)" "GLES 1.1 Common-Lite Profile from Imagination POWERVR(TM)" "GLES 1.0 Common Profile from Imagination POWERVR(TM)" "GLES 1.1 Common Profile from Imagination POWERVR(TM)" "GLES 2.0 from Imagination POWERVR(TM)" "Obey [S3E] SysGlesVersion .icf setting" "GLES 1.1 Common Profile from Qualcomm Snapdragon(TM)" "GLES 2.0 from Qualcomm Snapdragon(TM)" "GLES 2.0 ANGLE" "GLES 2.0 ANGLE DirectX 11", Default="Obey [S3E] SysGlesVersion .icf setting", Value = "Obey [S3E] SysGlesVersion .icf setting"
+GLAPI                          = Type=string, Allowed="None" "GLES 1.0 Common-Lite Profile from Imagination POWERVR(TM)" "GLES 1.1 Common-Lite Profile from Imagination POWERVR(TM)" "GLES 1.0 Common Profile from Imagination POWERVR(TM)" "GLES 1.1 Common Profile from Imagination POWERVR(TM)" "GLES 2.0 from Imagination POWERVR(TM)" "Obey [S3E] SysGlesVersion .icf setting" "GLES 1.1 Common Profile from Qualcomm Snapdragon(TM)" "GLES 2.0 from Qualcomm Snapdragon(TM)" "GLES 2.0 ANGLE", Default="Obey [S3E] SysGlesVersion .icf setting", Value = "Obey [S3E] SysGlesVersion .icf setting"
 GLDontUseHiddenWindow          = Type=bool, Default="false", Value = "false"
 GLTerminateOnSuspend           = Type=bool, Default="false", Value = "false"
 GLUsePVRVFrame                 = Type=bool, Default="false", Value = "false"

+ 103 - 0
examples/GameTemplate/src/Options.cpp

@@ -0,0 +1,103 @@
+#include "core/oxygine.h"
+#include "Options.h"
+#include <vector>
+#include "core/files_io.h"
+
+namespace oxygine
+{
+	Options Options::instance;
+
+
+	struct xml_string_writer: pugi::xml_writer
+	{
+		std::string result;
+
+		virtual void write(const void* data, size_t size)
+		{
+			result += std::string(static_cast<const char*>(data), size);
+		}
+	};
+
+	Options::Options():_path("options.xml")
+	{
+
+	}
+
+	Options::~Options()
+	{
+
+	}
+
+	void Options::setPath(const string &path)
+	{
+		_path = path;
+	}
+
+	void Options::init(const string &version)
+	{
+		_version = version;
+		load();
+		if (_doc.child("options").attribute("version").value() != _version)
+			reset();
+	}
+
+	void Options::reset()
+	{
+		_doc.reset();
+		pugi::xml_node root = _doc.append_child("options");
+		root.append_attribute("version").set_value(_version.c_str());
+	}
+
+
+	void Options::load()
+	{
+		_doc.reset();
+		file::buffer fb;
+		file::read(_path.c_str(), fb, ep_ignore_error);
+		if (fb.getSize())
+			_doc.load_buffer(fb.getData(), fb.getSize());
+	}
+	
+	pugi::xml_attribute Options::addValue(const string &name)
+	{
+		pugi::xml_node root = _doc.child("options");
+		if (!root)
+			root = _doc.append_child("options");
+		pugi::xml_node child = root.child(name.c_str());
+		if (!child)
+			child = root.append_child(name.c_str());
+
+		pugi::xml_attribute attr = child.attribute("value");
+		if (!attr)
+			attr = child.append_attribute("value");
+		else
+			attr = pugi::xml_attribute();
+
+		return attr;
+	}
+
+	pugi::xml_attribute Options::getValue(const string &name)
+	{
+		pugi::xml_node root = _doc.child("options");
+		OX_ASSERT(root);
+		pugi::xml_node child = root.child(name.c_str());
+		OX_ASSERT(child);
+		pugi::xml_attribute attr = child.attribute("value");
+		OX_ASSERT(attr);
+
+		return attr;
+	}
+
+	void Options::save()
+	{
+		xml_string_writer sw;
+		_doc.save(sw);
+
+		int size = sw.result.size();
+		const char *buf = sw.result.c_str();
+
+		file::handle h = file::open(_path.c_str(), "wb");
+		file::write(h, buf, size);
+		file::close(h);
+	}
+}

+ 36 - 0
examples/GameTemplate/src/Options.h

@@ -0,0 +1,36 @@
+#pragma once
+#include <string>
+#include "pugixml/pugixml.hpp"
+
+namespace oxygine
+{
+	using namespace std;
+
+	class Options
+	{
+	public:
+		static Options instance;
+
+		Options();
+		~Options();
+
+		void init(const string &version = "1");
+		void reset();
+		void load();
+		void save();
+
+
+		void setPath(const string &path);
+
+		pugi::xml_node getRoot() const {return _doc.root();}
+
+		pugi::xml_attribute addValue(const string &name);
+		pugi::xml_attribute getValue(const string &name);
+
+
+	private:
+		string _version;
+		string _path;
+		pugi::xml_document _doc;
+	};
+}

+ 28 - 0
examples/HelloWorld/HelloWorld.mkb

@@ -0,0 +1,28 @@
+#!/usr/bin/env mkb
+
+options
+{
+	module_path="../../oxygine/marmalade/"
+	enable-exceptions=1
+}
+
+includepath src
+
+files
+{
+	[src]
+	(src)
+	"*.h"
+	"*.cpp"
+}
+
+subprojects
+{
+	oxygine-framework
+	iwgl 
+}
+
+assets
+{
+	(data)
+}

+ 31 - 0
examples/Match3/match3.mkb

@@ -0,0 +1,31 @@
+#!/usr/bin/env mkb
+
+options
+{
+	module_path="../../oxygine/marmalade/"
+	enable-exceptions=1
+}
+
+includepath src
+
+debug_define MARMALADE
+define MARMALADE
+
+files
+{
+	[src]
+	(src)
+	"*.h"
+	"*.cpp"
+}
+
+subprojects
+{
+	oxygine-framework
+	iwgl 
+}
+
+assets
+{
+	(data)
+}

+ 0 - 2
oxygine/SDL/win32/oxygine_vs2010.vcxproj

@@ -124,7 +124,6 @@
     <ClCompile Include="..\..\src\Input.cpp" />
     <ClCompile Include="..\..\src\MemoryTexture.cpp" />
     <ClCompile Include="..\..\src\Multithreading.cpp" />
-    <ClCompile Include="..\..\src\Options.cpp" />
     <ClCompile Include="..\..\src\PointerState.cpp" />
     <ClCompile Include="..\..\src\ProgressBar.cpp" />
     <ClCompile Include="..\..\src\res\ResAnim.cpp" />
@@ -198,7 +197,6 @@
     <ClInclude Include="..\..\src\Input.h" />
     <ClInclude Include="..\..\src\MemoryTexture.h" />
     <ClInclude Include="..\..\src\Multithreading.h" />
-    <ClInclude Include="..\..\src\Options.h" />
     <ClInclude Include="..\..\src\PointerState.h" />
     <ClInclude Include="..\..\src\ProgressBar.h" />
     <ClInclude Include="..\..\src\res\CreateResourceContext.h" />

+ 0 - 6
oxygine/SDL/win32/oxygine_vs2010.vcxproj.filters

@@ -66,9 +66,6 @@
     <ClCompile Include="..\..\src\MemoryTexture.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\src\Options.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\PointerState.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -281,9 +278,6 @@
     <ClInclude Include="..\..\src\MemoryTexture.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\src\Options.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\src\PointerState.h">
       <Filter>src</Filter>
     </ClInclude>

+ 23 - 8
oxygine/src/Actor.h

@@ -68,22 +68,32 @@ namespace oxygine
 		Actor();
 		virtual ~Actor();
 
+		/**returns first child*/
 		spActor				getFirstChild() const {return _children._first;}
+		/**returns last child*/
 		spActor				getLastChild() const {return _children._last;}
+		/**returns next sibling*/
 		spActor				getNextSibling() {return intr_list::getNextSibling();}
+		/**returns previous sibling*/
 		spActor				getPrevSibling() {return intr_list::getPrevSibling();}
 
 		
-		//searched actor recursively, could return self
+		/**search child by name recursively, could return self*/
 		Actor*				getDescendant(const string &name, error_policy ep = ep_show_error);
+		/**search child by name recursively and cast it to other class*/
 		template<class T>
 		T*					getDescendantT(const string &name, error_policy ep = ep_show_error) {return safeCast<T*> (getDescendant(name, ep));}
+		/**search child by name*/
 		spActor				getChild(const string &name, error_policy ep = ep_show_error) const;
+		/**search child by name and cast it to other class*/
 		template<class T>
 		T*					getChildT(const string &name, error_policy ep = ep_show_error) const {return safeCast<T*> (getChild(name, ep).get());}
 
+		/**search tween by name*/
 		spTween				getTween(const string &name, error_policy ep = ep_show_error);
+		/**returns first tween in actor*/
 		spTween				getFirstTween() const {return _tweens._first;}
+		/**returns last tween in actor*/
 		spTween				getLastTween() const {return _tweens._last;}
 
 		const Vector2&		getAnchor() const {return _anchor;}
@@ -135,7 +145,7 @@ namespace oxygine
 		/**This option is connected with Anchor. By default value is True*/
 		void setChildrenRelative(bool r){_flags &= ~flag_childrenRelative; if (r) _flags |= flag_childrenRelative;}
 		
-		/**Sets Size of Actor. Size doesn't scale contents of Actor. Size only affects event handling and rendering if you change Anchor. Max size is 32000*/
+		/**Sets Size of Actor. Size doesn't scale contents of Actor. Size only affects event handling and rendering if you change Anchor*/
 		void setSize(const Vector2 &);
 		void setSize(float w, float h);
 		void setWidth(float w);
@@ -151,8 +161,9 @@ namespace oxygine
 		void setCull(bool enable) {_flags &= ~flag_cull; if (enable) _flags |= flag_cull;}
 		/**Sets transparency. if alpha is 0 actor and children are completely invisible, don't rendering and don't receive events.*/
 		void setAlpha(unsigned char alpha){_alpha = alpha;}
-		/**Enables/Disables input events(touch, mouse, keyboard) for Actor and it's children.*/
+		/**Enables/Disables input events(touch, mouse) for Actor.*/
 		void setInputEnabled(bool enabled) {_flags &= ~flag_inputEnabled; if (enabled) _flags |= flag_inputEnabled;}
+		/**Enables/Disables input events(touch, mouse) for children of Actor.*/
 		void setInputChildrenEnabled(bool enabled) {_flags &= ~flag_inputChildrenEnabled; if (enabled) _flags |= flag_inputChildrenEnabled;}
 
 		/**Sets callback which would be called each Actor::update cycle before doUpdate. Use it if you don't want inherit from Actor and overload Actor::doUpdate.*/
@@ -160,9 +171,9 @@ namespace oxygine
 		/**Sets callback which would be called each Actor::render cycle before doRender. Use it if you don't want inherit from Actor and overload Actor::doRender.*/
 		void setCallbackDoRender(RenderCallback cb){_cbDoRender = cb;}
 
-		//virtual bool isOn(const EventState &es);
 		virtual bool isOn(const Vector2 &localPosition);
-		bool isDescendant(spActor);
+		/**Returns true if actor is child or located deeper in current subtree*/
+		bool isDescendant(spActor actor);
 		
 		
 		void insertChildBefore(spActor actor, spActor insertBefore);
@@ -178,7 +189,7 @@ namespace oxygine
 		/**detaches actor from parent and returns parent. return NULL If actor doesn't have parent*/
 		Actor* detach();
 
-		//////
+		/**Dispatches an event into the event flow. The event target is the EventDispatcher object upon which the dispatchEvent() method is called.*/
 		void dispatchEvent(Event *event);
 
 
@@ -199,12 +210,15 @@ namespace oxygine
 		void removeTween(spTween);
 		/**remove all tweens and call completes them if callComplete == true*/
 		void removeTweens(bool callComplete = false);
-
+		
+		/**Updates this actor, children and all tweens.*/
 		virtual void update(const UpdateState &us);
+		/**Renders this actor and children.*/
 		virtual void render(const RenderState &rs);
-		virtual void handleEvent(Event *event);
+		virtual void handleEvent(Event *event);		
 		virtual void doRender(const RenderState &rs){}
 
+		/**Returns detailed actor information. Used for debug purposes. */
 		virtual std::string dump(const dumpOptions &opt) const;
 
 
@@ -228,6 +242,7 @@ namespace oxygine
 		Actor*	_getDescendant(const string &name);
 		spTween _addTween(spTween tween, bool rel);
 
+		
 		virtual void doUpdate(const UpdateState &us);
 		UpdateCallback _cbDoUpdate;
 		RenderCallback _cbDoRender;

+ 2 - 0
oxygine/src/AnimationFrame.h

@@ -34,6 +34,8 @@ namespace oxygine
 		const RectF&	getSrcRect() const {return _srcRect;}
 		const RectF&	getDestRect() const {return _destRect;}
 		const Diffuse&	getDiffuse() const {return _diffuse;}
+
+		void			setSrcRect(const RectF &r){_srcRect = r;}
 		
 
 	private:

+ 12 - 0
oxygine/src/Event.h

@@ -46,6 +46,18 @@ namespace oxygine
 	public:
 		enum 
 		{
+			/*
+			CLICK = makefourcc('_', 'C', 'L', 'C'),
+			OVER = makefourcc('_', 'O', 'V', 'R'),
+			OUT = makefourcc('_', 'O', 'U', 'T'),
+			MOVE = makefourcc('_', 'M', 'V', 'E'),
+			TOUCH_DOWN = makefourcc('_', 'T', 'D', 'W'),
+			TOUCH_UP = makefourcc('_', 'T', 'U', 'P'),
+
+			WHEEL_UP = makefourcc('_', 'W', 'U', 'P'),
+			WHEEL_DOWN = makefourcc('_', 'W', 'D', 'W'),
+			*/
+
 			CLICK = _et_TouchClick,
 			OVER = _et_TouchOver,
 			OUT = _et_TouchOut,

+ 14 - 15
oxygine/src/Tweener.h

@@ -93,7 +93,7 @@ namespace oxygine
 
 	DECLARE_SMART(Tween, spTween);
 
-	class Tween: public Object, public intrusive_list_item<spTween>//todo rename, it is not only tween
+	class Tween: public Object, public intrusive_list_item<spTween>
 	{
 		typedef intrusive_list_item<spTween> intr_list;
 	public:
@@ -121,12 +121,17 @@ namespace oxygine
 		void init(timeMS duration, int loops = 1, bool twoSides = false, timeMS delay = 0, EASE ease = Tween::ease_linear);//todo twoSide find better name
 		void reset();
 
-		int		getLoops() const {return _loops;}
-		timeMS	getDuration() const {return _duration;}
-		EASE	getEase() const {return _ease;}
-		timeMS	getDelay() const {return _delay;}
-		Actor*	getClient() const {return _client;}
-		float	getPercent() const {return _percent;}
+		int			getLoops() const {return _loops;}
+		timeMS		getDuration() const {return _duration;}
+		EASE		getEase() const {return _ease;}
+		timeMS		getDelay() const {return _delay;}
+		Actor*		getClient() const {return _client;}
+		float		getPercent() const {return _percent;}
+		spTween&	getNextSibling() {return intr_list::getNextSibling();}
+		spTween&	getPrevSibling() {return intr_list::getPrevSibling();}
+
+		bool		isStarted() const {return _started;}
+		bool		isDone() const {return _done;}
 
 		void setDoneCallback(EventCallback cb){_cbDone = cb;}		
 		void setEase(EASE ease){_ease = ease;}
@@ -142,15 +147,9 @@ namespace oxygine
 		/**immediately completes tween, calls doneCallback and mark tween as completed and removes self from Actor. If tween has infinity loops (=-1) then do nothing*/
 		void complete(timeMS deltaTime = INT_MAX);
 
-		bool isStarted() const {return _started;}
-		bool isDone() const {return _done;}
-
+		
 		virtual bool start(Actor &actor);
-		virtual bool update(Actor &actor, const UpdateState &us);
-
-
-		spTween &getNextSibling() {return intr_list::getNextSibling();}
-		spTween &getPrevSibling() {return intr_list::getPrevSibling();}
+		virtual bool update(Actor &actor, const UpdateState &us);	
 
 		static float calcEase(EASE ease, float v);
 

+ 0 - 1
oxygine/src/oxygine-framework.h

@@ -21,7 +21,6 @@
 #include "Input.h"
 #include "MemoryTexture.h"
 #include "Multithreading.h"
-#include "Options.h"
 #include "PointerState.h"
 #include "ProgressBar.h"
 #include "RenderState.h"

+ 40 - 2
oxygine/src/res/ResAtlas.cpp

@@ -34,9 +34,15 @@ namespace oxygine
 	{
 		if (!ad.texture)
 			return;
+		
 
-		ImageData image_data = ad.mt.lock();	
+		MemoryTexture mt;
+		const Rect &bounds = ad.atlas.getBounds();
+		int w = nextPOT(bounds.getWidth());
+		int h = nextPOT(bounds.getHeight());
+		mt.init(ad.mt.lock().getRect(Rect(0, 0, w, h)));
 		
+		ImageData image_data = mt.lock();	
 		ad.texture->init(image_data, false);
 		ad.mt.unlock();
 
@@ -131,6 +137,10 @@ namespace oxygine
 
 		float scaleFactor = context.scale_factor;
 
+
+		vector<ResAnim*> anims;
+
+
 		child_node = context.node.first_child();
 		while (!child_node.empty())
 		{
@@ -312,6 +322,8 @@ namespace oxygine
 					}
 					else
 					{
+						anims.push_back(ra);
+
 						for (int y = 0; y < rows; ++y)
 						{
 							for (int x = 0; x < columns; ++x)
@@ -339,8 +351,13 @@ namespace oxygine
 									OX_ASSERT(s);
 								}
 
+								/*
 								float iw = 1.0f / ad.mt.getWidth();
 								float ih = 1.0f / ad.mt.getHeight();
+								*/
+
+								float iw = 1.0f;
+								float ih = 1.0f;
 								
 								RectF srcRect(dest.pos.x * iw, dest.pos.y * ih, dest.size.x * iw, dest.size.y * ih);
 
@@ -360,7 +377,7 @@ namespace oxygine
 					
 					init_resAnim(ra, file, child_node);
 					
-					ra->init(frames, columns, scaleFactor);
+					ra->init(frames, columns, scaleFactor);					
 					context.resources->add(ra);
 				}
 
@@ -377,6 +394,27 @@ namespace oxygine
 		}
 
 		apply_atlas(ad);
+
+		for (vector<ResAnim*>::iterator i = anims.begin(); i != anims.end(); ++i)
+		{
+			ResAnim *rs = *i;
+			int num = rs->getTotalFrames();
+
+			for (int n = 0; n < num; ++n)
+			{
+				AnimationFrame &frame = const_cast<AnimationFrame&>(rs->getFrame(n));
+				
+				float iw = 1.0f / frame.getDiffuse().base->getWidth();
+				float ih = 1.0f / frame.getDiffuse().base->getHeight();
+
+				RectF rect = frame.getSrcRect();
+				rect.pos.x *= iw;
+				rect.pos.y *= ih;
+				rect.size.x *= iw;
+				rect.size.y *= ih;
+				frame.setSrcRect(rect);
+			}
+		}
 	}
 
 	Resource *ResAtlas::create(CreateResourceContext &context)

+ 3 - 2
oxygine/src/utils/AtlasTool.cpp

@@ -72,7 +72,7 @@ namespace oxygine
 	}
 
 
-	Atlas::Atlas():_tree(0)
+	Atlas::Atlas():_tree(0), _bounds(0,0,0,0)
 	{
 		
 	}
@@ -84,7 +84,6 @@ namespace oxygine
 
 	void Atlas::clean()
 	{
-		_frames.resize(0);
 		delete _tree;
 		_tree = 0;
 	}
@@ -116,6 +115,8 @@ namespace oxygine
 			srcRect.size = srcRect.size - offset;			
 			dest->updateRegion(srcRect.pos.x, srcRect.pos.y, src);
 
+			_bounds.unite(srcRect);
+
 			return true;
 		}
 

+ 4 - 3
oxygine/src/utils/AtlasTool.h

@@ -36,13 +36,14 @@ namespace oxygine
 
 		void init(int w, int h);
 		bool add(Texture *dest, const ImageData &src, Rect &srcRect);
-		spTexture getTexture();
+
+		spTexture	getTexture();
+		const Rect&	getBounds() const {return _bounds;}
 
 		void clean();
 
 	private:
-		frames _frames;
-
+		Rect _bounds;
 		AtlasNode *_tree;
 	};
 }

+ 8 - 5
tools/others/build_oxygine_zip.py

@@ -23,10 +23,13 @@ def recursive_zip(zipf, directory, folder = ""):
 
 
 with zipfile.ZipFile("doc.zip", "w", compression = zipfile.ZIP_DEFLATED) as zp:
-	recursive_zip(zp, "doc")
-	shutil.rmtree("doc")
-
-with zipfile.ZipFile("../../oxygine-framework.zip", "w", compression = zipfile.ZIP_DEFLATED) as zp:
-	recursive_zip(zp, "../")
+    recursive_zip(zp, "doc")
+    shutil.rmtree("doc")
+
+destzip = "../../oxygine-framework.zip"
+with zipfile.ZipFile(destzip, "w", compression = zipfile.ZIP_DEFLATED) as zp:
+    recursive_zip(zp, "../")
+    
+shutil.copyfile(destzip, "../../../gdrive/oxygine/oxygine-framework.zip")
 
 print "done."