void Scene::CreateTestScene() { Material* lambert1 = new LambertMaterial(glm::vec3(1, 0, 0)); Material* lambert2 = new LambertMaterial(glm::vec3(0, 1, 0)); Cube* c = new Cube(); c->material = lambert1; c->transform = Transform(glm::vec3(1,0,0), glm::vec3(40,20,45), glm::vec3(1,1,1)); c->create(); c->setBBox(); this->objects.append(c); Sphere* s = new Sphere(); s->material = lambert2; s->transform = Transform(glm::vec3(-1,0,0), glm::vec3(30,50,30), glm::vec3(1,2,1)); s->create(); s->setBBox(); this->objects.append(s); unsigned int w = 400, h = 400; camera = Camera(w, h); camera.near_clip = 0.1f; camera.far_clip = 100.0f; camera.create(); film = Film(w, h); }
/** * We created a method to manually skip the suffix and corner * data for this image to avoid implementing it in * ProcessImport and ProcessImportPds. To fully support this * file format, we would have to re-implement the ISIS2 Cube * IO plus add prefix data features to it. This is a shortcut; * because we know these files have one sideplane and four * backplanes, we know how much data to skip when. This should * be fixed if we ever decide to fully support suffix and * corner data, which would require extensive changes to * ProcessImport/ProcessImportPds. Method written by Steven * Lambright. * * @param inFileName FileName of the input file * @param outFile FileName of the output file */ void ReadVimsBIL(QString inFileName, const PvlKeyword &suffixItems, QString outFile) { Isis::PvlGroup &dataDir = Isis::Preference::Preferences().findGroup("DataDirectory"); QString transDir = (QString) dataDir["Base"]; Pvl pdsLabel(inFileName); Isis::FileName transFile(transDir + "/" + "translations/pdsQube.trn"); Isis::PvlTranslationManager pdsXlater(pdsLabel, transFile.expanded()); TableField sideplaneLine("Line", Isis::TableField::Integer); TableField sideplaneBand("Band", Isis::TableField::Integer); TableField sideplaneValue("Value", Isis::TableField::Integer); TableRecord record; record += sideplaneLine; record += sideplaneBand; record += sideplaneValue; Table sideplaneVisTable("SideplaneVis", record); Table sideplaneIrTable("SideplaneIr", record); sideplaneVisTable.SetAssociation(Table::Lines); sideplaneIrTable.SetAssociation(Table::Lines); QString str; str = pdsXlater.Translate("CoreBitsPerPixel"); int bitsPerPixel = toInt(str); str = pdsXlater.Translate("CorePixelType"); PixelType pixelType = Isis::Real; if((str == "Real") && (bitsPerPixel == 32)) { pixelType = Isis::Real; } else if((str == "Integer") && (bitsPerPixel == 8)) { pixelType = Isis::UnsignedByte; } else if((str == "Integer") && (bitsPerPixel == 16)) { pixelType = Isis::SignedWord; } else if((str == "Integer") && (bitsPerPixel == 32)) { pixelType = Isis::SignedInteger; } else if((str == "Natural") && (bitsPerPixel == 8)) { pixelType = Isis::UnsignedByte; } else if((str == "Natural") && (bitsPerPixel == 16)) { pixelType = Isis::UnsignedWord; } else if((str == "Natural") && (bitsPerPixel == 16)) { pixelType = Isis::SignedWord; } else if((str == "Natural") && (bitsPerPixel == 32)) { pixelType = Isis::UnsignedInteger; } else { QString msg = "Invalid PixelType and BitsPerPixel combination [" + str + ", " + toString(bitsPerPixel) + "]"; throw IException(IException::Io, msg, _FILEINFO_); } str = pdsXlater.Translate("CoreByteOrder"); Isis::ByteOrder byteOrder = Isis::ByteOrderEnumeration(str); str = pdsXlater.Translate("CoreSamples", 0); int ns = toInt(str); str = pdsXlater.Translate("CoreLines", 2); int nl = toInt(str); str = pdsXlater.Translate("CoreBands", 1); int nb = toInt(str); std::vector<double> baseList; std::vector<double> multList; str = pdsXlater.Translate("CoreBase"); baseList.clear(); baseList.push_back(toDouble(str)); str = pdsXlater.Translate("CoreMultiplier"); multList.clear(); multList.push_back(toDouble(str)); Cube outCube; outCube.setPixelType(Isis::Real); outCube.setDimensions(ns, nl, nb); outCube.create(outFile); // Figure out the number of bytes to read for a single line int readBytes = Isis::SizeOf(pixelType); readBytes = readBytes * ns; char *in = new char [readBytes]; // Set up an Isis::EndianSwapper object QString tok(Isis::ByteOrderName(byteOrder)); tok = tok.toUpper(); Isis::EndianSwapper swapper(tok); ifstream fin; // Open input file Isis::FileName inFile(inFileName); fin.open(inFileName.toAscii().data(), ios::in | ios::binary); if(!fin.is_open()) { QString msg = "Cannot open input file [" + inFileName + "]"; throw IException(IException::Io, msg, _FILEINFO_); } // Handle the file header streampos pos = fin.tellg(); int fileHeaderBytes = (int)(IString)pdsXlater.Translate("DataFileRecordBytes") * ((int)(IString)pdsXlater.Translate("DataStart", 0) - 1); fin.seekg(fileHeaderBytes, ios_base::beg); // Check the last io if(!fin.good()) { QString msg = "Cannot read file [" + inFileName + "]. Position [" + toString((int)pos) + "]. Byte count [" + toString(fileHeaderBytes) + "]" ; throw IException(IException::Io, msg, _FILEINFO_); } // Construct a line buffer manager Isis::Brick out(ns, 1, 1, Isis::Real); // Loop for each line for(int line = 0; line < nl; line++) { // Loop for each band for(int band = 0; band < nb; band++) { // Set the base multiplier double base, mult; if(baseList.size() > 1) { base = baseList[band]; mult = multList[band]; } else { base = baseList[0]; mult = multList[0]; } // Get a line of data from the input file pos = fin.tellg(); fin.read(in, readBytes); if(!fin.good()) { QString msg = "Cannot read file [" + inFileName + "]. Position [" + toString((int)pos) + "]. Byte count [" + toString(readBytes) + "]" ; throw IException(IException::Io, msg, _FILEINFO_); } // Swap the bytes if necessary and convert any out of bounds pixels // to special pixels for(int samp = 0; samp < ns; samp++) { switch(pixelType) { case Isis::UnsignedByte: out[samp] = (double)((unsigned char *)in)[samp]; break; case Isis::UnsignedWord: out[samp] = (double)swapper.UnsignedShortInt((unsigned short int *)in + samp); break; case Isis::SignedWord: out[samp] = (double)swapper.ShortInt((short int *)in + samp); break; case Isis::Real: out[samp] = (double)swapper.Float((float *)in + samp); break; default: break; } // Sets out to isis special pixel or leaves it if valid out[samp] = TestPixel(out[samp]); if(Isis::IsValidPixel(out[samp])) { out[samp] = mult * out[samp] + base; } } // End sample loop //Set the buffer position and write the line to the output file out.SetBasePosition(1, line + 1, band + 1); outCube.write(out); if(toInt(suffixItems[0]) != 0) { pos = fin.tellg(); char *sideplaneData = new char[4*toInt(suffixItems[0])]; fin.read(sideplaneData, 4 * toInt(suffixItems[0])); int suffixData = (int)swapper.Int((int *)sideplaneData); record[0] = line + 1; record[1] = band + 1; record[2] = suffixData; if(band < 96) { sideplaneVisTable += record; // set HIS pixels appropriately for(int samp = 0; samp < ns; samp++) { if(out[samp] >= 4095) { out[samp] = Isis::His; } } } else { record[1] = (band + 1) - 96; sideplaneIrTable += record; // set HIS pixels appropriately for(int samp = 0; samp < ns; samp++) { if(out[samp] + suffixData >= 4095) { out[samp] = Isis::His; } } } delete [] sideplaneData; // Check the last io if(!fin.good()) { QString msg = "Cannot read file [" + inFileName + "]. Position [" + toString((int)pos) + "]. Byte count [" + toString(4) + "]" ; throw IException(IException::Io, msg, _FILEINFO_); } } } // End band loop int backplaneSize = toInt(suffixItems[1]) * (4 * (ns + toInt(suffixItems[0]))); fin.seekg(backplaneSize, ios_base::cur); // Check the last io if(!fin.good()) { QString msg = "Cannot read file [" + inFileName + "]. Position [" + toString((int)pos) + "]. Byte count [" + toString(4 * (4 * ns + 4)) + "]" ; throw IException(IException::Io, msg, _FILEINFO_); } } // End line loop outCube.write(sideplaneVisTable); outCube.write(sideplaneIrTable); // Close the file and clean up fin.close(); outCube.close(); delete [] in; }