11-06-2019, 08:38 AM
(10-06-2019, 07:21 PM)josemendez Wrote: after you've determined which particles end up projected inside your marquee coordinates, then yes, you can make a handle out of them using the above code.Currently, my code is below;
Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Obi
{
public class CreateHandle : MonoBehaviour
{
ObiActor actor;
public ObiSolver solver;
public Transform anchor;
static protected Vector3[] wsPositions = new Vector3[0];
static public bool[] selectionStatus = new bool[0];
static int lastSelectedParticle = 0;
//Selection related:
static protected int selectedCount = 0;
public static int SelectedParticleCount
{
get { return selectedCount; }
}
// Start is called before the first frame update
void Start()
{
ObiSolver solver = actor.Solver;
actor = GetComponent<ObiActor>();
for (int i = 0; i < actor.positions.Length; ++i)
{
int indexInSolver = actor.particleIndices[i];
Vector3 projectedPos = GetComponent<Camera>().WorldToScreenPoint(solver.positions[indexInSolver]);
selectionStatus[i] = true;
}
// Create the handle:
GameObject c = new GameObject("Obi Handle");
Undo.RegisterCreatedObjectUndo(c, "Create Obi Particle Handle");
ObiParticleHandle handle = c.AddComponent<ObiParticleHandle>();
handle.Actor = actor;
selectedCount = 0;
for (int i = 0; i < selectionStatus.Length; i++)
{
if (actor.active[i] && selectionStatus[i])
{
selectedCount++;
lastSelectedParticle = i;
}
}
// Calculate position of handle from average of particle positions:
Vector3 average = Vector3.zero;
for (int i = 0; i < selectionStatus.Length; i++)
{
if (selectionStatus[i])
{
average += wsPositions[i];
}
}
c.transform.position = average / selectedCount;
// Add the selected particles to the handle:
for (int i = 0; i < selectionStatus.Length; i++)
{
if (selectionStatus[i])
{
handle.AddParticle(i, wsPositions[i], actor.invMasses[i]);
}
}
}
// Update is called once per frame
void Update()
{
}
}
}
There are two errors.
・Obi Solver does not contain definition of "position"
(error CS1061: 'ObiSolver' does not contain a definition for 'positions' and no accessible extension method 'positions' accepting a first argument of type 'ObiSolver' could be found (are you missing a using directive or an assembly reference?))
・I cannot find out "Undo"
(error CS0103: The name 'Undo' does not exist in the current context)
Do you know how to fix this? Or are there other much problems here, or I should change code at a fundamental level?