/* 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); } } }
/* 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); } } }
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); } }