Skip to main content

BrdbSchemaGlobalData

Struct BrdbSchemaGlobalData 

Source
pub struct BrdbSchemaGlobalData {
    pub entity_type_names: IndexSet<String>,
    pub entity_data_class_names: IndexSet<String>,
    pub basic_brick_asset_names: IndexSet<String>,
    pub procedural_brick_asset_names: IndexSet<String>,
    pub material_asset_names: IndexSet<String>,
    pub component_type_names: IndexSet<String>,
    pub component_data_struct_names: Vec<String>,
    pub component_wire_port_names: IndexSet<String>,
    pub external_asset_types: HashSet<String>,
    pub external_asset_references: IndexSet<(String, String)>,
    pub global_grid_entity_type_index: i32,
}

Fields§

§entity_type_names: IndexSet<String>§entity_data_class_names: IndexSet<String>§basic_brick_asset_names: IndexSet<String>§procedural_brick_asset_names: IndexSet<String>§material_asset_names: IndexSet<String>§component_type_names: IndexSet<String>§component_data_struct_names: Vec<String>§component_wire_port_names: IndexSet<String>§external_asset_types: HashSet<String>

Internal set for type checking, not used in the BRDB.

§external_asset_references: IndexSet<(String, String)>§global_grid_entity_type_index: i32

Index into entity_type_names for the BP_BrickGrid_Global_C entity type, or -1 if the save has no global grid.

Implementations§

Source§

impl BrdbSchemaGlobalData

Source

pub fn add_brick_meta(&mut self, brick: &Brick)

Source

pub fn get_struct_name(&self, type_name: &str) -> Option<&str>

Source

pub fn get_entity_class_name(&self, type_name: &str) -> Option<&str>

Source

pub fn get_port_index(&self, port_name: &str) -> Option<u16>

Source

pub fn get_component_type_index(&self, type_name: &str) -> Option<u16>

Source

pub fn has_component_type(&self, type_name: &str) -> bool

Source

pub fn add_entity_type(&mut self, type_name: &str)

Source

pub fn add_entity_type_with_class(&mut self, type_name: &str, class_name: &str)

Register an entity type with its explicit data-class name. Keeps entity_type_names and entity_data_class_names parallel as the saved-world format requires.

Source

pub fn basic_brick_asset_by_index( &self, index: usize, ) -> Result<BString, BrdbSchemaError>

Source

pub fn procedural_brick_asset_by_index( &self, index: usize, ) -> Result<BString, BrdbSchemaError>

Source

pub fn material_asset_by_index( &self, index: usize, ) -> Result<BString, BrdbSchemaError>

Source

pub fn proc_brick_starting_index(&self) -> u32

proc_brick_starting_index needs to exist because the type ids of brick assets are stored in the GlobalData, and the type ids of procedural bricks are assigned starting from the end of the basic brick asset names.

When new brick assets are added, the length of the basic brick asset names will increase, and the type ids of procedural bricks in older chunks will not match the new basic brick asset names.

This offset allows older chunks to properly load, assuming the global data does not change the order of brick asset names (by external tools)

Examples found in repository?
examples/world_move_bricks.rs (line 43)
5fn main() -> Result<(), Box<dyn std::error::Error>> {
6    let path = PathBuf::from("world.brdb");
7    let dst = PathBuf::from("world_patched.brdb");
8
9    println!("Warning - This code will break if the brick chunk struct changes!!");
10
11    let db = Brdb::open(path)?.into_reader();
12
13    let data = db.global_data()?;
14    let mut grid = UnsavedGrid::default();
15
16    let mut total_bricks = 0;
17    for chunk in db.brick_chunk_index(1)? {
18        for brick in db
19            .brick_chunk_soa(1, chunk.index)?
20            .iter_bricks(chunk.index, data.clone())
21        {
22            // If we wanted wires/components, we'd need to track the bricks here by their chunk index and brick index
23            total_bricks += 1;
24
25            let mut brick = brick?;
26            brick.position += Position::new(3000, 0, 0);
27            grid.add_brick(data.as_ref(), &brick);
28        }
29
30        if chunk.num_components > 0 {
31            println!("sorry, this example doesn't handle components");
32        }
33        if chunk.num_wires > 0 {
34            println!("sorry, this example doesn't handle wires");
35        }
36    }
37    println!("{total_bricks} bricks");
38
39    let mut pending = db.to_pending()?;
40
41    // Replace the main grid (1) with the grid we created
42    *pending.cd_mut("World/0/Bricks/Grids/1")? = grid.to_pending(
43        data.proc_brick_starting_index(),
44        db.components_schema()?.as_ref(),
45    )?;
46
47    if dst.exists() {
48        std::fs::remove_file(&dst)?;
49    }
50    Brdb::new(&dst)?.write_pending("Move the bricks", pending)?;
51
52    // Verify bricks can be read
53    let db = Brdb::open(dst)?.into_reader();
54    for chunk in db.brick_chunk_index(1)? {
55        let _ = db.brick_chunk_soa(1, chunk.index)?;
56    }
57
58    Ok(())
59}

Trait Implementations§

Source§

impl AsBrdbValue for BrdbSchemaGlobalData

Source§

fn as_brdb_struct_prop_value( &self, schema: &BrdbSchema, _struct_name: BrdbInterned, prop_name: BrdbInterned, ) -> Result<&dyn AsBrdbValue, BrdbSchemaError>

Read a specific struct property value from the schema.
Source§

fn as_brdb_struct_prop_array( &self, schema: &BrdbSchema, _struct_name: BrdbInterned, prop_name: BrdbInterned, ) -> Result<BrdbArrayIter<'_>, BrdbSchemaError>

Get the the number of entries in a struct property.
Source§

fn as_brdb_bool(&self) -> Result<bool, BrdbSchemaError>

Source§

fn as_brdb_u8(&self) -> Result<u8, BrdbSchemaError>

Source§

fn as_brdb_u16(&self) -> Result<u16, BrdbSchemaError>

Source§

fn as_brdb_u32(&self) -> Result<u32, BrdbSchemaError>

Source§

fn as_brdb_u64(&self) -> Result<u64, BrdbSchemaError>

Source§

fn as_brdb_i8(&self) -> Result<i8, BrdbSchemaError>

Source§

fn as_brdb_i16(&self) -> Result<i16, BrdbSchemaError>

Source§

fn as_brdb_i32(&self) -> Result<i32, BrdbSchemaError>

Source§

fn as_brdb_i64(&self) -> Result<i64, BrdbSchemaError>

Source§

fn as_brdb_f32(&self) -> Result<f32, BrdbSchemaError>

Source§

fn as_brdb_f64(&self) -> Result<f64, BrdbSchemaError>

Source§

fn as_brdb_str(&self) -> Result<&str, BrdbSchemaError>

Source§

fn as_brdb_asset( &self, _schema: &BrdbSchema, _ty: &str, ) -> Result<Option<usize>, BrdbSchemaError>

Source§

fn as_brdb_enum( &self, _schema: &BrdbSchema, _def: &BrdbSchemaEnum, ) -> Result<i32, BrdbSchemaError>

Source§

fn as_brdb_wire_variant(&self) -> Result<WireVariant, BrdbSchemaError>

Source§

fn as_brdb_wire_array_variant( &self, ) -> Result<WireArrayVariant, BrdbSchemaError>

Source§

fn as_brdb_wire_map_variant(&self) -> Result<WireMapVariant, BrdbSchemaError>

Source§

fn as_brdb_variant_member(&self) -> Option<&str>

When this value should encode as a named member of a schema variant (a tagged union whose members are structs, e.g. BRInventoryEntryVariant -> BRInventoryEntryNothing), return the member struct’s name. The writer emits uint(tag) + <that struct>. None (the default) means “not a struct-member variant” and the writer falls back to the wire map/array/scalar variant paths.
Source§

fn has_brdb_struct_prop( &self, _schema: &BrdbSchema, _struct_name: BrdbInterned, _prop_name: BrdbInterned, ) -> bool

Cheap presence probe for a struct property. When this returns false, the schema writer takes the default/zero path directly instead of paying for a MissingStructField error (two String allocations) per unset field. Implementations that can’t answer cheaply keep the default true; the writer then falls back to the erroring accessors below.
Source§

fn as_brdb_struct_prop_map( &self, _schema: &BrdbSchema, _struct_name: BrdbInterned, _prop_name: BrdbInterned, ) -> Result<BrdbMapIter<'_>, BrdbSchemaError>

Get the the number of entries in a struct property.
Source§

impl Clone for BrdbSchemaGlobalData

Source§

fn clone(&self) -> BrdbSchemaGlobalData

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BrdbSchemaGlobalData

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for BrdbSchemaGlobalData

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for BrdbSchemaGlobalData

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for BrdbSchemaGlobalData

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.