List <WDetailSingleRowViewModel> IPropertyTypeCustomization.CustomizeHeader(PropertyInfo property, string display_name, bool is_editable, object source) { WTransformControl pos_ctrl = new WTransformControl(); WTransformControl scale_ctrl = new WTransformControl(); WTransformControl rot_ctrl = new WTransformControl(); WTransform transform = property.GetValue(source) as WTransform; Binding pos_bind = new Binding("Position") { Source = transform, Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; pos_ctrl.SetBinding(WTransformControl.Vector3Property, pos_bind); WDetailSingleRowViewModel pos_row = new WDetailSingleRowViewModel("Position"); pos_row.PropertyControl = pos_ctrl; WDetailSingleRowViewModel rot_row = new WDetailSingleRowViewModel("Rotation"); rot_row.PropertyControl = rot_ctrl; WDetailSingleRowViewModel scale_row = new WDetailSingleRowViewModel("Scale"); scale_row.PropertyControl = scale_ctrl; return(new List <WDetailSingleRowViewModel>() { pos_row, rot_row, scale_row }); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var nodeJson = JObject.Load(reader); var actorName = (string)nodeJson["Name"]; SerializableDOMNode newNode; if (m_parent is WDOMLayeredGroupNode) { if (actorName == null) { return(null); } WDOMLayeredGroupNode layerNode = m_parent as WDOMLayeredGroupNode; string unlayedFourCC = layerNode.FourCC.ToString(); MapLayer layer = ChunkHeader.FourCCToLayer(ref unlayedFourCC); FourCC fourcc = FourCCConversion.GetEnumFromString(unlayedFourCC); Type newObjType = WResourceManager.GetTypeByName(actorName); if (newObjType == typeof(Actor)) { return(null); } newNode = (SerializableDOMNode)Activator.CreateInstance(newObjType, fourcc, m_world); newNode.Layer = layer; } else if (m_parent is WDOMGroupNode) { WDOMGroupNode groupNode = m_parent as WDOMGroupNode; FourCC fourcc = groupNode.FourCC; if (fourcc == FourCC.ACTR || fourcc == FourCC.SCOB || fourcc == FourCC.TRES) { return(null); } if (fourcc == FourCC.TGDR || fourcc == FourCC.TGSC || fourcc == FourCC.TGOB) { if (actorName == null) { return(null); } Type newObjType = WResourceManager.GetTypeByName(actorName); if (newObjType == typeof(Actor)) { return(null); } newNode = (SerializableDOMNode)Activator.CreateInstance(newObjType, fourcc, m_world); } else { Type newObjType = FourCCConversion.GetTypeFromEnum(groupNode.FourCC); newNode = (SerializableDOMNode)Activator.CreateInstance(newObjType, fourcc, m_world); } } else { return(null); } newNode.SetParent(m_parent); try { var wproperties = newNode.GetType().GetProperties().Where(prop => { CustomAttributeData[] custom_attributes = prop.CustomAttributes.ToArray(); CustomAttributeData wproperty_attribute = custom_attributes.FirstOrDefault(x => x.AttributeType.Name == "WProperty"); if (wproperty_attribute == null) { return(false); } CustomAttributeData jsonignore_attribute = custom_attributes.FirstOrDefault(x => x.AttributeType.Name == "JsonIgnoreAttribute"); if (jsonignore_attribute != null) { return(false); } return(true); }); foreach (var prop in wproperties) { JToken jsonValue = nodeJson[prop.Name]; if (jsonValue == null) { continue; } if (prop.PropertyType == typeof(WTransform)) { if (!(jsonValue is JObject)) { continue; } JObject jsonValueObject = (JObject)jsonValue; WTransform transform = prop.GetValue(newNode, null) as WTransform; if (transform != null) { if (jsonValueObject.ContainsKey("Position")) { var position = transform.Position; position.X = ((float?)jsonValueObject["Position"]["X"]).GetValueOrDefault(); position.Y = ((float?)jsonValueObject["Position"]["Y"]).GetValueOrDefault(); position.Z = ((float?)jsonValueObject["Position"]["Z"]).GetValueOrDefault(); transform.Position = position; } if (jsonValueObject.ContainsKey("Rotation")) { var rotation = transform.Rotation; rotation.X = ((float?)jsonValueObject["Rotation"]["X"]).GetValueOrDefault(); rotation.Y = ((float?)jsonValueObject["Rotation"]["Y"]).GetValueOrDefault(); rotation.Z = ((float?)jsonValueObject["Rotation"]["Z"]).GetValueOrDefault(); rotation.W = ((float?)jsonValueObject["Rotation"]["W"]).GetValueOrDefault(); transform.Rotation = rotation; } if (jsonValueObject.ContainsKey("LocalScale")) { var localScale = transform.LocalScale; localScale.X = ((float?)jsonValueObject["LocalScale"]["X"]).GetValueOrDefault(1.0f); localScale.Y = ((float?)jsonValueObject["LocalScale"]["Y"]).GetValueOrDefault(1.0f); localScale.Z = ((float?)jsonValueObject["LocalScale"]["Z"]).GetValueOrDefault(1.0f); transform.LocalScale = localScale; } } } else if (prop.PropertyType == typeof(MessageReference)) { ushort messageID = (ushort)jsonValue; MessageReference msgRef = new MessageReference(messageID); prop.SetValue(newNode, msgRef); } else if (prop.PropertyType == typeof(Path_v2)) { int pathIndex = (int)jsonValue; WDOMNode cur_object = m_parent; while (cur_object.Parent != null) { cur_object = cur_object.Parent; } List <Path_v2> pathsList = cur_object.GetChildrenOfType <Path_v2>(); if (pathIndex < 0) { prop.SetValue(newNode, null); } else if (pathIndex < pathsList.Count) { Path_v2 path = pathsList[pathIndex]; prop.SetValue(newNode, path); } } else if (prop.PropertyType == typeof(ExitData)) { int exitIndex = (int)jsonValue; WScene scene; CustomAttributeData[] custom_attributes = prop.CustomAttributes.ToArray(); CustomAttributeData wproperty_attribute = custom_attributes.FirstOrDefault(x => x.AttributeType.Name == "WProperty"); SourceScene source_scene = (SourceScene)wproperty_attribute.ConstructorArguments[4].Value; if (source_scene == SourceScene.Stage) { scene = m_world.Map.SceneList.First(x => x.GetType() == typeof(WStage)) as WScene; } else { WDOMNode cur_object = m_parent; while (cur_object.Parent != null) { cur_object = cur_object.Parent; } scene = cur_object as WScene; } List <ExitData> exitsList = scene.GetChildrenOfType <ExitData>(); if (exitIndex < 0) { prop.SetValue(newNode, null); } else if (exitIndex < exitsList.Count) { ExitData exit = exitsList[exitIndex]; prop.SetValue(newNode, exit); } } else if (prop.PropertyType == typeof(MapEvent)) { int eventIndex = (int)jsonValue; WStage stage = m_world.Map.SceneList.First(x => x.GetType() == typeof(WStage)) as WStage; List <MapEvent> eventsList = stage.GetChildrenOfType <MapEvent>(); if (eventIndex < 0) { prop.SetValue(newNode, null); } else if (eventIndex < eventsList.Count) { MapEvent evnt = eventsList[eventIndex]; prop.SetValue(newNode, evnt); } } else { var value = Convert.ChangeType(jsonValue, prop.PropertyType); if (value != null) { prop.SetValue(newNode, value); } } } newNode.PostLoad(); return(newNode); } catch (Exception e) { // Creating the entity failed, so remove it from the scene. newNode.SetParent(null); throw; } }
public void Render(WSceneView view, WTransform global_transform) { Matrix4 model_matrix = Matrix4.Identity; m_Model.Render(view.ViewMatrix, view.ProjMatrix, model_matrix); }