void do_refractions(miColor *result,miState *state,miColor *refraction, miScalar factor){ miVector *refraction_direction = (miVector *) malloc(sizeof(miVector *)); miColor *refr = (miColor *) malloc(sizeof(miColor *)); miBoolean found = miFALSE; refr->r = refraction->r; refr->g = refraction->g; refr->b = refraction->b; //printf("refr:%d refraction:%d\n",&refr->r,&refraction->r); if (factor > 0){ //miScalar *ior = mi_eval_scalar(&state->ior); miScalar f =1 - factor; result->r *= f; result->b *= f; result->g *= f; result->a = f; /*if(state->ior == 1.0 || state->ior==0.0 || state->ior_in==1.0 || state->ior_in==0.0){ mi_trace_transparent(refr, state); printf(" %f %f %f\n",state->dir.x,state->dir.y,state->dir.z); found = miTRUE; }else{*/ if(mi_refraction_dir(refraction_direction,state,state->ior_in,state->ior)){ if( mi_trace_refraction(refr,state,refraction_direction)){ //printf("Here2\n"); found = miTRUE; } }else{ if( mi_trace_environment(refr,state,refraction_direction)){ //printf("Here3\n"); found = miTRUE; } } //} if (found == miTRUE){ result->r += factor * refr->r; result->g += factor * refr->g; result->b += factor * refr->b; result->a += factor * refr->a; } //printf("\e[34mDirection X: %f\tY: %f\tZ: %f\e[0m\n",refraction_direction->x,refraction_direction->y,refraction_direction->z); //printf("\e[32mDirection X: %f\tY: %f\tZ: %f\e[0m\n",refraction_direction->x,refraction_direction->y,refraction_direction->z); //mi_mem_release(refraction_direction); delete refraction_direction; delete refr; } return; }
extern "C" DLLEXPORT miBoolean mib_dielectric( miColor *result, miState *state, struct md *paras) { miScalar refract; miColor inp, absorb; miVector dir; miScalar ior; double dist; /* check for illegal calls */ if (state->type == miRAY_SHADOW || state->type == miRAY_DISPLACE) return(miFALSE); refract = *mi_eval_scalar(¶s->refract); if (refract == 0.0) *result = *mi_eval_color(¶s->input); else { ior = *mi_eval_scalar(¶s->ior); if (ior==0.0 || ior==1.0) mi_trace_transparent(result, state); else { if (mi_refraction_dir(&dir, state, 1.0, ior)) mi_trace_refraction(result, state, &dir); else { /* total internal reflection */ mi_reflection_dir(&dir, state); mi_trace_reflection(result, state, &dir); } } dist = state->child ? state->child->dist : 0.0; absorb = *mi_eval_color(¶s->absorb); if(absorb.r > 0.0f) result->r *= (miScalar) exp(log(absorb.r) * dist); if(absorb.g > 0.0f) result->g *= (miScalar) exp(log(absorb.g) * dist); if(absorb.b > 0.0f) result->b *= (miScalar) exp(log(absorb.b) * dist); if(absorb.a > 0.0f) result->a *= (miScalar) exp(log(absorb.a) * dist); if (refract < 1.0f) { inp = *mi_eval_color(¶s->input); result->r = result->r * refract + inp.r * (1-refract); result->g = result->g * refract + inp.g * (1-refract); result->b = result->b * refract + inp.b * (1-refract); result->a = result->a * refract + inp.a * (1-refract); } } return(miTRUE); }