Пример #1
0
void PlayerBlind(IReGameHook_PlayerBlind *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, float fadeTime, float fadeHold, int alpha, Vector& color)
{
	Vector colorCopy(color);

	auto original = [chain, &colorCopy](int _pPlayer, int _pevInflictor, int _pevAttacker, float _fadeTime, float _fadeHold, int _alpha, cell _color)
	{
		chain->callNext(getPrivate<CBasePlayer>(_pPlayer), PEV(_pevInflictor), PEV(_pevAttacker), _fadeTime, _fadeHold, _alpha, colorCopy);
	};

	callVoidForward(RG_PlayerBlind, original, indexOfEdict(pPlayer->pev), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), fadeTime, fadeHold, alpha, g_amxxapi.PrepareCellArrayA(reinterpret_cast<cell *>(&colorCopy), 3, true));
}
Пример #2
0
static void shade( Scene* scene, double *eye, double *ray, Object* object, double *point,
										double *normal, int depth, float *out_color )
{
	Material *material = NULL;
	Light *light = NULL;
	int nlights, i;
	double reflectionFactor, specularExponent, refractedIndex, opacity, cos, sin;

	double V[VECTOR], Rr[VECTOR], Rt[VECTOR], vt[VECTOR], T[VECTOR], aux[VECTOR], 
    lightpos[VECTOR], L[VECTOR], unitnormal[VECTOR], aux2[VECTOR], r[4];

	float colorRr[COLOR], colorRt[COLOR], color [COLOR], ambient[COLOR], 
    diffuse[COLOR], specular[COLOR], lightcolor[COLOR], reflecColor[COLOR];

	sceGetMaterial( scene, objGetMaterial(object), &material );
	matGetReflectionFactor( material, &reflectionFactor );
	matGetSpecularExponent( material, &specularExponent );
	matGetRefractionIndex ( material, &refractedIndex);
	matGetOpacity( material, &opacity );

	sceGetAmbientLight( scene, ambient );
	objTextureCoordinateAt( object, point, aux );
	matGetDiffuse( material, aux, diffuse );	
	matGetSpecular( material, specular );

	/* Come�a com a cor ambiente */
	colorMultiplication( diffuse, ambient, color );

	algUnit( normal, unitnormal );

	/* Adiciona a componente difusa */
	sceGetLightCount(scene, &nlights);				/* numero de luzes na cena */
	for( i = 0; i < nlights; i++ ) {

		sceGetLight( scene, i, &light );					/* luz i da cena */

		lightGetColor( light, lightcolor );			/* cor da luz i */
		lightGetPosition( light, lightpos );		/* posicao da luz i */

		algSub( lightpos, point, L );
		algUnit( L, L );												/* vetor do ponto para a luz i */

		algDot( L, unitnormal, &cos );					/* cosseno com a normal */

		if( cos > 0 && isInShadow( scene, point, L, lightpos ) == 0)   /* se for visivel para a luz */
		{
			colorReflection( cos, lightcolor, diffuse, reflecColor );
			colorAddition( color, reflecColor, color );
		}

	}

	/*Componente especular*/
	algMinus( ray, V );
	algUnit( V, V );
	for( i = 0; i < nlights; i++ ) {

		sceGetLight( scene, i, &light );					/* ponteiro da luz i */

		lightGetColor( light, lightcolor );			/* cor da luz i */

		lightGetPosition( light, lightpos );		/* posicao da luz i */

		algSub(lightpos,point, L);
		algUnit( L, L );												/* aponta para a Luz i */

		algReflect( L, unitnormal, r );						/* reflex�o da luz i na normal */

		algDot( r, V, &cos ); 

		if( cos > 0 && isInShadow( scene, point, L, lightpos) == 0 )
		{
			colorReflection( pow(cos, specularExponent), lightcolor, specular, reflecColor );
			colorAddition( color, reflecColor, color);
		}

	}

	depth ++;

	/*Reflex�o*/ 
	algReflect( V,unitnormal, Rr );
	if( (reflectionFactor > 0.001) && (depth < MAX_DEPTH) )
	{
		rayTrace( scene, point, Rr, depth, colorRr );
		colorScale( reflectionFactor, colorRr, colorRr);
		colorAddition( color, colorRr, color );
	}

	/*Transpar�ncia */ 
	if( ((1-opacity) > 0.001) && (depth < MAX_DEPTH) )
	{
		algProj( V, unitnormal, vt );
		algSub( vt, V, vt );

		algNorm( vt, &sin );
		sin = (1.0/refractedIndex) * sin;

		cos = sqrt(1.-sin*sin);

		algUnit( vt, T );

		algScale( sin, T, aux );
		algScale(-cos, unitnormal, aux2 );

		algAdd( aux, aux2, Rt );
		//Rt=algMinus(V);

		rayTrace( scene, point, Rt, depth, colorRt );
		colorScale( 1-opacity, colorRt, colorRt );
		colorAddition(color, colorRt, color);
	}
	
	colorCopy( color, out_color );
}