TexturedVertex * GetNewVertexList(TextureContainer * container, const EERIE_FACE & face, float invisibility, float & fTransp) { fTransp = 0.f; if((face.facetype & POLY_TRANS) || invisibility > 0.f) { if(invisibility > 0.f) fTransp = 2.f - invisibility; else fTransp = face.transval; if(fTransp >= 2.f) { //MULTIPLICATIVE fTransp *= (1.f / 2); fTransp += 0.5f; return PushVertexInTable(container, TextureContainer::Multiplicative); } else if(fTransp >= 1.f) { //ADDITIVE fTransp -= 1.f; return PushVertexInTable(container, TextureContainer::Additive); } else if(fTransp > 0.f) { //NORMAL TRANS fTransp = 1.f - fTransp; return PushVertexInTable(container, TextureContainer::Blended); } else { //SUBTRACTIVE fTransp = 1.f - fTransp; return PushVertexInTable(container, TextureContainer::Subtractive); } } else { return PushVertexInTable(container, TextureContainer::Opaque); } }
static void Cedric_RenderObject(EERIE_3DOBJ * eobj, Skeleton * obj, Entity * io, const Vec3f & pos, float invisibility) { if(invisibility == 1.f) return; Entity *use_io = io; if(!io && IN_BOOK_DRAW && eobj == entities.player()->obj) use_io = entities.player(); HaloInfo haloInfo; if(use_io) { if(use_io == entities.player()) { pushSlotHalo(haloInfo, EQUIP_SLOT_HELMET, eobj->fastaccess.sel_head); pushSlotHalo(haloInfo, EQUIP_SLOT_ARMOR, eobj->fastaccess.sel_chest); pushSlotHalo(haloInfo, EQUIP_SLOT_LEGGINGS, eobj->fastaccess.sel_leggings); } if(use_io->halo.flags & HALO_ACTIVE) { haloInfo.push(HaloRenderInfo(&use_io->halo)); } if(haloInfo.size > 0) { PrepareAnimatedObjectHalo(haloInfo, pos, obj, eobj); } } bool glow = false; ColorRGBA glowColor; if(io && (io->sfx_flag & SFX_TYPE_YLSIDE_DEATH) && io->show != SHOW_FLAG_TELEPORTING) { const ArxDuration elapsed = arxtime.now() - io->sfx_time; if(elapsed >= ArxDurationMs(3000) && elapsed < ArxDurationMs(6000)) { float ratio = toMs(elapsed - ArxDurationMs(3000)) * (1.0f / 3000); glowColor = Color::gray(ratio).toRGB(); glow = true; } } for(size_t i = 0; i < eobj->facelist.size(); i++) { const EERIE_FACE & face = eobj->facelist[i]; if((face.facetype & POLY_HIDE) && !IN_BOOK_DRAW) continue; if(CullFace(eobj, face)) continue; if(face.texid < 0) continue; TextureContainer *pTex = eobj->texturecontainer[face.texid]; if(!pTex) continue; float fTransp = 0.f; TexturedVertex *tvList = GetNewVertexList(&pTex->m_modelBatch, face, invisibility, fTransp); for(size_t n = 0; n < 3; n++) { tvList[n].p = eobj->vertexlist3[face.vid[n]].vert.p; tvList[n].rhw = eobj->vertexlist3[face.vid[n]].vert.rhw; tvList[n].color = eobj->vertexlist3[face.vid[n]].vert.color; tvList[n].uv.x = face.u[n]; tvList[n].uv.y = face.v[n]; } if((face.facetype & POLY_TRANS) || invisibility > 0.f) { tvList[0].color = tvList[1].color = tvList[2].color = Color::gray(fTransp).toRGB(); } if(haloInfo.size) { AddAnimatedObjectHalo(haloInfo, face.vid, invisibility, eobj, io, tvList); } if(glow) { TexturedVertex * tv2 = PushVertexInTable(&TexSpecialColor.m_modelBatch, BatchBucket_Opaque); std::copy(tvList, tvList + 3, tv2); tv2[0].color = tv2[1].color = tv2[2].color = glowColor; } } }