public CharactersMenuLevel(FigureDefinition definition, FigureModel model) { var materialSetDict = definition.MaterialSetOptions.ToDictionary(item => item.Label, item => item); var shapesMenuLevel = new ShapesMenuLevel(definition, model); var materialsMenuLevel = new MaterialsMenuLevel(definition, model); var advancedMenuLevel = new StaticMenuLevel( new SubLevelMenuItem("Shape", shapesMenuLevel), new SubLevelMenuItem("Skin", materialsMenuLevel) ); var detailsMenuLevel = new MaterialSetVariantsMenuLevel(definition, model); items = new List <IMenuItem> { }; items.Add(new SubLevelMenuItem("Mix & Match", advancedMenuLevel)); items.Add(new SubLevelMenuItem("Character Details", detailsMenuLevel)); foreach (var shape in definition.ShapeOptions) { if (materialSetDict.TryGetValue(shape.Label, out var materialSet)) { items.Add(new CharacterMenuItem(model, shape, materialSet)); } } }
public Scene(IArchiveDirectory dataDir, Device device, ShaderCache shaderCache, StandardSamplers standardSamplers, TrackedDeviceBufferManager trackedDeviceBufferManager, ControllerManager controllerManager) { var textureCache = new TextureCache(device); toneMappingSettings = new ToneMappingSettings(); iblEnvironment = new ImageBasedLightingEnvironment(device, standardSamplers, dataDir, InitialSettings.Environment, InitialSettings.EnvironmentRotation); backdrop = new Backdrop(device, shaderCache); floor = new PlayspaceFloor(device, shaderCache); renderModelRenderer = new RenderModelRenderer(device, shaderCache, trackedDeviceBufferManager); primitiveRenderer = new MeshRenderer(device, shaderCache, Matrix.Translation(0, 1.25f, 0), GeometricPrimitiveFactory.MakeSphere(0.5f, 100).AsTriMesh()); var shapeNormalsLoader = new ShapeNormalsLoader(dataDir, device, textureCache); var figureRendererLoader = new FigureRendererLoader(dataDir, device, shaderCache, textureCache); var figureLoader = new FigureLoader(dataDir, device, shaderCache, shapeNormalsLoader, figureRendererLoader); actor = Actor.Load(dataDir, device, shaderCache, controllerManager, figureLoader); var iblMenu = LightingEnvironmentMenu.MakeMenuLevel(dataDir, iblEnvironment); var toneMappingMenuLevel = new ToneMappingMenuLevel(toneMappingSettings); var renderSettingsMenuLevel = new StaticMenuLevel( new SubLevelMenuItem("Lighting Enviroment", iblMenu), new SubLevelMenuItem("Tone Mapping", toneMappingMenuLevel), new FloorVisibilityToggleMenuItem(floor) ); var scenePersistenceMenuLevel = ScenePersistenceMenuLevel.Make(this); var appMenuLevel = new StaticMenuLevel( new SubLevelMenuItem("Save/Load", scenePersistenceMenuLevel), new SubLevelMenuItem("Render Settings", renderSettingsMenuLevel) ); var rootMenuLevel = new CombinedMenuLevel(appMenuLevel, actor.MenuLevel); menu = new Menu(device, shaderCache, trackedDeviceBufferManager, controllerManager, rootMenuLevel); }
public static IMenuLevel MakeHairMenuLevel(FigureFacade hairFigure) { if (hairFigure == null) { return(null); } var shapesMenuLevel = new ShapesMenuLevel(hairFigure.Definition, hairFigure.Model); var materialsMenuLevel = new MaterialsMenuLevel(hairFigure.Definition, hairFigure.Model); var hairMenuLevel = new StaticMenuLevel( new SubLevelMenuItem("Style", shapesMenuLevel), new SubLevelMenuItem("Color", materialsMenuLevel) ); return(hairMenuLevel); }
public static IMenuLevel MakeRootMenuLevel(Actor actor) { var model = actor.Model; var channelMenuLevel = ChannelMenuLevel.MakeRootLevelForFigure(model); var poseControlsMenuLevel = channelMenuLevel.Extract(new string[] { "Pose Controls" }); var expressionsMenuLevel = poseControlsMenuLevel.Extract(new string[] { "Head", "Expressions" }); var behaviorMenuLevel = new BehaviorMenuLevel(model.Behavior); var charactersMenuLevel = new CharactersMenuLevel(actor.Characters, actor.Main.Definition, actor.Main.Model); var shapingItems = new List <IMenuItem>(); var channelShapesMenuLevel = channelMenuLevel.Extract(new string[] { "Shapes" }); shapingItems.Add(new ActionMenuItem("Reset Shape", () => model.ResetShape())); shapingItems.AddRange(channelShapesMenuLevel.GetItems()); var shapingMenuLevel = new StaticMenuLevel(shapingItems.ToArray()); var animationsMenuLevel = new AnimationMenuLevel(model.Animation); var hairMenuLevel = MakeHairMenuLevel(actor.Hair); var clothingMenuLevel = ClothingMenuLevel.Make(actor); List <IMenuItem> items = new List <IMenuItem> { }; items.Add(new SubLevelMenuItem("Characters", charactersMenuLevel)); items.Add(new SubLevelMenuItem("Clothing", clothingMenuLevel)); if (hairMenuLevel != null) { items.Add(new SubLevelMenuItem("Hair", hairMenuLevel)); } items.Add(new SubLevelMenuItem("Shaping", shapingMenuLevel)); items.Add(new SubLevelMenuItem("Behavior", behaviorMenuLevel)); items.Add(new SubLevelMenuItem("Expressions", expressionsMenuLevel)); items.Add(new SubLevelMenuItem("Posing", poseControlsMenuLevel)); items.Add(new SubLevelMenuItem("Animations", animationsMenuLevel)); items.Add(new ActionMenuItem("Reset Pose", () => model.ResetPose())); var figureMenuLevel = new StaticMenuLevel(items.ToArray()); return(figureMenuLevel); }
public IMenuLevel MakeMaterialsMenuLevel(Outfit activeOutfit) { if (activeOutfit?.Fabrics != null) { var items = activeOutfit.Fabrics .Select(fabric => new FabricMenuItem(actor, fabric)) .ToArray(); return(new StaticMenuLevel(items)); } else { var individualMaterialItems = actor.Clothing .SelectMany(figure => figure.Definition.MaterialSetOptions .Select(materialSet => new MaterialSetMenuItem(figure.Model, materialSet))) .ToList <IToggleMenuItem>(); var compositeMaterialItems = CompositeToggleMenuItem.CombineByLabel(individualMaterialItems); var materialsMenuLevel = new StaticMenuLevel(compositeMaterialItems.ToArray()); return(materialsMenuLevel); } }
public CharactersMenuLevel(List <Character> characters, FigureDefinition definition, FigureModel model) { var shapesMenuLevel = new ShapesMenuLevel(definition, model); var materialsMenuLevel = new MaterialsMenuLevel(definition, model); var advancedMenuLevel = new StaticMenuLevel( new SubLevelMenuItem("Shape", shapesMenuLevel), new SubLevelMenuItem("Skin", materialsMenuLevel) ); var detailsMenuLevel = new MaterialSetVariantsMenuLevel(definition, model); items = new List <IMenuItem> { }; items.Add(new SubLevelMenuItem("Mix & Match", advancedMenuLevel)); items.Add(new SubLevelMenuItem("Character Details", detailsMenuLevel)); foreach (var character in characters) { items.Add(new CharacterMenuItem(model, character)); } }