Vector* Transformation::vectorToWorld(Vector* vec) { Eigen::Vector4f returnDir(vec->getX(), vec->getY(), vec->getZ(), 0.0f); Eigen::Matrix<float,4,4> invMatrix = mat->getMatrix(); returnDir = invMatrix * returnDir; Vector* result = new Vector(returnDir(0), returnDir(1), returnDir(2)); return result; }
// For Ray's and Vectors, 4th Position = 0, no translation Ray* Transformation::rayToObject(Ray* ray) { Coordinate* rayPt = ray->getPosition(); Vector* rayDir = ray->getDirection(); Eigen::Vector4f returnPt(rayPt->getX(), rayPt->getY(), rayPt->getZ(), 1.0f); Eigen::Vector4f returnDir(rayDir->getX(), rayDir->getY(), rayDir->getZ(), 0.0f); Eigen::Matrix4f matrix = inverseMatrix->getMatrix(); returnPt = matrix * returnPt; returnDir = matrix * returnDir; Coordinate* newPt = new Coordinate(returnPt(0), returnPt(1), returnPt(2)); Vector* newDir = new Vector(returnDir(0), returnDir(1), returnDir(2)); newDir->normalize(); return new Ray(newPt, newDir); }
char DirectoryManager::isFile(char* filename, Directory currentDir) { if (strcmp(filename, "/") == 0) { return 'd'; } Entry* fileEntry = currentDir.findName(filename); if (fileEntry == NULL) { throw "파일이 존재하지 않습니다."; } Directory* dir = returnDir(fileEntry->inodeNum); if (dir == NULL) return 'f'; return 'd'; }
void DirectoryManager::Dir_Unlink(char* direc) { /* direc이 나타내는 디렉토리를 삭제. 해당 디렉토리를 포함하는 상위 디렉토리에서도 관련 내용 삭제 data block, inode도 삭제, 관련 bitmap도 0으로 설정 디렉토리에 파일이 존재하면 에러 메시지 출력 루트 디렉토리는 삭제 불가 */ Directory dr = Dir_Read(direc); if (dr.entryCnt == 2) { int topInodeNum = dr.findName("..")->inodeNum; int currInodeNum = dr.findName(".")->inodeNum; // 아이노드 번호가 시스템파일 테이블에 없으면 파일 Unlink과정을 한다 // 속하는 상위 디렉토리의 엔트리에 해당 파일과 아이노드번호 삭제 Directory d = *returnDir(topInodeNum); d.rmDirectory(currInodeNum, topInodeNum); FileSystem& fs = *FileSystem::getInstance(); // InodeBitmap의 해당 비트 0으로 set // BlockBitmap의 dataIdx 에 해당하는 비트 0으로 set // InodeBlock에서 아이노드 번호에 해당하는 아이노드 삭제 Inode inodeData = fs.inodeBlock->getInodeData(currInodeNum); int blocks = atoi(inodeData.blocks); int* dataIdx = new int[blocks]; translateCharArrToIntArr(inodeData.dataBlockList, dataIdx, blocks); fs.resetDataBlock(dataIdx, blocks); fs.writeFS(currInodeNum); } else throw "디렉토리가 비어있지 않습니다."; }
Directory DirectoryManager::Dir_Read(char* direc) { try { FileSystem& fs = *FileSystem::getInstance(); int accessNum = returnInodeNum(direc); InodeBlock inode = ((accessNum > 31) ? fs.inodeBlock[1] : fs.inodeBlock[0]); char* mode = inode.getMode(accessNum); if (strchr(mode, 'f')) throw "파일을 입력했습니다."; else { Directory dir = *returnDir(accessNum); //openedDirList.push_back(dir); //openedDirList.erase(openedDirList.begin+5); return dir; } } catch (char* msg) { if (strcmp(direc, "파일을 입력했습니다.") == 0) throw msg; cerr << "error : " << msg << endl; } }
void DirectoryManager::openAllDir(char * path) { FileSystem& fs = *FileSystem::getInstance(); TableManager& tm = *TableManager::getInstance(); PathManager& pm = *PathManager::getInstance(); vector<string> vStr = *pm.getAllAbsPath(path); vector<string> vAllDirec = pm.doAnalyzeFolder(path); Directory dir = *returnDir(0); // root의 dir 객체 가져오기 int fd = tm.fileOpenEvent(0, fs.inodeBlock->getInodeData(0)); openedDir_FDList.push_back(fd); for (int i = 1; i < vStr.size(); i++) { // 상위 디렉토리를 통해 먼저 inodeNum과 Block을 얻는다. Entry* en = dir.findName(stringToCharArr(vAllDirec[i])); if (!en) { cout << "Name : " << vAllDirec[i] << endl; throw "dir의 엔트리에서 name을 찾지 못함."; } int inodeNum = en->inodeNum; Inode inodeBl = fs.inodeBlock->getInodeData(inodeNum); dir = Dir_Read(stringToCharArr(vStr[i])); if (tm.isExistInInodeTable(inodeNum)) { cout << endl << "open되어있는 디렉토리임" << endl; throw "error in DirectoryManager.cpp in allOpen Func";// fd = 0 -> 이미 오픈되어있는 경우 } fd = tm.fileOpenEvent(inodeNum, inodeBl); openedDir_FDList.push_back(fd); openedDirList.push_back(dir); } }
void DirectoryManager::Dir_Create(char* direc) { try { //Bitmap 갱신 함수를 통해 비트맵 갱신 string path = direc; Inode inode; // inode 설정 //비트맵들 1로 설정 .. inode.mode = "d777"; // int EmptyDataNum = dBlockBitmap.getEmpty(); // int EmptyInodeNum = inodeBitmap.getEmpty(); ppp.push("DC"); // 절대 경로 분석 PathManager& pm = *PathManager::getInstance(); vector<string> arr; pm.doAnalyzeFolder(direc, arr); int n = arr.size(); // n: 경로상의 폴더 개수? string currDir = arr[n - 1]; // 현재디렉토리 이름(내가 만들 디렉토리) string topDir = ""; // 상위디렉토리 이름 if (strcmp(direc, "/") == 0) topDir = arr[n - 1]; // 현재디렉토리 이름(내가 만들 디렉토리) else topDir = arr[n - 2]; //addDirectory int currDirInode = -1; int topDirInode = -1; if(path == "/") topDirInode = returnInodeNum((char*)topDir.c_str()); else topDirInode = returnInodeNum(stringToCharArr((*pm.getAllAbsPath(direc))[n - 2])); FileSystem& fs = *FileSystem::getInstance(); //memcpy(dB.data, (void *)content.c_str, sizeof(content)); Directory curDr; Directory topDr; char time[13]; getCurrentTime(time); char linkCount[2] = "0"; //Inode 정보 설정 inode.blocks = "1"; inode.linksCount = linkCount; inode.mtime = time; inode.size = "0"; inode.time = time; inode.ctime = time; if (strcmp(direc, "/") != 0 && topDr.isExist((char*)currDir.c_str()) == true) { cout << "dir exist" << endl; return; }//디렉토리 중복 검사 ppp.push("2"); currDirInode = fs.writeFS_Dir(inode); ppp.push("3"); if (strcmp(direc, "/") != 0) { topDr = *returnDir(topDirInode); Entry e; ppp.push("4"); e.inodeNum = currDirInode; strcpy(e.name, currDir.c_str()); topDr.addDirectory(e, topDirInode); ppp.push("5"); } curDr.setInodeNum(currDirInode, topDirInode); Entry *enList = curDr.entryList; string content = ".,"; //cout << enList[0].inodeNum << endl; content.append(to_string(enList[0].inodeNum)); content.append(";..," + to_string(enList[1].inodeNum)); content.append(";"); //데이터블록에 데이터 추가(idx는 datablock Index) //할당받은 블록 받아오기 char* tmpBlockList = fs.inodeBlock->getDataBlockList(currDirInode); int idx = atoi(tmpBlockList); //할당받은 블록 리셋 fs.resetDataBlock(&idx, 1); //다시 쓴다 int assignedIdx = fs.writeFS((char*)content.c_str()); char dataBlockList[] = " \0"; itoa(assignedIdx, dataBlockList); char size[4]; memcpy(size, stringToCharArr(to_string(content.length())), strlen(stringToCharArr(to_string(content.length())))+1); //링크 정보 다시 읽어와야 함 inode = fs.readFS(currDirInode); //Inode 정보 설정 getCurrentTime(time); inode.blocks = "1"; inode.mtime = time; inode.size = size; inode.dataBlockList = dataBlockList; ppp.push("6"); //데이터 블록 추가 후 업데이트 fs.updateInode_writeFile(currDirInode, inode); ppp.push("7"); } catch (char* msg) { cerr << "error : " << msg << endl; } }