| 3372 | } |
| 3373 | |
| 3374 | void Renderer::DrawMesh(RendererItem* itemToDraw, RendererMesh* mesh, RendererObjectType type, int boneIndex, bool skinned, RenderView& view, RendererPass rendererPass) |
| 3375 | { |
| 3376 | if (rendererPass == RendererPass::CollectTransparentFaces) |
| 3377 | { |
| 3378 | for (auto& bucket : mesh->Buckets) |
| 3379 | { |
| 3380 | if (bucket.NumVertices == 0) |
| 3381 | continue; |
| 3382 | |
| 3383 | auto blendMode = GetBlendModeFromAlpha(bucket.BlendMode, itemToDraw->Color.w); |
| 3384 | |
| 3385 | if (IsSortedBlendMode(blendMode)) |
| 3386 | { |
| 3387 | for (int p = 0; p < bucket.Polygons.size(); p++) |
| 3388 | { |
| 3389 | auto center = Vector3::Transform(bucket.Polygons[p].Centre, itemToDraw->InterpolatedAnimTransforms[boneIndex] * itemToDraw->InterpolatedWorld); |
| 3390 | int dist = Vector3::Distance(center, Camera.pos.ToVector3()); |
| 3391 | |
| 3392 | auto object = RendererSortableObject{}; |
| 3393 | object.ObjectType = type; |
| 3394 | object.Centre = center; |
| 3395 | object.Distance = dist; |
| 3396 | object.Skinned = skinned; |
| 3397 | object.BlendMode = blendMode; |
| 3398 | object.Bucket = &bucket; |
| 3399 | object.Item = itemToDraw; |
| 3400 | object.LightMode = mesh->LightMode; |
| 3401 | object.Polygon = &bucket.Polygons[p]; |
| 3402 | |
| 3403 | view.TransparentObjectsToDraw.push_back(object); |
| 3404 | } |
| 3405 | } |
| 3406 | } |
| 3407 | } |
| 3408 | else |
| 3409 | { |
| 3410 | bool bindTextureAndMaterialsRequired = true; |
| 3411 | |
| 3412 | for (int animated = 0; animated < 2; animated++) |
| 3413 | { |
| 3414 | for (auto& bucket : mesh->Buckets) |
| 3415 | { |
| 3416 | if ((animated == 1) ^ bucket.Animated || bucket.NumVertices == 0) |
| 3417 | { |
| 3418 | continue; |
| 3419 | } |
| 3420 | |
| 3421 | // HACK: waterfalls have a hardcoded step |
| 3422 | // We bind non animated textures in this case because the engine calculates at runtime the scroll effect |
| 3423 | // TODO: in the future uniform this thing |
| 3424 | if (IsWaterfall(itemToDraw->ObjectID) && animated == 1) |
| 3425 | continue; |
| 3426 | |
| 3427 | auto blendMode = GetBlendModeFromAlpha(bucket.BlendMode, itemToDraw->Color.w); |
| 3428 | |
| 3429 | if (rendererPass == RendererPass::ShadowMap) |
| 3430 | { |
| 3431 | SetBlendMode(BlendMode::Opaque); |