Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > PureBasic

PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач.

Ответ
 
Опции темы
Старый 20.09.2013, 21:29   #1
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 603
Написано 336 полезных сообщений
(для 1,319 пользователей)
OpenGL-загрузчики

Так как SpriteBoy, то приходится мне писать загрузчики для форматов моделек. За особо крутыми я не стал гнаться, только за чем нибудь простеньким. Тут буду выкидывать эти загрузчики, мало ли, кому пригодятся.
__________________


(Offline)
 
Ответить с цитированием
Старый 20.09.2013, 21:42   #2
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 603
Написано 336 полезных сообщений
(для 1,319 пользователей)
Ответ: OpenGL-загрузчики

Quake 2 MD2
Я у мамы кваколюб


Как юзать:
Лоадер умеет не только грузить, но и собственно рисовать модель, рисует через Immediate Mode (патамуша так рисовал сам Кармак, лол), секцию OGLCOM не использует.

Загрузка меша
; нам требуется переменная для собственно хранения меша и всех потрохов.
; она должна быть со структурой MD2Entity
myMD2.MD2Entity
; грузим меш. Первый параметр - ссылка на ваш объект, второй - путь.
LoadMD2(@myMD2, "tris.md2")
Отрисовка
; Параметры: ссылка на модель, кадр1, кадр2, интерполяция между ними (float от 0 до 1)
; следует помнить, что функция рисует модель относительно настоящей трансформации, по матрице MODELVIEW
; позиционирование - на вашей совести
; также, функция автоматически не играет анимацию, а лишь рисует интерполированную позицию между "кадр1" и "кадр2"
DisplayMD2(@myMD2, 1, 2, 0.3)
В исходнике ещё много разных функций, но они внутренние и их использование нежелательно.

Код:
; ===================================
; MD2 Loader and Drawer
; 2013 Kirpi4
; ===================================
; 
; Note: GLCCOM section not used


; Vertex
Structure MD2Vert
	x.f
	y.f
	z.f
	n.f
EndStructure

; Triangle
Structure MD2Tri
	Array vert.l(3)
	Array tex.l(3)
EndStructure

; Texture Coords
Structure MD2Coords
	u.f
	v.f
EndStructure

; Frame
Structure MD2Frame
	name.s
	Array trans.f(3)
	Array scale.f(3)
	Array verts.MD2Vert(0)
EndStructure

; Model
Structure MD2Entity
	Array header.l(18)
	Array frames.MD2Frame(0)
	Array tris.MD2Tri(0)
	Array coords.MD2Coords(0)
	Array skins.s(0)
	Array verts.MD2Vert(0)
EndStructure

Enumeration
	#MD2_MAGIC = 0
	#MD2_VERSION
	#MD2_SKIN_WIDTH
	#MD2_SKIN_HEIGHT
	#MD2_FRAME_SIZE
	#MD2_COUNT_SKIN
	#MD2_COUNT_VERTEX
	#MD2_COUNT_TEXCOORD
	#MD2_COUNT_TRIS
	#MD2_COUNT_OGLCOM
	#MD2_COUNT_FRAME
	#MD2_OFF_SKIN
	#MD2_OFF_TEXCOORD
	#MD2_OFF_TRIS
	#MD2_OFF_FRAME
	#MD2_OFF_OGLCOM
	#MD2_OFF_EOF
EndEnumeration

Procedure.s MD2BufferString(f.l,len.l)
	tmp.s = ""
	For i=0 To len-1
		tmp + Chr(ReadByte(f))
	Next
	ProcedureReturn tmp
EndProcedure

Procedure.f MD2Interpolate(x1.f,x2.f,interp.f)
	dlt.f = x2-x1
	ProcedureReturn x1 + (dlt*interp)
EndProcedure

Procedure.f MD2GetPos(pos1.l,scale.f,trans.f)
	oldps.f = (scale*pos1)+trans
	ProcedureReturn oldps
EndProcedure

Procedure.l MD2WrapByte(b.l)
	If b<0
		ProcedureReturn b+256
	Else
		ProcedureReturn b
	EndIf
EndProcedure

Procedure.l LoadMD2(*m.md2entity,file.s)

	f.l = ReadFile(-1,file)
	
	; Header
	For i=0 To 17
		*m\header(i) = ReadLong(f)
	Next
	
	; Frames
	FileSeek(f,*m\header(#MD2_OFF_FRAME))
	Dim *m\frames.MD2Frame(*m\header(#MD2_COUNT_FRAME))
	For i=0 To *m\header(#MD2_COUNT_FRAME)-1
		*m\frames(i)\scale(0) = ReadFloat(f)
		*m\frames(i)\scale(1) = ReadFloat(f)
		*m\frames(i)\scale(2) = ReadFloat(f)
		*m\frames(i)\trans(0) = ReadFloat(f)
		*m\frames(i)\trans(1) = ReadFloat(f)
		*m\frames(i)\trans(2) = ReadFloat(f)
		*m\frames(i)\name = Trim(MD2BufferString(f,16))
		Dim *m\frames(i)\verts.MD2Vert(*m\header(#MD2_COUNT_VERTEX))
		For j=0 To *m\header(#MD2_COUNT_VERTEX)-1
			With *m\frames(i)\verts(j)
				\x = MD2GetPos(MD2WrapByte(ReadByte(f)),*m\frames(i)\scale(0),*m\frames(i)\trans(0))
				\y = MD2GetPos(MD2WrapByte(ReadByte(f)),*m\frames(i)\scale(1),*m\frames(i)\trans(1))
				\z = MD2GetPos(MD2WrapByte(ReadByte(f)),*m\frames(i)\scale(2),*m\frames(i)\trans(2))
				\n = ReadByte(f)
			EndWith
		Next
	Next
	
	; Triangles
	FileSeek(f,*m\header(#MD2_OFF_TRIS))
	Dim *m\tris.MD2Tri(*m\header(#MD2_COUNT_TRIS))
	Dim *m\verts.MD2Vert(*m\header(#MD2_COUNT_VERTEX))
	For i=0 To *m\header(#MD2_COUNT_TRIS)-1
		With *m\tris(i)
			\vert(0) = ReadWord(f)
			\vert(1) = ReadWord(f)
			\vert(2) = ReadWord(f)
			\tex(0) = ReadWord(f)
			\tex(1) = ReadWord(f)
			\tex(2) = ReadWord(f)
		EndWith
	Next
	
	; Texture coords
	FileSeek(f,*m\header(#MD2_OFF_TEXCOORD))
	Dim *m\coords.MD2Coords(*m\header(#MD2_COUNT_TEXCOORD))
	For i=0 To *m\header(#MD2_COUNT_TEXCOORD)-1
		With *m\coords(i)
			cdx.f = ReadWord(f)
			cdy.f = ReadWord(f)
			divx.f = *m\header(#MD2_SKIN_WIDTH)
			divy.f = *m\header(#MD2_SKIN_HEIGHT)
			\u = cdx/divx
			\v = cdy/divy
		EndWith
	Next
	
	; Skins
	FileSeek(f,*m\header(#MD2_OFF_SKIN))
	Dim *m\skins.s(*m\header(#MD2_COUNT_SKIN))
	For i=0 To *m\header(#MD2_COUNT_SKIN)-1
		*m\skins(i) = Trim(MD2BufferString(f,64))
	Next
	
	
	
	CloseFile(f)
	
EndProcedure

Procedure DisplayMD2(*m.md2entity,frame1.l,frame2.l,trans.f)
	If frame1>=frame2
		Swap frame1, frame2
		trans = 1.0-trans
	EndIf
	glEnable_(#GL_CULL_FACE)
	For i=0 To *m\header(#MD2_COUNT_VERTEX)-1
		*m\verts(i)\x = MD2Interpolate(*m\frames(frame1)\verts(i)\x,*m\frames(frame2)\verts(i)\x,trans)
		*m\verts(i)\y = MD2Interpolate(*m\frames(frame1)\verts(i)\y,*m\frames(frame2)\verts(i)\y,trans)
		*m\verts(i)\z = MD2Interpolate(*m\frames(frame1)\verts(i)\z,*m\frames(frame2)\verts(i)\z,trans)
	Next
	glBegin_(#GL_TRIANGLES)
	For i=0 To *m\header(#MD2_COUNT_TRIS)-1
		For j = 0 To 2
			glTexCoord2f_(*m\coords(*m\tris(i)\tex(j))\u,*m\coords(*m\tris(i)\tex(j))\v)
			glVertex3f_(*m\verts(*m\tris(i)\vert(j))\y,*m\verts(*m\tris(i)\vert(j))\z,-*m\verts(*m\tris(i)\vert(j))\x)
		Next
	Next
	glEnd_()
	glDisable_(#GL_CULL_FACE)
EndProcedure
__________________



Последний раз редактировалось Кирпи4, 22.09.2013 в 21:40.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
ABTOMAT (21.09.2013), impersonalis (23.09.2013), St_AnGer (23.09.2013)
Старый 22.09.2013, 21:34   #3
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 603
Написано 336 полезных сообщений
(для 1,319 пользователей)
Ответ: OpenGL-загрузчики

SpriteBoy S3D


Как юзать:
Абсолютно аналогично предыдущему, но анимации этот формат не поддерживает.

Загрузка:
; Загрузка абсолютно идентична, только структура должна называться S3DEntity
LoadS3D(@tvoymesh.s3dentity,path.s)
Рисование:
; Принимает только один параметр - ссылку на модель, но внутри себя биндит текстуру, будьте начеку :-D 
DisplayS3D(@tvoymesh.s3dentity)
В исходнике ещё много разных функций, но они внутренние и их использование нежелательно.

Код:
; ===================================
; S3D Loader and Drawer
; 2013 Kirpi4
; ===================================

; Vertex
Structure S3DVert
	x.f
	y.f
	z.f
	u.f
	v.f
EndStructure

; Triangle
Structure S3DTri
	Array vert.S3DVert(3)
EndStructure

; Surface
Structure S3DSurf
	count.l
	Array tris.S3DTri(0)
EndStructure

; Model
Structure S3DEntity
	count.l
	Array surf.S3DSurf(0)
	
	texture.l
	gltex.l
EndStructure

Procedure.l NearPowerOf2(size.l)
	For i=0 To 31
		If size<Pow(2,i)
			ProcedureReturn Pow(2,i)
		EndIf
	Next
EndProcedure

Procedure.l MakeOGLTexture(imagenumber.l)
	ImageNumber = CopyImage(ImageNumber,-1)
	ResizeImage(ImageNumber,NearPowerOf2(ImageWidth(ImageNumber)),NearPowerOf2(ImageHeight(ImageNumber)),#PB_Image_Raw)
  Protected Counter.l,Color.l,texture
  Protected Dim ImageData.c(ImageWidth(ImageNumber)*ImageHeight(ImageNumber)*4)
  StartDrawing(ImageOutput(ImageNumber))
  For I = 0 To ImageHeight(ImageNumber)-1
    For J = 0 To ImageWidth(ImageNumber)-1
      color=Point(j,i)
      ImageData(Counter)=color & $FF
      ImageData(Counter+1)=color >> 8 & $FF
      ImageData(Counter+2)=color >> 16 & $FF
      ImageData(Counter+3)=255
      Counter+4
    Next
  Next
  StopDrawing()
  
  glGenTextures_(1, @texture) 
  glBindTexture_(#GL_TEXTURE_2D, texture) 
  glTexEnvi_(#GL_TEXTURE_ENV, #GL_TEXTURE_ENV_MODE, #GL_MODULATE) 
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
  
  glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, ImageWidth(ImageNumber), ImageHeight(ImageNumber), 0, #GL_RGBA, #GL_UNSIGNED_BYTE, ImageData())
	ProcedureReturn texture  
EndProcedure

Procedure.l LoadS3D(*m.s3dentity,file.s)

	f.l = ReadFile(-1,file)
	
	; Surfaces
	*m\count = ReadWord(f)
	Dim *m\surf.S3DSurf(*m\count)
	For surf=0 To *m\count-1
		; Tris
		*m\surf(s)\count = ReadWord(f)
		Dim *m\surf(s)\tris.S3DTri(*m\surf(s)\count)
		For t = 0 To *m\surf(surf)\count-1
			For v = 0 To 2
				With *m\surf(s)\tris(t)\vert(v)
					\x = ReadFloat(f)
					\y = ReadFloat(f)
					\z = ReadFloat(f)
					\u = ReadFloat(f)
					\v = ReadFloat(f)
				EndWith
			Next
		Next
	Next
	
	; Texture
	size.l = ReadLong(f)
	If size
		*mem = AllocateMemory(size)
		ReadData(f,*mem,size)
		*m\texture = CatchImage(-1,*mem,size)
		FreeMemory(*mem)
	EndIf
	
	If *m\texture
		*m\gltex = MakeOGLTexture(*m\texture)
	EndIf
	
	CloseFile(f)
	
EndProcedure

Procedure DisplayS3D(*m.s3dentity)
	If *m\gltex
		glEnable_(#GL_TEXTURE_2D)
		glBindTexture_(#GL_TEXTURE_2D,*m\gltex)
	EndIf
	glBegin_(#GL_TRIANGLES)
	For s=0 To *m\count-1
		For t=0 To *m\surf(s)\count-1
			For j = 2 To 0 Step -1
				With *m\surf(s)\tris(t)\vert(j)
					glTexCoord2f_(\u,\v)
					glVertex3f_(\x,\y,-\z)
				EndWith
			Next
		Next
	Next
	glEnd_()
EndProcedure


В аттаче - эта самая моделька, для тестов. Да, она немного сдвинута в сторону.
Вложения
Тип файла: rar lada02.rar (4.5 Кб, 126 просмотров)
__________________


(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
ABTOMAT (22.09.2013), impersonalis (23.09.2013), Raion (25.09.2013), St_AnGer (23.09.2013)
Старый 23.09.2013, 20:44   #4
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 603
Написано 336 полезных сообщений
(для 1,319 пользователей)
Ответ: OpenGL-загрузчики

Quake 3 Arena MD3
Вы спросите: сплю ли я? Я отвечу: зачем?


Как юзать:
Это кровный братишка MD2. Функции - те же самые, только кончаются на MD3. Но в загрузке есть нюанс. Если вы грузите модель откуда-то не из корневого каталога, вам нужно установить переменную MD3_Texture_Path на путь до папки с моделью. Путь должен кончаться на / или \. Загрузчик сам подберёт текстуры, сам забиндит их при рисовании, сказка вобщем .

Словцо о тэгах - они загружаются, но не используются. Вы можете получить их сами, посмотрите структуру MD3Entity.

Загрузка:
; нам требуется переменная для хранения меша.
; она должна быть со структурой MD3Entity
myMD3.MD3Entity
; грузим меш. Первый параметр - ссылка на ваш объект, второй - путь. Текстуры загрузятся автоматически, если будут найдены. Q3-шейдеры не поддерживаются
LoadMD3(@myMD3, "mesh.md3")
Рисование:
; Параметры абсолютно идентичны MD2. Условия отрисовки - те же.
; UP: новый параметр - режим рисования. Может быть либо #MD3_RENDER_IMMEDIATE (через glBegin/end)
; либо #MD3_RENDER_ARRAY (через glDrawElements)
DisplayMD3(@myMD3, 1, 2, 0.3, #MD3_RENDER_ARRAY)
Код:
; ===================================
; MD3 Loader and Drawer
; 2013 Kirpi4
; ===================================

Global MD3_Texture_Path.s = ""

Enumeration 
	#MD3_IDENT 
	#MD3_VERSION
	#MD3_FLAGS = 3
	#MD3_NUM_FRAMES
	#MD3_NUM_TAGS
	#MD3_NUM_SURFACES
	#MD3_NUM_SKINS
	#MD3_OFF_FRAMES
	#MD3_OFF_TAGS
	#MD3_OFF_SURFACES
EndEnumeration

Enumeration 
	#MD3_SURF_IDENT 
	#MD3_SURF_FLAGS = 2
	#MD3_SURF_NUM_FRAMES
	#MD3_SURF_NUM_SHADERS
	#MD3_SURF_NUM_VERTS
	#MD3_SURF_NUM_TRIANGLES
	#MD3_SURF_OFF_TRIANGLES
	#MD3_SURF_OFF_SHADERS
	#MD3_SURF_OFF_COORDS
	#MD3_SURF_OFF_VERTS
	#MD3_SURF_EOF
EndEnumeration

Enumeration 0
	#MD3_RENDER_IMMEDIATE
	#MD3_RENDER_ARRAY
EndEnumeration


; Vector
Structure MD3Vec
	x.f
	y.f
	z.f
EndStructure

; Vertex
Structure MD3Vert
	x.f
	y.f
	z.f
	n.l
EndStructure

; Frame
Structure MD3Frame
	min.MD3Vec
	max.MD3Vec
	orig.MD3Vec
	rad.f
	name.s
EndStructure

; VertexFrame (one frame of anim)
Structure MD3AnimFrame
	Array verts.MD3Vert(0)
EndStructure

; Tag
Structure MD3Tag
	name.s
	orig.MD3Vec
	Array orient.MD3Vec(3)
EndStructure

; Triangle
Structure MD3Tri
	Array index.l(3)
EndStructure

; TexCoord
Structure MD3TexCoord
	u.f
	v.f
EndStructure

; Shader (i.e. texture)
Structure MD3Shader
	name.s
	number.l
EndStructure

; Surface
Structure MD3Surf
	Array header.l(12)
	name.s ; Must be number 2 in header
	
	Array shaders.MD3Shader(0)
	Array tris.MD3Tri(0)
	Array coords.MD3TexCoord(0)
	Array anims.MD3AnimFrame(0)
	
	Array glCoords.f(0)
	Array glIndices.w(0)
EndStructure

; MD3 Entity
Structure MD3Entity
	Array header.l(12)
	name.s ; Must be number 3 in header
	
	Array frame.MD3Frame(0)
	Array tag.MD3Tag(0)
	Array surf.MD3Surf(0)
EndStructure

; Loaded MD3 textures, contains GL texture ID
Global NewMap MD3_LoadedTex.l()

Procedure.s MD3BufferString(f.l,len.l)
	tmp.s = ""
	For i=0 To len-1
		tmp + Chr(ReadByte(f))
	Next
	ProcedureReturn RTrim(tmp)
EndProcedure

Procedure.f MD3Interpolate(x1.f,x2.f,interp.f)
	dlt.f = x2-x1
	ProcedureReturn x1 + (dlt*interp)
EndProcedure

Procedure MD3ReadVec(*v.MD3Vec,f.l)
	*v\x = ReadFloat(f)
	*v\y = ReadFloat(f)
	*v\z = ReadFloat(f)
EndProcedure

Procedure.l MD3NearPowerOf2(size.l)
	For i=0 To 31
		If size<Pow(2,i)
			ProcedureReturn Pow(2,i)
		EndIf
	Next
EndProcedure

Procedure MD3LoadTexture(name.s)
	ImageNumber = LoadImage(-1,MD3_Texture_Path+name)
	If ImageNumber=0
		Debug "MD3 Texture not found: "+name
		ProcedureReturn
	EndIf
	ResizeImage(ImageNumber,MD3NearPowerOf2(ImageWidth(ImageNumber)),MD3NearPowerOf2(ImageHeight(ImageNumber)),#PB_Image_Raw)
  Protected Counter.l,Color.l,texture
  Protected Dim ImageData.c(ImageWidth(ImageNumber)*ImageHeight(ImageNumber)*4)
  StartDrawing(ImageOutput(ImageNumber))
  For I = 0 To ImageHeight(ImageNumber)-1
    For J = 0 To ImageWidth(ImageNumber)-1
      color=Point(j,i)
      ImageData(Counter)=color & $FF
      ImageData(Counter+1)=color >> 8 & $FF
      ImageData(Counter+2)=color >> 16 & $FF
      ImageData(Counter+3)=255
      Counter+4
    Next
  Next
  StopDrawing()
  
  glGenTextures_(1, @texture) 
  glBindTexture_(#GL_TEXTURE_2D, texture) 
  glTexEnvi_(#GL_TEXTURE_ENV, #GL_TEXTURE_ENV_MODE, #GL_MODULATE) 
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
  
  glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, ImageWidth(ImageNumber), ImageHeight(ImageNumber), 0, #GL_RGBA, #GL_UNSIGNED_BYTE, ImageData())
  FreeImage(ImageNumber)
  MD3_LoadedTex(MD3_Texture_Path+name) = texture
EndProcedure

Procedure MD3GetTexture(name.s)
	If FindMapElement(MD3_LoadedTex(),MD3_Texture_Path+name)
		glEnable_(#GL_TEXTURE_2D)
		glBindTexture_(#GL_TEXTURE_2D,MD3_LoadedTex(MD3_Texture_Path+name))
	Else
		glDisable_(#GL_TEXTURE_2D)
	EndIf
EndProcedure

Procedure LoadMD3(*m.md3entity,file.s)
	f = ReadFile(-1,file)
	
	; Header
	For i=0 To 11
		If i=2
			*m\name = MD3BufferString(f,64)
		Else
			*m\header(i) = ReadLong(f)
		EndIf
	Next
	
	; Frames
	FileSeek(f,*m\header(#MD3_OFF_FRAMES))
	Dim *m\frame.MD3Frame(*m\header(#MD3_NUM_FRAMES))
	For i=0 To *m\header(#MD3_NUM_FRAMES)-1
		With *m\frame(i)
			MD3ReadVec(@\min,f)
			MD3ReadVec(@\max,f)
			MD3ReadVec(@\orig,f)
			\rad = ReadFloat(f)
			\name = MD3BufferString(f,16)
		EndWith
	Next
	
	; Tags
	FileSeek(f,*m\header(#MD3_OFF_TAGS))
	Dim *m\tag.MD3Tag(*m\header(#MD3_NUM_TAGS))
	For i=0 To *m\header(#MD3_NUM_TAGS)-1
		With *m\tag(i)
			\name = MD3BufferString(f,64)
			MD3ReadVec(@\orig,f)
			For j=0 To 2
				MD3ReadVec(@\orient(j),f)
			Next
		EndWith
	Next
	
	; Surfaaaaaaaces
	FileSeek(f,*m\header(#MD3_OFF_SURFACES))
	Dim *m\surf.MD3Surf(*m\header(#MD3_NUM_SURFACES))
	For srf=0 To *m\header(#MD3_NUM_SURFACES)-1
		With *m\surf(srf)
			surfStart.l = Loc(f)
			; Header
			For i=0 To 11
				If i=1 
					\name = MD3BufferString(f,64)
				Else
					\header(i) = ReadLong(f)
				EndIf
			Next
			
			; Shaders
			FileSeek(f,surfStart+\header(#MD3_SURF_OFF_SHADERS))
			Dim *m\surf(srf)\shaders.MD3Shader(\header(#MD3_SURF_NUM_SHADERS))
			For i=0 To \header(#MD3_SURF_NUM_SHADERS)-1
				*m\surf(srf)\shaders(i)\name = GetFilePart(MD3BufferString(f,64))
				*m\surf(srf)\shaders(i)\number = ReadLong(f)
				MD3LoadTexture(*m\surf(srf)\shaders(i)\name)
			Next
			
			; Triangles
			FileSeek(f,surfStart+\header(#MD3_SURF_OFF_TRIANGLES))
			Dim *m\surf(srf)\tris.MD3Tri(\header(#MD3_SURF_NUM_TRIANGLES))
			For i=0 To \header(#MD3_SURF_NUM_TRIANGLES)-1
				For j=0 To 2
					*m\surf(srf)\tris(i)\index(j) = ReadLong(f)
				Next
			Next
			
			; Coords
			FileSeek(f,surfStart+\header(#MD3_SURF_OFF_COORDS))
			Dim *m\surf(srf)\coords.MD3TexCoord(\header(#MD3_SURF_NUM_VERTS))
			For i=0 To \header(#MD3_SURF_NUM_VERTS)-1
				*m\surf(srf)\coords(i)\u = ReadFloat(f)
				*m\surf(srf)\coords(i)\v = ReadFloat(f)
			Next
			
			; Verts
			FileSeek(f,surfStart+\header(#MD3_SURF_OFF_VERTS))
			Dim *m\surf(srf)\anims.MD3AnimFrame(*m\header(#MD3_NUM_FRAMES))
			For j=0 To *m\header(#MD3_NUM_FRAMES)-1
				Dim *m\surf(srf)\anims(j)\verts.MD3Vert(\header(#MD3_SURF_NUM_VERTS))
				For i=0 To \header(#MD3_SURF_NUM_VERTS)-1
						*m\surf(srf)\anims(j)\verts(i)\x = ReadWord(f)/64.0
						*m\surf(srf)\anims(j)\verts(i)\y = ReadWord(f)/64.0
						*m\surf(srf)\anims(j)\verts(i)\z = ReadWord(f)/64.0
						*m\surf(srf)\anims(j)\verts(i)\n = ReadWord(f)
				Next
			Next
			FileSeek(f,surfstart+\header(#MD3_SURF_EOF))
			
			; Preparing for array rendering
			Dim \glIndices.w(\header(#MD3_SURF_NUM_TRIANGLES)*3)
			Dim \glCoords.f(\header(#MD3_SURF_NUM_VERTS)*2)
			For tr = 0 To \header(#MD3_SURF_NUM_TRIANGLES)-1
				For vr = 0 To 2
					\glIndices(tr*3+vr) = \tris(tr)\index(vr)
				Next
			Next
			For vr = 0 To \header(#MD3_SURF_NUM_VERTS)-1
				\glCoords(vr*2) = \coords(vr)\u
				\glCoords(vr*2+1) = \coords(vr)\v
			Next
		EndWith
	Next

	CloseFile(f)
EndProcedure

Procedure DisplayMD3(*m.md3entity,frame1.l,frame2.l,trans.f,dispMode.b = #MD3_RENDER_IMMEDIATE)
	If frame1>=frame2
		Swap frame1, frame2
		trans = 1.0-trans
	EndIf
	For i=0 To *m\header(#MD3_NUM_SURFACES)-1
		With *m\surf(i)
		Select dispMode
			Case #MD3_RENDER_IMMEDIATE
				; Using glBegin/end
				Protected Dim verts.MD3Vert(*m\surf(i)\header(#MD3_SURF_NUM_VERTS))
	
				For v = 0 To \header(#MD3_SURF_NUM_VERTS)-1
					verts(v)\x = MD3Interpolate(\anims(frame1)\verts(v)\x,\anims(frame2)\verts(v)\x,trans)
					verts(v)\y = MD3Interpolate(\anims(frame1)\verts(v)\y,\anims(frame2)\verts(v)\y,trans)
					verts(v)\z = MD3Interpolate(\anims(frame1)\verts(v)\z,\anims(frame2)\verts(v)\z,trans)
				Next
				For tx = 0 To \header(#MD3_SURF_NUM_SHADERS)-1
					MD3GetTexture(\shaders(tx)\name)
				Next
				glBegin_(#GL_TRIANGLES)
				For tr = 0 To \header(#MD3_SURF_NUM_TRIANGLES)-1
					For vr = 0 To 2
						glTexCoord2f_(\coords(\tris(tr)\index(vr))\u,\coords(\tris(tr)\index(vr))\v)
						glVertex3f_(-verts(\tris(tr)\index(vr))\y,verts(\tris(tr)\index(vr))\z,-verts(\tris(tr)\index(vr))\x)
						
					Next
				Next
				glEnd_()
				
				FreeArray(verts())
				
			Case #MD3_RENDER_ARRAY
				; Using vertex buffers
				Protected Dim verts2.f(*m\surf(i)\header(#MD3_SURF_NUM_VERTS)*3)
	
				For v = 0 To \header(#MD3_SURF_NUM_VERTS)-1
					verts2(v*3)   = -MD3Interpolate(\anims(frame1)\verts(v)\y,\anims(frame2)\verts(v)\y,trans)
					verts2(v*3+1) =  MD3Interpolate(\anims(frame1)\verts(v)\z,\anims(frame2)\verts(v)\z,trans)
					verts2(v*3+2) = -MD3Interpolate(\anims(frame1)\verts(v)\x,\anims(frame2)\verts(v)\x,trans)
				Next
				
				For tx = 0 To \header(#MD3_SURF_NUM_SHADERS)-1
					MD3GetTexture(\shaders(tx)\name)
				Next
				
				glEnableClientState_(#GL_VERTEX_ARRAY)
				glEnableClientState_(#GL_TEXTURE_COORD_ARRAY)
				glEnableClientState_(#GL_INDEX_ARRAY)
				
				glVertexPointer_(3,#GL_FLOAT,0,@verts2())
				glTexCoordPointer_(2,#GL_FLOAT,0,@\glCoords())
				glDrawElements_(#GL_TRIANGLES,\header(#MD3_SURF_NUM_TRIANGLES)*3,#GL_UNSIGNED_SHORT,@\glIndices())
				
				glDisableClientState_(#GL_INDEX_ARRAY)
				glDisableClientState_(#GL_TEXTURE_COORD_ARRAY)
				glDisableClientState_(#GL_VERTEX_ARRAY)
				FreeArray(verts2())
				
		
		EndSelect
		
		
		EndWith
	Next
EndProcedure
__________________



Последний раз редактировалось Кирпи4, 14.10.2013 в 17:52.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
impersonalis (23.09.2013), St_AnGer (14.10.2013)
Старый 14.10.2013, 17:54   #5
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 603
Написано 336 полезных сообщений
(для 1,319 пользователей)
Ответ: OpenGL-загрузчики

Ап, ребятки. Всё глубже постигаю дзен, поэтому добавил в рисовальщик MD3 новый параметр - режим отрисовки. Он выбирает, рисовать через glBegin/End, либо через glDrawElements.
__________________


(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 13:12.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com