Пример #1
0
/* Object dynamic lighting */
static void Cedric_ApplyLighting(EERIE_3DOBJ * eobj, EERIE_C_DATA * obj, const ColorMod & colorMod) {

	/* Apply light on all vertices */
	for(int i = 0; i != obj->nb_bones; i++) {

		glm::quat *quat = &obj->bones[i].anim.quat;

		/* Get light value for each vertex */
		for(int v = 0; v != obj->bones[i].nb_idxvertices; v++) {
			size_t vertexIndex = obj->bones[i].idxvertices[v];

			Vec3f & position = eobj->vertexlist3[vertexIndex].v;
			Vec3f & normal = eobj->vertexlist[vertexIndex].norm;

			eobj->vertexlist3[vertexIndex].vert.color = ApplyLight(quat, position, normal, colorMod);
		}
	}
}
Пример #2
0
/* Object dynamic lighting */
static void Cedric_ApplyLighting(ShaderLight lights[], int lightsCount, EERIE_3DOBJ * eobj, Skeleton * obj, const ColorMod & colorMod) {

	/* Apply light on all vertices */
	for(size_t i = 0; i != obj->bones.size(); i++) {

		const glm::quat & quat = obj->bones[i].anim.quat;

		/* Get light value for each vertex */
		for(size_t v = 0; v != obj->bones[i].idxvertices.size(); v++) {
			size_t vertexIndex = obj->bones[i].idxvertices[v];

			Vec3f & position = eobj->vertexlist3[vertexIndex].v;
			Vec3f & normal = eobj->vertexlist[vertexIndex].norm;

			eobj->vertexlist3[vertexIndex].vert.color = ApplyLight(lights, lightsCount, quat, position, normal, colorMod);
		}
	}
}
Пример #3
0
void DrawEERIEInter_Render(EERIE_3DOBJ *eobj, const TransformInfo &t, Entity *io, float invisibility) {

	ColorMod colorMod;
	colorMod.updateFromEntity(io, !io);

	Vec3f tv = t.pos;

	if(io && (io->ioflags & IO_ITEM))
		tv.y -= 60.f;
	else
		tv.y -= 90.f;

	UpdateLlights(tv, false);

	for(size_t i = 0; i < eobj->facelist.size(); i++) {
		const EERIE_FACE & face = eobj->facelist[i];

		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, face, invisibility, fTransp);

		for(size_t n = 0; n < 3; n++) {

			if(io && (io->ioflags & IO_ANGULAR)) {
				const Vec3f & position = eobj->vertexlist3[face.vid[n]].v;
				const Vec3f & normal = face.norm;

				eobj->vertexlist3[face.vid[n]].vert.color = ApplyLight(&t.rotation, position, normal, colorMod, 0.5f);
			} else {
				Vec3f & position = eobj->vertexlist3[face.vid[n]].v;
				Vec3f & normal = eobj->vertexlist[face.vid[n]].norm;

				eobj->vertexlist3[face.vid[n]].vert.color = ApplyLight(&t.rotation, position, normal, colorMod);
			}

			tvList[n] = eobj->vertexlist[face.vid[n]].vert;
			tvList[n].uv.x = face.u[n];
			tvList[n].uv.y = face.v[n];

			// Treat WATER Polys (modify UVs)
			if(face.facetype & POLY_WATER) {
				tvList[n].uv += getWaterFxUvOffset(eobj->vertexlist[face.vid[n]].v, 0.3f);
			}

			if(face.facetype & POLY_GLOW) {
				// unaffected by light
				tvList[n].color = 0xffffffff;
			} else {
				// Normal Illuminations
				tvList[n].color = eobj->vertexlist3[face.vid[n]].vert.color;
			}

			// TODO copy-paste
			if(io && Project.improve) {
				long lr=(tvList[n].color>>16) & 255;
				float ffr=(float)(lr);

				float dd = tvList[n].rhw;

				dd = clamp(dd, 0.f, 1.f);

				Vec3f & norm = eobj->vertexlist[face.vid[n]].norm;

				float fb=((1.f-dd)*6.f + (EEfabs(norm.x) + EEfabs(norm.y))) * 0.125f;
				float fr=((.6f-dd)*6.f + (EEfabs(norm.z) + EEfabs(norm.y))) * 0.125f;

				if(fr < 0.f)
					fr = 0.f;
				else
					fr = std::max(ffr, fr * 255.f);

				fr=std::min(fr,255.f);
				fb*=255.f;
				fb=std::min(fb,255.f);
				u8 lfr = fr;
				u8 lfb = fb;
				u8 lfg = 0x1E;
				tvList[n].color = (0xff000000L | (lfr << 16) | (lfg << 8) | (lfb));
			}

			// Transparent poly: storing info to draw later
			if((face.facetype & POLY_TRANS) || invisibility > 0.f) {
				tvList[n].color = Color::gray(fTransp).toBGR();
			}
		}

		// HALO HANDLING START
		if(io && (io->halo.flags & HALO_ACTIVE)) {
			AddFixedObjectHalo(face, t, io, tvList, eobj);
		}
	}