Ed_
f76ba4e9ba
There is now a 2D camera in the workspace! We have a basic 'Frame' definition. It doesn't have any interaction yet... I started to define spacial math, mostly for doing conversion and getting a grounding on pixel/points/cm reference. The world space is in cm.
99 lines
2.8 KiB
Odin
99 lines
2.8 KiB
Odin
package sectr
|
|
|
|
import "core:encoding/json"
|
|
import "core:fmt"
|
|
import "core:os"
|
|
import "core:strings"
|
|
|
|
Serializer_Version :: 1
|
|
Serializer_Loading :: false
|
|
|
|
ArchiveData :: struct {
|
|
data : [] byte,
|
|
version : i32,
|
|
}
|
|
|
|
archive_init_temp :: proc () -> ^ ArchiveData {
|
|
archive := new( ArchiveData, context.temp_allocator )
|
|
archive.version = Serializer_Version
|
|
return archive
|
|
}
|
|
|
|
state_serialize :: proc ( archive : ^ ArchiveData = nil ) {
|
|
// TODO(Ed): We'll need this for a better save/load snapshot setup.
|
|
}
|
|
|
|
project_serialize :: proc ( project : ^ Project, archive : ^ ArchiveData, is_writting : b32 = true )
|
|
{
|
|
options : json.Marshal_Options
|
|
options.spec = json.Specification.MJSON
|
|
options.indentation = 2
|
|
options.pretty = true
|
|
options.use_spaces = false
|
|
|
|
if is_writting
|
|
{
|
|
marshal_archive : struct {
|
|
version : i32,
|
|
project : Project
|
|
}
|
|
marshal_archive.version = archive.version
|
|
marshal_archive.project = project^
|
|
// TODO(Ed): In the future this will be more complicated, as serialization of workspaces and the code database won't be trivial
|
|
|
|
json_data, marshal_code := json.marshal( marshal_archive, options, allocator = context.temp_allocator )
|
|
verify( marshal_code != json.Marshal_Data_Error.None, "Failed to marshal the project to JSON" )
|
|
|
|
archive.data = json_data
|
|
}
|
|
else
|
|
{
|
|
parsed_json, parse_code := json.parse( archive.data, json.Specification.MJSON, allocator = context.temp_allocator )
|
|
verify( parse_code != json.Error.None, "Failed to parse project JSON")
|
|
|
|
archive_json := parsed_json.(json.Object)
|
|
archive_version : i32 = cast(i32) archive_json["version"].(json.Float)
|
|
verify( Serializer_Version != archive_version, "Version mismatch on archive!" )
|
|
|
|
project_json := archive_json["project"].(json.Object)
|
|
project.name = project_json["name"].(json.String)
|
|
|
|
// TODO(Ed) : Make this a separate proc
|
|
workspace_json := project_json["workspace"].(json.Object)
|
|
project.workspace.name = workspace_json["name"].(json.String)
|
|
|
|
// DEBUG DUD
|
|
options.use_spaces = false
|
|
}
|
|
}
|
|
|
|
project_save :: proc ( project : ^ Project, archive : ^ ArchiveData = nil )
|
|
{
|
|
archive := archive
|
|
if archive == nil {
|
|
archive = archive_init_temp()
|
|
}
|
|
project_serialize( project, archive )
|
|
|
|
if ! os.is_dir( project.path ) {
|
|
os.make_directory( project.path )
|
|
verify( ! os.is_dir( project.path ), "Failed to create project path for saving" )
|
|
}
|
|
|
|
os.write_entire_file( fmt.tprint( project.path, project.name, ".sectr_proj", sep = ""), archive.data )
|
|
}
|
|
|
|
project_load :: proc ( path : string, project : ^ Project, archive : ^ ArchiveData = nil )
|
|
{
|
|
archive := archive
|
|
if archive == nil {
|
|
archive = archive_init_temp()
|
|
}
|
|
|
|
data, read_code := os.read_entire_file( path, context.temp_allocator )
|
|
verify( ! read_code, "Failed to read from project file" )
|
|
|
|
archive.data = data
|
|
project_serialize( project, archive, Serializer_Loading )
|
|
}
|