/** * This callback is specific to TreeAgentState * and has no UI dependencies, so it is included here. * It should not be used with any agent state other then * TreeAgentState */ public class MorphDoneCallback implements ISimUICallback { boolean m_bTimeInit; double m_lfFirstTime; double m_lfLastTime; boolean m_bDoneLastTime; boolean m_bAllConnected; IMorphSpec m_morphSpec; double m_lfEpsilon; public MorphDoneCallback() { m_bAllConnected = false; m_bTimeInit = false; m_bDoneLastTime = false; m_morphSpec = null; m_lfEpsilon = 0.1; } public MorphDoneCallback(IMorphSpec morphSpec) { m_bAllConnected = false; m_bTimeInit = false; m_bDoneLastTime = false; m_morphSpec = null; setMorphSpec(morphSpec); m_lfEpsilon = 0.1; } void setMorphSpec(IMorphSpec morphSpec) { m_morphSpec = morphSpec; } public boolean doCallback(double [] arrLfState, IAgent agent, StateBundle [] arrStates, ISensor [] arrSensors, IEnvironment env , CommGraph graph, double lfSimTime) { if(m_bTimeInit == false) { m_lfFirstTime = lfSimTime; m_bTimeInit = true; } m_lfLastTime = lfSimTime; boolean bResult = true; m_bAllConnected = true; boolean bFinal = true; for(int i = 1; i < arrStates.length; ++i) { TreeAgentState currState = (TreeAgentState)(arrStates[i].getVars()); Boolean bDone1 = currState.getBoolVar(new Integer(2)); if(bDone1 != null) { bResult = bResult && bDone1.booleanValue(); } else { bResult = false; } if(!currState.getDfsFinished() || currState.getParentId() < 0) { if(m_lfLastTime > 50.0) { System.out.println("This is bad"); } m_bAllConnected = false; bResult = false; } if(m_morphSpec != null) { double arrLfFinalPos[] = m_morphSpec.getFinalUv(i); double lfDistSqrd = arrLfState[2*i] - arrLfFinalPos[0]; lfDistSqrd *= lfDistSqrd; double lfTmp = arrLfState[2*i+1] - arrLfFinalPos[1]; lfTmp *= lfTmp; lfDistSqrd += lfTmp; if(lfTmp > m_lfEpsilon*m_lfEpsilon) { bFinal = false; } } } m_bDoneLastTime = bResult && bFinal; return bResult; } /** * In case we need more info then true/false from doCallback * @return arbitrary object (meaning depends on derived class) */ public Object getLastObject() { if(m_bTimeInit == false || m_bAllConnected == false) { double lfTimeDiff = m_lfLastTime - m_lfFirstTime; System.out.println("Time init == "+m_bTimeInit+ ", all connected == "+m_bAllConnected+ ", Last result == "+m_bDoneLastTime); System.out.println("Time would be "+lfTimeDiff); return new Boolean(false); } return new Double(m_lfLastTime-m_lfFirstTime); } }