Denis Muratshin %!s(int64=12) %!d(string=hai) anos
pai
achega
72f141b4a4

+ 2 - 2
.hg_archival.txt

@@ -1,5 +1,5 @@
 repo: b6d71054df5712e643a0685bc3ba54b123db5729
 repo: b6d71054df5712e643a0685bc3ba54b123db5729
-node: ca65ed9e863d9d90b766422e5f7dbbc36b616589
+node: 213101996a81cfcccf8c898be5bfb86163b77d60
 branch: default
 branch: default
 latesttag: oldrender
 latesttag: oldrender
-latesttagdistance: 96
+latesttagdistance: 106

BIN=BIN
doc.zip


+ 2 - 2
oxygine/src/Actor.cpp

@@ -328,7 +328,7 @@ namespace oxygine
 
 
 			if (_parent)
 			if (_parent)
 			{
 			{
-				bool touchEvent = event->type > _et_TouchFirst && event->type < _et_TouchLast;
+				bool touchEvent = (event->type > (int)_et_TouchFirst) && (event->type < (int)_et_TouchLast);
 
 
 				if(touchEvent)
 				if(touchEvent)
 				{	
 				{	
@@ -347,7 +347,7 @@ namespace oxygine
 
 
 	void Actor::handleEvent(Event *event)
 	void Actor::handleEvent(Event *event)
 	{
 	{
-		bool touchEvent = event->type > _et_TouchFirst && event->type < _et_TouchLast;
+		bool touchEvent = (event->type > (int)_et_TouchFirst) && (event->type < (int)_et_TouchLast);
 		if (touchEvent)
 		if (touchEvent)
 		{
 		{
 			if (!(_flags & flag_visible) || getAlpha() == 0)
 			if (!(_flags & flag_visible) || getAlpha() == 0)

+ 2 - 2
oxygine/src/AnimationFrame.cpp

@@ -11,7 +11,7 @@ namespace oxygine
 		_frameSize = frame_size.cast<PointS>();
 		_frameSize = frame_size.cast<PointS>();
 	}
 	}
 
 
-	AnimationFrame AnimationFrame::clip(const RectF &rect) const
+	AnimationFrame AnimationFrame::getClipped(const RectF &rect) const
 	{
 	{
 		AnimationFrame f = *this;
 		AnimationFrame f = *this;
 		float w = (float)_diffuse.base->getWidth();
 		float w = (float)_diffuse.base->getWidth();
@@ -36,7 +36,7 @@ namespace oxygine
 		return f;
 		return f;
 	}
 	}
 
 
-	AnimationFrame AnimationFrame::flip(bool vertical, bool horizontal) const
+	AnimationFrame AnimationFrame::getFlipped(bool vertical, bool horizontal) const
 	{
 	{
 		AnimationFrame f = *this;
 		AnimationFrame f = *this;
 		if (vertical)
 		if (vertical)

+ 2 - 2
oxygine/src/AnimationFrame.h

@@ -27,8 +27,8 @@ namespace oxygine
 		void init(ResAnim *rs, const Diffuse &df, 
 		void init(ResAnim *rs, const Diffuse &df, 
 			const RectF &srcRect, const RectF &destRect, const Vector2 &frame_size);
 			const RectF &srcRect, const RectF &destRect, const Vector2 &frame_size);
 		/**ResAnim should be valid!*/
 		/**ResAnim should be valid!*/
-		AnimationFrame clip(const RectF &rect) const;
-		AnimationFrame flip(bool vertical, bool horizontal) const;
+		AnimationFrame getClipped(const RectF &rect) const;
+		AnimationFrame getFlipped(bool vertical, bool horizontal) const;
 
 
 		/**Returns size of frame in pixels*/		
 		/**Returns size of frame in pixels*/		
 		const Vector2&	getSize() const {return _frameSize;}
 		const Vector2&	getSize() const {return _frameSize;}

+ 2 - 2
oxygine/src/Box9Sprite.cpp

@@ -256,14 +256,14 @@ namespace oxygine
 					{
 					{
 						if (xc == 0) // select correct index for _guides% arrays
 						if (xc == 0) // select correct index for _guides% arrays
 							xgi = 0;
 							xgi = 0;
-						else if (xc == _pointsX.size() - 2)
+						else if (xc == (int)_pointsX.size() - 2)
 							xgi = 2;
 							xgi = 2;
 						else
 						else
 							xgi = 1;
 							xgi = 1;
 					
 					
 						if (yc == 0)
 						if (yc == 0)
 							ygi = 0;
 							ygi = 0;
-						else if (yc == _pointsY.size() - 2)
+						else if (yc == (int)_pointsY.size() - 2)
 							ygi = 2;
 							ygi = 2;
 						else
 						else
 							ygi = 1;
 							ygi = 1;

+ 1 - 1
oxygine/src/ClipRectActor.cpp

@@ -36,7 +36,7 @@ namespace oxygine
 
 
 	void ClipRectActor::handleEvent(Event *event)
 	void ClipRectActor::handleEvent(Event *event)
 	{
 	{
-		bool touchEvent = event->type > _et_TouchFirst && event->type < _et_TouchLast;
+		bool touchEvent = (event->type > (int)_et_TouchFirst && event->type < (int)_et_TouchLast);
 		if (touchEvent)
 		if (touchEvent)
 		{
 		{
 			TouchEvent *te = safeCast<TouchEvent*>(event);
 			TouchEvent *te = safeCast<TouchEvent*>(event);

+ 6 - 1
oxygine/src/Sprite.cpp

@@ -15,7 +15,12 @@ namespace oxygine
 
 
 	Sprite::~Sprite()
 	Sprite::~Sprite()
 	{
 	{
-	
+		if (_flags & flag_manageResAnim)
+		{
+			ResAnim *rs = _frame.getResAnim();
+			if (rs)
+				rs->getAtlas()->unload();
+		}		
 	}
 	}
 
 
 	Sprite::Sprite(const Sprite &src, cloneOptions opt):VStyleActor(src, opt)
 	Sprite::Sprite(const Sprite &src, cloneOptions opt):VStyleActor(src, opt)

+ 2 - 0
oxygine/src/core/FileSystem.h

@@ -13,6 +13,8 @@ namespace oxygine
 			virtual unsigned int read(void *dest, unsigned int size) = 0;
 			virtual unsigned int read(void *dest, unsigned int size) = 0;
 			virtual unsigned int write(const void *src, unsigned int size) = 0;
 			virtual unsigned int write(const void *src, unsigned int size) = 0;
 			virtual unsigned int getSize() const = 0;
 			virtual unsigned int getSize() const = 0;
+			virtual int			 seek(unsigned int offset, int whence) = 0;
+			virtual unsigned int tell() const = 0;
 		};
 		};
 
 
 
 

+ 14 - 0
oxygine/src/core/STDFileSystem.cpp

@@ -142,6 +142,20 @@ namespace oxygine
 				return oxFileWrite(src,1, size, _handle);
 				return oxFileWrite(src,1, size, _handle);
 			}
 			}
 
 
+			int seek(unsigned int offset, int whence)
+			{
+#ifdef __S3E__
+				return oxFileSeek(_handle, offset, (s3eFileSeekOrigin)whence);
+#else
+				return oxFileSeek(_handle, offset, whence);
+#endif
+			}
+
+			unsigned int tell() const
+			{
+				return oxFileTell(_handle);
+			}
+
 			virtual unsigned int getSize() const
 			virtual unsigned int getSize() const
 			{
 			{
 				oxFileSeek(_handle, 0, ox_FILESEEK_END);
 				oxFileSeek(_handle, 0, ox_FILESEEK_END);

+ 77 - 23
oxygine/src/core/ThreadMessages.cpp

@@ -1,21 +1,15 @@
 #include "ThreadMessages.h"
 #include "ThreadMessages.h"
+#include "log.h"
 namespace oxygine
 namespace oxygine
 {
 {
-	class MutexPthreadLock
-	{
-	public:
-		MutexPthreadLock(pthread_mutex_t &m):_mutex(m)
-		{
-			pthread_mutex_lock(&_mutex);
-		}
-
-		~MutexPthreadLock()
-		{
-			pthread_mutex_unlock(&_mutex);
-		}
+#if 0
+#define  LOGDN(...)  log::messageln(__VA_ARGS__)
+#define  LOGD(...)  log::message(__VA_ARGS__)
 
 
-		pthread_mutex_t& _mutex;
-	};
+#else
+#define  LOGDN(...)  ((void)0)
+#define  LOGD(...)  ((void)0)
+#endif
 
 
 	ThreadMessages::ThreadMessages():_id(0), _waitReplyID(0)
 	ThreadMessages::ThreadMessages():_id(0), _waitReplyID(0)
 	{			
 	{			
@@ -37,26 +31,63 @@ namespace oxygine
 			pthread_cond_wait(&_cond, &_mutex);			
 			pthread_cond_wait(&_cond, &_mutex);			
 	}
 	}
 
 
-	void ThreadMessages::get(message &ev)
+	void mywait(pthread_cond_t *cond, pthread_mutex_t *mutex)
 	{
 	{
+#ifdef __S3E__
+		timespec ts;
+		clock_gettime(CLOCK_REALTIME, &ts);
+		ts.tv_sec += 1;
+		//ts.tv_nsec += 5000;
+		pthread_cond_timedwait(cond, mutex, &ts);
+#else
+		pthread_cond_wait(cond, mutex);		
+#endif
+	}
+	
+	void ThreadMessages::get(message &ev)
+	{		
 		MutexPthreadLock lock(_mutex);
 		MutexPthreadLock lock(_mutex);
+		LOGDN("ThreadMessages::get");
 
 
 		_replyLast(0);
 		_replyLast(0);
 
 
 		while (_events.empty())
 		while (_events.empty())
-			pthread_cond_wait(&_cond, &_mutex);			
+		{
+			LOGDN("ThreadMessages::get pthread_cond_wait");
+			mywait(&_cond, &_mutex);
+		}
 
 
 		ev = _events.front();
 		ev = _events.front();
 		_events.erase(_events.begin());
 		_events.erase(_events.begin());
 		_last = ev;
 		_last = ev;
+		LOGDN("ThreadMessages::get received msgid=%d id=%d", _last.msgid, _last._id);
+	}
+	/*
+	ThreadMessages::messages &ThreadMessages::pause(pthread_mutex_t &mutex)
+	{
+		mutex = _mutex;
+		pthread_mutex_lock(&_mutex);
+		return _events;
 	}
 	}
 
 
+	void ThreadMessages::resume()
+	{
+		pthread_mutex_unlock(&_mutex);
+	}
+	*/
+
 	bool ThreadMessages::empty()
 	bool ThreadMessages::empty()
 	{
 	{
 		MutexPthreadLock lock(_mutex);
 		MutexPthreadLock lock(_mutex);
 		return _events.empty();
 		return _events.empty();
 	}
 	}
 
 
+	void ThreadMessages::clear()
+	{
+		MutexPthreadLock lock(_mutex);
+		_events.resize(0);
+	}
+
 	bool ThreadMessages::peek(message &ev, bool del)
 	bool ThreadMessages::peek(message &ev, bool del)
 	{
 	{
 		bool has = false;
 		bool has = false;
@@ -78,18 +109,27 @@ namespace oxygine
 
 
 	void ThreadMessages::_replyLast(void *val)
 	void ThreadMessages::_replyLast(void *val)
 	{
 	{
+		LOGDN("ThreadMessages::_replyLast");	
 		if (!_last._replied)
 		if (!_last._replied)
 		{
 		{
+			LOGDN("ThreadMessages::_replyLast not replied yet");	
 			_last._replied = true;
 			_last._replied = true;
 			_last._result = val;
 			_last._result = val;
 
 
 			if (_last.cb)			
 			if (_last.cb)			
 				_last.cb(_last);
 				_last.cb(_last);
 
 
+			LOGDN("ThreadMessages::_replyLast pre _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
+
 			if (_waitReplyID && _last._id == _waitReplyID)
 			if (_waitReplyID && _last._id == _waitReplyID)
 			{
 			{
+				LOGDN("ThreadMessages::_replyLast pthread_cond_signal _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
 				pthread_cond_signal(&_cond);
 				pthread_cond_signal(&_cond);
 			}
 			}
+			else
+			{
+				LOGDN("ThreadMessages::_replyLast else _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
+			}
 		}
 		}
 	}
 	}
 
 
@@ -105,17 +145,31 @@ namespace oxygine
 		message ev;
 		message ev;
 		ev.msgid = msgid;
 		ev.msgid = msgid;
 		ev.arg1 = arg1;
 		ev.arg1 = arg1;
-		ev.arg2 = arg2;
-		ev._id = ++_id;
+		ev.arg2 = arg2;		
+
 
 
 		MutexPthreadLock lock(_mutex);
 		MutexPthreadLock lock(_mutex);
+		ev._id = ++_id;
 
 
 		_waitReplyID = ev._id;
 		_waitReplyID = ev._id;
 		_events.push_back(ev);
 		_events.push_back(ev);
+
+		LOGDN("ThreadMessages::send msgid=%d pthread_cond_signal.. _waitReplyID=%d", msgid, _waitReplyID);	
 		pthread_cond_signal(&_cond);
 		pthread_cond_signal(&_cond);
 
 
+		
+		if (_last._replied)
+		{
+			LOGDN("ThreadMessages::send msgid=%d already replied", msgid);	
+		}
+				
 		while (!_last._replied)		
 		while (!_last._replied)		
-			pthread_cond_wait(&_cond, &_mutex);
+		{
+			LOGDN("ThreadMessages::send msgid=%d waiting reply...", msgid);	
+			mywait(&_cond, &_mutex);
+		}
+
+		LOGDN("ThreadMessages::send msgid=%d done", msgid);	
 
 
 		_waitReplyID = 0;
 		_waitReplyID = 0;
 		_last._replied = false;
 		_last._replied = false;
@@ -130,10 +184,10 @@ namespace oxygine
 		ev.arg1 = arg1;
 		ev.arg1 = arg1;
 		ev.arg2 = arg2;
 		ev.arg2 = arg2;
 		ev.cb = cb;
 		ev.cb = cb;
-		ev.cbData = cbData;
-		ev._id = ++_id;
+		ev.cbData = cbData;		
 
 
 		MutexPthreadLock lock(_mutex);
 		MutexPthreadLock lock(_mutex);
+		ev._id = ++_id;
 		_events.push_back(ev);
 		_events.push_back(ev);
 		pthread_cond_signal(&_cond);
 		pthread_cond_signal(&_cond);
 	}
 	}
@@ -143,10 +197,10 @@ namespace oxygine
 		message ev;
 		message ev;
 		ev.msgid = msgid;
 		ev.msgid = msgid;
 		ev.arg1 = arg1;
 		ev.arg1 = arg1;
-		ev.arg2 = arg2;
-		ev._id = ++_id;
+		ev.arg2 = arg2;		
 
 
 		MutexPthreadLock lock(_mutex);
 		MutexPthreadLock lock(_mutex);
+		ev._id = ++_id;
 		_events.push_back(ev);
 		_events.push_back(ev);
 		pthread_cond_signal(&_cond);
 		pthread_cond_signal(&_cond);
 	}
 	}

+ 27 - 1
oxygine/src/core/ThreadMessages.h

@@ -4,6 +4,24 @@
 #include "pthread.h"
 #include "pthread.h"
 namespace oxygine
 namespace oxygine
 {
 {
+	class MutexPthreadLock
+	{
+	public:
+		MutexPthreadLock(pthread_mutex_t &m, bool lock = true):_mutex(m), _locked(lock)
+		{
+			if (_locked)
+				pthread_mutex_lock(&_mutex);
+		}
+
+		~MutexPthreadLock()
+		{
+			pthread_mutex_unlock(&_mutex);
+		}
+
+		pthread_mutex_t& _mutex;
+		bool _locked;
+	};
+
 	class ThreadMessages
 	class ThreadMessages
 	{
 	{
 	public:		
 	public:		
@@ -23,6 +41,8 @@ namespace oxygine
 			bool _replied;
 			bool _replied;
 		};
 		};
 
 
+		typedef std::vector<message> messages;
+
 		ThreadMessages();
 		ThreadMessages();
 		~ThreadMessages();
 		~ThreadMessages();
 
 
@@ -30,6 +50,7 @@ namespace oxygine
 		void wait();
 		void wait();
 		void get(message &ev);
 		void get(message &ev);
 		bool peek(message &ev, bool del);
 		bool peek(message &ev, bool del);
+		void clear();
 				
 				
 		void*send(int msgid, void *arg1, void *arg2);
 		void*send(int msgid, void *arg1, void *arg2);
 		void sendCallback(int msgid, void *arg1, void *arg2, callback cb, void *cbData);
 		void sendCallback(int msgid, void *arg1, void *arg2, callback cb, void *cbData);
@@ -37,9 +58,14 @@ namespace oxygine
 
 
 		void reply(void *val);		
 		void reply(void *val);		
 
 
+		/*
+		messages &pause(pthread_mutex_t &mutex);
+		void resume();
+		*/
+
 	private:
 	private:
 		void _replyLast(void *val);
 		void _replyLast(void *val);
-		std::vector<message> _events;
+		messages _events;
 		unsigned int _id;
 		unsigned int _id;
 		unsigned int _waitReplyID;
 		unsigned int _waitReplyID;
 		//unsigned int _lastGetID;
 		//unsigned int _lastGetID;

+ 13 - 1
oxygine/src/core/ZipFileSystem.cpp

@@ -35,7 +35,7 @@ namespace file
 
 
 		bf.data.resize(file_info.uncompressed_size);
 		bf.data.resize(file_info.uncompressed_size);
 		r = unzReadCurrentFile(entry->zp, &bf.data.front(), bf.data.size());
 		r = unzReadCurrentFile(entry->zp, &bf.data.front(), bf.data.size());
-		OX_ASSERT(r == file_info.uncompressed_size);
+		OX_ASSERT(r == (int)file_info.uncompressed_size);
 
 
 		unzCloseCurrentFile(entry->zp);
 		unzCloseCurrentFile(entry->zp);
 		return true;
 		return true;
@@ -169,6 +169,18 @@ namespace file
 			delete this;
 			delete this;
 		}
 		}
 
 
+		int	seek(unsigned int offset, int whence)
+		{
+			OX_ASSERT(!"not implemented");
+			return 0;
+		}
+
+		unsigned int tell() const
+		{
+			OX_ASSERT(!"not implemented");
+			return 0;
+		}
+
 		unsigned int read(void *dest, unsigned int size)
 		unsigned int read(void *dest, unsigned int size)
 		{
 		{
 			return unzReadCurrentFile(_entry->zp, dest, size);
 			return unzReadCurrentFile(_entry->zp, dest, size);

+ 12 - 0
oxygine/src/core/file.cpp

@@ -93,6 +93,18 @@ namespace oxygine
 			fh->release();
 			fh->release();
 		}
 		}
 
 
+		int seek(handle h, unsigned int offset, int whence)
+		{
+			fileHandle *fh = (fileHandle *)h;
+			return fh->seek(offset, whence);
+		}
+
+		unsigned int tell(handle h)
+		{
+			fileHandle *fh = (fileHandle *)h;
+			return fh->tell();
+		}
+
 		bool deleteFile(const char *path, error_policy ep)
 		bool deleteFile(const char *path, error_policy ep)
 		{
 		{
 			bool ok = _nfs.deleteFile(path) == FileSystem::status_ok;
 			bool ok = _nfs.deleteFile(path) == FileSystem::status_ok;

+ 3 - 0
oxygine/src/core/file.h

@@ -44,6 +44,9 @@ namespace oxygine
 		/**Closes opened file handle*/
 		/**Closes opened file handle*/
 		void close(handle);
 		void close(handle);
 
 
+		int seek(handle, unsigned int offset, int whence);
+		unsigned int tell(handle);
+
 		/**Reads bytes into user memory*/
 		/**Reads bytes into user memory*/
 		unsigned int read(handle, void *dest, unsigned int size);
 		unsigned int read(handle, void *dest, unsigned int size);
 
 

+ 7 - 3
oxygine/src/initActor.h

@@ -78,11 +78,12 @@ namespace oxygine
 			const ResAnim *_resAnim;
 			const ResAnim *_resAnim;
 			int _col;
 			int _col;
 			int _row;
 			int _row;
+			bool _managed;
 			AnimationFrame _frame;
 			AnimationFrame _frame;
 			bool _useResAnim;
 			bool _useResAnim;
 
 
 		public:
 		public:
-			animFrame(int col = 0, int row = 0):_col(col), _row(row), _resAnim(0), _useResAnim(true){}
+			animFrame(bool managed, int col, int row):_col(col), _row(row), _resAnim(0), _useResAnim(true), _managed(managed){}
 
 
 			animFrame &operator = (const ResAnim *r)
 			animFrame &operator = (const ResAnim *r)
 			{
 			{
@@ -100,6 +101,8 @@ namespace oxygine
 
 
 			void apply(Sprite *s) const
 			void apply(Sprite *s) const
 			{
 			{
+				if (_managed)
+					s->setManageResAnim(_managed);
 				if (_useResAnim)
 				if (_useResAnim)
 					return s->setAnimFrame(_resAnim, _col, _row);
 					return s->setAnimFrame(_resAnim, _col, _row);
 				return s->setAnimFrame(_frame);
 				return s->setAnimFrame(_frame);
@@ -153,8 +156,9 @@ namespace oxygine
 		
 		
 
 
 //sprite or button
 //sprite or button
-#define arg_animFrame args::animFrame()
-#define arg_resAnim args::animFrame()
+#define arg_animFrame args::animFrame(false, 0, 0)
+#define arg_resAnim args::animFrame(false, 0, 0)
+#define arg_managedResAnim args::animFrame(true, 0, 0)
 
 
 //TextActor
 //TextActor
 #define arg_style args::style()
 #define arg_style args::style()

+ 1 - 1
oxygine/src/minizip/ioapi_mem.c

@@ -86,7 +86,7 @@ voidpf ZCALLBACK fopen_mem_func (opaque, filename, mode)
      * size of an int and therefore may need addressing for 64bit
      * size of an int and therefore may need addressing for 64bit
      * architectures
      * architectures
      */
      */
-    if (sscanf(filename,"%x+%x",&mem->base,&mem->size)!=2)
+    if (sscanf(filename,"%x+%x", (unsigned int*)&mem->base, (unsigned int*)&mem->size)!=2)
       return NULL;
       return NULL;
 
 
     if (mode & ZLIB_FILEFUNC_MODE_CREATE)
     if (mode & ZLIB_FILEFUNC_MODE_CREATE)

+ 8 - 0
oxygine/src/res/Resources.cpp

@@ -30,6 +30,14 @@ namespace oxygine
 		strcpy(r.id, resTypeID);
 		strcpy(r.id, resTypeID);
 				
 				
 		registeredResources::iterator it = lower_bound(_registeredResources.begin(), _registeredResources.end(), r.id, registeredResource::comparePred2);
 		registeredResources::iterator it = lower_bound(_registeredResources.begin(), _registeredResources.end(), r.id, registeredResource::comparePred2);
+		if (it != _registeredResources.end())
+		{
+			if(!strcmp(it->id, resTypeID))
+			{
+				OX_ASSERT(!"resource already registered");
+				return;
+			}
+		}
 		_registeredResources.insert(it, r);
 		_registeredResources.insert(it, r);
 
 
 		/*
 		/*

+ 8 - 7
oxygine/src/utils/stringUtils.cpp

@@ -178,16 +178,17 @@ namespace oxygine
 
 
 		const char &c = *utfstr++;
 		const char &c = *utfstr++;
 		p[0] = c;
 		p[0] = c;
-
+		
+		if((c & 0xE0) == 0xE0)
+		{
+			p[1] = *utfstr++;
+			p[2] = *utfstr++;
+		}
+		else
 		if((c & 0xC0) == 0xC0)
 		if((c & 0xC0) == 0xC0)
 		{
 		{
 			p[1] = *utfstr++;
 			p[1] = *utfstr++;
-		} else
-			if((c & 0xE0) == 0xE0)
-			{
-				p[1] = *utfstr++;
-				p[2] = *utfstr++;
-			}
+		} 
 
 
 		return utfstr;
 		return utfstr;
 	}
 	}

+ 1 - 1
tools/process_xml2.py

@@ -12,7 +12,7 @@ def get_parser():
     parser.add_argument("-r", "--resize", help = "downscale/upscale by scale factor", action="store_true", default = False)
     parser.add_argument("-r", "--resize", help = "downscale/upscale by scale factor", action="store_true", default = False)
     parser.add_argument("-us", "--upscale", help = "allow upscale. good option for very HD displays with texture compression", action="store_true", default = False)
     parser.add_argument("-us", "--upscale", help = "allow upscale. good option for very HD displays with texture compression", action="store_true", default = False)
     parser.add_argument("-c", "--compression", help = "type of images compression. default is pure rgba8888 packed to png", 
     parser.add_argument("-c", "--compression", help = "type of images compression. default is pure rgba8888 packed to png", 
-                        choices = ["pvrtc", "etc1"], default = "")
+                        choices = ["pvrtc", "etc1", "no"], default = "")
     parser.add_argument("-np", "--nopng", help = "store images without packing to png", 
     parser.add_argument("-np", "--nopng", help = "store images without packing to png", 
                             action="store_true", default = False)    
                             action="store_true", default = False)    
     parser.add_argument("-q", "--quality", help = "select quality to compressed textures", 
     parser.add_argument("-q", "--quality", help = "select quality to compressed textures",