rgb_value_t Sphere::shade_glass(Ray* ray, Light* light, std::list<Sphere*>* sphereList, coord_t* point, int ref_cnt){ rgb_value_t darkness, ret_val; darkness.r = 0; darkness.g = 0; darkness.b = 0; if (ref_cnt == 0) return darkness; coord_t norm_ray_dir_vect = ray->getDirection(); norm_ray_dir_vect = normalize_vect(&norm_ray_dir_vect); coord_t norm_vect; norm_vect = subtract_coord(point, ¢er); norm_vect = normalize_vect(&norm_vect); bool ray_going_inside = (scalar_mult_vect(&norm_vect, &norm_ray_dir_vect)<=0.0) ? true : false; coord_t refract_dir; float r, w, k; if (ray_going_inside) { r = 1/brechzahl; } else { r = brechzahl; } w = -scalar_mult_vect(&norm_vect, &norm_ray_dir_vect)*r; k = 1.0 + (w-r)*(w+r); if (k<0.0) { return this->shade_reflective(ray, light, sphereList, point, ref_cnt-1); } norm_ray_dir_vect = mult_vect(&norm_ray_dir_vect, r); norm_vect = mult_vect(&norm_vect, (w-sqrt(k))); refract_dir = add_coord(&norm_ray_dir_vect, &norm_vect); Ray* refractedRay = new Ray(point, &refract_dir); Sphere* pointer_dummy=this; ret_val = refractedRay->raytrace(sphereList, light, &pointer_dummy, ref_cnt-1); delete refractedRay; return ret_val; }
void Camera::makeSnapShot(std::list<Sphere*>* sphereList, Light* light, int ref_max, bool show) { coord_t ray_dir_temp, ray_dir, ray_dir_projection_help, focal_point; focal_point = point_on_straight(&optical_center, &direction, -focal_length); rgb_value_t pixel_temp; Sphere* dummy_pointer = NULL; Ray privateRay(&focal_point, &focal_point); omp_set_num_threads(2); #pragma omp parallel for firstprivate(privateRay, ray_dir_temp, ray_dir, pixel_temp, ray_dir_projection_help) schedule(static,1) for (int i=0; i<sensor_height_px; i++) { for (int j=0; j<sensor_width_px; j++) { //initial Koordinatenursprung ray_dir.y = j*px_width -sensor_width_physical/2; ray_dir.z = i*px_height -sensor_height_physical/2; ray_dir.x = 0.0; //rotation um y achse ray_dir_projection_help = direction; ray_dir_projection_help.y= 0.0; ray_dir_projection_help = normalize_vect(&ray_dir_projection_help); if (ray_dir_projection_help.x < 0.0) ray_dir_projection_help.x=-ray_dir_projection_help.x; ray_dir_temp.x = -ray_dir.z*ray_dir_projection_help.z; ray_dir_temp.y = ray_dir.y; ray_dir_temp.z = ray_dir.z*ray_dir_projection_help.x; //rotation um z achse ray_dir_projection_help = direction; ray_dir_projection_help.z= 0.0; ray_dir_projection_help = normalize_vect(&ray_dir_projection_help); ray_dir.x = ray_dir_temp.x*ray_dir_projection_help.x - ray_dir_temp.y*ray_dir_projection_help.y; ray_dir.y = ray_dir_temp.x*ray_dir_projection_help.y + ray_dir_temp.y*ray_dir_projection_help.x; ray_dir.z = ray_dir_temp.z; //ray_dir = ray_dir_temp; //translation to optical center ray_dir = add_coord(&ray_dir, &optical_center); ray_dir = subtract_coord(&ray_dir, &focal_point); privateRay.setStartPoint(&optical_center); privateRay.setDirection(&ray_dir); pixel_temp = privateRay.raytrace(sphereList, light, &dummy_pointer, ref_max); image_matrix->at<Vec3b>(i,j)[2] = pixel_temp.r; image_matrix->at<Vec3b>(i,j)[1] = pixel_temp.g; image_matrix->at<Vec3b>(i,j)[0] = pixel_temp.b; } } if (show) { namedWindow( "Raytrace", CV_WINDOW_AUTOSIZE ); imshow("Raytrace", *image_matrix); std::cout << "BLA" << std::endl; cvWaitKey(0); } else { //imwrite("raytrace.jpg", image_matrix); } }
/*------------------------------------------------------*/ void LoadFromPc(char *p) { void InProg(void); int ReadPar(char *); char q[LINK_LEN],*r,*s,*ss[16]; int i,j,k; long y,z; lib *l; command *c,**cp; switch(*p) { case 'd': Lr=scanLLA(Lr,++p,null); if(!Lr) { j=0; switch(strscan(p,ss,',',16)) { case 2: j=atoi(ss[1]); case 1: if(l=FindLib(LinkAddrStr(ss[0]))) { copylib(l,Lr=makelib()); if(j) for(Lr->xc=Lr->x; --j && Lr->xc->next;) Lr->xc=Lr->xc->next; else Lr->x=Lr->xc=freecoord(Lr->x); Ungetch(REFRESH,0); } else puts_pc("!NOT_FOUND\r\n"); break; default: puts_pc("!SYNTAX\r\n"); break; } } break; case 'l': if(i=LinkAddrStr(++p)) { freelib(Lc); Lc=makelib(); Lc->ltype=LinkAddrType(i); Lc->n=LinkAddrN(i); } else InsertLib(&Lc); break; case 'M': if(sscanf(++p," %d,%04X,%04X,%s",&k,&i,&j,q)==4) { if(Mscan) /* znak, da je editor odprt ! */ if(Mscan->c->maxopt) { /* vrstica in obseg aktivna ? */ if(k) if(--k <= Mscan->c->maxopt) { Mscan->active = k; Refresh(); } break; } r=strchr(q,','); *r++=0; cp=NULL; if(!strcmp(q,"message")) cp=&CP; if(!strcmp(q,"gun")) cp=&GUN; if(!strcmp(q,"meteo")) cp=&METEO; if(!cp) break; /*......................................................................................*/ if(!*cp) new_command(cp); else{ c=*cp; do if(c->chk == j) *cp=c; else c=c->next; while(c != *cp); if((*cp)->chk != j) new_command(cp); } (*cp)->chk=j; c=*cp; s=(char *)c; i = sizeof(command) - sizeof(command *) - sizeof(int); while(i--) { sscanf(r,"%02X",&j); *s++ = j; ++r;++r; } c->chk *= -1; if(cp == &CP) Ungetch(GXM_MESSAGE_ID,0); if(cp == &GUN) Ungetch(GXM_GUN_ID,0); } break; case 'r': if(crest && (sscanf(++p," %ld %ld",&y,&z) == 2)) { add_coord(crest,0,y,z); crest->xc->refp=null; } else DeleteTask(DMRtimeout,RTC_task); break; case 'c': i=j=0; if(Lc) Lc=scanLLA(Lc,++p,eof); break; case 'g': if(Lc && (sscanf(++p," %s %d %d",q,&j,&k) == 3)) { for(i=0; Guns[i].name; ++i) if(!strcmp(Guns[i].name,q)) { Lc->gun=i; Lc->refd=j; Lc->powder=k; } } break; case 'a': if(Lc && (sscanf(++p,"%s %d",q,&j) == 2)) { for(i=0; Guns[Lc->gun].ammo[i]; ++i) if(!strcmp(Guns[Lc->gun].ammo[i],q)) { Lc->ammpcs[i]=j; r=strchr(p,'+'); s=strrchr(p,'+'); if(r) do Lc->ammpcs[i] += 0x1000; while(r++ != s); r=strchr(p,'-'); s=strrchr(p,'-'); if(r) do Lc->ammpcs[i] -= 0x1000; while(r++ != s); } } break; case 'p': if(sscanf(++p,"%d,%d",&i,&j) == 2) if(i<12 && j<4) { xyLCD(i,j); Ungetch(GXM_CURSOR_POS,0); } break; case 'm': LoadHexRec(p,'m',_MenuCode); break; case 'h': LoadHexRec(p,'h',_MenuHead); break; case 't': if(Lc) { ++p; ++p; Lc->txt=addtxt(Lc,p); } else LoadHexRec(p,'t',_TextCode); break; case 'T': if(sscanf(++p," %x %x",&i,&j)==2) { sprintf(q,"%04X\r\n",readTEMP(i,j)); puts_pc(q); } break; case 'f': if(ReadPar(++p)) break; i=strscan(p,ss,' ',16); if(i>=2) { sscanf(ss[0],"%lx",&eebott); sscanf(ss[1],"%lx",&eetop); if(eebott < (long)FLASHTOP) { puts_pc("!ILL_ADDRESS\r\n"); break; } if(eetop > (long)FLASHTOP+0x80000L) { puts_pc("!ILL_ADDRESS\r\n"); break; } if(i==3) { ss[2][8]=0; sprintf(pass,"%-8s",ss[2]); } if(CheckPass(&syspass)) { puts_pc("!NOT_ALLOWED\r\n"); break; } puts_pc("\7\r\nFLASH programming !!!\r\n"); wait(50); InProg(); puts_pc("Done\r\n"); } else puts_pc("!SYNTAX\r\n"); break; case 'b': k=sscanf(++p," %d %d",&i,&j); if(k) if(Baud(CHPC,i)) { if(k==2) Xonoff(j); break; } puts_pc("!SYNTAX\r\n"); break; case 'z': EnterZone(++p); break; case 'G': DeleteTask(ReadPc,RTC_task); Guns=ReadGunData(0,0,0,0,NULL); SetTask(ReadPc,0,RTC_task); break; default: puts_pc("!SYNTAX\r\n"); break; } }