예제 #1
0
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);
	}
}
예제 #2
0
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;
		}
	}
}