コード例 #1
0
ファイル: WriteGeo.cpp プロジェクト: AWhetter/alembic
//-*****************************************************************************
void ProcessSubD( ISubD &subd, ProcArgs &args, const std::string & facesetName )
{
    ISubDSchema &ss = subd.getSchema();

    TimeSamplingPtr ts = ss.getTimeSampling();

    SampleTimeSet sampleTimes;
    GetRelevantSampleTimes( args, ts, ss.getNumSamples(), sampleTimes );

    bool multiSample = sampleTimes.size() > 1;

    //include this code path for future expansion
    bool isHierarchicalSubD = false;
    bool hasLocalResources = false;
    
    
    
    std::vector<IFaceSet> faceSets;
    std::vector<std::string> faceSetResourceNames;
    if ( facesetName.empty() )
    {
        std::vector <std::string> childFaceSetNames;
        ss.getFaceSetNames(childFaceSetNames);
        
        faceSets.reserve(childFaceSetNames.size());
        faceSetResourceNames.reserve(childFaceSetNames.size());
        
        for (size_t i = 0; i < childFaceSetNames.size(); ++i)
        {
            faceSets.push_back(ss.getFaceSet(childFaceSetNames[i]));
            
            IFaceSet & faceSet = faceSets.back();
            
            std::string resourceName = args.getResource(
                    faceSet.getFullName() );
            
            if ( resourceName.empty() )
            {
                resourceName = args.getResource( faceSet.getName() );
            }
            
#ifdef PRMAN_USE_ABCMATERIAL
                
                Mat::MaterialFlatten mafla(faceSet);
                
                if (!mafla.empty())
                {
                    if (!hasLocalResources)
                    {
                        RiResourceBegin();
                        hasLocalResources = true;
                    }
                    
                    RiAttributeBegin();
                    
                    if ( !resourceName.empty() )
                    {
                        //restore existing resource state here
                        RestoreResource( resourceName );
                    }
                    
                    
                    WriteMaterial( mafla, args );
                    
                    resourceName = faceSet.getFullName();
                    SaveResource( resourceName );
                    
                    RiAttributeEnd();
                }
#endif
            faceSetResourceNames.push_back(resourceName);
            
        }
    }
#ifdef PRMAN_USE_ABCMATERIAL    
    else
    {
        //handle single faceset material directly
        if ( ss.hasFaceSet( facesetName ) )
        {
            IFaceSet faceSet = ss.getFaceSet( facesetName );
            ApplyObjectMaterial(faceSet, args);
            
        }
    }
#endif
    
    
    
    
    

    if ( multiSample ) { WriteMotionBegin( args, sampleTimes ); }

    for ( SampleTimeSet::iterator iter = sampleTimes.begin();
          iter != sampleTimes.end(); ++iter )
    {
        
        ISampleSelector sampleSelector( *iter );

        ISubDSchema::Sample sample = ss.getValue( sampleSelector );

        RtInt npolys = (RtInt) sample.getFaceCounts()->size();

        ParamListBuilder paramListBuilder;

        paramListBuilder.add( "P", (RtPointer)sample.getPositions()->get() );

        IV2fGeomParam uvParam = ss.getUVsParam();
        if ( uvParam.valid() )
        {
            ICompoundProperty parent = uvParam.getParent();
            
            if ( !args.flipv )
            {
                AddGeomParamToParamListBuilder<IV2fGeomParam>(
                    parent,
                    uvParam.getHeader(),
                    sampleSelector,
                    "float",
                    paramListBuilder,
                    2,
                    "st");
            }
            else if ( std::vector<float> * values =
                    AddGeomParamToParamListBuilderAsFloat<IV2fGeomParam, float>(
                        parent,
                        uvParam.getHeader(),
                        sampleSelector,
                        "float",
                        paramListBuilder,
                        "st") )
            {
                for ( size_t i = 1, e = values->size(); i < e; i += 2 )
                {
                    (*values)[i] = 1.0 - (*values)[i];
                }
            }
            
        }

        ICompoundProperty arbGeomParams = ss.getArbGeomParams();
        AddArbitraryGeomParams( arbGeomParams,
                    sampleSelector, paramListBuilder );

        std::string subdScheme = sample.getSubdivisionScheme();

        SubDTagBuilder tags;

        ProcessFacevaryingInterpolateBoundry( tags, sample );
        ProcessInterpolateBoundry( tags, sample );
        ProcessFacevaryingPropagateCorners( tags, sample );
        ProcessHoles( tags, sample );
        ProcessCreases( tags, sample );
        ProcessCorners( tags, sample );
        
        if ( !facesetName.empty() )
        {
            if ( ss.hasFaceSet( facesetName ) )
            {
                IFaceSet faceSet = ss.getFaceSet( facesetName );
                
                ApplyResources( faceSet, args );
                
                // TODO, move the hold test outside of MotionBegin
                // as it's not meaningful to change per sample
                
                IFaceSetSchema::Sample faceSetSample = 
                        faceSet.getSchema().getValue( sampleSelector );
                
                std::set<int> facesToKeep;
                
                facesToKeep.insert( faceSetSample.getFaces()->get(),
                        faceSetSample.getFaces()->get() +
                                faceSetSample.getFaces()->size() );
                
                for ( int i = 0; i < npolys; ++i )
                {
                    if ( facesToKeep.find( i ) == facesToKeep.end() )
                    {
                        tags.add( "hole" );
                        tags.addIntArg( i );
                    }
                }
            }
        }
        else
        {
            //loop through the facesets and determine whether there are any
            //resources assigned to each
            
            for (size_t i = 0; i < faceSetResourceNames.size(); ++i)
            {
                const std::string & resourceName = faceSetResourceNames[i];
                
                //TODO, visibility?
                
                if ( !resourceName.empty() )
                {
                    IFaceSet & faceSet = faceSets[i];
                    
                    isHierarchicalSubD = true;
                    
                    tags.add("faceedit");
                    
                    Int32ArraySamplePtr faces = faceSet.getSchema().getValue(
                            sampleSelector ).getFaces();
                    
                    for (size_t j = 0, e = faces->size(); j < e; ++j)
                    {
                        tags.addIntArg(1); //yep, every face gets a 1 in front of it too
                        tags.addIntArg( (int) faces->get()[j]);
                    }
                    
                    tags.addStringArg( "attributes" );
                    tags.addStringArg( resourceName );
                    tags.addStringArg( "shading" );
                }
            }
        }


        if ( isHierarchicalSubD )
        {
            RiHierarchicalSubdivisionMeshV(
                const_cast<RtToken>( subdScheme.c_str() ),
                npolys,
                (RtInt*) sample.getFaceCounts()->get(),
                (RtInt*) sample.getFaceIndices()->get(),
                tags.nt(),
                tags.tags(),
                tags.nargs( true ),
                tags.intargs(),
                tags.floatargs(),
                tags.stringargs(),
                paramListBuilder.n(),
                paramListBuilder.nms(),
                paramListBuilder.vals()
                                          );
        }
        else
        {
            RiSubdivisionMeshV(
                const_cast<RtToken>(subdScheme.c_str() ),
                npolys,
                (RtInt*) sample.getFaceCounts()->get(),
                (RtInt*) sample.getFaceIndices()->get(),
                tags.nt(),
                tags.tags(),
                tags.nargs( false ),
                tags.intargs(),
                tags.floatargs(),
                paramListBuilder.n(),
                paramListBuilder.nms(),
                paramListBuilder.vals()
                              );
        }
    }

    if ( multiSample ) { RiMotionEnd(); }
    
    if ( hasLocalResources ) { RiResourceEnd(); }
}
コード例 #2
0
ファイル: RFeather.cpp プロジェクト: esotericDisciple/makoto
void RFeather::generateRIB(RtFloat detail)
{
	if(m_is_shd!=1) RiSides(2);
	else RiSides(1);

	RtToken paramname[MAX_NUMPARAM];
	RtPointer paramvalue[MAX_NUMPARAM];
	
	MATRIX44F hair_space;
	XYZ wind, pw, side;
	float length, curl, root_s, root_t, noil;
	
	int n_curve;
	FBend* fb = new FBend();
	int num_hair = feather->getNumHair();
	
	n_curve = num_hair;
	
	float delta = (m_shutter_close-m_shutter_open)*m_fps;
	
	if(m_is_shd!=1)
	{
		XYZ* parray = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* parray_close = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col0 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col1 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col2 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col3 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col4 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col5 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col6 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col7 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col8 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col9 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col10 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col11 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col12 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col13 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col14 = new XYZ[2*(NUMBENDSEG+1)];
		XYZ* col15 = new XYZ[2*(NUMBENDSEG+1)];
		
		int g_seed = 13;
		CoeRec root_rt;
		for(int i=0; i<num_hair; i++)
		{
			feather->getAParam(i, hair_space, length, wind, side, curl, root_s, root_t, root_rt);
			
			float noil = 1.f+(randfint( g_seed )-0.5)*0.13;
			g_seed++;
			
			length *= noil;
			
			fb->create(length, wind.x, wind.y+length*(curl*noil-0.5)*2);
			
			for(int j=0; j<NUMBENDSEG+1; j++)
			{
				fb->getPoint(j, pw);
				hair_space.transform(pw);

				parray[j*2] = pw - side*length*m_f_wh*0.5;
				parray[j*2+1] = pw + side * length*m_f_wh*0.5;
			}
			
			for(int j=0; j<4*NUMBENDSEG; j++)
			{
				roots[j]=root_s;
				roott[j] = 1.f-root_t;
			}
			
			paramname[0] = "P";
			paramvalue[0] = (RtPoint*)parray;
			
			paramname[1] = "facevarying float s";
			paramvalue[1] = (RtFloat*)scoord;
			
			paramname[2] = "facevarying float t";
			paramvalue[2] = (RtFloat*)tcoord;
			
			paramname[3] = "facevarying float root_s";
			paramvalue[3] = (RtFloat*)roots;
			
			paramname[4] = "facevarying float root_t";
			paramvalue[4] = (RtFloat*)roott;
			
			for(int j=0; j<2*(NUMBENDSEG+1);j++) 
			{
				col0[j] = root_rt.data[0];
				col1[j] = root_rt.data[1];
				col2[j] = root_rt.data[2];
				col3[j] = root_rt.data[3];
				col4[j] = root_rt.data[4];
				col5[j] = root_rt.data[5];
				col6[j] = root_rt.data[6];
				col7[j] = root_rt.data[7];
				col8[j] = root_rt.data[8];
				col9[j] = root_rt.data[9];
				col10[j] = root_rt.data[10];
				col11[j] = root_rt.data[11];
				col12[j] = root_rt.data[12];
				col13[j] = root_rt.data[13];
				col14[j] = root_rt.data[14];
				col15[j] = root_rt.data[15];
			}
			paramname[5] = "vertex color coeff0";
			paramvalue[5] = (RtFloat*)col0;
			paramname[6] = "vertex color coeff1";
			paramvalue[6] = (RtFloat*)col1;
			paramname[7] = "vertex color coeff2";
			paramvalue[7] = (RtFloat*)col2;
			paramname[8] = "vertex color coeff3";
			paramvalue[8] = (RtFloat*)col3;
			paramname[9] = "vertex color coeff4";
			paramvalue[9] = (RtFloat*)col4;
			paramname[10] = "vertex color coeff5";
			paramvalue[10] = (RtFloat*)col5;
			paramname[11] = "vertex color coeff6";
			paramvalue[11] = (RtFloat*)col6;
			paramname[12] = "vertex color coeff7";
			paramvalue[12] = (RtFloat*)col7;
			paramname[13] = "vertex color coeff8";
			paramvalue[13] = (RtFloat*)col8;
			paramname[14] = "vertex color coeff9";
			paramvalue[14] = (RtFloat*)col9;
			paramname[15] = "vertex color coeff10";
			paramvalue[15] = (RtFloat*)col10;
			paramname[16] = "vertex color coeff11";
			paramvalue[16] = (RtFloat*)col11;
			paramname[17] = "vertex color coeff12";
			paramvalue[17] = (RtFloat*)col12;
			paramname[18] = "vertex color coeff13";
			paramvalue[18] = (RtFloat*)col13;
			paramname[19] = "vertex color coeff14";
			paramvalue[19] = (RtFloat*)col14;
			paramname[20] = "vertex color coeff15";
			paramvalue[20] = (RtFloat*)col15;
			
			if(m_is_blur ==1 && feather_close) 
			{
				RiMotionBegin(2, m_shutter_open, m_shutter_close);
				RiHierarchicalSubdivisionMeshV("catmull-clark", (RtInt)3,  (RtInt*)nvertices, (RtInt*)vertices, (RtInt)2, tags, nargs, intargs, floatargs, stringargs, (RtInt)21, paramname, paramvalue );
				
				feather_close->getAParam(i, hair_space, length, wind, side, curl, root_s, root_t);
				fb->create(length, wind.x, wind.y+length*(curl*noil-0.5)*2);
				
				for(int j=0; j<NUMBENDSEG+1; j++)
				{
					fb->getPoint(j, pw);
					hair_space.transform(pw);

					parray_close[j*2] = pw - side*length*m_f_wh*0.5;
					parray_close[j*2+1] = pw + side * length*m_f_wh*0.5;
					
					parray[j*2] += (parray_close[j*2] - parray[j*2])*delta;
					parray[j*2+1] += (parray_close[j*2+1] - parray[j*2+1])*delta;
				}
			
				paramvalue[0] = (RtPoint*)parray;

				RiHierarchicalSubdivisionMeshV("catmull-clark", (RtInt)3,  (RtInt*)nvertices, (RtInt*)vertices, (RtInt)2, tags, nargs, intargs, floatargs, stringargs, (RtInt)21, paramname, paramvalue );
				RiMotionEnd();
			}
			else RiHierarchicalSubdivisionMeshV("catmull-clark", (RtInt)3,  (RtInt*)nvertices, (RtInt*)vertices, (RtInt)2, tags, nargs, intargs, floatargs, stringargs, (RtInt)21, paramname, paramvalue );
		}

		delete[] parray;
		delete[] parray_close;
		delete[] col0;
		delete[] col1;
		delete[] col2;
		delete[] col3;
		delete[] col4;
		delete[] col5;
		delete[] col6;
		delete[] col7;
		delete[] col8;
		delete[] col9;
		delete[] col10;
		delete[] col11;
		delete[] col12;
		delete[] col13;
		delete[] col14;
		delete[] col15;
	}
	else
	{
		XYZ* parray = new XYZ[2*(NUMBENDSEG+1)];
		
		int g_seed = 13;
		for(int i=0; i<num_hair; i++)
		{
			feather->getAParam(i, hair_space, length, wind, side, curl, root_s, root_t);
			
			float noil = 1.f+(randfint( g_seed )-0.5)*0.13;
			g_seed++;
			
			length *= noil;
			
			fb->create(length, wind.x, wind.y+length*(curl*noil-0.5)*2);
			
			for(int j=0; j<NUMBENDSEG+1; j++)
			{
				fb->getPoint(j, pw);
				hair_space.transform(pw);

				parray[j*2] = pw - side*length*m_f_wh*0.5;
				parray[j*2+1] = pw + side * length*m_f_wh*0.5;
			}
			
			for(int j=0; j<4*NUMBENDSEG; j++)
			{
				roots[j]=root_s;
				roott[j] = 1.f-root_t;
			}
			
			paramname[0] = "P";
			paramvalue[0] = (RtPoint*)parray;
			
			paramname[1] = "facevarying float s";
			paramvalue[1] = (RtFloat*)scoord;
			
			paramname[2] = "facevarying float t";
			paramvalue[2] = (RtFloat*)tcoord;
			
			paramname[3] = "facevarying float root_s";
			paramvalue[3] = (RtFloat*)roots;
			
			paramname[4] = "facevarying float root_t";
			paramvalue[4] = (RtFloat*)roott;
			
			RiHierarchicalSubdivisionMeshV("catmull-clark", (RtInt)3,  (RtInt*)nvertices, (RtInt*)vertices, (RtInt)2, tags, nargs, intargs, floatargs, stringargs, (RtInt)5, paramname, paramvalue );
		}

		delete[] parray;
	}
	return;
}