Select Git revision
CallFunctionOnCommand.cs
GenerateDemoFiles.cs 12.06 KiB
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using static CommunicationEvents;
using static UnityEditor.PlayerSettings;
using static CanonBallProblemCalculator;
using Unity.Mathematics;
using System;
using static SOMDocManager;
public class GenerateDemoFiles
{
public static void GenerateAll()
{
if (UnityEngine.Object.FindObjectOfType<GadgetBehaviour>(true) == null)
{
Debug.LogError("Cannot GenerateDemoFiles without populated GadgetManager");
return;
}
Debug.LogWarning("Generating and Overwriting Stage Files");
Action[] DemoGeneration = new Action[]{
GenerateTreeStage,
GenerateRiverStage,
GenerateCanonBallStage
};
foreach (Action action in DemoGeneration)
try
{
action();
Debug.Log("Successfully executed " + action.Method.Name);
}
catch (Exception ex)
{
Debug.LogError("Exception while executing " + action.Method.Name);
Debug.LogException(ex);
}
StageStatic.StageOfficial = null;
StageStatic.StageLocal = null;
}
public static void GenerateTreeStage()
{
// Params
float minimalSolutionHight = 6;
// Generate Stage
Stage demo = new Stage
(
number: 1,
category: "Demo Category",
name: "TechDemo A",
scene: "RiverWorld",
description: "Tree Stage",
local: false
);
// needed to generate facts
StageStatic.StageOfficial = new Dictionary<string, Stage>
{
{ demo.name, demo },
};
StageStatic.SetStage(demo.name, false);
// Populate Solution
PointFact
buttom = new PointFact(Vector3.zero, Vector3.up, StageStatic.stage.solution),
top = new PointFact(Vector3.zero + Vector3.up * minimalSolutionHight, Vector3.up, StageStatic.stage.solution);
StageStatic.stage.solution.Add(buttom, out _, false, null, null);
StageStatic.stage.solution.Add(top, out _, true, null, null);
LineFact target = new LineFact(buttom.Id, top.Id, StageStatic.stage.solution);
var target_Id = StageStatic.stage.solution.Add(target, out _, true, null, null);
// Set Solution
StageStatic.stage.solution.ValidationSet =
new List<SolutionOrganizer.SubSolution>
{ new SolutionOrganizer.SubSolution(new HashSet<string> { target_Id }, null, null, new LineFactHightDirectionComparer()) };
// Set Gadgets/ Scrolls
StageStatic.stage.AllowedGadgets = null;
StageStatic.stage.AllowedScrolls = null;
// Save
StageStatic.SetMode(StageStatic.Mode.Create);
StageStatic.stage.store(false, true);
}
public static void GenerateRiverStage()
{
// Params
float minimalSolutionHight = 6;
// Generate Stage
Stage demo = new Stage
(
number: 2,
category: "Demo Category",
name: "TechDemo B",
scene: "RiverWorld",
description: "River Stage",
local: false
);
// needed to generate facts
StageStatic.StageOfficial = new Dictionary<string, Stage>
{
{ demo.name, demo },
};
StageStatic.SetStage(demo.name, false);
// Populate Solution
PointFact
buttom = new PointFact(Vector3.zero, Vector3.up, StageStatic.stage.solution),
top = new PointFact(Vector3.zero + Vector3.up * minimalSolutionHight, Vector3.up, StageStatic.stage.solution);
StageStatic.stage.solution.Add(buttom, out _, false, null, null);
StageStatic.stage.solution.Add(top, out _, true, null, null);
LineFact target = new LineFact(buttom.Id, top.Id, StageStatic.stage.solution);
var target_Id = StageStatic.stage.solution.Add(target, out _, true, null, null);
// Set Solution
StageStatic.stage.solution.ValidationSet =
new List<SolutionOrganizer.SubSolution> {
new SolutionOrganizer.SubSolution(new HashSet<string> { target_Id }, null, null, new LineFactHightDirectionComparer()),
new SolutionOrganizer.SubSolution(new HashSet<string> { target_Id }, null, null, new LineSpanningOverRiverWorldComparer()),
new SolutionOrganizer.SubSolution(null, new List<int> { 1 }, new List<int> { 0 }, new LineFactHightComparer()),
};
// Set Gadgets/ Scrolls
StageStatic.stage.AllowedGadgets = new() { new Pointer(), new Tape(), new AngleTool(), new LineTool(), new LotTool(), new Pendulum(), new Remover() }; //, new EqualCircleGadget(), new TestMiddlePoint() };
StageStatic.stage.AllowedScrolls = new() {
"http://mathhub.info/FrameIT/frameworld?OppositeLen",
//"http://mathhub.info/FrameIT/frameworld?SupplementaryAngles",
//"http://mathhub.info/FrameIT/frameworld?AngleSum",
//"http://mathhub.info/FrameIT/frameworld?Pythagoras",
//"http://mathhub.info/FrameIT/frameworld?CylinderVolumeScroll",
//"http://mathhub.info/FrameIT/frameworld?CircleLineAngleToAngleScroll",
//"http://mathhub.info/FrameIT/frameworld?Midpoint",
//"http://mathhub.info/FrameIT/frameworld?CircleScroll",
//"http://mathhub.info/FrameIT/frameworld?CircleLineAngleScroll",
//"http://mathhub.info/FrameIT/frameworld?CircleAreaScroll",
//"http://mathhub.info/FrameIT/frameworld?ConeVolumeScroll",
//"http://mathhub.info/FrameIT/frameworld?TruncatedConeVolumeScroll",
};
// Save
StageStatic.SetMode(StageStatic.Mode.Create);
StageStatic.stage.store(false, true);
}
public static void GenerateCanonBallStage()
{
// Params //List<Wall> walls, T starPos, T starVec, T gravity, int dimension
int
dim_const = 0,
dim_A = 2,
dim_B = 1;
float Py_factor = 0.04905f;
float2 StartPos_py = new(380, 300);
float2 StartVec_py = new(-490, 150);
float2 Gravity_py = new(0, -200);
(int x, int y, int width, int angle_deg, double bounce)[] PythonParams = {
(250, 0, 50, 0, 2.0 ),
(0, 0, 400, 90, 0.9 ),
(400, 0, 400, 90, 0.9),
(0, 400, 400, 0, 0.9),
(50, 200, 100, 45, 1),
(150, 100, 50, 0, 0.9),
(200, 200, 100, 120, 0.9),
(300, 300, 80, 150, 0.9),
(300, 100, 100, 30, 0.8),
(50, 50, 100, 60, 0.9),
(300, 0, 100, 0, 0.4),
(0, 0, 250, 0, 0.1),
};
//Parse PythonParams
Vector3
StartPos = Vector3.zero,
StartVec = Vector3.zero,
Gravity = Vector3.zero;
StartPos[dim_A] = StartPos_py[0] * Py_factor;
StartPos[dim_B] = StartPos_py[1] * Py_factor;
StartVec[dim_A] = StartVec_py[0] * Py_factor;
StartVec[dim_B] = StartVec_py[1] * Py_factor;
Gravity[dim_A] = Gravity_py[0] * Py_factor;
Gravity[dim_B] = Gravity_py[1] * Py_factor;
float[,,] Wall_parameter = new float[PythonParams.Length, 2, 2];
float[] Bounce_parameter = new float[PythonParams.Length];
for (uint i = 0; i < PythonParams.Length; i++)
{
Wall_parameter[i, 0, 0] = Py_factor * (PythonParams[i].x);
Wall_parameter[i, 0, 1] = Py_factor * (PythonParams[i].y);
Wall_parameter[i, 1, 0] = Py_factor * (PythonParams[i].x + PythonParams[i].width * Mathf.Cos(MathfExtensions.ToRadians(PythonParams[i].angle_deg)));
Wall_parameter[i, 1, 1] = Py_factor * (PythonParams[i].y + PythonParams[i].width * Mathf.Sin(MathfExtensions.ToRadians(PythonParams[i].angle_deg)));
Bounce_parameter[i] = (float)PythonParams[i].bounce;
}
// Generate Stage
Stage demo = new Stage
(
number: 2,
category: "Demo Category",
name: "CanonBall A",
scene: "RiverWorld",
description: "CanonBall Test",
local: false
);
// needed to generate facts
StageStatic.StageOfficial = new Dictionary<string, Stage>
{
{ demo.name, demo },
};
StageStatic.SetStage(demo.name, false);
// Populate Solution
List<Wall> Walls = new();
for (int i = 0; i < PythonParams.Length; i++)
{
Vector3 tmpVec = Vector3.zero;
tmpVec[dim_A] = Wall_parameter[i, 0, 0];
tmpVec[dim_B] = Wall_parameter[i, 0, 1];
PointFact topA = new(tmpVec, Vector3.up, StageStatic.stage.solution);
string topAURI = StageStatic.stage.solution.Add(topA, out _, false, null, null);
tmpVec[dim_A] = Wall_parameter[i, 1, 0];
tmpVec[dim_B] = Wall_parameter[i, 1, 1];
PointFact topB = new(tmpVec, Vector3.up, StageStatic.stage.solution);
string topBURI = StageStatic.stage.solution.Add(topB, out _, true, null, null);
LineFact topology = new(topAURI, topBURI, StageStatic.stage.solution);
string lineURI = StageStatic.stage.solution.Add(topology, out _, true, null, null);
StageStatic.stage.solution.ExposedSolutionFacts.Add(lineURI);
Walls.Add(new(topology, Bounce_parameter[i]));
}
// Set Solution
#region CannonBallScroll
StageStatic.stage.solution.Add( // for CannonBallScroll
new ListFact(Walls.Select(w => w.Topology.Id).ToArray(), typeof(LineFact), StageStatic.stage.solution),
out bool _, true, null, null
);
// special case for Prototype
string[] RRRRTupel = new string[Walls.Count];
for (int i = 0; i < Walls.Count; i++)
{
RRRRTupel[i] = StageStatic.stage.solution.Add(
new TupelFact(null,
new[] {
SOMDoc.MakeTupel(new OMF[] { new(Walls[i].Topology.Point1.Point[dim_A]), new(Walls[i].Topology.Point1.Point[dim_B]) }),
SOMDoc.MakeTupel(new OMF[] { new(Walls[i].Topology.Point2.Point[dim_A]), new(Walls[i].Topology.Point2.Point[dim_B]) }),
},
StageStatic.stage.solution),
out bool _, true, null, null
);
}
StageStatic.stage.solution.Add(
new ListFact(RRRRTupel, typeof(TupelFact), StageStatic.stage.solution),
out bool _, true, null, null
);
#endregion CannonBallScroll
string BallURI = StageStatic.stage.solution.Add(
new PointFact(StartPos, Vector3.up, StageStatic.stage.solution),
out _, false, null, null);
StageStatic.stage.solution.ExposedSolutionFacts.Add(BallURI);
CanonBallProblemCalculator calc = new(Walls, StartPos, StartVec, Gravity, dim_const, dim_A, dim_B, StageStatic.stage.solution);
string attacheFactURI = StageStatic.stage.solution.Add(
new AttachedPositionFunction(BallURI, calc.Result_FuncCall_Id.ToArray(), StageStatic.stage.solution),
out _, true, null, null);
StageStatic.stage.solution.ExposedSolutionFacts.Add(attacheFactURI);
//TODO: ~attach funcs + ~cheat?
//StageStatic.stage.solution.ValidationSet =
// new List<SolutionOrganizer.SubSolution> {
// new SolutionOrganizer.SubSolution(new HashSet<string> { target_Id }, null, null, new LineFactHightDirectionComparer()),
// new SolutionOrganizer.SubSolution(new HashSet<string> { target_Id }, null, null, new LineSpanningOverRiverWorldComparer()),
// new SolutionOrganizer.SubSolution(null, new List<int> { 1 }, new List<int> { 0 }, new LineFactHightComparer()),
// };
// Set Gadgets/ Scrolls
StageStatic.stage.AllowedGadgets = null;
StageStatic.stage.AllowedScrolls = null;
// Save
StageStatic.SetMode(StageStatic.Mode.Create);
StageStatic.stage.store(false, true);
}
}