Exemple #1
0
	bool KOrthogonalMap::_loadStream(KIStream &Stream, const std::string &Address) {
		if (!Stream.isOpen()) {
			Stream.close();
		}

		if (!Stream.open(Address, IOMode::BIN)) {
			KD_FPRINT("can't open stream. address: %s", Address.c_str());
			return false;
		}

		KBinarySerial bserial;
		if (!bserial.loadStream(Stream, Address)) {
			KD_PRINT("can't load stream");
			Stream.close();
			return false;
		}
		std::string format;

		bserial >> format;

		if (format != "KOMap") {
			KD_PRINT("incorrect file format");
			Stream.close();
			return false;
		}

		bserial >> _kwidth;
		bserial >> _kheight;
		bserial >> _ktilewidth;
		bserial >> _ktileheight;
		bserial >> _ktotalWidthPixels;
		bserial >> _ktotalHeightPixels;
		bserial >> _krootList;
		bserial >> _knodeList;
		bserial >> _ktilesetStamp;
		bserial >> _klayerNames;

		// load composite resources (texture)
		auto slist = getCompositeList();
		if (!slist.empty()) {
			_ktileSet = (KAtlasTextureArray *)(*slist.begin());
		} else {
			_ktileSet = nullptr;
		}

		Stream.close();

		return true;
	}
Exemple #2
0
	void KOrthogonalMap::swapTileLayer(U32 TileID, U16 Layer1, U16 Layer2) {
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return;
		}

		if (Layer1 == Layer2) return;

		// layer 1
		KOrthoLayer layer1;
		bool l1 = getTileLayer(TileID, Layer1, layer1);
		removeTileLayer(TileID, Layer1);

		// layer 2
		KOrthoLayer layer2;
		bool l2 = getTileLayer(TileID, Layer2, layer2);
		removeTileLayer(TileID, Layer2);

		if (l1) {
			setTileLayer(TileID, Layer2, layer1);
		}

		if (l2) {
			setTileLayer(TileID, Layer1, layer2);
		}

#if defined(KITE_EDITOR)
		setScenePtr(TileID, Layer1, layer2.sceneItem);
		setScenePtr(TileID, Layer2, layer1.sceneItem);
#endif

	}
Exemple #3
0
	void KShaderProgram::bindAttribute(U16 Index, const std::string &Name){
		if (_kisCreated) {
			KD_PRINT("this function is ineffective after binding the shader program");
			return;
		}
		_kattribList.push_back({ Index, Name });
	}
Exemple #4
0
	bool KOrthogonalMap::_saveStream(KOStream &Stream, const std::string &Address) {
		// texture information
		KBinarySerial bserial;
		bserial << std::string("KOMap");

		bserial << _kwidth;
		bserial << _kheight;
		bserial << _ktilewidth;
		bserial << _ktileheight;
		bserial << _ktotalWidthPixels;
		bserial << _ktotalHeightPixels;
		bserial << _krootList;
		bserial << _knodeList;
		bserial << _ktilesetStamp;
		bserial << _klayerNames;

		if (!bserial.saveStream(Stream, Address, 0)) {
			KD_PRINT("can't save stream.");
			Stream.close();
			return false;
		}
		Stream.close();

		// save composite list (texture)
		std::vector<KResource *> composite;
		composite.push_back((KResource *)_ktileSet);
		setCompositeList(composite);

		return true;
	}
Exemple #5
0
void _trace_blk(IBlk * blk, const char * action)
{
	char path[F8_MAX_PATH];
	*path = 0;
	IBlk_path_by_blk(blk, path, sizeof(path));
	KD_PRINT(("%s block %s\n", action, path));
}
Exemple #6
0
	SIZE KArchiveStream::write(const void *Data, SIZE DataSize) {
		if (_kzipIO->writeFile(Data, DataSize, _kcomp)) {
			return DataSize;
		}

		KD_PRINT("archive writing error");
		return 0;
	}
Exemple #7
0
	SIZE KOrthogonalMap::getTileLayerSize(U32 TileID) {
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return 0;
		}

		return _krootList[TileID].layerSize;
	}
Exemple #8
0
    void KGLWindow::open(){
        // initialize SDL
        Internal::initeSDL();

        // destroy currently window
        if (_kwindow){
			KD_PRINT("this window is currently opened!");
			return;
        }

		// make flags
		U32 flag = SDL_WINDOW_OPENGL;
		if (_kwinstate.fullscreen) {
			_kwinstate.xpos = 0;
			_kwinstate.ypos = 0;
			flag = flag | SDL_WINDOW_FULLSCREEN;
		} else {
			if (_kwinstate.resizable) {
				flag = flag | SDL_WINDOW_RESIZABLE;
			}
		}

		// OGL version
		// opengl 3.3 or greater
		if (_kwinstate.oglMajor <= 3) {
			_kwinstate.oglMajor = 3;
			if (_kwinstate.oglMinor < 3)
				_kwinstate.oglMinor = 3;
		}

		// Set our OpenGL version.
		// SDL_GL_CONTEXT_CORE gives us only the newer version, deprecated functions are disabled
		DSDL_CALL(SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE));

		DSDL_CALL(SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, _kwinstate.oglMajor));
		DSDL_CALL(SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, _kwinstate.oglMinor));

		// optimize for 2D purpose
		DSDL_CALL(SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0));
		DSDL_CALL(SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 0));

		// double buffer
		DSDL_CALL(SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1));

		// Create our window 
		DSDL_CALL(_kwindow = SDL_CreateWindow(_kwinstate.title.c_str(), _kwinstate.xpos, _kwinstate.ypos,
											  _kwinstate.width, _kwinstate.height, flag));

		// Create an OpenGL context associated with the window.
		DSDL_CALL(_kcontext = SDL_GL_CreateContext(_kwindow));

		DSDL_CALL(SDL_GL_SetSwapInterval(_kwinstate.swapInterval));

		if (!_kwinstate.showCursor) {
			DSDL_CALL(SDL_ShowCursor(SDL_DISABLE));
		}
    }
Exemple #9
0
	U64 ZipIO::_readCompressed(void *Data, U64 DataSize){
		if (!_kisopen || !_kready || _kfindex < 0 || _kmode == OpenMode::WRITE)
			return 0;

		if (mz_zip_reader_extract_to_mem(&_kzarchive, _kfindex, Data, (size_t)DataSize, 0))
			return DataSize;

		KD_PRINT("reading archive error");
		return 0;
	}
Exemple #10
0
	const KSharedResource &KShaderProgram::getShader(ShaderType Type) {
		if (Type == ShaderType::VERTEX) {
			return _kvert;
		} else if (Type == ShaderType::FRAGMENT) {
			return _kfrag;
		} else if (Type == ShaderType::GEOMETRY) {
			return _kgeom;
		}
		KD_PRINT("incorrect shader type");
		return KSharedResource();
	}
Exemple #11
0
	I32 ZipIO::setReadOffset(I64 Offset, I32 Origin){
		if (!_kisopen || !_kready || _kfindex < 0 || _kmode == OpenMode::WRITE)
			return -1;

		if (_kisCmprsd)
			return -1;

		switch (Origin){
		case SEEK_SET:
			// calibration new offset
			if ((U64)Offset > _kfstat.m_uncomp_size)
				Offset = _kfstat.m_uncomp_size;

			// return current offset to base offset
			_kcurOfst -= _kfileCurOfst;

			// set new offset
			_kcurOfst += Offset;
			_kfileCurOfst = Offset;

			return 0;

		case SEEK_CUR:
			// calibration new offset
			if ((Offset + _kfileCurOfst) > _kfstat.m_uncomp_size)
				Offset = _kfstat.m_uncomp_size - _kfileCurOfst;

			// set new offset
			_kcurOfst += Offset;
			_kfileCurOfst = Offset;

			return 0;

		case SEEK_END:
			// calibration new offset
			if ((U64)Offset > _kfstat.m_uncomp_size)
				Offset = 0;

			// return current offset to base offset
			_kcurOfst -= _kfileCurOfst;

			// set new offset
			_kcurOfst += _kfstat.m_uncomp_size - Offset;
			_kfileCurOfst = _kfstat.m_uncomp_size - Offset;

			return 0;

		default:
			break;
		}

		KD_PRINT("invalid param");
		return -1;
	}
Exemple #12
0
	void KOrthogonalMap::setTileLayer(U32 TileID, U16 LayerIndex, const KOrthoLayer &Layer) {
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return;
		}

		// find layer if it is already exist otherwise create it
		KOrthoNode &nodeRef = insertNode(TileID, LayerIndex);

		// reset node with new values
		initeNode(nodeRef, TileID, Layer);
	}
Exemple #13
0
	KRectF32 KOrthogonalMap::getTileDimension(U32 TileID) {
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return KRectF32();
		}

		KRectF32 Output;
		Output.bottom = (TileID / _kwidth) * _ktileheight;
		Output.top = Output.bottom + _ktileheight;

		Output.left = (TileID % _kwidth) * _ktilewidth;
		Output.right = Output.left + _ktilewidth;
		return Output;
	}
Exemple #14
0
	bool KShaderProgram::setShader(const KSharedResource &Shader){
		auto shader = static_cast<const KShader *>(Shader.constGet());
		if (shader->getShaderType() == ShaderType::VERTEX) {
			_kvert = Shader;
		} else if (shader->getShaderType() == ShaderType::FRAGMENT) {
			_kfrag = Shader;
		} else if (shader->getShaderType() == ShaderType::GEOMETRY) {
			_kgeom = Shader;
		} else {
			KD_PRINT("incorrect shader type.");
			return false;
		}

		return true;
	}
Exemple #15
0
	U64 ZipIO::_readUncompressed(void *Data, U64 DataSize){
		if (!_kisopen || !_kready || _kfindex < 0 || _kmode == OpenMode::WRITE)
			return 0;

		if (!Data || DataSize == 0)
			return 0;

		U64 buffSize = MZ_MIN(DataSize, (_kfstat.m_uncomp_size - _kfileCurOfst));
		if (_kzarchive.m_pRead(_kzarchive.m_pIO_opaque, _kcurOfst, Data, (size_t)buffSize) == buffSize){
			_kcurOfst += buffSize;
			_kfileCurOfst += buffSize;
			return buffSize;
		}

		KD_PRINT("reading archive error");
		return 0;
	}
Exemple #16
0
	bool KShaderProgram::bind(){
		// create texture only first time
		if (!_kisCreated) {
			if (!_create()) {
				KD_PRINT("can't initialize shader program");
				return false;
			}
		}

		if (_klastProgId != _kprogId){
			// enable the program
			DGL_CALL(glUseProgram(_kprogId));
			_klastProgId = _kprogId;
		}

		return true;
	}
Exemple #17
0
	void KOrthogonalMap::getTileLayers(U32 TileID, std::vector<KOrthoLayer> &Output) {
		Output.clear();
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return;
		}
		Output.reserve(_krootList[TileID].layerSize);

		U32 tindex = _krootList[TileID].firstNode;
		auto dim = getTileDimension(TileID);
		for (SIZE ncounter = 0; ncounter < _krootList[TileID].layerSize; ++ncounter) {
			Output.push_back(KOrthoLayer());
			initeLayer(_knodeList[tindex], Output.back());
			tindex = _knodeList[tindex].nextNode;
		}
	}
Exemple #18
0
	void KOrthogonalMap::removeTileLayer(U32 TileID, U16 LayerIndex) {
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return;
		}

		// empty tile (there is no layer)
		if (_krootList[TileID].layerSize == 0) return;

		// iterate over layers
		SIZE nodeIndex = _krootList[TileID].firstNode;
		SIZE prevNode = nodeIndex;
		for (U16 i = 0; i < _krootList[TileID].layerSize; ++i) {
			// layer not found
			if (_knodeList[nodeIndex].layerIndex > LayerIndex) break;

			// layer found
			if (_knodeList[nodeIndex].layerIndex == LayerIndex) {

				// first node 
				if (i == 0) {
					_krootList[TileID].firstNode = _knodeList[nodeIndex].nextNode;

				} else {
					_knodeList[prevNode].nextNode = _knodeList[nodeIndex].nextNode;
				}

				--_krootList[TileID].layerSize;

				// swap and remove methode
				moveNode(_knodeList.back(), nodeIndex);
				_knodeList.pop_back();
				break;
			}

			// store current node
			prevNode = nodeIndex;

			// move to next node
			nodeIndex = _knodeList[nodeIndex].nextNode;
		}
	}
Exemple #19
0
	void KOrthogonalMap::setScenePtr(U32 TileID, U16 LayerIndex, void *Pointer) {
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return;
		}

		// iterate over nodes
		SIZE nodeIndex = _krootList[TileID].firstNode;
		for (SIZE i = 0; i < _krootList[TileID].layerSize; ++i) {
			// layer found
			if (_knodeList[nodeIndex].layerIndex == LayerIndex) {
				_knodeList[nodeIndex].sceneItem = Pointer;
				return;
			}

			// layer not found
			if (_knodeList[nodeIndex].layerIndex > LayerIndex) break;

			// move to next node
			nodeIndex = _knodeList[nodeIndex].nextNode;
		}
	}
Exemple #20
0
	void KOrthogonalMap::removeTileLayers(U32 TileID) {
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return;
		}

		// iterate over nodes and remove them
		auto tempSize = _krootList[TileID].layerSize;
		for (SIZE i = 0; i < tempSize; ++i) {
			--_krootList[TileID].layerSize;
			// swap and remove methode
			// swap removed node with last node in the list
			moveNode(_knodeList.back(), _krootList[TileID].firstNode);
			_knodeList.pop_back();

			// move first pointer to next node
			_krootList[TileID].firstNode = _knodeList[_krootList[TileID].firstNode].nextNode;
		}

		// cleanup root
		_krootList[TileID].firstNode = 0;
	}
Exemple #21
0
	bool KOrthogonalMap::getTileLayer(U32 TileID, U16 LayerIndex, KOrthoLayer &Output) {
		// check range
		if (TileID >= _krootList.size()) {
			KD_PRINT("tile id is out of range or tile map is not created yet");
			return false;
		}

		// iterate over nodes
		SIZE nodeIndex = _krootList[TileID].firstNode;
		for (SIZE i = 0; i < _krootList[TileID].layerSize; ++i) {
			// layer found
			if (_knodeList[nodeIndex].layerIndex == LayerIndex) {
				initeLayer(_knodeList[nodeIndex], Output);
				return true;
			}

			// layer not found
			if (_knodeList[nodeIndex].layerIndex > LayerIndex) break;

			// move to next node
			nodeIndex = _knodeList[nodeIndex].nextNode;
		}
		return false;
	}