| 202 | } |
| 203 | |
| 204 | std::vector<glm::vec2> nfsUvGenerate(NFSVer tag, EntityType mesh_type, uint32_t textureFlags, Texture gl_texture) { |
| 205 | std::bitset<32> textureAlignment(textureFlags); |
| 206 | std::vector<glm::vec2> uvs; |
| 207 | |
| 208 | switch (tag) { |
| 209 | case NFS_1: |
| 210 | ASSERT(false, "Unimplemented"); |
| 211 | break; |
| 212 | case NFS_2: |
| 213 | case NFS_2_SE: |
| 214 | switch (mesh_type) { |
| 215 | case XOBJ: { |
| 216 | bool horizontalFlip = false; //textureAlignment[8]; |
| 217 | bool verticalFlip = false; //textureAlignment[9]; |
| 218 | glm::vec2 originTransform = glm::vec2(0.5f, 0.5f); |
| 219 | uint8_t nRotate = 0; |
| 220 | float angle = nRotate * 90.f; |
| 221 | glm::mat2 uvRotationTransform = glm::mat2(cos(glm::radians(angle)), sin(glm::radians(angle)), -sin(glm::radians(angle)), cos(glm::radians(angle))); |
| 222 | uvs.emplace_back(((glm::vec2(1.0f, 1.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 223 | uvs.emplace_back(((glm::vec2(0.0f, 1.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 224 | uvs.emplace_back(((glm::vec2(0.0f, 0.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 225 | uvs.emplace_back(((glm::vec2(1.0f, 1.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 226 | uvs.emplace_back(((glm::vec2(0.0f, 0.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 227 | uvs.emplace_back(((glm::vec2(1.0f, 0.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 228 | for (auto &uv : uvs) { |
| 229 | if (horizontalFlip) { |
| 230 | uv.x = 1.0f - uv.x; |
| 231 | } |
| 232 | if (verticalFlip) { |
| 233 | uv.y = 1.0f - uv.y; |
| 234 | } |
| 235 | uv.x *= gl_texture.max_u; |
| 236 | uv.y *= gl_texture.max_v; |
| 237 | } |
| 238 | } |
| 239 | break; |
| 240 | case OBJ_POLY: |
| 241 | break; |
| 242 | case ROAD: |
| 243 | { |
| 244 | bool horizontalFlip = false; // textureAlignment[8]; |
| 245 | bool verticalFlip = false; // textureAlignment[9]; |
| 246 | glm::vec2 originTransform = glm::vec2(0.5f, 0.5f); |
| 247 | uint8_t nRotate = (textureFlags >> 11) & 3; // 8,11 ok |
| 248 | float angle = nRotate * 90.f; |
| 249 | glm::mat2 uvRotationTransform = glm::mat2(cos(glm::radians(angle)), sin(glm::radians(angle)), -sin(glm::radians(angle)), cos(glm::radians(angle))); |
| 250 | uvs.emplace_back(((glm::vec2(1.0f, 1.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 251 | uvs.emplace_back(((glm::vec2(0.0f, 1.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 252 | uvs.emplace_back(((glm::vec2(0.0f, 0.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 253 | uvs.emplace_back(((glm::vec2(1.0f, 1.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 254 | uvs.emplace_back(((glm::vec2(0.0f, 0.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 255 | uvs.emplace_back(((glm::vec2(1.0f, 0.0f) - originTransform) * uvRotationTransform) + originTransform); |
| 256 | for (auto &uv : uvs) { |
| 257 | if (horizontalFlip) { |
| 258 | uv.x = 1.0f - uv.x; |
| 259 | } |
| 260 | if (verticalFlip) { |
| 261 | uv.y = 1.0f - uv.y; |
no outgoing calls
no test coverage detected