Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define unicode
- #include "windows.bi"
- '
- #include "fbgfx.bi"
- #include "GL/gl.bi"
- #include "GL/glu.bi"
- Declare Sub DrawCube(ByVal a As Single, ByVal r1 As Single, ByVal g1 As Single, ByVal b1 As Single, ByVal a1 As Single, _
- ByVal r2 As Single, ByVal g2 As Single, ByVal b2 As Single, ByVal a2 As Single, _
- ByVal r3 As Single, ByVal g3 As Single, ByVal b3 As Single, ByVal a3 As Single, _
- ByVal r4 As Single, ByVal g4 As Single, ByVal b4 As Single, ByVal a4 As Single, _
- ByVal r5 As Single, ByVal g5 As Single, ByVal b5 As Single, ByVal a5 As Single, _
- ByVal r6 As Single, ByVal g6 As Single, ByVal b6 As Single, ByVal a6 As Single)
- Declare Sub DrawPoligon(ByVal x1 As Single, ByVal y1 As Single, ByVal z1 As Single, _
- ByVal x2 As Single, ByVal y2 As Single, ByVal z2 As Single, _
- ByVal x3 As Single, ByVal y3 As Single, ByVal z3 As Single, _
- ByVal x4 As Single, ByVal y4 As Single, ByVal z4 As Single, _
- ByVal r As Single, ByVal g As Single, ByVal b As Single, ByVal a As Single)
- Declare Function CalculateScaler(ByVal Param As Single, ByVal mMin As Single, _
- ByVal mMax As Single, ByVal Scaler As Single)As Single
- Sub DrawPoligon(ByVal x1 As Single, ByVal y1 As Single, ByVal z1 As Single, _
- ByVal x2 As Single, ByVal y2 As Single, ByVal z2 As Single, _
- ByVal x3 As Single, ByVal y3 As Single, ByVal z3 As Single, _
- ByVal x4 As Single, ByVal y4 As Single, ByVal z4 As Single, _
- ByVal r As Single, ByVal g As Single, ByVal b As Single, ByVal a As Single)
- glBegin(GL_QUADS)
- glColor4f(r,g,b,a)
- glTexCoord2f(0, 0)
- glVertex3d(x1, y1, z1)
- glTexCoord2f(0, 1)
- glVertex3d(x2, y2, z2)
- glTexCoord2f(1, 1)
- glVertex3d(x3, y3, z3)
- glTexCoord2f(1, 0)
- glVertex3d(x4, y4, z4)
- glEnd()
- End Sub
- ' Вычисляет коэффициент
- Private Function CalculateScaler(ByVal Param As Single, ByVal mMin As Single, ByVal mMax As Single, ByVal Scaler As Single)As Single
- If Param > mMax Then
- Return -1
- Else
- If Param < mMin Then
- Return 1
- Else
- Return Scaler
- End If
- End If
- End Function
- Private Sub DrawCube(ByVal a As Single, ByVal r1 As Single, ByVal g1 As Single, ByVal b1 As Single, ByVal a1 As Single, _
- ByVal r2 As Single, ByVal g2 As Single, ByVal b2 As Single, ByVal a2 As Single, _
- ByVal r3 As Single, ByVal g3 As Single, ByVal b3 As Single, ByVal a3 As Single, _
- ByVal r4 As Single, ByVal g4 As Single, ByVal b4 As Single, ByVal a4 As Single, _
- ByVal r5 As Single, ByVal g5 As Single, ByVal b5 As Single, ByVal a5 As Single, _
- ByVal r6 As Single, ByVal g6 As Single, ByVal b6 As Single, ByVal a6 As Single)
- ' нижняя грань
- DrawPoligon(0,0,0, a,0,0, a,0,a, 0,0,a, r1,g1,b1,a1)
- ' задняя грань
- DrawPoligon(0,0,0, a,0,0, a,a,0, 0,a,0, r2,g2,b2,a2)
- ' левая грань
- DrawPoligon(0,0,0, 0,0,a, 0,a,a, 0,a,0, r3,g3,b3,a3)
- ' верхняя грань
- DrawPoligon(0,a,0, a,a,0, a,a,a, 0,a,a, r4,g4,b4,a4)
- ' передняя грань
- DrawPoligon(0,0,a, a,0,a, a,a,a, 0,a,a, r5,g5,b5,a5)
- ' правая грань
- DrawPoligon(a,0,0, a,0,a, a,a,a, a,a,0, r6,g6,b6,a5)
- End Sub
- ' Длина, ширина и цветовое разрешение экрана
- Dim w As Integer = Any, h as Integer = Any, depth As Integer = Any
- Dim ppos(3) As Single = {3,3,3,1}
- Dim pdir(3) As Single = {-1,-1,-1}
- ' Генератор случайных чисел
- Randomize(Timer)
- ' Проверяем разрешение экрана
- ScreenInfo(w, h, depth)
- ' Устанавливаем графический режим с рисованием в опенгёл
- ' с полученными параметрами длины и ширины экрана
- ScreenRes(w, h, depth, , FB.GFX_OPENGL Or FB.GFX_FULLSCREEN)
- ' Конфигурация OpenGL
- glMatrixMode(GL_PROJECTION) ' Определение матрицы
- glLoadIdentity()
- glViewport(0,0,w,h) ' Установка оси координат
- gluPerspective(45,w/h, 1, 100) ' Перспективная проекция
- glMatrixMode(GL_MODELVIEW) ' Отключить вывод невидимых частей
- 'glEnable(GL_CULL_FACE)
- 'glCullFace(GL_BACK)
- 'glEnable(GL_TEXTURE_2D) ' Включение текстур
- 'glLoadIdentity()
- glEnable(GL_DEPTH_TEST) ' Тест глубины
- 'glDepthFunc(GL_LESS)
- glEnable(GL_ALPHA_TEST) ' Тест Альфа
- 'glAlphaFunc(GL_GREATER, 0.1)
- ' разрешаем смешение цветов
- glEnable(GL_BLEND)
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
- gluLookAt(0,0,20, 0,0,0, 0,1,0)
- ' glColor будет устанавливать
- ' свойства материала
- ' вам не надо дополнительно
- ' вызывать glMaterialfv
- 'glEnable(GL_COLOR_MATERIAL)
- ' разрешаем освещение
- 'glEnable(GL_LIGHTING)
- '// включаем нулевую лампу
- 'glEnable(GL_LIGHT0)
- ' устанавливаем положение нулевой лампы
- 'glLightfv(GL_LIGHT0, GL_POSITION, @ppos(0))
- 'glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, @pdir(0))
- ' Длина стороны куба
- Dim CubeLength As Single = 1 + Rnd()
- Dim CubeScaler As Single = 1
- ' Скалеры по координатам вершины куба
- Dim ScaleX As Single = (-1)^(CInt(Rnd*10)), ScaleY As Single = (-1)^(CInt(Rnd*10)), ScaleZ As Single = (-1)^(CInt(Rnd*10))
- Dim CubeX As Single = 2, CubeY As Single = 2, CubeZ As Single = 2
- ' Цвета граней куба
- Dim ScaleCubeColor(5, 3) As Single = Any
- Dim CubeColor(5, 3) As Single = Any
- For k As Integer = 0 To 5
- For i As Integer = 0 To 2
- ScaleCubeColor(k, i) = (-1)^(CInt(Rnd*10))
- CubeColor(k, i) = Rnd()
- Next i
- Next k
- For i As Integer = 0 To 5
- CubeColor(i, 3) = 0.89
- ScaleCubeColor(i, 3) = (-1)^(CInt(Rnd*10))
- Next i
- Do
- glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT)
- ' Рисую куб
- DrawCube(CubeLength, CubeColor(0, 0), CubeColor(0, 1), CubeColor(0, 2),CubeColor(0, 3), CubeColor(1, 0), CubeColor(1, 1), CubeColor(1, 2),CubeColor(1, 3), CubeColor(2, 0), CubeColor(2, 1), CubeColor(2, 2),CubeColor(2, 3), CubeColor(3, 0), CubeColor(3, 1), CubeColor(3, 2),CubeColor(3, 3), CubeColor(4, 0), CubeColor(4, 1), CubeColor(4, 2),CubeColor(4, 3), CubeColor(5, 0), CubeColor(5, 1), CubeColor(5, 2), CubeColor(5, 3))
- ' Вращаю сцену
- glRotatef(ScaleX * ScaleY * ScaleZ * 0.5, CubeColor(0, 0), CubeColor(0, 1), CubeColor(0, 2))
- ' Сдвигаю сцену (параллельный перенос)
- glTranslatef(ScaleX * 0.009, ScaleY * 0.009, ScaleZ * 0.009)
- ' Вычисление вектора переноса сцены
- ScaleX = CalculateScaler(CubeX, -10, 5, ScaleX)
- CubeX += ScaleX * 0.009
- ScaleY = CalculateScaler(CubeY, -10, 5, ScaleY)
- CubeY += ScaleY * 0.009
- ScaleZ = CalculateScaler(CubeZ, -10, 5, ScaleZ)
- CubeZ += ScaleZ * 0.009
- ' Изменяю цвета куба
- For k As Integer = 0 To 5
- For i As Integer = 0 To 2
- CubeColor(k, i) += ScaleCubeColor(k, i) * 0.005
- ScaleCubeColor(k, i) = CalculateScaler(CubeColor(k, i), 0, 1, ScaleCubeColor(k, i))
- Next i
- Next k
- For i As Integer = 0 To 5
- CubeColor(i, 3) += ScaleCubeColor(i, 3) * 0.005
- ScaleCubeColor(i, 3) = CalculateScaler(CubeColor(i, 3), 0.7, 1, ScaleCubeColor(i, 3))
- Next i
- ' Вычисляю размеры куба
- CubeScaler = CalculateScaler(CubeLength, 0.1, 10, CubeScaler)
- CubeLength += CubeScaler * 0.01
- 'glFlush()
- Flip()
- ' Задержку нужно вычислять отдельно
- Sleep(10)
- Loop Until MultiKey(FB.SC_ESCAPE)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement