plDrawableSpans     *plDrawableGenerator::GeneratePlanarDrawable( const hsPoint3 &corner, const hsVector3 &xVec, const hsVector3 &yVec,
                                                                hsGMaterial *material, const hsMatrix44 &localToWorld, hsBool blended,
                                                                const hsColorRGBA* multColor,
                                                                hsTArray<uint32_t> *retIndex, plDrawableSpans *toAddTo )
{
    hsTArray<hsPoint3>      points;
    hsTArray<hsVector3>     normals;
    hsTArray<uint16_t>        indices;
    hsTArray<hsColorRGBA>   colors;
    hsTArray<hsPoint3>      uvws;
    hsPoint3                point;

    plDrawableSpans     *drawable;


    /// Generate points and normals
    points.Expand( 4 );
    normals.Expand( 4 );

    point = corner;                 points.Append( point );
    point += xVec;                  points.Append( point );
    point += yVec;                  points.Append( point );
    point = corner + yVec;          points.Append( point );

    CALC_PNORMAL( normals, xVec, yVec );
    CALC_PNORMAL( normals, xVec, yVec );
    CALC_PNORMAL( normals, xVec, yVec );
    CALC_PNORMAL( normals, xVec, yVec );

    uvws.Expand( 4 );
    uvws.Append( hsPoint3( 0.f, 1.f, 0.f ) );
    uvws.Append( hsPoint3( 1.f, 1.f, 0.f ) );
    uvws.Append( hsPoint3( 1.f, 0.f, 0.f ) );
    uvws.Append( hsPoint3( 0.f, 0.f, 0.f ) );

    /// Generate indices
    indices.Expand( 6 );
    indices.Append( 0 ); indices.Append( 1 ); indices.Append( 2 );
    indices.Append( 0 ); indices.Append( 2 ); indices.Append( 3 );

    /// Create a drawable for it
    drawable = plDrawableGenerator::GenerateDrawable( points.GetCount(), points.AcquireArray(), normals.AcquireArray(),
                                                        uvws.AcquireArray(), 1,
                                                        nil, true, multColor,
                                                        indices.GetCount(), indices.AcquireArray(),
                                                        material, localToWorld, blended, retIndex, toAddTo );

    return drawable;
}
//
// find the position of this object (if there are more than one, just the first one)
PyObject* pySceneObject::GetWorldPosition()
{
    // make sure that there are sceneobjects
    if ( fSceneObjects.Count() > 0 )
    {
        // get the object pointer of just the first one in the list
        // (We really can't tell which one the user is thinking of if they are
        // referring to multiple objects, so the first one in the list will do.)
        plSceneObject* obj = plSceneObject::ConvertNoRef(fSceneObjects[0]->ObjectIsLoaded());
        if ( obj )
        {
            const plCoordinateInterface* ci = obj->GetCoordinateInterface();
            if ( ci )
                return pyPoint3::New((hsPoint3)ci->GetWorldPos());
            else
            {
                plString errmsg = plString::Format("Sceneobject %s does not have a coordinate interface.",
                                                   obj->GetKeyName().c_str());
                PyErr_SetString(PyExc_RuntimeError, errmsg.c_str());
                return nil; // return nil to tell python we errored
            }
        }
    }
    // if we couldn't find any sceneobject or a coordinate interface
    return pyPoint3::New(hsPoint3(0,0,0));
}
示例#3
0
PyObject* pyGUIControl::GetObjectCenter()
{
    if ( fGCkey )
    {
        // get the pointer to the modifier
        pfGUIControlMod* pbmod = pfGUIControlMod::ConvertNoRef(fGCkey->ObjectIsLoaded());
        if ( pbmod )
            return pyPoint3::New(pbmod->GetObjectCenter());
    }
    return pyPoint3::New(hsPoint3(0,0,0));
}
void plSceneInputInterface::ResetClickableState()
{
    if( fLastClicked != nil )
        ISetLastClicked( nil, hsPoint3(0,0,0) );
    
    ClearClickableMap();
    fCurrentClickable = nil;
    fCurrentClickableLogicMod = nil;
    fCurrentCursor = SetCurrentCursorID(kNullCursor);
    fCurrClickIsAvatar = false;
    
}
示例#5
0
/** Look left, right, up, and down to see which directions are clear
    for our movement. We could do this by positioning our actual collision
    body and testing for hits, but it gives a lot more false positives *and*
    we won't get the normals of intersection, so it will be more complex
    to figure out which directions are actually blocked.
    The approach here is to do a raycast in the aforementioned directions
    and fail that direction if the raycast hits anything. */
void plAvBrainClimb::IProbeEnvironment()
{
    hsMatrix44 l2w = fAvMod->GetTarget(0)->GetLocalToWorld();
    // we're just going to pull the axes out of the 
    
    hsPoint3 up = hsPoint3(l2w.GetAxis(hsMatrix44::kUp) * fVerticalProbeLength);
    hsPoint3 down = -up;
    hsPoint3 right = hsPoint3(l2w.GetAxis(hsMatrix44::kRight) * fHorizontalProbeLength);
    hsPoint3 left = -right;
    hsPoint3 start = l2w.GetTranslate();

    start.fZ += 3.0f;   // move the origin from the feet to the bellybutton
    up += start;
    down += start;
    left += start;
    right += start;

    plKey ourKey = fAvMod->GetKey();

    // *** would be cool if we could hint that these should be batched for spatial coherence optimization
    plLOSRequestMsg *upReq = new plLOSRequestMsg(ourKey, start, up, plSimDefs::kLOSDBCustom, plLOSRequestMsg::kTestAny, plLOSRequestMsg::kReportHit);
    upReq->SetRequestID(static_cast<uint32_t>(plClimbMsg::kUp));
    upReq->Send();

    plLOSRequestMsg *downReq = new plLOSRequestMsg(ourKey, start, down, plSimDefs::kLOSDBCustom, plLOSRequestMsg::kTestAny, plLOSRequestMsg::kReportHit);
    downReq->SetRequestID(static_cast<uint32_t>(plClimbMsg::kDown));
    downReq->Send();

    plLOSRequestMsg *leftReq = new plLOSRequestMsg(ourKey, start, left, plSimDefs::kLOSDBCustom, plLOSRequestMsg::kTestAny, plLOSRequestMsg::kReportHit);
    leftReq->SetRequestID(static_cast<uint32_t>(plClimbMsg::kLeft));
    leftReq->SetRequestType(plSimDefs::kLOSDBCustom);
    leftReq->Send();

    plLOSRequestMsg *rightReq = new plLOSRequestMsg(ourKey, start, right, plSimDefs::kLOSDBCustom, plLOSRequestMsg::kTestAny, plLOSRequestMsg::kReportHit);
    rightReq->SetRequestID(static_cast<uint32_t>(plClimbMsg::kRight));
    rightReq->Send();

    fOldPhysicallyBlockedDirections = fPhysicallyBlockedDirections;
    fPhysicallyBlockedDirections = 0;   // clear our blocks until the new reports come in....
}
示例#6
0
// GetColorLoc
// takes a color to look for and returns the x and y coord for its location (x and y from 0 to 1), if the
// color exists in more than one location, then the location with the lowest x and y will be returned.
// if the color is not found, it trys to return the closest match
PyObject* pyImage::GetColorLoc(const pyColor &color)
{
    plMipmap* image;
    if (fMipmap)
        image = fMipmap;
    else
        image = plMipmap::ConvertNoRef(fMipMapKey->ObjectIsLoaded());
    if (image)
    {
        uint32_t height = image->GetHeight();
        uint32_t width = image->GetWidth();
        double minSqrDist = 9999999;
        hsPoint3 closestMatch;
        image->SetCurrLevel(0);
        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                hsColorRGBA pixColor;
                pixColor.FromARGB32(*(image->GetAddr32(x,y)));
                PyObject* imgColorObj = pyColor::New(pixColor);
                pyColor* imgColor = pyColor::ConvertFrom(imgColorObj);
                if ((*imgColor) == color)
                {
                    Py_DECREF(imgColorObj);
                    float fX, fY;
                    fX = (float)x / (float)width;
                    fY = (float)y / (float)height;
                    return pyPoint3::New(hsPoint3(fX, fY, 0));
                }
                double dist = pow((imgColor->getRed() - color.getRed()),2) + pow((imgColor->getGreen() - color.getGreen()),2) + pow((imgColor->getBlue() - color.getBlue()),2);
                if (dist < minSqrDist)
                {
                    minSqrDist = dist;
                    float fX, fY;
                    fX = (float)x / (float)width;
                    fY = (float)y / (float)height;
                    closestMatch.fX = fX;
                    closestMatch.fY = fY;
                }
                Py_DECREF(imgColorObj);
            }
        }
        return pyPoint3::New(closestMatch);
    }
    PYTHON_RETURN_NONE;
}
hsScalarTriple plViewTransform::CameraToNDC(const hsScalarTriple& camP) const
{
    const hsMatrix44& c2NDC = GetCameraToNDC();
    
#ifdef MF_FLIP_SPARSE
    // We count on the fact that we set up CameratToNDC, so we know where the
    // zeros are. Also, note that the proper "* camP.fZ"'s are missing off the
    // c2NDC.fMap[i][2] terms, because they just get cancelled out by the invW.

    hsPoint3 ndc;
    if( GetOrthogonal() )
    {
        ndc.fX = c2NDC.fMap[0][0] * camP.fX 
            + c2NDC.fMap[0][2];

        ndc.fY = c2NDC.fMap[1][1] * camP.fY 
            + c2NDC.fMap[1][2];

        ndc.fZ = c2NDC.fMap[2][2] * camP.fZ 
            + c2NDC.fMap[2][3];
    }
    else
    {
        float invW = 1.f / camP.fZ;
        ndc.fX = c2NDC.fMap[0][0] * camP.fX * invW
            + c2NDC.fMap[0][2];

        ndc.fY = c2NDC.fMap[1][1] * camP.fY * invW
            + c2NDC.fMap[1][2];

        ndc.fZ = c2NDC.fMap[2][2] * camP.fZ 
            + c2NDC.fMap[2][3];
        ndc.fZ *= invW;
    }
#else // MF_FLIP_SPARSE
    hsPoint3 ndc = c2NDC * hsPoint3(camP);
    if( !GetOrthogonal() )
    {
        float invW = 1.f / camP.fZ;
        ndc *= invW;
    }
#endif // MF_FLIP_SPARSE

    return ndc;
}
示例#8
0
void hsMatrix44::MakeEnvMapMatrices(const hsPoint3& pos, hsMatrix44* worldToCameras, hsMatrix44* cameraToWorlds)
{
    MakeCameraMatrices(pos, hsPoint3(pos.fX - 1.f, pos.fY, pos.fZ), hsVector3(0, 0, 1.f), worldToCameras[0], cameraToWorlds[0]);

    MakeCameraMatrices(pos, hsPoint3(pos.fX + 1.f, pos.fY, pos.fZ), hsVector3(0, 0, 1.f), worldToCameras[1], cameraToWorlds[1]);

    MakeCameraMatrices(pos, hsPoint3(pos.fX, pos.fY + 1.f, pos.fZ), hsVector3(0, 0, 1.f), worldToCameras[2], cameraToWorlds[2]);

    MakeCameraMatrices(pos, hsPoint3(pos.fX, pos.fY - 1.f, pos.fZ), hsVector3(0, 0, 1.f), worldToCameras[3], cameraToWorlds[3]);

    MakeCameraMatrices(pos, hsPoint3(pos.fX, pos.fY, pos.fZ + 1.f), hsVector3(0, -1.f, 0), worldToCameras[4], cameraToWorlds[4]);

    MakeCameraMatrices(pos, hsPoint3(pos.fX, pos.fY, pos.fZ - 1.f), hsVector3(0, 1.f, 0), worldToCameras[5], cameraToWorlds[5]);
}
void GetSuspensionProps(plMaxNode* hardPoint, plMaxNode* wheel, hsPoint3& chassisPoint,
                        plVehicleModifier::WheelProps& props)
{
    props.wheelKey = wheel->GetKey();

    hsPoint3 hardPos = hardPoint->GetLocalToWorld44().GetTranslate();
    hsPoint3 wheelPos = wheel->GetLocalToWorld44().GetTranslate();

    // Get position of the hardpoint relative to the chassis
    props.pos = hardPos - chassisPoint;

    // Get a vector from the hardpoint to the wheel
    hsVector3 dir(wheelPos - hardPos);

    // Get the length of the suspension (hardpoint to wheel)
    props.len = hsPoint3(dir).Magnitude();

    // Get the direction of the suspension
    dir.Normalize();
    props.dir = dir;
}
hsBool plSceneInputInterface::InterpretInputEvent( plInputEventMsg *pMsg )
{
    plControlEventMsg* pControlEvent = plControlEventMsg::ConvertNoRef(pMsg);
    if (pControlEvent)
    {
        if (pControlEvent->GetControlCode() == B_CONTROL_IGNORE_AVATARS)
        {
            for (int i = 0; i < fLocalIgnoredAvatars.Count(); i++)
            {
                plSceneObject* pObj = plSceneObject::ConvertNoRef(fLocalIgnoredAvatars[i]->ObjectIsLoaded());
                if (!pObj)
                    continue;

                const plArmatureMod* pArm = (const plArmatureMod*)pObj->GetModifierByType(plArmatureMod::Index());
                if (!pArm)
                    continue;

                plPhysicalControllerCore* controller = pArm->GetController();
                if (controller)
                {
                    if (pControlEvent->ControlActivated())
                        controller->SetLOSDB(plSimDefs::kLOSDBNone);
                    else
                        controller->SetLOSDB(plSimDefs::kLOSDBUIItems);
                }
            }
            return true;
        }
        return false;
    }

    plMouseEventMsg *mouseMsg = plMouseEventMsg::ConvertNoRef( pMsg );
    if( mouseMsg != nil )
    {
        // you're suspended when in this mode...
        if (fBookMode == kOfferLinkPending || fBookMode == kOfferAccepted)
            return true;

        if( mouseMsg->GetButton() == kLeftButtonDown )
        {
            if( fCurrentClickable != nil && fLastClicked == nil && fCurrentCursor != kNullCursor )
            {
                fButtonState |= kLeftButtonDown;
                ISetLastClicked( fCurrentClickable, fCurrentClickPoint );
                fCurrentCursor = SetCurrentCursorID(kCursorClicked);
                return true;
            }
            // right here
            if (fBookMode == kOfferBook)
            {
                fBookMode = kNotOffering;
                fOffereeKey = nil;
                ISendAvatarDisabledNotification(true);
            }
        }
        else if( mouseMsg->GetButton() == kLeftButtonUp )
        {
            if (fBookMode != kNotOffering)
            {
                if (fBookMode == kOfferBook && fCurrClickIsAvatar)
                {
                    // send the avatar a message to put up his appropriate book
                    ISendOfferNotification(fCurrentClickable, 999, true);
                    //IManageIgnoredAvatars(fCurrentClickable, true);
                    fBookMode = kBookOffered;
                    fOffereeKey = fCurrentClickable;
                }
                else
                if (fBookMode == kBookOffered && fCurrClickIsAvatar)
                {
                    // and put our own dialog back up...
                    ISendOfferNotification(fOffereeKey, -999, true);
                    plKey avKey = plNetClientMgr::GetInstance()->GetLocalPlayerKey();
                    ISendOfferNotification(avKey, 0, false);
                    //IManageIgnoredAvatars(fOffereeKey, false);
                    fBookMode = kOfferBook;
                    fOffereeKey = nil;
                }   
                else
                if (fBookMode == kOfferBook)
                {
                    fBookMode = kNotOffering;
                    fOffereeKey = nil;
                    ISendAvatarDisabledNotification(true);
                }
            }
            if( fLastClicked != nil )
            {
                fButtonState &= ~kLeftButtonDown;
                ISetLastClicked( nil, hsPoint3(0,0,0) );
                
                return true;
            }
        }
    }

    return false;
}
void plRidingAnimatedPhysicalStrategy::Apply(float delSecs)
{
    hsVector3 LinearVelocity=fCore->GetLinearVelocity();
    hsVector3 AchievedLinearVelocity=fCore->GetAchievedLinearVelocity();
    if (fCore->IsKinematic())
    {   
        //want to make sure nothing funky happens in the sim
        IApplyKinematic();
        return;
    }
    if (!fCore->IsEnabled())
        return;

    //need to sweep ahead to see what we might hit. 
    // if we hit anything we should probably apply the force that would normally be applied in

    
    fCore->SetPushingPhysical(nil);
    fCore->SetFacingPushingPhysical( false);
    plSceneObject* so = plSceneObject::ConvertNoRef(fOwner->ObjectIsLoaded());
    hsPoint3 startPos, desiredDestination, endPos;
    fCore->GetPositionSim(startPos);
    uint32_t collideFlags =
    1<<plSimDefs::kGroupStatic |
    1<<plSimDefs::kGroupAvatarBlocker |
    1<<plSimDefs::kGroupDynamic;
    std::multiset<plControllerSweepRecord> GroundHitRecords;
    int possiblePlatformCount =fCore->SweepControllerPath(startPos, startPos + hsPoint3(0.f,0.f, -0.002f), true, true, collideFlags, GroundHitRecords);
    float maxPlatformVel = - FLT_MAX;
    int platformCount=0;
    fGroundHit = false;
    if(possiblePlatformCount)
    {
        
        std::multiset<plControllerSweepRecord>::iterator curRecord; 

        for(curRecord = GroundHitRecords.begin(); curRecord != GroundHitRecords.end(); curRecord++)
        {
            hsBool groundlike=false;
            if((curRecord->locHit.fZ - startPos.fZ)<= .2) groundlike= true;
            if(groundlike)
            {
                if(curRecord->ObjHit !=nil)
                {
                    hsVector3 vel;
                    curRecord->ObjHit->GetLinearVelocitySim(vel);
                    if(vel.fZ > maxPlatformVel)
                    {
                        maxPlatformVel= vel.fZ;
                    }
                }
                platformCount ++;
                fGroundHit = true;
            }
        }
    }
    
    
    
    bool gotGroundHit = fGroundHit;
    if (so)
    {
        
        // If we've been moved since the last physics update (somebody warped us),
        // update the physics before we apply velocity.
        const hsMatrix44& l2w = so->GetCoordinateInterface()->GetLocalToWorld();
        if (!CompareMatrices(l2w, fCore->GetLastGlobalLoc(), .0001f))
            fCore->SetGlobalLoc(l2w);

        // Convert our avatar relative velocity to subworld relative
        if (!LinearVelocity.IsEmpty())
        {
            LinearVelocity = l2w * LinearVelocity;
            const plCoordinateInterface* subworldCI = fCore->GetSubworldCI();
            if (subworldCI)
                LinearVelocity = subworldCI->GetWorldToLocal() * LinearVelocity;
        }
        
        if(!IsOnGround())
        {
            if(!fNeedVelocityOverride)
            {
                LinearVelocity.fZ= AchievedLinearVelocity.fZ;
            }
            else
            {
                LinearVelocity = fOverrideVelocity;
            }
        }
        if(fStartJump)
        {
            LinearVelocity.fZ =12.0f;
        }
        if(platformCount)
        {
            LinearVelocity.fZ = LinearVelocity.fZ + maxPlatformVel;
        }

        //probably neeed to do something with contact normals in here
        //for false ground stuff
        
        fFalseGround = false;
        hsVector3 testLength = LinearVelocity * delSecs + hsVector3(0.0, 0.0, -0.00f);
    //
        hsPoint3 desiredDestination= startPos + testLength;
        if(!IsOnGround())
        {
            if(ICheckMove(startPos, desiredDestination))
            {//we can get there soley by the LinearVelocity
                
                fNeedVelocityOverride =false;
            }
            else
            {
                
                fNeedVelocityOverride =true;
                fOverrideVelocity = LinearVelocity;
                fOverrideVelocity.fZ -=  delSecs * 32.f;
            }
        }
        else
        {
            fNeedVelocityOverride =false;
        }

        fCore->SetLinearVelocity(LinearVelocity);
    
    }
}
plDrawableSpans     *plDrawableGenerator::GenerateBoundsDrawable( hsBounds3Ext *bounds,
                                                                    hsGMaterial *material, const hsMatrix44 &localToWorld, hsBool blended,
                                                                    const hsColorRGBA* multColor,
                                                                    hsTArray<uint32_t> *retIndex, plDrawableSpans *toAddTo )
{
    hsTArray<hsPoint3>      points;
    hsTArray<hsVector3>     normals;
    hsTArray<uint16_t>        indices;
    hsTArray<hsColorRGBA>   colors;
    hsPoint3                point;
    hsVector3               normal;

    int                 i;
    plDrawableSpans     *drawable;
    float               mults[ 8 ][ 3 ] = { { -1, -1, -1 }, { 1, -1, -1 }, { 1, 1, -1 }, { -1, 1, -1 },
                                            { -1, -1,  1 }, { 1, -1,  1 }, { 1, 1,  1 }, { -1, 1,  1 } };


    /// Generate points and normals
    points.Expand( 8 );
    normals.Expand( 8 );
    hsPoint3 min = bounds->GetMins();
    hsPoint3 max = bounds->GetMaxs();

    for( i = 0; i < 8; i++ )
    {
        points.Append( hsPoint3( mults[ i ][ 0 ] > 0 ? max.fX : min.fX,
                                 mults[ i ][ 1 ] > 0 ? max.fY : min.fY,
                                 mults[ i ][ 2 ] > 0 ? max.fZ : min.fZ ) );
        normals.Append( hsVector3( mults[ i ][ 0 ], mults[ i ][ 1 ], mults[ i ][ 2 ] ) );
    }

    /// Generate indices
    indices.Expand( 36 );
    indices.Append( 0 ); indices.Append( 1 ); indices.Append( 2 );
    indices.Append( 0 ); indices.Append( 2 ); indices.Append( 3 );

    indices.Append( 1 ); indices.Append( 0 ); indices.Append( 4 );
    indices.Append( 1 ); indices.Append( 4 ); indices.Append( 5 );

    indices.Append( 2 ); indices.Append( 1 ); indices.Append( 5 );
    indices.Append( 2 ); indices.Append( 5 ); indices.Append( 6 );

    indices.Append( 3 ); indices.Append( 2 ); indices.Append( 6 );
    indices.Append( 3 ); indices.Append( 6 ); indices.Append( 7 );

    indices.Append( 0 ); indices.Append( 3 ); indices.Append( 7 );
    indices.Append( 0 ); indices.Append( 7 ); indices.Append( 4 );

    indices.Append( 7 ); indices.Append( 6 ); indices.Append( 5 );
    indices.Append( 7 ); indices.Append( 5 ); indices.Append( 4 );

    /// Create a drawable for it
    drawable = plDrawableGenerator::GenerateDrawable( points.GetCount(), points.AcquireArray(), normals.AcquireArray(),
                                                        nil, 0,
                                                        nil, true, multColor,
                                                        indices.GetCount(), indices.AcquireArray(),
                                                        material, localToWorld, blended, retIndex, toAddTo );

    return drawable;
}
示例#13
0
//
// show lists of members, listenList, and talkList
//
void plNetClientMgr::IShowLists()
{
    plNetLinkingMgr * lm = plNetLinkingMgr::GetInstance();
    plDebugText     &txt = plDebugText::Instance();

    int y,x,i;
    const int yOff=10, xOff=300, startY=70, startX=10;
    char str[256];

    // My player info
    x=startX;
    y=startY;
    plSceneObject *player = plSceneObject::ConvertNoRef(GetLocalPlayer());
    hsPoint3 pos = (player ? player->GetLocalToWorld() * hsPoint3(0, 0, 0) : hsPoint3(0, 0, 0));
    sprintf(str, "%s%s PlyrName=%s PlyrID=%d AcctID=%d P2P=%d Join#=%d Peers=%d %.1f,%.1f,%.1f",
        GetFlagsBit(kSendingVoice) ? "V" : " ",
        GetFlagsBit(kSendingActions) ? "A" : " ",
        GetPlayerName().c_str(), GetPlayerID(), 0,
        IsPeerToPeer(), GetJoinOrder(), 0,
        pos.fX, pos.fY, pos.fZ);
    txt.DrawString(x,y,str,255,255,255,255);
    SetFlagsBit(kSendingVoice, 0);
    SetFlagsBit(kSendingActions, 0);

    y+=yOff;
    sprintf(str, "   Server=%s ILIAS=%d", "foo",
        IsLoadingInitialAgeState());
    txt.DrawString(x,y,str,255,255,255,255);
    
    // MEMBERS
    y+=yOff;
    int baseY=y;
    txt.DrawString(x,y,"   Members",255,255,255,255,plDebugText::kStyleBold);
    y+=yOff;
    plNetTransportMember** members=nil;
    fTransport.GetMemberListDistSorted(members);
    for(i=0;i<fTransport.GetNumMembers();i++)
    {
        plNetTransportMember* mbr=members[i];
        hsAssert(mbr, "ShowLists: nil member?");
        if (mbr->IsServer())
            continue;
        player = (mbr->GetAvatarKey() ? plSceneObject::ConvertNoRef(mbr->GetAvatarKey()->ObjectIsLoaded()) : nil);
        sprintf(str, "%s%s %s p2p=%d dist=%.1f",
            mbr->GetTransportFlags() & plNetTransportMember::kSendingVoice ? "V" : " ",
            mbr->GetTransportFlags() & plNetTransportMember::kSendingActions ? "A" : " ",
            mbr->AsString().c_str(),
            mbr->IsPeerToPeer(),
            mbr->GetDistSq() != FLT_MAX ? sqrt(mbr->GetDistSq()) :-1.f);
        txt.DrawString(x,y,str);
        y+=yOff;
        mbr->SetTransportFlags(mbr->GetTransportFlags() & 
            ~(plNetTransportMember::kSendingVoice|plNetTransportMember::kSendingActions));
    }

    delete [] members;
    
    // LISTENLIST
    x+=xOff;
    y=baseY;
    txt.DrawString(x,y,"ListenList",255,255,255,255,plDebugText::kStyleBold);
    y+=yOff;
    for(i=0;i<GetListenList()->GetNumMembers();i++)
    {
        sprintf(str, "name=%s", GetListenList()->GetMember(i)->AsString().c_str());
        txt.DrawString(x,y,str);
        y+=yOff;
    }

    // TALKLIST
    x+=xOff;
    y=baseY;
    txt.DrawString(x,y,"TalkList",255,255,255,255,plDebugText::kStyleBold);
    y+=yOff;
    for(i=0;i<GetTalkList()->GetNumMembers();i++)
    {
        sprintf(str, "name=%s", GetTalkList()->GetMember(i)->AsString().c_str());
        txt.DrawString(x,y,str);
        y+=yOff;
    }
}
示例#14
0
void plNetClientMgr::IShowAvatars()
{
    plDebugText     &txt = plDebugText::Instance();
    txt.SetFont( "Courier New", 6 );

    int y,x,i;
    const int yOff=10, xOff=285, startY=100, startX=10;
    char str[256];

    // Me
    x=startX;
    y=startY-yOff*3;
    plSceneObject *player = plSceneObject::ConvertNoRef(GetLocalPlayer());
    hsPoint3 pos = (player ? player->GetLocalToWorld() * hsPoint3(0, 0, 0) : hsPoint3(0, 0, 0));
    hsVector3 ori = (player ? player->GetLocalToWorld() * hsVector3(0, -1, 0) : hsVector3(0, 0, 0));
    sprintf(str, "%s: pos(%.2f, %.2f, %.2f) ori(%.2f, %.2f, %.2f)",
            GetPlayerName().c_str(), pos.fX, pos.fY, pos.fZ, ori.fX, ori.fY, ori.fZ);
    txt.DrawString(x,y,str,255,255,255,255);


    if (player)
    {
        const plArmatureMod *avMod = plArmatureMod::ConvertNoRef(player->GetModifierByType(plArmatureMod::Index()));
        if (avMod)
        {
            plArmatureMod* pNonConstArm = const_cast<plArmatureMod*>(avMod);
            plSceneObject* pObj = pNonConstArm->GetFollowerParticleSystemSO();
            if (pObj)
            {
                y+=yOff;
                y+=yOff;
                hsPoint3 pos = (pObj ? pObj->GetLocalToWorld() * hsPoint3(0, 0, 0) : hsPoint3(0, 0, 0));
                hsVector3 ori = (pObj ? pObj->GetLocalToWorld() * hsVector3(0, -1, 0) : hsVector3(0, 0, 0));
                sprintf(str, "%s: pos(%.2f, %.2f, %.2f) ori(%.2f, %.2f, %.2f)",
                        pObj->GetKeyName().c_str(), pos.fX, pos.fY, pos.fZ, ori.fX, ori.fY, ori.fZ);
                txt.DrawString(x,y,str,255,255,255,255);
            }
        }
    }


    // Others
    y=startY;
    x=startX;

    plNetTransportMember** members=nil;
    fTransport.GetMemberListDistSorted(members);
    for(i=0;i<fTransport.GetNumMembers();i++)
    {
        plNetTransportMember* mbr=members[i];
        hsAssert(mbr, "ShowLists: nil member?");
        if (mbr->IsServer())
            continue;

        player = (mbr->GetAvatarKey() ? plSceneObject::ConvertNoRef(mbr->GetAvatarKey()->ObjectIsLoaded()) : nil);
        pos = (player ? player->GetLocalToWorld() * hsPoint3(0, 0, 0) : hsPoint3(0, 0, 0));
        ori = (player ? player->GetLocalToWorld() * hsVector3(0, -1, 0) : hsVector3(0, 0, 0));

        sprintf(str, "%s: pos(%.2f, %.2f, %.2f) ori(%.2f, %.2f, %.2f)",
                mbr->AsString().c_str(), pos.fX, pos.fY, pos.fZ, ori.fX, ori.fY, ori.fZ);
        txt.DrawString(x,y,str);
        y+=yOff;

        if (player)
        {
            const plArmatureMod *avMod = plArmatureMod::ConvertNoRef(player->GetModifierByType(plArmatureMod::Index()));
            if (avMod)
            {
                plArmatureMod* pNonConstArm = const_cast<plArmatureMod*>(avMod);
                plSceneObject* pObj = pNonConstArm->GetFollowerParticleSystemSO();
                if (pObj)
                {
                    y+=yOff;
                    y+=yOff;
                    hsPoint3 pos = (pObj ? pObj->GetLocalToWorld() * hsPoint3(0, 0, 0) : hsPoint3(0, 0, 0));
                    hsVector3 ori = (pObj ? pObj->GetLocalToWorld() * hsVector3(0, -1, 0) : hsVector3(0, 0, 0));
                    sprintf(str, "%s: pos(%.2f, %.2f, %.2f) ori(%.2f, %.2f, %.2f)",
                            pObj->GetKeyName().c_str(), pos.fX, pos.fY, pos.fZ, ori.fX, ori.fY, ori.fZ);
                    txt.DrawString(x,y,str,255,255,255,255);
                }
            }
        }

    }

    delete [] members;

    txt.SetFont( "Courier New", 8 );
}