亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 3dsloader.cpp

?? 通過vc++編程實現3DS格式的模型載入
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//========================================================
/**
*  @file      3DSLoader.h
*
*  項目描述: 3DS文件載入
*  文件描述:  3DS文件載入類  
*  適用平臺: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  電子郵件:  wwboss123@gmail.com
*  創建日期: 2006-12-06	
*  修改日期: 2006-12-12
*
*/     
//========================================================

#include "3DSLoader.h"
#include "CBMPLoader.h"

/** 構造函數 */
C3DSLoader::C3DSLoader()
{
	m_CurrentChunk = new tChunk;	 /**< 為當前塊分配空間 */
	m_TempChunk = new tChunk;		 /**< 為臨時塊分配空間 */
	m_3DModel.numOfObjects = 0;
	m_3DModel.numOfMaterials = 0;
	for (int i=0; i<MAX_TEXTURES; i++) 
		m_textures[i] = 0;
}

/** 釋放內存并關閉文件 */ 
void C3DSLoader::CleanUp()
{
	fclose(m_FilePointer);			 /**< 關閉文件 */
	delete m_CurrentChunk;		     /**< 釋放當前塊 */
	delete m_TempChunk;				 /**< 釋放臨時塊 */
}

/** 析構函數 */
C3DSLoader::~C3DSLoader()
{
	m_3DModel.numOfObjects = 0;
	m_3DModel.numOfMaterials = 0;
	m_3DModel.pObject.clear();
	m_3DModel.pMaterials.clear();
	glDeleteTextures(MAX_TEXTURES, m_textures);
}

/** 初時化3DS文件 */
void C3DSLoader::Init(char *filename)
{	
	/** 將3ds文件裝入到模型結構體中 */
	Import3DS(&m_3DModel, filename);	

	for(int i =0; i<m_3DModel.numOfMaterials;i++)
	{ 
		if(strlen(m_3DModel.pMaterials[i].strFile)>0)                 /**< 判斷是否是一個文件名 */
		   LoadTexture(m_3DModel.pMaterials[i].strFile,m_textures, i);/**< 使用紋理文件名稱來裝入位圖 */		 
	   
		/** 設置材質的紋理ID */
		m_3DModel.pMaterials[i].texureId = i;                     
	} 
}

/** 顯示3ds模型 */
void C3DSLoader::Draw() 
{
	glPushAttrib(GL_CURRENT_BIT); /**< 保存現有顏色屬實性 */
	glDisable(GL_TEXTURE_2D);
	
	/**< 遍歷模型中所有的對象 */
	for(int i = 0; i < m_3DModel.numOfObjects; i++)
	{
		if(m_3DModel.pObject.size() <= 0) 
			break;                   /**< 如果對象的大小小于0,則退出 */
	 
		t3DObject *pObject = &m_3DModel.pObject[i];/**< 獲得當前顯示的對象 */
	 
		if(pObject->bHasTexture)                  /**< 判斷該對象是否有紋理映射 */
		 {	
			 glEnable(GL_TEXTURE_2D);             /**< 打開紋理映射 */
			 glBindTexture(GL_TEXTURE_2D, m_textures[pObject->materialID]);
		 } 
	 else	
		 glDisable(GL_TEXTURE_2D);                /**< 關閉紋理映射 */
	 
	 glColor3ub(255, 255, 255);

	 /** 開始繪制 */
	 glBegin(GL_TRIANGLES);
	 for(int j = 0; j < pObject->numOfFaces; j++)		/**< 遍歷所有的面 */
	 {for(int tex = 0; tex < 3; tex++)					/**< 遍歷三角形的所有點 */
		{
			int index = pObject->pFaces[j].vertIndex[tex];	/**< 獲得面對每個點的索引 */
		 
			glNormal3f(pObject->pNormals[index].x,pObject->pNormals[index].y,  
			        pObject->pNormals[index].z);		/**< 給出法向量 */
		 
		 if(pObject->bHasTexture)						/**< 如果對象具有紋理 */
		 {	
			 if(pObject->pTexVerts)						/**< 確定是否有UVW紋理坐標 */
				glTexCoord2f(pObject->pTexVerts[index].x,pObject->pTexVerts[index].y);
		 }
		 else
		 {	
			 if(m_3DModel.pMaterials.size() && pObject->materialID>= 0) 
			{	
				BYTE *pColor = m_3DModel.pMaterials[pObject->materialID].color;
				glColor3ub(pColor[0],pColor[1],pColor[2]);
			}
		 }
		 glVertex3f(pObject->pVerts[index].x,pObject->pVerts[index].y,pObject->pVerts[index].z);
		}
	 }
	glEnd(); /**< 繪制結束 */
	}
	glEnable(GL_TEXTURE_2D);
	
	glPopAttrib();   /**< 恢復前一屬性 */
}

/** 轉載紋理 */
void C3DSLoader::LoadTexture(char* filename, GLuint textureArray[], GLuint textureID)
{

	if(!filename)
		return;
	
	/** 載入位圖 */
	if(!m_BMPTexture.LoadBitmap(filename))
	{
		MessageBox(NULL,"載入位圖失敗!","錯誤",MB_OK);
		exit(0);
	}
	glGenTextures(1,&m_textures[textureID]);
	
	glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
	glBindTexture(GL_TEXTURE_2D, m_textures[textureID]);
	
	/** 控制濾波 */
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
	
	/** 創建紋理 */
	gluBuild2DMipmaps(GL_TEXTURE_2D, 3, m_BMPTexture.imageWidth, m_BMPTexture.imageHeight, GL_RGB, 
		              GL_UNSIGNED_BYTE, m_BMPTexture.image);
		
}

/** 載入3DS文件到模型結構中 */
bool C3DSLoader::Import3DS(t3DModel *pModel, char *strFileName)
{	
	char strMessage[255] = {0};
	
	/** 打開一個3ds文件 */
	m_FilePointer = fopen(strFileName, "rb");
	
	/**< 檢查文件指針 */
	if(!m_FilePointer) 
	{	
		sprintf(strMessage, "找不到文件: %s!", strFileName);
		MessageBox(NULL, strMessage, "Error", MB_OK);
		return false;
	}
	
	/** 將文件的第一塊讀出并判斷是否是3ds文件 */
	ReadChunk(m_CurrentChunk);
	
	/** 確保是3ds文件 */
	if (m_CurrentChunk->ID != PRIMARY)
	{	
		MessageBox(NULL, "不能加載主塊!", "Error", MB_OK);
		return false;
	}
	
	/** 遞歸讀出對象數據 */
	ReadNextChunk(pModel, m_CurrentChunk);
	
	/** 計算頂點的法線 */
	ComputeNormals(pModel);
	
	/** 釋放內存空間 */
	CleanUp();
	
	return true;
}

/**  讀入一個字符串 */
int C3DSLoader::GetString(char *pBuffer)
{	
	int index = 0;
	
	/** 讀入一個字節的數據 */
	fread(pBuffer, 1, 1, m_FilePointer);
	
	/** 直到結束 */
	while (*(pBuffer + index++) != 0) 
	{
		/** 讀入一個字符直到NULL */
		fread(pBuffer + index, 1, 1, m_FilePointer);
	}
	
	/** 返回字符串的長度 */
	return strlen(pBuffer) + 1;
}

/** 讀入塊的ID號和它的字節長度 */
void C3DSLoader::ReadChunk(tChunk *pChunk)
{	
	// 讀入塊的ID號 */
	pChunk->bytesRead = fread(&pChunk->ID, 1, 2, m_FilePointer);
	
	/** 讀入塊占用的長度 */
	pChunk->bytesRead += fread(&pChunk->length, 1, 4, m_FilePointer);
}


/** 讀出3ds文件的主要部分 */
void C3DSLoader::ReadNextChunk(t3DModel *pModel, tChunk *pPreChunk)
{	
	t3DObject newObject = {0};					/**< 用來添加到對象鏈表 */
	tMatInfo newTexture = {0};				    /**< 用來添加到材質鏈表 */
	unsigned int version = 0;					/**< 保存文件版本 */
	int buffer[50000] = {0};					/**< 用來跳過不需要的數據 */
	m_CurrentChunk = new tChunk;				/**< 為新的塊分配空間		 */
	
	/** 繼續讀入子塊 */
	while (pPreChunk->bytesRead < pPreChunk->length)
	{	
		/** 讀入下一個塊 */
		ReadChunk(m_CurrentChunk);
		
		/** 判斷塊的ID號 */
		switch (m_CurrentChunk->ID)
		{
		
		/** 文件版本號 */
		case VERSION:							
			
			/** 讀入文件的版本號 */
			m_CurrentChunk->bytesRead += fread(&version, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
			
			/** 如果文件版本號大于3,給出一個警告信息 */
			if (version > 0x03)
				MessageBox(NULL, " 該3DS文件版本大于3.0,可能不能正確讀取", "警告", MB_OK);
			break;
		
			/** 網格版本信息 */
		case OBJECTINFO:						
			
			/** 讀入下一個塊 */
			ReadChunk(m_TempChunk);
			
			/** 獲得網格的版本號 */
			m_TempChunk->bytesRead += fread(&version, 1, m_TempChunk->length - m_TempChunk->bytesRead, m_FilePointer);
			
			/** 增加讀入的字節數 */
			m_CurrentChunk->bytesRead += m_TempChunk->bytesRead;
			
			/** 進入下一個塊 */
			ReadNextChunk(pModel, m_CurrentChunk);
			break;
		
		/** 材質信息 */
		case MATERIAL:							
			
			/** 材質的數目遞增 */
			pModel->numOfMaterials++;
			
			/** 在紋理鏈表中添加一個空白紋理結構 */
			pModel->pMaterials.push_back(newTexture);
			
			/** 進入材質裝入函數 */
			ReadNextMatChunk(pModel, m_CurrentChunk);
			break;

		/** 對象名稱 */
		case OBJECT:							
			
			/** 對象數遞增 */
			pModel->numOfObjects++;
			
			/** 添加一個新的tObject節點到對象鏈表中 */
			pModel->pObject.push_back(newObject);
			
			/** 初始化對象和它的所有數據成員 */
			memset(&(pModel->pObject[pModel->numOfObjects - 1]), 0, sizeof(t3DObject));
			
			/** 獲得并保存對象的名稱,然后增加讀入的字節數 */
			m_CurrentChunk->bytesRead += GetString(pModel->pObject[pModel->numOfObjects - 1].strName);
			
			/** 進入其余的對象信息的讀入 */
			ReadNextObjChunk(pModel, &(pModel->pObject[pModel->numOfObjects - 1]), m_CurrentChunk);
			break;
		

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费视频caoporn| 日韩一区二区三区视频在线| 日韩欧美视频在线| 久久久99精品免费观看| 亚洲成人午夜电影| av高清久久久| 国产喷白浆一区二区三区| 蜜臀91精品一区二区三区| 色先锋aa成人| 中文字幕国产一区| 精品亚洲porn| 91精品啪在线观看国产60岁| 亚洲一区二区三区在线播放| 91免费版在线| 日本一区二区三区dvd视频在线| 久久精品国产在热久久| 欧美日韩成人高清| 亚洲尤物在线视频观看| 色欧美片视频在线观看| 亚洲欧洲一区二区三区| 成人午夜在线视频| 国产午夜久久久久| 国产精品99久久久久久有的能看| 欧美一区二区三区精品| 日本伊人色综合网| 欧美男人的天堂一二区| 亚洲va韩国va欧美va| 欧美色老头old∨ideo| 亚洲精品国产一区二区精华液 | 国产精品私人影院| 国产在线看一区| 欧美精品一区二区三区久久久| 免费欧美高清视频| 日韩视频在线永久播放| 久草热8精品视频在线观看| 欧美成人伊人久久综合网| 久久99国产精品免费| 国产三级久久久| 91丝袜美女网| 久久99热这里只有精品| 日韩一区二区三区免费观看| 久久激情综合网| 久久女同精品一区二区| 粉嫩欧美一区二区三区高清影视| 国产精品夫妻自拍| 色婷婷av久久久久久久| 视频在线在亚洲| 亚洲精品一区二区三区蜜桃下载 | 精品久久久久久亚洲综合网| 国产乱子轮精品视频| 国产精品不卡在线观看| 欧美日韩一区二区在线观看视频| 日韩一区二区三区在线观看| 亚洲成人av一区| 日韩欧美一区中文| 国产成人自拍网| 亚洲人成网站精品片在线观看| 欧美亚洲一区三区| 美女脱光内衣内裤视频久久网站| 精品少妇一区二区三区日产乱码| 国产一区二区伦理片| 亚洲精品乱码久久久久久| 538prom精品视频线放| 国产成人8x视频一区二区 | 91久久精品国产91性色tv| 亚洲电影欧美电影有声小说| 久久尤物电影视频在线观看| 99久久99精品久久久久久| 蜜臀久久99精品久久久久宅男| 国产欧美日韩综合精品一区二区 | 久久丝袜美腿综合| 色吧成人激情小说| 国产一区二区三区免费观看| 亚洲午夜免费视频| 中文字幕不卡在线| 国产精品视频第一区| 欧美怡红院视频| 国产不卡视频一区二区三区| 三级欧美在线一区| 亚洲欧美偷拍卡通变态| 欧美精品一区二区在线观看| 在线观看一区二区视频| 国产黄人亚洲片| 日本成人中文字幕在线视频| 日韩毛片视频在线看| 久久久五月婷婷| 555夜色666亚洲国产免| 在线观看精品一区| jvid福利写真一区二区三区| 极品尤物av久久免费看| 午夜精品久久久久久久99樱桃| 国产精品萝li| 国产女人aaa级久久久级 | 国精品**一区二区三区在线蜜桃| 亚洲另类中文字| 国产精品日产欧美久久久久| www国产精品av| 91精品国产免费| 欧美精选一区二区| 欧美视频一二三区| 在线中文字幕不卡| 91网页版在线| 91麻豆文化传媒在线观看| 成人黄色a**站在线观看| 国产精品系列在线播放| 国产乱子轮精品视频| 激情丁香综合五月| 蜜臀av一区二区在线观看 | 中文字幕欧美一区| 国产日韩精品一区二区三区| www日韩大片| xfplay精品久久| 久久久不卡网国产精品二区| 久久久久国产一区二区三区四区 | 国产欧美日韩精品在线| 久久久午夜精品| 亚洲国产高清aⅴ视频| 精品国产91乱码一区二区三区 | 欧美精品久久一区| 91精品在线观看入口| 69精品人人人人| 日韩亚洲欧美高清| 久久综合色天天久久综合图片| 精品国产百合女同互慰| 国产免费久久精品| 亚洲图片另类小说| 亚洲成a人v欧美综合天堂下载| 日韩在线观看一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 国产一区二区精品久久99| 成人午夜视频在线观看| 91在线小视频| 制服丝袜av成人在线看| 欧美精品一区二区三区一线天视频 | 欧美tk—视频vk| 久久久国产精品麻豆| 亚洲免费资源在线播放| 天天色综合成人网| 国产九色sp调教91| 色诱视频网站一区| 日韩欧美黄色影院| 国产精品国产精品国产专区不片| 一区二区三区电影在线播| 日韩国产成人精品| 国产成人精品三级| 在线免费观看日本欧美| 亚洲精品在线免费播放| 一区二区三区欧美激情| 久久精品国产一区二区三区免费看| 高清av一区二区| 7777女厕盗摄久久久| 国产欧美日韩精品在线| 天天av天天翘天天综合网色鬼国产| 国产精品资源网| 在线电影国产精品| 国产精品福利在线播放| 麻豆国产欧美一区二区三区| 99天天综合性| 久久这里只有精品首页| 香蕉影视欧美成人| 成人av在线资源网| 精品成人一区二区三区| 亚洲午夜久久久久中文字幕久| 91久久精品一区二区| 精品国产亚洲在线| 亚洲国产精品一区二区久久 | 久久97超碰国产精品超碰| 91麻豆福利精品推荐| 久久尤物电影视频在线观看| 香蕉影视欧美成人| av成人老司机| 久久久久久久久久久电影| 亚洲va在线va天堂| 色999日韩国产欧美一区二区| 欧美精品一区二区在线观看| 亚洲成人一区在线| 色妞www精品视频| 欧美激情艳妇裸体舞| 国产一区二区三区美女| 欧美一区二区在线播放| 午夜久久久久久电影| 欧美亚洲一区二区在线| 亚洲日本va午夜在线影院| 国产毛片精品国产一区二区三区| 欧美一区二区人人喊爽| 天天操天天色综合| 欧美日产在线观看| 亚洲国产精品天堂| 日本乱人伦一区| 一区二区三区在线视频观看| 91香蕉视频mp4| 亚洲色图在线看| 91官网在线观看| 亚洲一区在线观看免费| 91亚洲国产成人精品一区二区三 | 久久久久综合网| 国产乱人伦偷精品视频不卡 | 欧美成人艳星乳罩| 九色综合狠狠综合久久| 精品电影一区二区三区|