AppTitle "Load/Save Demonstration by CAESAR GAMES"

;------------------------------------------------------------
; -----"Load/Save Demonstration by CAESAR GAMES"----------
;---------www.caesararts.com-----------------------------
;---------caesar@caesararts.com------------------------
;---------Programming: CAESAR------------------------------
;----------23.12.2006----------------------------------------
;------------------------------------------------------------
;-------- The special gratitude:-------------------------------
;------ ANDREYman (avothuy@yandex.ru)----------------------
;---for functions AEntityScaleX#(Entity), AEntityScaleY#(Entity)
;-----AEntityScaleZ#(Entity)----------------------------------
;-------------------------------------------------------------
; Это демонстрационная система сохранения/загрузки параметров ваших моделей
; Управление демонстрацией:
; F5 - Сохранить в файл
; F6 - Загрузить из файла"
; Скроллинг мыши - Выбор объекта (Куб, сфера, цилиндр)
; Кнопка мыши 1 - Вставить объект
; R - Очистить поле (удалить все объекты из вида)
;----------------------------------------------------------------
;----------- Примечание ------------------------------------------
; В примере функции SaveMap и LoadMap используются не полностью
; здесь мы используем только координаты объекта, сами же функции
; еще "умеют" сохранять размер объекта и его наклон по 3 осям.
;-----------------------------------------------------------------

; Создаем тип первого объекта он у нас будет КУБ
Type TObject0
Field entity
Field pos_x#
Field pos_y#
Field pos_z#
Field scl_x#
Field scl_y#
Field scl_z#
Field rot_x#
Field rot_y#
Field rot_z#
End Type
; Создаем тип второго объекта он будет СФЕРА
Type TObject1
Field entity
Field pos_x#
Field pos_y#
Field pos_z#
Field scl_x#
Field scl_y#
Field scl_z#
Field rot_x#
Field rot_y#
Field rot_z#
End Type
; И тип третьего объекта, ЦИЛИНДР
Type TObject2
Field entity
Field pos_x#
Field pos_y#
Field pos_z#
Field scl_x#
Field scl_y#
Field scl_z#
Field rot_x#
Field rot_y#
Field rot_z#
End Type

; Выбор объекта сути не имеет, простые объекты взяты для наглядности,
; просто все объекты в вашем мире имеют координаты X,Y,Z, размер объекта,
; и углы по всем трем осям

; Инициализируем графику
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
; Команда скрывающая курсор мышки в нашем окне
HidePointer
; SELECTING переменная показывающая номер выбранного объекта, по умолчанию 1
Global SELECTING=1
; Создаем камеру
Global camera=CreateCamera()
CameraClsColor camera,0,94,138
PositionEntity camera,60,100,-50
RotateEntity camera,40,0,0
; Свет
AmbientLight 205,205,205
; Создаем ПЛАН - поверхность на которой у нас будут располагаться объекты
plane=CreateTerrain(128)
EntityColor plane,255,128,64
; Объекты мы будем ставить CameraPick поэтому укажем свойство для ПЛАНА, 2 означает что тип пика полигональный
EntityPickMode plane,2

; Начало главного цикла
Repeat
; Считываем поворот колесика мыши (скроллинг)
Select MouseZSpeed ()
Case -1:SELECTING=SELECTING+1 ; Вверх - прибавляем
Case 1:SELECTING=SELECTING-1 ; Вниз - отнимаем
End Select

If SELECTING>3 SELECTING=3; Объектов всего 3 поэтому делаем ограничение до 3 максимум
If SELECTING<1 SELECTING=1; И 1, минимальный номер переменной

If MouseHit(1) campick=CameraPick(camera,MouseX(),MouseY()); Если нажата клавиша мышки 1, пикаем камерой в координатах MouseX(),MouseY()
If campick<>0 Then ; Если переменная campick отличается от 0, значит мы попали в нашем примере по ПЛАНУ
Select SELECTING ; и в зависимости от номера переменной ставим объект в координатах ПИКА
Case 1:CreateObject_1(PickedX#(),PickedY#(),PickedZ#(),
0,0,0,5,5,5)
Case 2:CreateObject_2(PickedX#(),PickedY#(),PickedZ#(),
0,0,0,5,5,5)
Case 3:CreateObject_3(PickedX#(),PickedY#(),PickedZ#(),
0,0,0,5,5,5)
End Select
campick=0 ; Объект поставили, обнуляем переменную campick
EndIf

If KeyHit(63) SaveMap("test.map"); Если нажата клавиша F5 значит сохраняем координаты наших объектов в файл test.map
If KeyHit(64) Then ; Если нажата F6 значит загружаем объекты из файла test.map, предварительно удалив их из текущего мира
For A0.TObject0 = Each TObject0
FreeEntity A0\Entity:Delete A0
Next
For A1.TObject1 = Each TObject1
FreeEntity A1\Entity:Delete A1
Next
For A2.TObject2 = Each TObject2
FreeEntity A2\Entity:Delete A2
Next
LoadMap("test.map")
EndIf

If KeyHit(19) Then ; Если нажата клавиша R значит просто удаляем (очищаем) все наши объекты
For A0.TObject0 = Each TObject0
FreeEntity A0\Entity:Delete A0
Next
For A1.TObject1 = Each TObject1
FreeEntity A1\Entity:Delete A1
Next
For A2.TObject2 = Each TObject2
FreeEntity A2\Entity:Delete A2
Next
EndIf
; Обновляем и рендерим наш мир
UpdateWorld
RenderWorld

Color 255,255,255:Text MouseX(),MouseY(),"><",1,1 ; Выводим курсор в координатах мыши белым цветом
; В зависимости от номера переменной SELECTING мы принимаем текстовое значение для переменной SELECTING_TEXT$
Select SELECTING
Case 1:SELECTING_TEXT$="Cube"
Case 2:SELECTING_TEXT$="Sphere"
Case 3:SELECTING_TEXT$="Cylinder"
End Select

; Выводим текстовую информацию
Text 10,10,"Object selecting: "+SELECTING_TEXT$
Text 10,30, "F5 - Save map"
Text 10,50, "F6 - Load map"
Text 10,70, "Mouse Scroll - Change object"
Text 10,90, "Mouse 1 - Build object"
Text 10,110, "R - Clear plane"

Flip
Until KeyHit(1)
; Конец цикла

; Функция создания первого объекта 0 в типе он у нас TObject0, создается куб
Function CreateObject_1(x#,y#,z#,p#,yw#,r#,sx#,sy#,sz#)
A0.TObject0 = New TObject0
A0\Entity=CreateCube()
EntityColor A0\Entity,255,255,128
A0\scl_x#=sx#
A0\scl_y#=sy#
A0\scl_z#=sz#
A0\pos_x#=x#
A0\pos_y#=y#
A0\pos_z#=z#
A0\rot_x#=p#
A0\rot_y#=yw#
A0\rot_z#=r#
ScaleEntity A0\Entity,A0\scl_x#,A0\scl_y#,A0\scl_z#
PositionEntity A0\Entity,A0\pos_x,A0\pos_y,A0\pos_z
RotateEntity A0\Entity,A0\rot_x#,A0\rot_y#,A0\rot_z#
End Function
; Функция создания второго объекта 1 в типе он у нас TObject1, создается сфера
Function CreateObject_2(x#,y#,z#,p#,yw#,r#,sx#,sy#,sz#)
A1.TObject1 = New TObject1
A1\Entity=CreateSphere()
EntityColor A1\Entity,255,255,128
A1\scl_x#=sx#
A1\scl_y#=sy#
A1\scl_z#=sz#
A1\pos_x#=x#
A1\pos_y#=y#
A1\pos_z#=z#
A1\rot_x#=p#
A1\rot_y#=yw#
A1\rot_z#=r#
ScaleEntity A1\Entity,A1\scl_x#,A1\scl_y#,A1\scl_z#
PositionEntity A1\Entity,A1\pos_x,A1\pos_y,A1\pos_z
RotateEntity A1\Entity,A1\rot_x#,A1\rot_y#,A1\rot_z#
End Function
; Функция создания третьего объекта 2 в типе он у нас TObject2, создается цилиндр
Function CreateObject_3(x#,y#,z#,p#,yw#,r#,sx#,sy#,sz#)
A2.TObject2 = New TObject2
A2\Entity=CreateCylinder()
EntityColor A2Entity,255,255,128
A2\scl_x#=sx#
A2\scl_y#=sy#
A2\scl_z#=sz#
A2\pos_x#=x#
A2\pos_y#=y#
A2\pos_z#=z#
A2\rot_x#=p#
A2\rot_y#=yw#
A2\rot_z#=r#
ScaleEntity A2\Entity,A2\scl_x#,A2\scl_y#,A2\scl_z#
PositionEntity A2\Entity,A2\pos_x,A2\pos_y,A2\pos_z
RotateEntity A2\Entity,A2\rot_x#,A2\rot_y#,A2\rot_z#
End Function

; Собственно сама функция сохранения, мы поочереди пролистываем каждый объект в типе
; считываем из этого объекта нужные нам переменные и записываем в файл, также в файл
; записывается ТИП объекта (точнее его номер например куб номер 1)

Function SaveMap(filename$)
filesavemap=WriteFil e (filename$)
For A0.TObject0 = Each TObject0
WriteLine (filesavemap,"Object 1")
WriteLine (filesavemap,EntityX#(A0\Entity))
WriteLine (filesavemap,EntityY#(A0\Entity))
WriteLine (filesavemap,EntityZ#(A0\Entity))
WriteLine (filesavemap,EntityPitch#(A0\Entity))
WriteLine (filesavemap,EntityYaw#(A0\Entity))
WriteLine (filesavemap,EntityRoll#(A0\Entity))
WriteLine (filesavemap,AEntityScaleX#(A0\Entity))
WriteLine (filesavemap,AEntityScaleY#(A0\Entity))
WriteLine (filesavemap,AEntityScaleZ#(A0\Entity))
Next
For A1.TObject1 = Each TObject1
WriteLine (filesavemap,"Object 2")
WriteLine (filesavemap,EntityX#(A1\Entity))
WriteLine (filesavemap,EntityY#(A1\Entity))
WriteLine (filesavemap,EntityZ#(A1\Entity))
WriteLine (filesavemap,EntityPitch#(A1\Entity))
WriteLine (filesavemap,EntityYaw#(A1\Entity))
WriteLine (filesavemap,EntityRoll#(A1\Entity))
WriteLine (filesavemap,AEntityScaleX#(A1\Entity))
WriteLine (filesavemap,AEntityScaleY#(A1\Entity))
WriteLine (filesavemap,AEntityScaleZ#(A1\Entity))
Next
For A2.TObject2 = Each TObject2
WriteLine (filesavemap,"Object 3")
WriteLine (filesavemap,EntityX#(A2\Entity))
WriteLine (filesavemap,EntityY#(A2\Entity))
WriteLine (filesavemap,EntityZ#(A2\Entity))
WriteLine (filesavemap,EntityPitch#(A2\Entity))
WriteLine (filesavemap,EntityYaw#(A2\Entity))
WriteLine (filesavemap,EntityRoll#(A2\Entity))
WriteLine (filesavemap,AEntityScaleX#(A2\Entity))
WriteLine (filesavemap,AEntityScaleY#(A2\Entity))
WriteLine (filesavemap,AEntityScaleZ#(A2\Entity))
Next
CloseFile (filesavemap)
End Function

; Функция загрузки противоположна и одновременно похожа на функцию сохранения
; здесь мы прочитываем файл, считываем тип объекта и его координаты, после
; мы узнаем что это за объект и передаем ему координаты из файла, тем самым
; объект попадает на то место где (он был) его сохранили
Function LoadMap(filename$)
fileloadmap=OpenFile(filename$)
If fileloadmap<>0 Then
While Not Eof(fileloadmap)
Line0$=ReadLine(fileloadmap)
Line1$=ReadLine(fileloadmap)
Line2$=ReadLine(fileloadmap)
Line3$=ReadLine(fileloadmap)
Line4$=ReadLine(fileloadmap)
Line5$=ReadLine(fileloadmap)
Line6$=ReadLine(fileloadmap)
Line7$=ReadLine(fileloadmap)
Line8$=ReadLine(fileloadmap)
Line9$=ReadLine(fileloadmap)
Select Right$(Line0$,1)
Case "1" :CreateObject_1(Line1,Line2,Line3,Line4,Line5,Line
6,Line7,Line8,Line9)
Case "2" :CreateObject_2(Line1,Line2,Line3,Line4,Line5,Line
6,Line7,Line8,Line9)
Case "3" :CreateObject_3(Line1,Line2,Line3,Line4,Line5,Line
6,Line7,Line8,Line9)
End Select
Wend
CloseFile (fileloadmap)
EndIf
End Function

; Функции которые возвращают размер нашего объекта, это необходимо если вы изменяете его размер например
; в редакторе карт, камни которые вы ставите на карту должны иметь разный размер, вы его меняете а функция
; его сохраняет

Function AEntityScaleX#(Entity)

S_Componentx# = GetMatElement(Entity, 0, 0)
S_Componenty# = GetMatElement(Entity, 0, 1)
S_Componentz# = GetMatElement(Entity, 0, 2)
Return Sqr(S_Componentx#*S_Componentx# + S_Componenty#*S_Componenty# + S_Componentz#*S_Componentz#)

End Function

Function AEntityScaley#(Entity)

S_Componentx# = GetMatElement(Entity, 1, 0)
S_Componenty# = GetMatElement(Entity, 1, 1)
S_Componentz# = GetMatElement(Entity, 1, 2)
Return Sqr(S_Componentx#*S_Componentx# + S_Componenty#*S_Componenty# + S_Componentz#*S_Componentz#)

End Function

Function AEntityScalez#(Entity)

S_Componentx# = GetMatElement(Entity, 2, 0)
S_Componenty# = GetMatElement(Entity, 2, 1)
S_Componentz# = GetMatElement(Entity, 2, 2)
Return Sqr(S_Componentx#*S_Componentx# + S_Componenty#*S_Componenty# + S_Componentz#*S_Componentz#)

End Function
(Visited 89 times, 1 visits today)