Skip to content

Commit 324b892

Browse files
authored
Merge pull request #4 from xavierpuigf/dev
Added functionality to the simulator to specify x,y,z or x,z coordinates when placing objects
2 parents 4449ffe + fc69d39 commit 324b892

File tree

2 files changed

+127
-31
lines changed

2 files changed

+127
-31
lines changed

Assets/Story Generator/Scripts/GameObjectUtils.cs

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -207,15 +207,15 @@ public static List<Vector3> GetWalkLocation(Vector3[] points, out Vector3 curren
207207
}
208208

209209
public static List<Vector3> CalculatePutPositions(Vector3 intPos, GameObject go, GameObject goDest, bool putInside,
210-
bool ignoreObstacles)
210+
bool ignoreObstacles, Vector2? destPos = null, float yPos = -1)
211211
{
212212

213-
return CalculatePutPositions(intPos, GetBounds(go), go.transform.position, goDest, putInside, ignoreObstacles);
213+
return CalculatePutPositions(intPos, GetBounds(go), go.transform.position, goDest, putInside, ignoreObstacles, destPos, yPos);
214214
}
215215

216216
// Put object go to goDest, character is at interaction position
217217
public static List<Vector3> CalculatePutPositions(Vector3 intPos, Bounds srcBounds, Vector3 srcPos, GameObject goDest,
218-
bool putInside, bool ignoreObstacles)
218+
bool putInside, bool ignoreObstacles, Vector2? destPos = null, float yPos = -1)
219219
{
220220

221221
// "Optimal" distance from character to search for space (0.5 meters)
@@ -266,37 +266,68 @@ public static List<Vector3> CalculatePutPositions(Vector3 intPos, Bounds srcBoun
266266
}
267267

268268
Vector3 center = new Vector3(intPos.x + dir.x, 0, intPos.z + dir.z);
269+
// If position specified
270+
if (destPos == null)
271+
for (float r = min_center_distance; r <= putCenterDistance; r += 0.1f) { // advance radii by 10 cm
272+
for (int i = 0; i < 20; i++) { // angle quantization is 360/20 = 18 degrees
273+
float phi = 2 * Mathf.PI * i / 20;
274+
float x = center.x + r * Mathf.Cos(phi);
275+
float z = center.z + r * Mathf.Sin(phi);
276+
Vector3 srcDelta;
269277

270-
for (float r = min_center_distance; r <= putCenterDistance; r += 0.1f) { // advance radii by 10 cm
271-
for (int i = 0; i < 20; i++) { // angle quantization is 360/20 = 18 degrees
272-
float phi = 2 * Mathf.PI * i / 20;
273-
float x = center.x + r * Mathf.Cos(phi);
274-
float z = center.z + r * Mathf.Sin(phi);
275-
Vector3 srcDelta;
276-
277-
if (putInside)
278-
srcDelta = new Vector3(x - srcCenter.x, destMax.y - srcBounds.size.y - 0.03f - srcBounds.min.y, z - srcCenter.z);
279-
else
280-
srcDelta = new Vector3(x - srcCenter.x, destMax.y - srcBounds.min.y, z - srcCenter.z);
278+
if (putInside)
279+
srcDelta = new Vector3(x - srcCenter.x, destMax.y - srcBounds.size.y - 0.03f - srcBounds.min.y, z - srcCenter.z);
280+
else
281+
srcDelta = new Vector3(x - srcCenter.x, destMax.y - srcBounds.min.y, z - srcCenter.z);
281282

282-
// Check if placement is sufficiently far from boundary
283-
// bool ok = x > destMin.x + 0.1f && z > destMin.z + 0.1f && x < destMax.x - 0.1f && z < destMax.z - 0.1f;
283+
// Check if placement is sufficiently far from boundary
284+
// bool ok = x > destMin.x + 0.1f && z > destMin.z + 0.1f && x < destMax.x - 0.1f && z < destMax.z - 0.1f;
284285

285-
//if (!ok)
286-
// continue;
286+
//if (!ok)
287+
// continue;
287288

288-
float hity;
289+
float hity;
289290

290-
if (HitFlatSurface(srcBounds, srcDelta, goDest, out hity)) {
291+
if (HitFlatSurface(srcBounds, srcDelta, goDest, out hity)) {
291292

292-
float yDelta = hity - (srcBounds.min.y + srcDelta.y);
293-
Vector3 delta = srcDelta + new Vector3(0, yDelta, 0);
293+
float yDelta = hity - (srcBounds.min.y + srcDelta.y);
294+
Vector3 delta = srcDelta + new Vector3(0, yDelta, 0);
294295

295-
if (putInside || ignoreObstacles || !CheckBox(srcBounds, delta, 0.01f, goDest)) {
296-
result.Add(srcPos + delta);
296+
if (putInside || ignoreObstacles || !CheckBox(srcBounds, delta, 0.01f, goDest)) {
297+
result.Add(srcPos + delta);
298+
}
297299
}
298300
}
299301
}
302+
else
303+
{
304+
// obtain x and z values from the destination
305+
float x = destPos.Value.x;
306+
float z = destPos.Value.y;
307+
308+
Vector3 srcDelta;
309+
310+
if (yPos != -1) {
311+
srcDelta = new Vector3(x - srcCenter.x, yPos, z - srcCenter.z);
312+
}
313+
else if (putInside)
314+
srcDelta = new Vector3(x - srcCenter.x, destMax.y - srcBounds.size.y - 0.03f - srcBounds.min.y, z - srcCenter.z);
315+
else
316+
srcDelta = new Vector3(x - srcCenter.x, destMax.y - srcBounds.min.y, z - srcCenter.z);
317+
318+
float hity;
319+
320+
if (HitFlatSurface(srcBounds, srcDelta, goDest, out hity))
321+
{
322+
323+
float yDelta = hity - (srcBounds.min.y + srcDelta.y);
324+
Vector3 delta = srcDelta + new Vector3(0, yDelta, 0);
325+
326+
if (putInside || ignoreObstacles || !CheckBox(srcBounds, delta, 0.01f, goDest))
327+
{
328+
result.Add(srcPos + delta);
329+
}
330+
}
300331
}
301332
return result;
302333
}

Assets/Story Generator/Scripts/ScriptExecution.cs

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using System.Text;
1919
using StoryGenerator.DoorProperties;
2020
using System.Threading;
21+
using System.Globalization;
2122

2223

2324
namespace StoryGenerator.Utilities
@@ -343,16 +344,20 @@ public class PutAction : IAction
343344
{
344345
public ScriptObjectName Name { get; private set; }
345346
public ScriptObjectName DestName { get; private set; }
347+
public Vector2? DestPos { get; private set; } // put destination position
348+
public float Y { get; private set; }
346349
public int ScriptLine { get; private set; }
347350
public bool PutInside { get; private set; }
348351
public IObjectSelector Selector;
349352

350353

351-
public PutAction(int scriptLine, IObjectSelector selector, string name, int instance, string destName, int destInstance, bool putInside)
354+
public PutAction(int scriptLine, IObjectSelector selector, string name, int instance, string destName, int destInstance, bool putInside, Vector2? destPos, float y = -1)
352355
{
353356
ScriptLine = scriptLine;
354357
Name = new ScriptObjectName(name, instance);
355358
DestName = new ScriptObjectName(destName, destInstance);
359+
DestPos = destPos;
360+
Y = y;
356361
PutInside = putInside;
357362
Selector = selector;
358363

@@ -2463,7 +2468,7 @@ private IEnumerable<IStateGroup> ProcessPutAction(PutAction a, State current)
24632468
if (fbbe != null)
24642469
{
24652470
// We need to calculate putback position
2466-
foreach (Vector3 pos in GameObjectUtils.CalculatePutPositions(current.InteractionPosition, sod.GameObject, sodDest.GameObject, a.PutInside, false))
2471+
foreach (Vector3 pos in GameObjectUtils.CalculatePutPositions(current.InteractionPosition, sod.GameObject, sodDest.GameObject, a.PutInside, false, a.DestPos, a.Y))
24672472
{
24682473
State s = new State(current, a, current.InteractionPosition, ExecutePut);
24692474
s.AddScriptGameObject(a.Name, sod.GameObject, pos, current.InteractionPosition, false);
@@ -4000,7 +4005,7 @@ public static void ParseScript(List<ScriptExecutor> sExecutors, IList<string> sc
40004005
ParseScriptForChar(sExecutors[i], scriptLines, i, actionEquivProvider);
40014006
}
40024007
}
4003-
4008+
40044009
private static void ParseScriptForChar(ScriptExecutor sExecutor, IList<string> scriptLines, int charIndex,
40054010
ActionEquivalenceProvider actionEquivProvider)
40064011
{
@@ -4014,7 +4019,7 @@ private static void ParseScriptForChar(ScriptExecutor sExecutor, IList<string> s
40144019
if (sl != null)
40154020
sLines.Add(sl);
40164021
}
4017-
sExecutor.sLines = new List<ScriptLine>(sLines);
4022+
//sExecutor.sLines = new List<ScriptLine>(sLines);
40184023
for (int i = 0; i < sLines.Count; i++)
40194024
{
40204025
ScriptLineToAction(sExecutor, i, sLines);
@@ -4124,7 +4129,37 @@ private static void ScriptLineToAction(ScriptExecutor sExecutor, int index, ILis
41244129
case InteractionType.PUTIN:
41254130
if (string.IsNullOrEmpty(name1))
41264131
throw new ScriptReaderException($"No second argument for [{sl.Interaction}]");
4127-
sExecutor.AddAction(new PutAction(sl.LineNumber, sExecutor.GetObjectSelector(name1, instance1), name0, instance0, name1, instance1, sl.Interaction == InteractionType.PUTIN));
4132+
4133+
if (sl.Parameters.Count > 2)
4134+
{
4135+
string strpos = sl.Parameters[sl.Parameters.Count-1].Item1;
4136+
Debug.Log("POSITION: " + strpos);
4137+
string[] positions = strpos.Split(',');
4138+
if (positions.Length == 3)
4139+
{
4140+
NumberFormatInfo fmt = new NumberFormatInfo();
4141+
fmt.NegativeSign = "-";
4142+
Vector2 pos = new Vector2(float.Parse(positions[0], fmt), float.Parse(positions[2], fmt));
4143+
float y = float.Parse(positions[1], fmt);
4144+
sExecutor.AddAction(new PutAction(sl.LineNumber, sExecutor.GetObjectSelector(name1, instance1), name0, instance0, name1, instance1, sl.Interaction == InteractionType.PUTIN, pos, y)); //TODO: add destPos
4145+
}
4146+
else if (positions.Length == 2)
4147+
{
4148+
NumberFormatInfo fmt = new NumberFormatInfo();
4149+
fmt.NegativeSign = "-";
4150+
Vector2 pos = new Vector2(float.Parse(positions[0], fmt), float.Parse(positions[1], fmt));
4151+
sExecutor.AddAction(new PutAction(sl.LineNumber, sExecutor.GetObjectSelector(name1, instance1), name0, instance0, name1, instance1, sl.Interaction == InteractionType.PUTIN, pos, -1)); //TODO: add destPos
4152+
}
4153+
else
4154+
{
4155+
sExecutor.AddAction(new PutAction(sl.LineNumber, sExecutor.GetObjectSelector(name1, instance1), name0, instance0, name1, instance1, sl.Interaction == InteractionType.PUTIN, null, -1));
4156+
}
4157+
}
4158+
else
4159+
{
4160+
sExecutor.AddAction(new PutAction(sl.LineNumber, sExecutor.GetObjectSelector(name1, instance1), name0, instance0, name1, instance1, sl.Interaction == InteractionType.PUTIN, null, -1));
4161+
}
4162+
41284163
break;
41294164
case InteractionType.PUTOBJBACK:
41304165
sExecutor.AddAction(new PutBackAction(sl.LineNumber, name0, instance0));
@@ -4215,6 +4250,8 @@ private static ScriptLine ParseLineForChar(int charIndex, string line, int lineN
42154250
string pattAction = @"\[(\w+)\]";
42164251
string pattParams = @"<([\w\s]+)>\s*\((\d+)\)\s*(:\d+:)?";
42174252
string pattchar = @"<char(\d+)>";
4253+
string pattPos = @"(-?\d+\.?\d*(E-\d+)?),(-?\d+\.?\d*(E-\d+)?),(-?\d+\.?\d*(E-\d+)?)";
4254+
string pattPosXZ = @"(-?\d+\.?\d*(E-\d+)?),(-?\d+\.?\d*(E-\d+)?)";
42184255

42194256
string[] sentences = line.Split('|');
42204257

@@ -4237,7 +4274,6 @@ private static ScriptLine ParseLineForChar(int charIndex, string line, int lineN
42374274
// Debug.Log (lineNo + ',' + sentence);
42384275

42394276

4240-
42414277
// Parse action
42424278
r = new Regex(pattAction);
42434279
m = r.Match(sentence);
@@ -4263,7 +4299,6 @@ private static ScriptLine ParseLineForChar(int charIndex, string line, int lineN
42634299
}
42644300
m = m.NextMatch();
42654301
}
4266-
42674302
if (paramList.Count == 1)
42684303
{
42694304
string newActionStr;
@@ -4278,6 +4313,36 @@ private static ScriptLine ParseLineForChar(int charIndex, string line, int lineN
42784313
if (actionEquivProvider.TryGetEquivalentAction(actionStr, paramList[0].Item1, paramList[1].Item1, out newActionStr))
42794314
actionStr = newActionStr;
42804315
}
4316+
/*else if (paramList.Count == 3) //TODO: either continue with this or remove/use parse position
4317+
{
4318+
string newActionStr;
4319+
if (actionEquivProvider.TryGetEquivalentAction(actionStr, paramList[0].Item1, paramList[1].Item1, paramList[2].Item1, out newActionStr))
4320+
actionStr = newActionStr;
4321+
}*/
4322+
4323+
// Parse position x,y,z
4324+
r = new Regex(pattPos);
4325+
m = r.Match(sentence);
4326+
4327+
if (m.Success)
4328+
{
4329+
// 2.5,3.4,1.5
4330+
paramList.Add(Tuple.Create(m.Groups[0].Value, 0));
4331+
} else
4332+
{
4333+
// Parse position x,z
4334+
r = new Regex(pattPosXZ);
4335+
m = r.Match(sentence);
4336+
4337+
if (m.Success)
4338+
{
4339+
// 2.5,3.4
4340+
paramList.Add(Tuple.Create(m.Groups[0].Value, 0));
4341+
}
4342+
}
4343+
4344+
4345+
42814346

42824347
InteractionType action = (InteractionType)Enum.Parse(typeof(InteractionType), actionStr, true);
42834348
return new ScriptLine() { Interaction = action, Parameters = paramList, LineNumber = lineNo, modifier = modifier };

0 commit comments

Comments
 (0)