//============================================================ // <T>保存模板渲染信息。</T> // // @prama renderable 模板渲染信息 //============================================================ public void SaveRenderable(FDrTemplateRenderable renderable) { // 保存选项 renderable.OptionSelect = qdrOptionSelect.DataValue; renderable.OptionVisible = qdrOptionVisible.DataValue; renderable.OptionGround = qdrOptionGround.DataValue; }
//============================================================ // <T>选中显示项目。</T> // // @param item 显示项目 //============================================================ public void SelectItem(object item) { qdrMaterialProperty.Visible = false; qdrTemplateRenderableProperty.Visible = false; qdrTemplateMovieProperty.Visible = false; // 显示材质 if (item is FDrMaterialGroup) { FDrMaterialGroup material = item as FDrMaterialGroup; qdrMaterialProperty.Dock = DockStyle.Fill; qdrMaterialProperty.LoadMaterialGroup(material); qdrMaterialProperty.Visible = true; } // 显示渲染 if (item is FDrTemplateRenderable) { FDrTemplateRenderable renderable = item as FDrTemplateRenderable; qdrTemplateRenderableProperty.LoadRenderable(renderable); qdrTemplateRenderableProperty.Dock = DockStyle.Fill; qdrTemplateRenderableProperty.Visible = true; } // 显示动画 if (item is FDrTemplateAnimationMovie) { FDrTemplateAnimationMovie movie = item as FDrTemplateAnimationMovie; qdrTemplateMovieProperty.LoadMovie(movie); qdrTemplateMovieProperty.Dock = DockStyle.Fill; qdrTemplateMovieProperty.Visible = true; } }
//============================================================ // <T>加载模板渲染信息。</T> // // @prama renderable 模板渲染信息 //============================================================ public void LoadRenderable(FDrTemplateRenderable renderable) { // 设置属性 txtModelName.Text = renderable.ModelName; txtGeometryName.Text = renderable.GeometryName; txtMaterialName.Text = renderable.MaterialName; // 设置选项 qdrOptionSelect.DataValue = renderable.OptionSelect; qdrOptionVisible.DataValue = renderable.OptionVisible; qdrOptionGround.DataValue = renderable.OptionGround; }
//============================================================ public override void Serialize(IOutput output) { base.Serialize(output); // 存储属性 output.WriteInt8((sbyte)_optionLoaded); output.WriteInt8((sbyte)_optionSelect); output.WriteInt8((sbyte)_optionGround); output.WriteInt8((sbyte)_optionMergeVertex); output.WriteInt8((sbyte)_optionMergeMaterial); output.WriteInt8((sbyte)_optionLightMap); //............................................................ // 统计材质次数 FDictionary <int> materialsCount = new FDictionary <int>(); foreach (FDrTemplateRenderable renderable in _renderables) { int materialCount = 0; if (materialsCount.Contains(renderable.MaterialCode)) { materialCount = materialsCount.Get(renderable.MaterialCode); } materialCount++; materialsCount.Set(renderable.MaterialCode, materialCount); } //............................................................ // 存储渲染列表 int count = _renderables.Count; output.WriteInt16((short)count); for (int n = 0; n < count; n++) { FDrTemplateRenderable renderable = _renderables[n]; int materialCount = materialsCount.Get(renderable.MaterialCode); if (1 == materialCount) { renderable.OptionMerge = EDrFlag.No; } renderable.Id = n + 1; renderable.Serialize(output); } //............................................................ // 存储动画列表 if (_animation.IsEmpty) { output.WriteBool(false); } else { output.WriteBool(true); _animation.Serialize(output); } }
//============================================================ // <T>序列化数据。</T> //============================================================ public void Import() { string fileName = _directory + "\\model.m3x"; FXmlDocument xdoc = new FXmlDocument(fileName); FXmlNode xscene = xdoc.Root.Find("Scene"); // 重新导入所有集合体(可以重复) _renderables.Clear(); int n = 0; FXmlNode xmesh = xscene.Find("Mesh"); foreach (FXmlNode xgeometry in xmesh.Nodes) { if (xgeometry.IsName("Geometry")) { string name = xgeometry.Get("name"); string[] items = name.Split('|'); if (items.Length >= 2) { // 获得模型和集合体对象 string modelCode = items[0]; string geometryName = items[1]; FDrModel model = RContent3dManager.ModelConsole.Find(modelCode); if (null == model) { RMoCore.TrackConsole.Write(this, "Import", "Model is not exists. (model={0})", modelCode); continue; } model.Open(); FDrGeometry geometry = model.Mesh.Find(geometryName); if (null == geometry) { RMoCore.TrackConsole.Write(this, "Import", "Model geometry is not exists. (model={0}, geometry={1})", modelCode, geometryName); continue; } // 新建渲染对象 FDrTemplateRenderable renderable = new FDrTemplateRenderable(); renderable.Id = n++; renderable.Name = name; renderable.LightMapName = RString.Right(name, "|"); renderable.ModelName = model.Name; renderable.GeometryName = geometry.Name; renderable.MaterialName = geometry.MaterialName; renderable.LoadExportConfig(xgeometry); _renderables.Push(renderable); } } } _logger.Debug(this, "Import", "Import template success. (file_name={0})", fileName); Store(); }
//============================================================ // <T>存储配置信息。</T> // // @param config 配置信息 //============================================================ public void SaveConfig(FXmlNode xconfig) { // 设置信息 xconfig.Set("name", _name); xconfig.Set("label", _label); xconfig.Set("option_loaded", _optionLoaded); xconfig.Set("option_select", _optionSelect); xconfig.Set("option_ground", _optionGround); xconfig.Set("option_merge_vertex", _optionMergeVertex); xconfig.Set("option_merge_material", _optionMergeMaterial); xconfig.Set("option_light_map", _optionLightMap); //............................................................ // 存储渲染列表 if (!_renderables.IsEmpty) { FXmlNode xrenderables = xconfig.CreateNode("Renderables"); int count = _renderables.Count; xrenderables.Set("count", count); for (int n = 0; n < count; n++) { FDrTemplateRenderable renderable = _renderables[n]; if (renderable.Id == 0) { renderable.Id = n + 1; } renderable.SaveConfig(xrenderables.CreateNode("Renderable")); } } //............................................................ // 存储引用列表 if (!_references.IsEmpty) { FXmlNode xreferences = xconfig.CreateNode("References"); xreferences.Set("count", _references.Count); foreach (FDrTemplateReference reference in _references) { reference.SaveConfig(xreferences.CreateNode("Renderable")); } } //............................................................ // 存储引动画列表 FXmlNode xanimation = xconfig.CreateNode("Animation"); _animation.SaveConfig(xanimation); }
//============================================================ // <T>根据模块名称和几何体名称,获得渲染对象。</T> // // @param modelName 模块名称 // @param geometryName 几何体名称 // @return 渲染对象 //============================================================ public FDrTemplateRenderable SyncRenderable(string modelName, string geometryName) { // 查询渲染对象 if (!_renderables.IsEmpty) { foreach (FDrTemplateRenderable renderable in _renderables) { if (renderable.ModelName.Equals(modelName) && renderable.GeometryName.Equals(geometryName)) { return(renderable); } } } // 新建渲染对象 FDrTemplateRenderable newRenderable = new FDrTemplateRenderable(); newRenderable.ModelName = modelName; newRenderable.GeometryName = geometryName; _renderables.Push(newRenderable); return(newRenderable); }