Показать сообщение отдельно
Старый 23.09.2013, 01:34   #3
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: 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 Кб, 663 просмотров)
__________________


(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
ABTOMAT (23.09.2013), impersonalis (23.09.2013), Raion (25.09.2013), St_AnGer (23.09.2013)