NewMem question



  • in my plugin i used the following code which doesn't work in r20

    Vector* vp1 = NewMem(Vector, 3);
    Vector* vp2 = NewMem(Vector, 3);
    Vector* vf = NewMem(Vector, 3);
    

    i get the error "Initialisierung": "maxon::ResultMemT<T *>" kann nicht in "Vector *" konvertiert werden

    edit: found out this

    Vector vp1[3] = { endpoint1 + dir * Vector(0, 0, -20) , endpoint1 + dir * Vector(0, 5, -5) , endpoint1 + dir * Vector(0, -5, -5) };
    

    but now i get new errors:

    Fehler (aktiv) E0135 "class "maxon::ArrayInterfacemaxon::Generic"" hat keinen Member ""Iterator"". arkos C:\sdk\frameworks\core.framework\source\maxon\array.h 741

    Fehler (aktiv) E0070 Ein unvollständiger Typ ist nicht zulässig. arkos C:\sdk\frameworks\core.framework\source\maxon\array.h 706


  • Global Moderator

    Hello,

    Cinema 40 R20 introduces a new, elaborate error handling system. A function can return now a dedicated result object that stores additional information if the operation was successful or not.

    NewMem does return such a result value. You find information on how to handle errors in the documentation: Error Handling. See also Error System in the API Transition.

    That being said, in most cases there should be no reason to allocate memory with NewMem. It is recommended to use arrays like BaseArray instead. Such an array provides save access to and management of the allocated data.

    See

    best wishes,
    Sebastian



  • @s_bach thank you very much for pointing me to that. however, i tried adopting that to a function retrieveing the vertex normals and now i don't know how to properly return those normals.

    Vector *GetVertexNormals(PolygonObject *pObj)
    {
    	Int32 numVerts = pObj->GetPointCount();
    	Int32 numPolys = pObj->GetPolygonCount();
    	const Vector *pVerts = pObj->GetPointR();
    	const CPolygon *pPolys = pObj->GetPolygonR();
    
    	// initialize neighbor class... this is used to compute m_SrcvNorms
    	Neighbor neighbor;
    	if( !neighbor.Init(numVerts, pPolys, numPolys, NULL) )
    		return NULL;
    
    	//** those two lines worked in the old version **//
    	//Vector *pNormals = (Vector *)NewMemClear(UChar,numVerts * sizeof(Vector));
    	//if( !pNormals )     return NULL;
    
    	//** these are my adoption to basearray **//
    	maxon::BaseArray<Vector> pNormals;
    	if(pNormals.GetCount()<=0) return NULL;
    
    	// Determine a Normal for each vertex of mesh
    	Int32 i, j, faceCnt, *pFaces = NULL;
    	Vector vNorm;
    	for(i=0; i<numVerts; i++)
    	{
    		vNorm = Vector();          // (re)intitialize 
    		neighbor.GetPointPolys(i, &pFaces, &faceCnt);
    		if( faceCnt )
    		{
    			for(j=0; j<faceCnt; j++)
    			{
    				Vector n = CalcFaceNormal(pVerts, pPolys[pFaces[j]]);
    				vNorm += !n;
    			}
    			vNorm /= faceCnt;          // average the normal(s)
    			pNormals[i] = !vNorm;     // normalize and store
    		}
    		else
    			pNormals[i] = Vector(0.0,1.0,0.0);     // default case = Up for any stray verts
    	}
    	return pNormals;
    }
    


  • and btw, it seems to be a general problem with all parts of the plugin, cinema is not crashing with most of them, but the debugger halts everytime


  • Global Moderator

    Hello,

    the best solution is probably to create the BaseArray in the caller and hand over a reference to that BaseArray. Your function can then safely fill the BaseArray:

    maxon::Result<void> GetVertexNormals(PolygonObject * const pObj, maxon::BaseArray<Vector>& normals)
    

    If you encounter unexpected break points, please open a new thread to discuss this issue.

    best wishes,
    Sebastian



  • thank you. i got this working. maybe there are even other places in my code where i can use this knowledge :)