void dtransmission(SOCKET csock, SOCKET csock2){ int net_taille_chaine, nb_fichiers, net_nb_fichiers, taille_chaine, dossier_fichier, i; char *nom_fichier = NULL, fin; recv(csock, (char *)&net_nb_fichiers, sizeof(int), 0); send(csock2, (char *)&net_nb_fichiers, sizeof(int), 0); nb_fichiers = ntohl(net_nb_fichiers); for (i = 1 ; i < nb_fichiers ; i++){ recv(csock, (char *)&net_taille_chaine, sizeof(int), 0); send(csock2, (char *)&net_taille_chaine, sizeof(int), 0); taille_chaine = ntohl(net_taille_chaine); nom_fichier = malloc(taille_chaine); recv(csock, nom_fichier, taille_chaine, 0); send(csock2, nom_fichier, taille_chaine, 0); recv(csock2, &fin, sizeof(char), 0); send(csock, &fin, sizeof(char), 0); recv(csock, (char *)&dossier_fichier, sizeof(int), 0); send(csock2, (char *)&dossier_fichier, sizeof(int), 0); if (ntohl(dossier_fichier)){ transmission(csock, csock2); } } }
FreeSSM::~FreeSSM() { disconnect( _dump_action, SIGNAL( triggered() ), this, SLOT( dumpCUdata() ) ); disconnect( engine_pushButton, SIGNAL( released() ), this, SLOT( engine() ) ); disconnect( transmission_pushButton, SIGNAL( released() ), this, SLOT( transmission() ) ); disconnect( absvdc_pushButton, SIGNAL( released() ), this, SLOT( abs() ) ); disconnect( cruisecontrol_pushButton, SIGNAL( released() ), this, SLOT( cruisecontrol() ) ); disconnect( aircon_pushButton, SIGNAL( released() ), this, SLOT( aircon() ) ); disconnect( preferences_pushButton, SIGNAL( released() ), this, SLOT( preferences() ) ); disconnect( help_pushButton, SIGNAL( released() ), this, SLOT( help() ) ); disconnect( about_pushButton, SIGNAL( released() ), this, SLOT( about() ) ); disconnect( exit_pushButton, SIGNAL( released() ), this, SLOT( close() ) ); delete _dump_action; #ifndef SMALL_RESOLUTION delete _progtitle_label; #endif if (_translator != NULL) { QApplication::removeTranslator(_translator); delete _translator; } if (_qt_translator != NULL) { QApplication::removeTranslator(_qt_translator); delete _qt_translator; } }
Mat ChromaticPrior::computePrior(Mat image, int patchsize , Vec3f veil) { //[y x ~] = size(I); //J = zeros(y, x); // add some space around the edges int sizeY = image.rows; int sizeX = image.cols; cout << sizeX << endl; cout << sizeY << endl; Mat transmission(sizeY,sizeX,CV_64F); cout << image(Range(sizeY-1,sizeY-1),Range(sizeX-1,sizeX-1)) << endl; for(int i=0; i < sizeY;i++){ for(int j=0;j < sizeX;j++){ //cout << j + patchsize << " " << image.cols << endl; Mat tile = image(Range(i, min(i + patchsize, image.rows)), Range(j, min(j + patchsize, image.cols))).clone(); //Mat tileCopy =transmission(Range(i, min(i + patchsize, transmission.rows)), Range(j, min(j + patchsize, transmission.cols))); //cout << tile.channels() << endl; //cout << i << " " << j << endl; double priorValue = prior(tile,veil); //cout << tile.rows << " " << tile.cols << endl; //cout << i << " " << j << endl; //cout << transmission.rows << " " << transmission.cols << endl; //cout << Rect(i,j, tile.rows ,tile.cols) << endl; // Yes, the rectangle is inverted with matrix when you access // Mat tileCopy = transmission(Rect(j,i, tile.cols ,tile.rows)); transmission.at<double>(i,j) = priorValue; //cout << tileCopy.rows << " " << tileCopy.cols << endl; //tileCopy = Mat( tile.rows,tile.cols, CV_64F, cvScalar(priorValue)); //tileCopy.copyTo(transmission(Rect(j,i, tile.cols ,tile.rows))); //cout << "prior" << endl; //cout << priorValue << endl; //cout << transmission.at<double>(i,j) << endl; //cout << priorValue << " "; //tileCopy = } //cout << i << endl; } return transmission; }
bool LightScheme::GetLightIter(TracingInstance* pLocalData, const KVec2& samplePos, UINT32 lightIdx, const ShadingContext* shadingCtx, const IntersectContext* hit_ctx, LightIterator& out_iter) const { const ILightObject* pLightObj = GetLightPtr(lightIdx); KVec3 lightPos_f; KVec3d lightPos; KColor litClr; if (pLightObj->EvaluateLighting(samplePos, shadingCtx->position, lightPos_f, out_iter)) { lightPos = ToVec3d(lightPos_f); bool isOccluded = false; KColor transmission(out_iter.intensity); { KVec3d adjustedPos = ToVec3d(shadingCtx->position); KVec3d lightDir = lightPos - adjustedPos; float l_n = ToVec3f(lightDir) * shadingCtx->normal; float l_fn = ToVec3f(lightDir) * shadingCtx->face_normal; if (l_n > 0 && l_fn < 0) AdjustHitPos(pLocalData, *hit_ctx, *shadingCtx, adjustedPos); KVec3d temp_light_pos(lightPos); lightDir = adjustedPos - temp_light_pos; KRay ray; lightDir = temp_light_pos - adjustedPos; ray.Init(adjustedPos, lightDir, NULL); ray.mExcludeBBoxNode = hit_ctx->bbox_node_idx; ray.mExcludeTriID = hit_ctx->tri_id; KColor trans_coefficent; pLocalData->ComputeLightTransimission(ray, 1.0f, trans_coefficent); transmission.Modulate(trans_coefficent); } if (transmission.Luminance() > 0) { out_iter.intensity = transmission; return true; } } return false; }
int main(int argc, char **argv) { int gate; int port; char port_number; int readed; printf("Give me the port, where the server is runnig!\n"); scanf("%s", &port_number); port = atoi(&port_number); // Konvert számmá gate = client(port); // Csatlakozás if ((readed = transmission(gate)) < 1) { close(gate); exit(0); } return 0; }
int main(void) { unsigned char dev1_access, dev2_access, dev3_access, dev4_access, dev5_access, dev6_access, dev7_access, dev8_access; // Indique si les informations ont bien été prise du capteur init(); // Initialisations globales dev1_access = initDS7505(ADD1_DS7505); // Initialiser le capteur de T° n°1 dev2_access = initDS7505(ADD2_DS7505); // Initialiser le capteur de T° n°2 dev3_access = initDS7505(ADD3_DS7505); // Initialiser le capteur de T° n°3 dev4_access = initDS7505(ADD4_DS7505); // Initialiser le capteur de T° n°4 dev5_access = initDS7505(ADD5_DS7505); // Initialiser le capteur de T° n°5 dev6_access = initDS7505(ADD6_DS7505); // Initialiser le capteur de T° n°6 dev7_access = initDS7505(ADD7_DS7505); // Initialiser le capteur de T° n°7 dev8_access = initDS7505(ADD8_DS7505); // Initialiser le capteur de T° n°8 /* boucle infinie */ for(;;) { if( data[0] != 0x00 ) // Envoie des informations à la foxboard { switch(data[0]) { case CMD_INCLINAISON : // Envoie les informations d'inclinaisons du sous-marin transmission(CMD_INCLINAISON, ACCL, ACCH); break; case CMD_HYGROMETRE1 : // Envoie les informations d'humidité du premier capteur hygrométrique transmission(CMD_HYGROMETRE1, HUM1L, HUM1H); break; case CMD_HYGROMETRE2 : // Envoie les informations d'humidité du deuxième capteur hygrométrique transmission(CMD_HYGROMETRE2, HUM2L, HUM2H); break; case CMD_BALLAST : // Envoie les informations de la position du ballast transmission(CMD_BALLAST, IMP1L, IMP1H); break; case CMD_SYSTEME_BALLAST : // Envoie les informations de la position du chariot portant le ballast transmission(CMD_SYSTEME_BALLAST, IMP2L, IMP2H); break; case CMD_TEMP1 : // Envoie les informations de température du premier capteur dev1_access = get_DS7505_Devices(ADD1_DS7505, listTemp); // Récupérer T° capteur n°1 convertTemp(listTemp, tempResult); TEMP1H = tempResult[0]; TEMP1L = tempResult[1]; transmission(CMD_TEMP1, TEMP1L, TEMP1H); break; case CMD_TEMP2 : // Envoie les informations de température du deuxième capteur dev2_access = get_DS7505_Devices(ADD3_DS7505, listTemp); // Récupérer T° capteur n°2 convertTemp(listTemp, tempResult); TEMP2H = tempResult[0]; TEMP2L = tempResult[1]; transmission(CMD_TEMP2, TEMP2L, TEMP2H); break; case CMD_TEMP3 : // Envoie les informations de température du troisième capteur dev3_access = get_DS7505_Devices(ADD3_DS7505, listTemp); // Récupérer T° capteur n°3 convertTemp(listTemp, tempResult); TEMP3H = tempResult[0]; TEMP3L = tempResult[1]; transmission(CMD_TEMP3, TEMP3L, TEMP3H); break; case CMD_TEMP4 : // Envoie les informations de température du quatrième capteur dev4_access = get_DS7505_Devices(ADD4_DS7505, listTemp); // Récupérer T° capteur n°3 convertTemp(listTemp, tempResult); TEMP4H = tempResult[0]; TEMP4L = tempResult[1]; transmission(CMD_TEMP4,TEMP4L, TEMP4H); break; case CMD_TEMP5 : // Envoie les informations de température du cinquième capteur dev5_access = get_DS7505_Devices(ADD5_DS7505, listTemp); // Récupérer T° capteur n°3 convertTemp(listTemp, tempResult); TEMP5H = tempResult[0]; TEMP5L = tempResult[1]; transmission(CMD_TEMP5, TEMP5L, TEMP5H); break; case CMD_TEMP6 : // Envoie les informations de température du sixième capteur dev6_access = get_DS7505_Devices(ADD6_DS7505, listTemp); // Récupérer T° capteur n°3 convertTemp(listTemp, tempResult); TEMP6H = tempResult[0]; TEMP6L = tempResult[1]; transmission(CMD_TEMP6, TEMP6L, TEMP6H); break; case CMD_TEMP7 : // Envoie les informations de température du septième capteur dev7_access = get_DS7505_Devices(ADD7_DS7505, listTemp); // Récupérer T° capteur n°3 convertTemp(listTemp, tempResult); TEMP7H = tempResult[0]; TEMP7L = tempResult[1]; transmission(CMD_TEMP7, TEMP7L, TEMP7H); break; case CMD_TEMP8 : // Envoie les informations de température du huitième capteur dev8_access = get_DS7505_Devices(ADD8_DS7505, listTemp); // Récupérer T° capteur n°3 convertTemp(listTemp, tempResult); TEMP8H = tempResult[0]; TEMP8L = tempResult[1]; transmission(CMD_TEMP8, TEMP8L, TEMP8H); break; case CMD_PROFONDEUR : // Envoie les informations de pression reçue par le capteur de pression comme indicatif de la profondeur StartADC(0); ReadADC(listTemp); ADC1L = listTemp[0]; ADC1H = listTemp[1]; transmission(CMD_PROFONDEUR, ADC1L, ADC1H); cbiBF(PORTD,2); cbiBF(PORTD,3); sbiBF(PORTD,4); break; case CMD_ADC2 : // Envoie les informations du deuxième convertisseur ADC StartADC(1); ReadADC(listTemp); ADC2L = listTemp[0]; ADC2H = listTemp[1]; transmission(CMD_ADC2, ADC2L, ADC2H); sbiBF(PORTD,2); cbiBF(PORTD,3); sbiBF(PORTD,4); break; case CMD_ADC3 : // Envoie les informations du troisième convertisseur ADC StartADC(2); ReadADC(listTemp); ADC3L = listTemp[0]; ADC3H = listTemp[1]; transmission(CMD_ADC3, ADC3L, ADC3H); cbiBF(PORTD,2); sbiBF(PORTD,3); sbiBF(PORTD,4); break; case CMD_ADC4 : // Envoie les informations du quatrième convertisseur ADC StartADC(3); ReadADC(listTemp); ADC4L = listTemp[0]; ADC4H = listTemp[1]; transmission(CMD_ADC4, ADC4L, ADC4H); sbiBF(PORTD,2); sbiBF(PORTD,3); sbiBF(PORTD,4); break; case CMD_SENS_0_POSITIF : Sens_0 = 1 ; transmission(CMD_SENS_0_POSITIF,Conf_sens0p, 0x00 ); break; case CMD_SENS_0_NEGATIF : Sens_0 = 0 ; transmission(CMD_SENS_0_NEGATIF,Conf_sens0n, 0x00 ); break; case CMD_SENS_1_POSITIF : Sens_1 = 1 ; transmission(CMD_SENS_1_POSITIF,Conf_sens1p, 0x00 ); break; case CMD_SENS_1_NEGATIF : Sens_1 = 0 ; transmission(CMD_SENS_1_NEGATIF, Conf_sens1n, 0x00 ); break; default : asm("nop"); } for(decalage=0;decalage<=4;decalage++) // Décale les demandes pour supprimer la première et passer au traitement de la demande suivante { data[decalage]=data[decalage+1]; } data[4] = 0x00 ; } else { asm("nop"); } } return 0; }
int transmission (int gate) { char buffer[BUFFER_SIZE]; // Szerver üznete int reader; // Hiba kód kezelő char answer[BUFFER_SIZE]; // Kliens üzenete memset(buffer, 0, BUFFER_SIZE); // Buffer kinullázása if ((reader = read(gate, buffer, BUFFER_SIZE)) > 0) { // Ha sikeres az olvasás, akkor : if (strncmp(buffer, "welcome", 7) == 0) { printf("Welcome\n"); printf("Valid step format is : x,y\n"); printf("If you can't step : 'pass' \n"); printf("If you want to give up : 'give_up'\n"); printf("START\n"); printf("Waiting...\n"); transmission (gate); } else if (strncmp(buffer, "loose", 5) == 0) { printf("You loose!\n"); write(gate, answer, BUFFER_SIZE); transmission(gate); } else if(strncmp(buffer, "winner", 6) == 0) { printf("You won!\n"); write(gate, answer, BUFFER_SIZE); transmission(gate); } else if(strncmp(buffer, "draw", 4) == 0) { printf("Draw!\n"); write(gate, answer, BUFFER_SIZE); transmission(gate); } else if(buffer[63] != '\0' && buffer[64] == '\0') { // pálya print_board(buffer); write(gate, answer, BUFFER_SIZE); transmission(gate); } else if(buffer[4] != '\0' && buffer[5] == '\0') { // eredmény print_result(buffer); write(gate, answer, BUFFER_SIZE); transmission(gate); } else if(strncmp(buffer, "active", 6) == 0) { printf("You turn:"); scanf("%s", answer); write(gate, answer , BUFFER_SIZE); transmission(gate); } else if(strncmp(buffer, "passive", 7) == 0) { printf ("Waiting...\n"); transmission (gate); } else if(strncmp(buffer, "invalid_step", 12) == 0) { printf("Invalid step!\n"); printf("Try again: "); scanf("%s", answer); write(gate, answer, BUFFER_SIZE); transmission(gate); } else if(strncmp(buffer, "wrong_answer", 12) == 0) { printf("Wrong answer!\n"); printf("Try again: "); scanf("%s", answer); write(gate, answer, BUFFER_SIZE); transmission (gate); } else { printf("%s\n", buffer); transmission(gate); } return 0; } return reader; }
FreeSSM::FreeSSM(QApplication *app) { _qt_translator = NULL; _translator = NULL; _iface_type = AbstractDiagInterface::interface_serialPassThrough; _iface_filename = ""; _language = "en"; // default language _dumping = false; QString appsPath( QCoreApplication::applicationDirPath() ); // SETUP GUI: setupUi(this); setWindowFlags( windowFlags() & ~Qt::WindowMaximizeButtonHint ); // only necessary for MS Windows #ifndef SMALL_RESOLUTION // LOAD BACKGROUND PICTURE: background_label->setPixmap(appsPath + "/background.png"); // SHOW PROGRAM TITEL + VERSION: QFont titlefont = this->font(); titlefont.setPointSize(20); titlefont.setBold(true); _progtitle_label = new QLabel(this); _progtitle_label->setGeometry(20, 17, 315, 34); _progtitle_label->setFont( titlefont ); _progtitle_label->setText("FreeSSM " + QApplication::applicationVersion()); this->setWindowTitle("FreeSSM " + QApplication::applicationVersion()); // PLACE WINDOW IN THE CENTER OF THE SCREEN: QDesktopWidget desktop; int x = (desktop.width() - size().width()) / 2; int y = (desktop.height() - size().height()) / 2 - 50; this->move ( x, y ); #endif // LOAD PREFERENCES FROM FILE: QString savedinterfacefilename = ""; QString savedlanguage = ""; QString savedGUIstyle = ""; QString savedinterfacetype = ""; QFile prefsfile(QDir::homePath() + "/FreeSSM.prefs"); if (prefsfile.open(QIODevice::ReadOnly | QIODevice::Text)) { QByteArray line; if (!prefsfile.atEnd()) { // Load interface type settings: line = prefsfile.readLine(); line.truncate(line.length()-1); // truncate newline-character savedinterfacefilename = static_cast<QString>(line); } if (!prefsfile.atEnd()) { // Load language settings: line = prefsfile.readLine(); line.truncate(line.length()-1); savedlanguage = static_cast<QString>(line); } if (!prefsfile.atEnd()) { // Load GUI-style settings: line = prefsfile.readLine(); line.truncate(line.length()-1); savedGUIstyle = static_cast<QString>(line); } if (!prefsfile.atEnd()) { // Load interface file name settings: line = prefsfile.readLine(); line.truncate(line.length()-1); savedinterfacetype = static_cast<QString>(line); } prefsfile.close(); } // SET PREFERRED GUI-Style: if (savedGUIstyle.size()) { QStyle *qstyle = QStyleFactory::create( savedGUIstyle ); if (qstyle) QApplication::setStyle( qstyle ); } // CHECK SAVED LANGUAGE: bool sl_valid = false; QLocale loc = QLocale(savedlanguage); if ((loc != QLocale::C) && (__supportedLocales.indexOf( loc ) > -1)) { _language = savedlanguage; sl_valid = true; } // TRY TO SELECT SYSTEM LANGUAGE, IF SAVED LANGUAGE IS INVALID: if (!sl_valid) { if (__supportedLocales.indexOf( QLocale::system() ) > -1) _language = QLocale::system().name().section('_', 0, 0); } // SET TRANSLATOR AND RETRANSLATE: _translator = new QTranslator; bool langfileerror = false; langfileerror = !_translator->load("FreeSSM_" + _language + ".qm", appsPath); if (langfileerror && (_language != "en")) { // Fallback to English _language = "en"; langfileerror = !_translator->load("FreeSSM_en.qm", appsPath); // Display error message about missing language file: QMessageBox msg( QMessageBox::Critical, tr("Error"), tr("Error:\n- Language file missing or damaged -"), QMessageBox::Ok, this); QFont msgfont = msg.font(); msgfont.setPointSize(9); msg.setFont( msgfont ); msg.show(); msg.exec(); msg.close(); } if (!langfileerror) { app->installTranslator(_translator); retranslateUi(this); } else { delete _translator; _translator = NULL; } // SET Qt-TRANSLATOR (if necessary and available): if (_language != "en") { QString qt_ts_path = QLibraryInfo::location(QLibraryInfo::TranslationsPath); if (qt_ts_path.isEmpty()) qt_ts_path = QCoreApplication::applicationDirPath(); _qt_translator = new QTranslator; if (_qt_translator->load("qt_" + _language, qt_ts_path)) app->installTranslator(_qt_translator); else { delete _qt_translator; _qt_translator = NULL; } } // CHECK THE SAVED INTERFACE SETTINGS AND CORRECT IF NECESSARY: if (savedinterfacetype == QString::number(AbstractDiagInterface::interface_J2534)) // J2534-Pass-Through { _iface_type = AbstractDiagInterface::interface_J2534; const std::vector<J2534Library> J2534libs = J2534_API::getAvailableJ2534Libs(); if (J2534libs.size()) { if (!savedinterfacefilename.isEmpty()) { for (const J2534Library& lib : J2534libs) { if (savedinterfacefilename == QString::fromStdString(lib.path)) { _iface_filename = savedinterfacefilename; break; } } } if (_iface_filename.isEmpty()) _iface_filename = QString::fromStdString(J2534libs.at(0).path); } // NOTE: otherwise _iface_filename remains empty } else // Serial Pass-Through, AT-comand controlled (e.g. ELM, AGV, Diamex) or invalid { if (savedinterfacetype == QString::number(AbstractDiagInterface::interface_ATcommandControlled)) _iface_type = AbstractDiagInterface::interface_ATcommandControlled; else _iface_type = AbstractDiagInterface::interface_serialPassThrough; std::vector<std::string> portlist; portlist = serialCOM::GetAvailablePorts(); if (portlist.size()) { if (!savedinterfacetype.isEmpty() && !savedinterfacefilename.isEmpty()) { for (unsigned int k=0; k<portlist.size(); k++) { if (savedinterfacefilename == QString::fromStdString(portlist.at(k))) { _iface_filename = savedinterfacefilename; break; } } } if (_iface_filename.isEmpty()) _iface_filename = QString::fromStdString(portlist.at(0)); } // NOTE: otherwise _iface_filename remains empty } // CREATE ACTION FOR DUMPING CONTROL UNIT ID-DATA TO FILE: _dump_action = new QAction(this); _dump_action->setShortcut( QKeySequence("Ctrl+Alt+Return") ); this->addAction(_dump_action); // CONNECT SIGNALS/SLOTS: connect( engine_pushButton, SIGNAL( released() ), this, SLOT( engine() ) ); connect( transmission_pushButton, SIGNAL( released() ), this, SLOT( transmission() ) ); connect( absvdc_pushButton, SIGNAL( released() ), this, SLOT( abs() ) ); connect( cruisecontrol_pushButton, SIGNAL( released() ), this, SLOT( cruisecontrol() ) ); connect( aircon_pushButton, SIGNAL( released() ), this, SLOT( aircon() ) ); connect( preferences_pushButton, SIGNAL( released() ), this, SLOT( preferences() ) ); connect( help_pushButton, SIGNAL( released() ), this, SLOT( help() ) ); connect( about_pushButton, SIGNAL( released() ), this, SLOT( about() ) ); connect( exit_pushButton, SIGNAL( released() ), this, SLOT( close() ) ); // NOTE: using released() instead of pressed() as workaround for a Qt-Bug occuring under MS Windows connect( _dump_action, SIGNAL(triggered()), this, SLOT(dumpCUdata()) ); }
bool LightScheme::GetLightIter(TracingInstance* pLocalData, const KVec2& samplePos, UINT32 lightIdx, const ShadingContext* shadingCtx, const IntersectContext* hit_ctx, LightIterator& out_iter) const { const ILightObject* pLightObj = GetLightPtr(lightIdx); KVec3 lightPos_f; KVec3d lightPos; KColor litClr; if (pLightObj->EvaluateLighting(samplePos, shadingCtx->position, lightPos_f, out_iter)) { lightPos = ToVec3d(lightPos_f); bool isOccluded = false; KColor transmission(out_iter.intensity); { KVec3d adjustedPos = ToVec3d(shadingCtx->position); KVec3d lightDir = lightPos - adjustedPos; float l_n = ToVec3f(lightDir) * shadingCtx->normal; float l_fn = ToVec3f(lightDir) * shadingCtx->face_normal; if (l_n > 0) { if (l_fn < 0) AdjustHitPos(pLocalData, *hit_ctx, *shadingCtx, adjustedPos); KVec3d temp_light_pos(lightPos); lightDir = adjustedPos - temp_light_pos; // Clamp the shadow ray if the light source is out of the scene's bounding box. // Doing so can improve the floating point precision. const KBBox& sceneBBox = pLocalData->GetScenePtr()->GetSceneBBox(); bool needClampRay = !sceneBBox.IsInside(ToVec3f(temp_light_pos)); if (needClampRay) { KRay ray; ray.Init(temp_light_pos, lightDir, NULL); double t0, t1; if (IntersectBBox(ray, sceneBBox, t0, t1)) { temp_light_pos = ray.GetOrg() + ray.GetDir() * t0; } } KRay ray; lightDir = adjustedPos - temp_light_pos; ray.Init(temp_light_pos, lightDir, NULL); ray.mExcludeBBoxNode = INVALID_INDEX; ray.mExcludeTriID = INVALID_INDEX; float lum = 1.0f; while (lum > 0) { IntersectContext test_ctx; test_ctx.ray_t = 1.0; isOccluded = pLocalData->CastRay(ray, test_ctx); if (isOccluded) { if (test_ctx.bbox_node_idx == hit_ctx->bbox_node_idx && test_ctx.tri_id == hit_ctx->tri_id) break; // Calculate how much light can pass through the hit surface KColor temp_trans; ShadingContext shading_context; pLocalData->CalcuShadingContext(ray, test_ctx, shading_context); TransContext& transCtx = pLocalData->GetCurrentTransCtxStorage(); pLocalData->ConvertToTransContext(test_ctx, shading_context, transCtx); shading_context.surface_shader->ShaderTransmission(transCtx, temp_trans); transmission.Modulate(temp_trans); lum = transmission.Luminance(); if (lum > 0.001f) { KVec3d go_dis = lightDir*test_ctx.ray_t; temp_light_pos += (go_dis * 1.00001); lightDir -= (go_dis * 0.9999); ray.Init(temp_light_pos, lightDir, NULL); ray.mExcludeBBoxNode = test_ctx.bbox_node_idx; ray.mExcludeTriID = test_ctx.tri_id; } else { transmission.Clear(); break; } } else break; } } else transmission.Clear(); } if (transmission.Luminance() > 0) { out_iter.intensity = transmission; return true; } } return false; }
Color Raytracer::trace(Scene *scene, Ray ray, int depth) { if (depth >= m_max_depth) { return scene->background(); } Intersection *intersection = get_closest_intersection(scene, ray); // If this ray hits nothing, return the background color if (intersection == nullptr) { return scene->background(); } // local illumination Color rv = m_phong_shader.shade(scene, intersection); float kr = intersection->intersected_shape()->reflective_constant(); float kt = intersection->intersected_shape()->transmissive_constant(); // spawn reflection ray if (kr > 0) { Ray reflection = make_reflection_ray(intersection->normal(), ray, intersection->intersection_point()); rv += trace(scene, reflection, depth + 1) * kr; } // spawn transmission ray if (kt > 0) { float alpha; bool insideShape = (dot_product(negate_vector(ray.direction()), intersection->normal()) < 0); if (insideShape) { intersection->set_normal(negate_vector(intersection->normal())); alpha = intersection->intersected_shape()->refraction_index(); } else { alpha = 1.0 / intersection->intersected_shape()->refraction_index(); } float cosine = dot_product(negate_vector(ray.direction()), intersection->normal()); float discriminant = 1.0 + ( (alpha * alpha) * ((cosine * cosine) - 1.0) ); bool total_internal_reflection = (discriminant < 0); if (total_internal_reflection) { // use the reflection ray with the kt value Ray reflection = make_reflection_ray(intersection->normal(), ray, intersection->intersection_point()); rv += trace(scene, reflection, depth + 1) * kt; } else { // spawn a transmission ray Ray transmission(intersection->intersection_point(), normalize( vector_add(scalar_multiply(ray.direction(), alpha), scalar_multiply(intersection->normal(), (alpha * cosine) - sqrt(discriminant))))); rv += trace(scene, transmission, depth + 1) * kt; } } delete intersection; return rv; }
//================================================================================================= int main(int argc, char *argv[]) { std::string binary_name(argv[0]); Options options(binary_name); srand(WsgcUtils::timenow_usec_hour()); if (options.get_options(argc,argv)) { std::ostringstream os; options.print_options(os); std::cout << os.str() << std::endl; unsigned int nb_message_symbols; #ifdef _CCSOFT if (options.fec_scheme == Options::OptionFEC_CCSoft) { unsigned int tmp_n, tmp_k, tmp_m; ccsoft::get_cc_parameters<unsigned int>(options.cc_k_constraints, options.cc_generator_polys, tmp_n, tmp_k, tmp_m); nb_message_symbols = 1<<tmp_n; } else { nb_message_symbols = options.nb_message_symbols; } #else nb_message_symbols = options.nb_message_symbols; #endif GoldCodeGenerator gc_generator(options.gc_nb_stages, nb_message_symbols, options.nb_service_symbols, options.nb_training_symbols, options.g1_poly_powers, options.g2_poly_powers); Transmission transmission(options, gc_generator); transmission.generate_samples(options.prns); wsgc_complex *faded_source_samples = transmission.get_samples(); unsigned int nb_faded_source_samples = transmission.get_nb_samples(); if (faded_source_samples) { if (options.transmission_scheme == Options::OptionTrans_MFSK) { Reception_MFSK reception_MFSK(options, gc_generator); reception_MFSK.message_processing(faded_source_samples, nb_faded_source_samples); } else if (options.transmission_scheme == Options::OptionTrans_WSGC) { Reception_WSGC reception_WSGC(options, gc_generator); if (options.simulate_training) { reception_WSGC.training_processing(faded_source_samples, nb_faded_source_samples); } else { reception_WSGC.message_processing(faded_source_samples, nb_faded_source_samples); } } else if (options.transmission_scheme == Options::OptionTrans_WSGCE) { Reception_WSGCE reception_WSGCE(options, gc_generator); if (options.simulate_training) { std::cerr << "Simulating training sequence is not implemented" << std::endl; } else { reception_WSGCE.message_processing(faded_source_samples, nb_faded_source_samples); } } else if (options.transmission_scheme == Options::OptionTrans_WSGCO) { Reception_WSGCO reception_WSGCO(options, gc_generator); if (options.simulate_training) { reception_WSGCO.training_processing(faded_source_samples, nb_faded_source_samples); } else { reception_WSGCO.message_processing(faded_source_samples, nb_faded_source_samples); } } else if (options.transmission_scheme == Options::OptionTrans_WSGCD) { Reception_WSGCD reception_WSGCD(options, gc_generator); if (options.simulate_training) { reception_WSGCD.training_processing(faded_source_samples, nb_faded_source_samples); } else { reception_WSGCD.message_processing(faded_source_samples, nb_faded_source_samples); } } else { std::cout << "Unknown or undefined transmission scheme" << std::endl; } } else { std::cout << "No samples" << std::endl; } return 0; } else { std::cout << "Incorrect options. Please correct and re-submit" << std::endl; return -1; } }