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