void CCOLEntry::parseCollisionMeshVertices(void) { CDataReader *pDataReader = CDataReader::getInstance(); eCOLVersion eCOLVersionValue = getCOLVersion() == nullptr ? COL_UNKNOWN : getCOLVersion()->getVersionId(); vector<TVertex>& vecVertices = getCollisionMeshVertices(); for (uint32 i = 0, j = getCollisionMeshVertexCount(); i < j; i++) { char szText1[500]; TVertex vertex; if (eCOLVersionValue == COL_1) { vertex.m_x = pDataReader->readFloat32(); vertex.m_y = pDataReader->readFloat32(); vertex.m_z = pDataReader->readFloat32(); } else { vertex.m_x = ((float32) pDataReader->readInt16()) / 128.0f; vertex.m_y = ((float32) pDataReader->readInt16()) / 128.0f; vertex.m_z = ((float32) pDataReader->readInt16()) / 128.0f; } vecVertices.push_back(vertex); } }
void CRWEntry_2dEffect_Light::unserialize(void) { CDataReader *pDataReader = CDataReader::getInstance(); m_uiColor = pDataReader->readUint32(); m_fCoronaFarClip = pDataReader->readFloat32(); m_fPointlightRange = pDataReader->readFloat32(); m_fCoronaSize = pDataReader->readFloat32(); m_fShadowSize = pDataReader->readFloat32(); m_ucCoronaShowMode = pDataReader->readUint8(); m_ucCoronaEnableReflection = pDataReader->readUint8(); m_ucCoronaFlareType = pDataReader->readUint8(); m_ucShadowColorMultiplier = pDataReader->readUint8(); m_ucFlags1 = pDataReader->readUint8(); m_strCoronaTexName = CStringUtility::rtrimFromLeft(pDataReader->readString(24)); m_strShadowTexName = CStringUtility::rtrimFromLeft(pDataReader->readString(24)); m_ucShadowZDistance = pDataReader->readUint8(); m_ucFlags2 = pDataReader->readUint8(); if (m_uiDataSize == 76) { m_vecPadding.m_x = pDataReader->readUint8(); m_vecPadding.m_y = 0; } else if (m_uiDataSize == 80) { m_vecLookDirection.m_x = pDataReader->readUint8(); m_vecLookDirection.m_y = pDataReader->readUint8(); m_vecLookDirection.m_z = pDataReader->readUint8(); m_vecPadding.m_x = pDataReader->readUint8(); m_vecPadding.m_y = pDataReader->readUint8(); } }
void CCOLEntry::parseCollisionMeshFaceGroups(void) { CDataReader *pDataReader = CDataReader::getInstance(); vector<TFaceGroup>& vecFaceGroups = getCollisionMeshFaceGroups(); for (uint32 i = 0, j = getCollisionMeshFaceGroupCount(); i < j; i++) { TFaceGroup faceGroup; faceGroup.m_min.m_x = pDataReader->readFloat32(); faceGroup.m_min.m_y = pDataReader->readFloat32(); faceGroup.m_min.m_z = pDataReader->readFloat32(); faceGroup.m_max.m_x = pDataReader->readFloat32(); faceGroup.m_max.m_y = pDataReader->readFloat32(); faceGroup.m_max.m_z = pDataReader->readFloat32(); faceGroup.m_startFace = pDataReader->readUint16(); faceGroup.m_endFace = pDataReader->readUint16(); vecFaceGroups.push_back(faceGroup); } }
void CCOLEntry::parseCollisionBoxes(void) { CDataReader *pDataReader = CDataReader::getInstance(); vector<TBox>& vecBoxes = getCollisionBoxes(); for (uint32 i = 0, j = getCollisionBoxCount(); i < j; i++) { TBox box; box.m_min.m_x = pDataReader->readFloat32(); box.m_min.m_y = pDataReader->readFloat32(); box.m_min.m_z = pDataReader->readFloat32(); box.m_max.m_x = pDataReader->readFloat32(); box.m_max.m_y = pDataReader->readFloat32(); box.m_max.m_z = pDataReader->readFloat32(); box.m_surface.m_ucMaterial = pDataReader->readUint8(); box.m_surface.m_ucFlag = pDataReader->readUint8(); box.m_surface.m_ucBrightness = pDataReader->readUint8(); box.m_surface.m_ucLight = pDataReader->readUint8(); vecBoxes.push_back(box); } }
void CCOLEntry::parseCollisionSpheres(void) { CDataReader *pDataReader = CDataReader::getInstance(); eCOLVersion eCOLVersionValue = getCOLVersion() == nullptr ? COL_UNKNOWN : getCOLVersion()->getVersionId(); vector<TSphere>& vecSpheres = getCollisionSpheres(); for (uint32 i = 0, j = getCollisionSphereCount(); i < j; i++) { TSphere sphere; if (eCOLVersionValue == COL_1) { sphere.m_fRadius = pDataReader->readFloat32(); sphere.m_vecCenter.m_x = pDataReader->readFloat32(); sphere.m_vecCenter.m_y = pDataReader->readFloat32(); sphere.m_vecCenter.m_z = pDataReader->readFloat32(); sphere.m_surface.m_ucMaterial = pDataReader->readUint8(); sphere.m_surface.m_ucFlag = pDataReader->readUint8(); sphere.m_surface.m_ucBrightness = pDataReader->readUint8(); sphere.m_surface.m_ucLight = pDataReader->readUint8(); } else { sphere.m_vecCenter.m_x = pDataReader->readFloat32(); sphere.m_vecCenter.m_y = pDataReader->readFloat32(); sphere.m_vecCenter.m_z = pDataReader->readFloat32(); sphere.m_fRadius = pDataReader->readFloat32(); sphere.m_surface.m_ucMaterial = pDataReader->readUint8(); sphere.m_surface.m_ucFlag = pDataReader->readUint8(); sphere.m_surface.m_ucBrightness = pDataReader->readUint8(); sphere.m_surface.m_ucLight = pDataReader->readUint8(); } vecSpheres.push_back(sphere); } }
// unserialize components void CCOLEntry::parseBoundingObjects(void) { CDataReader *pDataReader = CDataReader::getInstance(); eCOLVersion eCOLVersionValue = getCOLVersion() == nullptr ? COL_UNKNOWN : getCOLVersion()->getVersionId(); TBounds& boundingObjects = getBoundingObjects(); if (eCOLVersionValue == COL_1) { boundingObjects.m_fRadius = pDataReader->readFloat32(); boundingObjects.m_vecCenter.m_x = pDataReader->readFloat32(); boundingObjects.m_vecCenter.m_y = pDataReader->readFloat32(); boundingObjects.m_vecCenter.m_z = pDataReader->readFloat32(); boundingObjects.m_vecMin.m_x = pDataReader->readFloat32(); boundingObjects.m_vecMin.m_y = pDataReader->readFloat32(); boundingObjects.m_vecMin.m_z = pDataReader->readFloat32(); boundingObjects.m_vecMax.m_x = pDataReader->readFloat32(); boundingObjects.m_vecMax.m_y = pDataReader->readFloat32(); boundingObjects.m_vecMax.m_z = pDataReader->readFloat32(); } else { boundingObjects.m_vecMin.m_x = pDataReader->readFloat32(); boundingObjects.m_vecMin.m_y = pDataReader->readFloat32(); boundingObjects.m_vecMin.m_z = pDataReader->readFloat32(); boundingObjects.m_vecMax.m_x = pDataReader->readFloat32(); boundingObjects.m_vecMax.m_y = pDataReader->readFloat32(); boundingObjects.m_vecMax.m_z = pDataReader->readFloat32(); boundingObjects.m_vecCenter.m_x = pDataReader->readFloat32(); boundingObjects.m_vecCenter.m_y = pDataReader->readFloat32(); boundingObjects.m_vecCenter.m_z = pDataReader->readFloat32(); boundingObjects.m_fRadius = pDataReader->readFloat32(); } }
void CRWSection_Geometry::unserialize(void) { CDataReader *pDataReader = CDataReader::getInstance(); m_usFlags = pDataReader->readUint16(); m_ucUVCoordinateCount = pDataReader->readUint8(); if (m_usFlags & 4) { m_ucUVCoordinateCount = 1; } m_ucGeometryNativeFlags = pDataReader->readUint8(); m_uiTriangleCount = pDataReader->readUint32(); m_uiVertexCount = pDataReader->readUint32(); m_uiFrameCount = pDataReader->readUint32(); if (m_uiSectionRWVersion < 0x1003FFFF) { m_uiAmbientColour = pDataReader->readUint32(); m_uiDiffuseColour = pDataReader->readUint32(); m_uiSpecularColour = pDataReader->readUint32(); } else { m_uiAmbientColour = 1; m_uiDiffuseColour = 1; m_uiSpecularColour = 1; } if (!m_ucGeometryNativeFlags) { if (m_usFlags & 8) { m_vecVertexColours = pDataReader->readVector4ui8ArrayAsStdVector(m_uiVertexCount); } if (m_usFlags & 4) { m_vecTextureCoordinates = pDataReader->readVector2DArrayAsStdVector(m_uiVertexCount); } if (m_usFlags & 128) { for (uint32 i = 0, j = m_ucUVCoordinateCount; i < j; i++) { m_vecTextureCoordinates = pDataReader->readVector2DArrayAsStdVector(m_uiVertexCount); } } m_vecVertexIndices = pDataReader->readVector4ui16ArrayAsStdVector(m_uiTriangleCount); } m_boundingInfo.setCenter(pDataReader->readVector3D()); m_boundingInfo.setCenterRadius(pDataReader->readFloat32()); m_boundingInfo.setHasPosition(pDataReader->readUint32() != 0); m_boundingInfo.setHasNormals(pDataReader->readUint32() != 0); if (!m_ucGeometryNativeFlags) { if ((m_usFlags & 2) || m_boundingInfo.doesHavePosition() /* || true */) { m_vecTextureCoordinates = pDataReader->readVector2DArrayAsStdVector(m_uiVertexCount); // todo - store multiple texture coordinates so data loss doesn't occur } if ((m_usFlags & 16) || m_boundingInfo.doesHaveNormals()) { m_vecVertexNormals = pDataReader->readVector3DArrayAsStdVector(m_uiVertexCount); } } }