avm2: Implement IndexBuffer3D.uploadFromByteArray

This commit is contained in:
Aaron Hill 2023-03-15 17:45:43 -05:00
parent 8b92b2cf7c
commit 24c7ca838b
1 changed files with 25 additions and 8 deletions

View File

@ -3,7 +3,6 @@ use crate::avm2::parameters::ParametersExt;
use crate::avm2::Activation; use crate::avm2::Activation;
use crate::avm2::Value; use crate::avm2::Value;
use crate::avm2::{Error, Object}; use crate::avm2::{Error, Object};
use crate::avm2_stub_method;
pub fn index_buffer_3d_allocator<'gc>( pub fn index_buffer_3d_allocator<'gc>(
_class: ClassObject<'gc>, _class: ClassObject<'gc>,
@ -14,14 +13,32 @@ pub fn index_buffer_3d_allocator<'gc>(
pub fn upload_from_byte_array<'gc>( pub fn upload_from_byte_array<'gc>(
activation: &mut Activation<'_, 'gc>, activation: &mut Activation<'_, 'gc>,
_this: Option<Object<'gc>>, this: Option<Object<'gc>>,
_args: &[Value<'gc>], args: &[Value<'gc>],
) -> Result<Value<'gc>, Error<'gc>> { ) -> Result<Value<'gc>, Error<'gc>> {
avm2_stub_method!( if let Some(index_buffer) = this.and_then(|this| this.as_index_buffer()) {
let byte_array = args.get_object(activation, 0, "byteArray")?;
let byte_array = byte_array
.as_bytearray()
.ok_or_else(|| Error::from("ArgumentError: Parameter must be a ByteArray"))?;
let byte_offset = args.get_u32(activation, 1)?;
let start_offset = args.get_u32(activation, 2)?;
let count = args.get_u32(activation, 3)?;
let data = byte_array
// Each index is always 16 bits (2 bytes)
.read_at(count as usize * 2, byte_offset as usize)
.map_err(|e| e.to_avm(activation))?
.to_vec();
index_buffer.context3d().upload_index_buffer_data(
index_buffer,
data,
start_offset as usize,
activation, activation,
"flash.display3D.IndexBuffer3D",
"uploadFromByteArray"
); );
}
Ok(Value::Undefined) Ok(Value::Undefined)
} }