'closing' a SplineObject



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/06/2008 at 12:00, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   10.1+ 
    Platform:   Windows  ;   
    Language(s) :     C++  ;

    ---------
    I have questions about the following code-snippet...

        
        
          
        //----------------------------------------------------------------------------------------------------  
        //******************************************************************************************************  
        // ObjLoader::MakeSplineObject()  
        //******************************************************************************************************  
        //------------------------------------------------------------------------------------------------------
        
        
        
        
        BaseObject *ObjLoader::MakeSplineObject(DWORD numSegments, DWORD *pSegIndices, String splineName)  
        {  
            SplineObject *op;  
            Vector *padr;  
            Segment *sadr;  
            objSegment *pSeg;  
            DWORD *pSegNdx;  
            DWORD i, j, numVerts;
        
        
        
        
            if( !numSegments ) return NULL;
        
        
        
        
            // first figure out how many vertices are used...  
            numVerts = 0;  
            pSegNdx = pSegIndices;  
            for( i=0; i<numSegments; i++)  
            {  
                pSeg = &m_pSegs[*pSegNdx];  
                numVerts += pSeg->vCount;  
                pSegNdx++;  
            }
        
        
        
        
            op = SplineObject::Alloc(numVerts,Tlinear); // allocate spline object large enough for all points  
            if( !op || !op->MakeVariableTag(Tsegment,numSegments) )  
            {  
                MessageDialog(String("Spline Object Allocation Failed"));  
                return NULL;  
            }
        
        
        
        
            op->SetName(splineName);
        
        
        
        
        #ifdef _R10p1_SDK_  
            padr = op->GetPointW();  
            sadr = op->GetSegmentW();  
        #else  
            padr = op->GetPoint();  
            sadr = op->GetSegment();  
        #endif
        
        
        
        
            // set up the points...  
            numVerts = 0;  
            if( padr )  
            {  
                pSegNdx = pSegIndices;  
                for( i=0; i<numSegments; i++)  
                {  
                    pSeg = &m_pSegs[*pSegNdx];  
                    for(j=0; j<pSeg->vCount; j++)  
                        padr[numVerts++] = m_pVerts[pSeg->v[j]];  
                    pSegNdx++;  
                }  
            }
        
        
        
        
            // set up the segments...  
            if (sadr)  
            {  
                pSegNdx = pSegIndices;  
                for( i=0; i<numSegments; i++)  
                {  
                    pSeg = &m_pSegs[*pSegNdx];  
                    sadr[i].cnt = pSeg->vCount;  
                    sadr[i].closed = m_MpOpts.MpCloseSplines() ? true : false; // <-- this is failing  
                    pSegNdx++;  
                }  
            }
        
        
        
        
            return op;  
        }
        
        
        
    

    ...assuming that 'm_MpOpts.MpCloseSplines()' returns true (which it does), the splines are still not being 'closed'.
    In the SDK, I see a SplineObject::IsClosed(void) method, but no other way to Set it to closed.   Am I missing something?
    Thanks,
    Keith



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/06/2008 at 13:06, xxxxxxxx wrote:

    You have to:

    Segment* sadr = op->GetSegmentW();

    and set each segment in the spline to be closed, set:

    sadr[n].closed = TRUE;

    which is what you're already doing. I don't know what the m_MpOpts.MpCloseSplines() is but maybe it is the problem. Try just doing:

    sadr[n].closed = m_MpOpts.MpCloseSpline();

    and see what results. Don't forget to update the SplineObject after changing it:

    op->Message(MSG_UPDATE);



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/06/2008 at 13:14, xxxxxxxx wrote:

    Hey Robert,
    I have it coded that way because 'm_MpOpts.MpCloseSpline()' call returns a masked value or zero (not really a boolean), but I've also just hard-coded a 'true' there with no better luck.
    Your 'MSG_UPDATE' suggestion may lead somewhere though.. lemme look into the code again - thanks.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/06/2008 at 13:18, xxxxxxxx wrote:

    ...hmm - nope - I was already doing a op->Message(MSG_UPDATE); everywhere, after adding the spline to the scene/document (I also just tried doing it before, but neither works).



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/06/2008 at 13:30, xxxxxxxx wrote:

    I'm surprised since this is almost identical in places to my code which exists in several forms throughout my plugin code.

    There is one difference though. I insert the SplineObject into the document before doing any setup. Could this be the culprit?

    Oh, I just noticed this tidbit in my code as well (eh hem) :

    splineObj->GetDataInstance()->SetBool(SPLINEOBJECT_CLOSED,FALSE);

    So, you may want to add this (with TRUE of course).



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/06/2008 at 13:51, xxxxxxxx wrote:

    D'oh!  or, maybe "Eureka" is more appropriate :).  Thanks Robert, I'm sure that will fix it... and - yep! it did.  Thanks again.


Log in to reply