avm1: Stub out ActionSetProperty
Rough impl of ActionSetProperty action. Not all properties implemented. Add DisplayObject::matrix_mut.
This commit is contained in:
parent
0ab20e01c1
commit
6c923930e6
|
@ -120,6 +120,7 @@ impl Avm1 {
|
||||||
Action::RemoveSprite => self.action_remove_sprite(context)?,
|
Action::RemoveSprite => self.action_remove_sprite(context)?,
|
||||||
Action::Return => self.action_return(context)?,
|
Action::Return => self.action_return(context)?,
|
||||||
Action::SetMember => self.action_set_member(context)?,
|
Action::SetMember => self.action_set_member(context)?,
|
||||||
|
Action::SetProperty => self.action_set_property(context)?,
|
||||||
Action::SetTarget(target) => self.action_set_target(context, &target)?,
|
Action::SetTarget(target) => self.action_set_target(context, &target)?,
|
||||||
Action::SetVariable => self.action_set_variable(context)?,
|
Action::SetVariable => self.action_set_variable(context)?,
|
||||||
Action::StackSwap => self.action_stack_swap(context)?,
|
Action::StackSwap => self.action_stack_swap(context)?,
|
||||||
|
@ -828,6 +829,29 @@ impl Avm1 {
|
||||||
unimplemented!("Action::SetMember");
|
unimplemented!("Action::SetMember");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn action_set_property(&mut self, context: &mut ActionContext) -> Result<(), Error> {
|
||||||
|
let value = self.pop()?.as_f64()? as f32;
|
||||||
|
let prop_index = self.pop()?.as_u32()? as usize;
|
||||||
|
let clip_path = self.pop()?;
|
||||||
|
let path = clip_path.as_string()?;
|
||||||
|
if let Some(clip) =
|
||||||
|
Avm1::resolve_slash_path(context.active_clip, context.root, path)
|
||||||
|
{
|
||||||
|
if let Some(clip) = clip.write(context.gc_context).as_movie_clip_mut() {
|
||||||
|
match prop_index {
|
||||||
|
0 => clip.set_x(value),
|
||||||
|
1 => clip.set_y(value),
|
||||||
|
2 => clip.set_x_scale(value),
|
||||||
|
3 => clip.set_y_scale(value),
|
||||||
|
_ => log::warn!("ActionSetProperty: Unimplemented property index {}", prop_index),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log::warn!("ActionSetProperty: Invalid path {}", path);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn action_set_variable(&mut self, context: &mut ActionContext) -> Result<(), Error> {
|
fn action_set_variable(&mut self, context: &mut ActionContext) -> Result<(), Error> {
|
||||||
// Flash 4-style variable
|
// Flash 4-style variable
|
||||||
let value = self.pop()?;
|
let value = self.pop()?;
|
||||||
|
|
|
@ -33,6 +33,9 @@ impl<'gc> DisplayObject<'gc> for DisplayObjectBase<'gc> {
|
||||||
fn matrix(&self) -> &Matrix {
|
fn matrix(&self) -> &Matrix {
|
||||||
&self.transform.matrix
|
&self.transform.matrix
|
||||||
}
|
}
|
||||||
|
fn matrix_mut(&mut self) -> &mut Matrix {
|
||||||
|
&mut self.transform.matrix
|
||||||
|
}
|
||||||
fn set_matrix(&mut self, matrix: &Matrix) {
|
fn set_matrix(&mut self, matrix: &Matrix) {
|
||||||
self.transform.matrix = *matrix;
|
self.transform.matrix = *matrix;
|
||||||
}
|
}
|
||||||
|
@ -76,6 +79,7 @@ pub trait DisplayObject<'gc>: 'gc + Collect {
|
||||||
|
|
||||||
fn transform(&self) -> &Transform;
|
fn transform(&self) -> &Transform;
|
||||||
fn matrix(&self) -> &Matrix;
|
fn matrix(&self) -> &Matrix;
|
||||||
|
fn matrix_mut(&mut self) -> &mut Matrix;
|
||||||
fn set_matrix(&mut self, matrix: &Matrix);
|
fn set_matrix(&mut self, matrix: &Matrix);
|
||||||
fn color_transform(&self) -> &ColorTransform;
|
fn color_transform(&self) -> &ColorTransform;
|
||||||
fn set_color_transform(&mut self, color_transform: &ColorTransform);
|
fn set_color_transform(&mut self, color_transform: &ColorTransform);
|
||||||
|
@ -136,6 +140,9 @@ macro_rules! impl_display_object {
|
||||||
fn matrix(&self) -> &crate::matrix::Matrix {
|
fn matrix(&self) -> &crate::matrix::Matrix {
|
||||||
self.$field.matrix()
|
self.$field.matrix()
|
||||||
}
|
}
|
||||||
|
fn matrix_mut(&mut self) -> &mut crate::matrix::Matrix {
|
||||||
|
self.$field.matrix_mut()
|
||||||
|
}
|
||||||
fn set_matrix(&mut self, matrix: &crate::matrix::Matrix) {
|
fn set_matrix(&mut self, matrix: &crate::matrix::Matrix) {
|
||||||
self.$field.set_matrix(matrix)
|
self.$field.set_matrix(matrix)
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,18 +118,34 @@ impl<'gc> MovieClip<'gc> {
|
||||||
self.matrix().tx
|
self.matrix().tx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_x(&mut self, val: f32) {
|
||||||
|
self.matrix_mut().tx = val;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn y(&self) -> f32 {
|
pub fn y(&self) -> f32 {
|
||||||
self.matrix().ty
|
self.matrix().ty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_y(&mut self, val: f32) {
|
||||||
|
self.matrix_mut().ty = val;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn x_scale(&self) -> f32 {
|
pub fn x_scale(&self) -> f32 {
|
||||||
self.matrix().a * 100.0
|
self.matrix().a * 100.0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_x_scale(&mut self, val: f32) {
|
||||||
|
self.matrix_mut().a = val / 100.0;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn y_scale(&self) -> f32 {
|
pub fn y_scale(&self) -> f32 {
|
||||||
self.matrix().d * 100.0
|
self.matrix().d * 100.0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_y_scale(&mut self, val: f32) {
|
||||||
|
self.matrix_mut().d = val / 100.0;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn current_frame(&self) -> FrameNumber {
|
pub fn current_frame(&self) -> FrameNumber {
|
||||||
self.current_frame
|
self.current_frame
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue