float GetColorz(const Vec3f & pos) { ShaderLight lights[llightsSize]; size_t lightsCount; UpdateLlights(lights, lightsCount, pos, true); Color3f ff = Color3f(0.f, 0.f, 0.f); for(size_t k = 0; k < lightsCount; k++) { const ShaderLight & light = lights[k]; float dd = fdist(light.pos, pos); if(dd < light.fallend) { float dc; if(dd <= light.fallstart) { dc = light.intensity * GLOBAL_LIGHT_FACTOR; } else { float p = ((light.fallend - dd) * light.falldiffmul); if(p <= 0.f) dc = 0.f; else dc = p * light.intensity * GLOBAL_LIGHT_FACTOR; } dc *= 0.4f * 255.f; ff.r = std::max(ff.r, light.rgb.r * dc); ff.g = std::max(ff.g, light.rgb.g * dc); ff.b = std::max(ff.b, light.rgb.b * dc); } } EERIEPOLY * ep; float needy; ep = CheckInPoly(pos, &needy); if(ep != NULL) { Color3f _ff = Color3f(0.f, 0.f, 0.f); long to = (ep->type & POLY_QUAD) ? 4 : 3; float div = (1.0f / to); EP_DATA & epdata = portals->rooms[ep->room].epdata[0]; ApplyTileLights(ep, epdata.tile); for(long i = 0; i < to; i++) { Color col = Color::fromRGBA(ep->color[i]); _ff.r += float(col.r); _ff.g += float(col.g); _ff.b += float(col.b); } _ff.r *= div; _ff.g *= div; _ff.b *= div; float ratio, ratio2; ratio = glm::abs(needy - pos.y) * (1.0f / 300); ratio = (1.f - ratio); ratio2 = 1.f - ratio; ff.r = ff.r * ratio2 + _ff.r * ratio; ff.g = ff.g * ratio2 + _ff.g * ratio; ff.b = ff.b * ratio2 + _ff.b * ratio; } return (std::min(ff.r, 255.f) + std::min(ff.g, 255.f) + std::min(ff.b, 255.f)) * (1.f / 3); }
float GetColorz(const Vec3f &pos) { UpdateLlights(pos, true); Color3f ff = Color3f(0.f, 0.f, 0.f); for(long k = 0; k < MAX_LLIGHTS; k++) { EERIE_LIGHT * el = llights[k]; if(el) { float dd = fdist(el->pos, pos); if(dd < el->fallend) { float dc; if(dd <= el->fallstart) { dc = el->intensity * GLOBAL_LIGHT_FACTOR; } else { float p = ((el->fallend - dd) * el->falldiffmul); if(p <= 0.f) dc = 0.f; else dc = p * el->intensity * GLOBAL_LIGHT_FACTOR; } dc *= 0.4f * 255.f; ff.r = std::max(ff.r, el->rgb.r * dc); ff.g = std::max(ff.g, el->rgb.g * dc); ff.b = std::max(ff.b, el->rgb.b * dc); } } } EERIEPOLY * ep; float needy; ep = CheckInPoly(pos, &needy); if(ep != NULL) { Color3f _ff = Color3f(0.f, 0.f, 0.f); long to = (ep->type & POLY_QUAD) ? 4 : 3; float div = (1.0f / to); EP_DATA & epdata = portals->rooms[ep->room].epdata[0]; ApplyTileLights(ep, epdata.p); for(long i = 0; i < to; i++) { Color col = Color::fromRGBA(ep->tv[i].color); _ff.r += float(col.r); _ff.g += float(col.g); _ff.b += float(col.b); } _ff.r *= div; _ff.g *= div; _ff.b *= div; float ratio, ratio2; ratio = glm::abs(needy - pos.y) * ( 1.0f / 300 ); ratio = (1.f - ratio); ratio2 = 1.f - ratio; ff.r = ff.r * ratio2 + _ff.r * ratio; ff.g = ff.g * ratio2 + _ff.g * ratio; ff.b = ff.b * ratio2 + _ff.b * ratio; } return (std::min(ff.r, 255.f) + std::min(ff.g, 255.f) + std::min(ff.b, 255.f)) * (1.f/3); }
static void ARX_PORTALS_Frustrum_RenderRoomTCullSoft(long room_num, const EERIE_FRUSTRUM_DATA & frustrums, long tim) { ARX_PROFILE_FUNC(); if(!RoomDraw[room_num].count) return; EERIE_ROOM_DATA & room = portals->rooms[room_num]; if(!room.pVertexBuffer) { // No need to spam this for every frame as there will already be an // earlier warning LogDebug("no vertex data for room " << room_num); return; } SMY_VERTEX * pMyVertex = room.pVertexBuffer->lock(NoOverwrite); unsigned short *pIndices=room.indexBuffer; EP_DATA *pEPDATA = &room.epdata[0]; for(long lll=0; lll<room.nb_polys; lll++, pEPDATA++) { EERIE_BKG_INFO *feg = &ACTIVEBKG->fastdata[pEPDATA->p.x][pEPDATA->p.y]; if(!feg->treat) { // TODO copy-paste background tiles short tilex = pEPDATA->p.x; short tilez = pEPDATA->p.y; short radius = 1; short minx = std::max(tilex - radius, 0); short maxx = std::min(tilex + radius, ACTIVEBKG->Xsize - 1); short minz = std::max(tilez - radius, 0); short maxz = std::min(tilez + radius, ACTIVEBKG->Zsize - 1); for(short z = minz; z <= maxz; z++) for(short x = minx; x <= maxx; x++) { EERIE_BKG_INFO & feg2 = ACTIVEBKG->fastdata[x][z]; if(!feg2.treat) { feg2.treat = true; ComputeTileLights(x, z); } } } EERIEPOLY *ep = &feg->polydata[pEPDATA->idx]; if(!ep->tex) { continue; } if(ep->type & (POLY_IGNORE | POLY_NODRAW| POLY_HIDE)) { continue; } if(FrustrumsClipPoly(frustrums, *ep)) { continue; } if(ep->v[0].rhw < -efpPlaneNear.getDist(ep->center)) { continue; } Vec3f nrm = ep->v[2].p - ACTIVECAM->orgTrans.pos; int to = (ep->type & POLY_QUAD) ? 4 : 3; if(!(ep->type & POLY_DOUBLESIDED) && glm::dot(ep->norm , nrm) > 0.f) { if(to == 3 || glm::dot(ep->norm2 , nrm) > 0.f) { continue; } } SMY_ARXMAT::TransparencyType transparencyType; if(ep->type & POLY_TRANS) { if(ep->transval >= 2.f) { transparencyType = SMY_ARXMAT::Multiplicative; } else if(ep->transval >= 1.f) { transparencyType = SMY_ARXMAT::Additive; } else if(ep->transval > 0.f) { transparencyType = SMY_ARXMAT::Blended; } else { transparencyType = SMY_ARXMAT::Subtractive; } } else { transparencyType = SMY_ARXMAT::Opaque; } SMY_ARXMAT & roomMat = ep->tex->tMatRoom[room_num]; unsigned short * pIndicesCurr = pIndices + roomMat.offset[transparencyType] + roomMat.count[transparencyType]; unsigned long * pNumIndices = &roomMat.count[transparencyType]; *pIndicesCurr++ = ep->uslInd[0]; *pIndicesCurr++ = ep->uslInd[1]; *pIndicesCurr++ = ep->uslInd[2]; *pNumIndices += 3; if(to == 4) { *pIndicesCurr++ = ep->uslInd[3]; *pIndicesCurr++ = ep->uslInd[2]; *pIndicesCurr++ = ep->uslInd[1]; *pNumIndices += 3; } SMY_VERTEX * pMyVertexCurr = &pMyVertex[roomMat.uslStartVertex]; if(!player.m_improve) { // Normal View... if(ep->type & POLY_GLOW) { pMyVertexCurr[ep->uslInd[0]].color = Color(255, 255, 255, 255).toRGBA(); pMyVertexCurr[ep->uslInd[1]].color = Color(255, 255, 255, 255).toRGBA(); pMyVertexCurr[ep->uslInd[2]].color = Color(255, 255, 255, 255).toRGBA(); if(to == 4) { pMyVertexCurr[ep->uslInd[3]].color = Color(255, 255, 255, 255).toRGBA(); } } else { if(!(ep->type & POLY_TRANS)) { ApplyTileLights(ep, pEPDATA->p); pMyVertexCurr[ep->uslInd[0]].color = ep->tv[0].color; pMyVertexCurr[ep->uslInd[1]].color = ep->tv[1].color; pMyVertexCurr[ep->uslInd[2]].color = ep->tv[2].color; if(to&4) { pMyVertexCurr[ep->uslInd[3]].color = ep->tv[3].color; } } if(ep->type & POLY_LAVA) { ManageLava_VertexBuffer(ep, to, tim, pMyVertexCurr); vPolyLava.push_back(ep); } else if(ep->type & POLY_WATER) { ManageWater_VertexBuffer(ep, to, tim, pMyVertexCurr); vPolyWater.push_back(ep); } } } else { // Improve Vision Activated if(!(ep->type & POLY_TRANS)) { if(!EERIERTPPoly(ep)) { // RotTransProject Vertices continue; } ApplyTileLights(ep, pEPDATA->p); for(int k = 0; k < to; k++) { long lr = Color::fromRGBA(ep->tv[k].color).r; float ffr=(float)(lr); float dd = ep->tv[k].rhw; dd = glm::clamp(dd, 0.f, 1.f); Vec3f & norm = ep->nrml[k]; float fb=((1.f-dd)*6.f + (glm::abs(norm.x) + glm::abs(norm.y))) * 0.125f; float fr=((.6f-dd)*6.f + (glm::abs(norm.z) + glm::abs(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; ep->tv[k].color = Color(lfr, lfg, lfb, 255).toRGBA(); } pMyVertexCurr[ep->uslInd[0]].color = ep->tv[0].color; pMyVertexCurr[ep->uslInd[1]].color = ep->tv[1].color; pMyVertexCurr[ep->uslInd[2]].color = ep->tv[2].color; if(to == 4) { pMyVertexCurr[ep->uslInd[3]].color = ep->tv[3].color; } } } } room.pVertexBuffer->unlock(); }