
Function CreateCube2(xs#, ys#, zs#, parent% = 0, invert% = 0, multi% = 0)
Local cx#, cy#, cz#, mesh%, surf%, v1%, v2%, v3%, v4%
; вычисляем центр
cx = xs * 0.5
cy = ys * 0.5
cz = zs * 0.5
; создаем меш
mesh = CreateMesh(parent)
; создаем сурфейс
surf = CreateSurface(mesh)
; ---------------------------------
; нижняя грань
; ---------------------------------
v1 = AddVertex(surf, -cx, -cy, -cz, 0.0, 0.0)
v2 = AddVertex(surf, +cx, -cy, -cz, 1.0, 0.0)
v3 = AddVertex(surf, +cx, -cy, +cz, 1.0, 1.0)
v4 = AddVertex(surf, -cx, -cy, +cz, 0.0, 1.0)
; если задан с нормалями внутрь,
; здесь и далее, создаем треугольники
; обходя вершины в обратном порядке
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; верхняя грань
; ---------------------------------
; если задан мультисурфейсный, здесь и далее,
; создаем на каждую грань отдельную поверхность
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, -cx, +cy, +cz, 0.0, 0.0)
v2 = AddVertex(surf, +cx, +cy, +cz, 1.0, 0.0)
v3 = AddVertex(surf, +cx, +cy, -cz, 1.0, 1.0)
v4 = AddVertex(surf, -cx, +cy, -cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; левая грань
; ---------------------------------
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, -cx, +cy, +cz, 0.0, 0.0)
v2 = AddVertex(surf, -cx, +cy, -cz, 1.0, 0.0)
v3 = AddVertex(surf, -cx, -cy, -cz, 1.0, 1.0)
v4 = AddVertex(surf, -cx, -cy, +cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; правая грань
; ---------------------------------
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, +cx, +cy, -cz, 0.0, 0.0)
v2 = AddVertex(surf, +cx, +cy, +cz, 1.0, 0.0)
v3 = AddVertex(surf, +cx, -cy, +cz, 1.0, 1.0)
v4 = AddVertex(surf, +cx, -cy, -cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; передняя грань
; ---------------------------------
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, -cx, +cy, -cz, 0.0, 0.0)
v2 = AddVertex(surf, +cx, +cy, -cz, 1.0, 0.0)
v3 = AddVertex(surf, +cx, -cy, -cz, 1.0, 1.0)
v4 = AddVertex(surf, -cx, -cy, -cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; задняя грань
; ---------------------------------
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, +cx, +cy, +cz, 0.0, 0.0)
v2 = AddVertex(surf, -cx, +cy, +cz, 1.0, 0.0)
v3 = AddVertex(surf, -cx, -cy, +cz, 1.0, 1.0)
v4 = AddVertex(surf, +cx, -cy, +cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
Return mesh
End Function
; пример
Local camera%, light%, outer_text%, outer_cube%, inner_text%, inner_cube%
Graphics3D(800, 600, 0, 2)
SetBuffer(BackBuffer())
outer_text = GenerateTexture(256, 256)
; внешний куб (обратные нормали)
outer_cube = CreateCube2(25.0, 25.0, 25.0, 0, True)
EntityTexture(outer_cube, outer_text)
inner_text = GenerateTexture( 32, 32, 30.0, 30.0)
; внутренний куб
inner_cube = CreateCube2(1.0, 1.0, 1.0)
EntityTexture(inner_cube, inner_text)
; камера
camera = CreateCamera()
PositionEntity(camera, 0.0, 0.0, -5.0)
Repeat
TurnEntity(inner_cube, 1.0, 1.0, 1.0)
RenderWorld()
Flip()
Until (KeyDown(1))
End
; генерация текстуры :)
Function GenerateTexture(xs%, ys%, sx# = 10.0, sy# = 10.0, flags% = 1)
Local texture%, buffer%, ix%, iy%, pixel
texture = CreateTexture(xs, ys, flags)
buffer = TextureBuffer(texture)
LockBuffer(buffer)
iy = ys
While (iy > 0)
iy = iy - 1
ix = xs
While (ix > 0)
ix = ix - 1
pixel = 65.0 * Sin(ix * sx) + 65.0 * Sin(iy * sy)
WritePixelFast(ix, iy, pixel, buffer)
Wend
Wend
UnlockBuffer(buffer)
Return texture
End Function
параметр multi нужен для мультисурфейсного кубика, если вдруг понадобится наложить на каждую грань свою текстуру