Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
// 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);
}
Exemplo n.º 3
0
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';
}
Exemplo n.º 4
0
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 "디렉토리가 비어있지 않습니다.";
}
Exemplo n.º 5
0
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;
	}
}
Exemplo n.º 6
0
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);
	}
}
Exemplo n.º 7
0
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;
	}
}