Социал-сычевист
Регистрация: 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
В аттаче - эта самая моделька, для тестов. Да, она немного сдвинута в сторону.
|