Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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();
}