mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2024-09-19 14:20:00 +00:00
add bilinear compute to cpu kernel ( not yet for other kernels)
This commit is contained in:
parent
23a3b7b15f
commit
ee40f8d259
@ -206,20 +206,35 @@ OsdCpuKernelDispatcher::Synchronize() { }
|
||||
void
|
||||
OsdCpuKernelDispatcher::ApplyBilinearFaceVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||
|
||||
VertexDescriptor vd(_numVertexElements, _numVaryingElements);
|
||||
|
||||
computeFace(&vd, _vbo, _varyingVbo,
|
||||
(int*)_tables[F_IT].devicePtr + _tableOffsets[F_IT][level-1],
|
||||
(int*)_tables[F_ITa].devicePtr + _tableOffsets[F_ITa][level-1],
|
||||
offset, start, end);
|
||||
}
|
||||
|
||||
void
|
||||
OsdCpuKernelDispatcher::ApplyBilinearEdgeVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||
|
||||
VertexDescriptor vd(_numVertexElements, _numVaryingElements);
|
||||
|
||||
computeBilinearEdge(&vd, _vbo, _varyingVbo,
|
||||
(int*)_tables[E_IT].devicePtr + _tableOffsets[E_IT][level-1],
|
||||
offset,
|
||||
start, end);
|
||||
}
|
||||
|
||||
void
|
||||
OsdCpuKernelDispatcher::ApplyBilinearVertexVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||
|
||||
VertexDescriptor vd(_numVertexElements, _numVaryingElements);
|
||||
|
||||
computeBilinearVertex(&vd, _vbo, _varyingVbo,
|
||||
(int*)_tables[V_ITa].devicePtr + _tableOffsets[V_ITa][level-1],
|
||||
offset, start, end);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
OsdCpuKernelDispatcher::ApplyCatmarkFaceVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||
|
||||
|
@ -227,5 +227,49 @@ void computeLoopVertexB(const VertexDescriptor *vdesc, float *vertex, float *var
|
||||
}
|
||||
}
|
||||
|
||||
void computeBilinearEdge(const VertexDescriptor *vdesc, float *vertex, float *varying, const int *E_IT, int offset, int start, int end) {
|
||||
|
||||
int ve = vdesc->numVertexElements;
|
||||
int vev = vdesc->numVaryingElements;
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for
|
||||
#endif
|
||||
for (int i = start; i < end; i++) {
|
||||
int eidx0 = E_IT[2*i+0];
|
||||
int eidx1 = E_IT[2*i+1];
|
||||
|
||||
float *dst = &vertex[(offset+i)*ve];
|
||||
float *dstVarying = &varying[(offset+i)*vev];
|
||||
vdesc->Clear(dst, dstVarying);
|
||||
|
||||
vdesc->AddWithWeight(dst, &vertex[eidx0*ve], 0.5f);
|
||||
vdesc->AddWithWeight(dst, &vertex[eidx1*ve], 0.5f);
|
||||
|
||||
vdesc->AddVaryingWithWeight(dstVarying, &varying[eidx0*vev], 0.5f);
|
||||
vdesc->AddVaryingWithWeight(dstVarying, &varying[eidx1*vev], 0.5f);
|
||||
}
|
||||
}
|
||||
|
||||
void computeBilinearVertex(const VertexDescriptor *vdesc, float *vertex, float *varying, const int *V_ITa, int offset, int start, int end) {
|
||||
|
||||
int ve = vdesc->numVertexElements;
|
||||
int vev = vdesc->numVaryingElements;
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for
|
||||
#endif
|
||||
for (int i = start; i < end; i++) {
|
||||
int p = V_ITa[i];
|
||||
|
||||
float *dst = &vertex[(offset+i)*ve];
|
||||
float *dstVarying = &varying[(offset+i)*vev];
|
||||
vdesc->Clear(dst, dstVarying);
|
||||
|
||||
vdesc->AddWithWeight(dst, &vertex[p*ve], 1.0f);
|
||||
vdesc->AddVaryingWithWeight(dstVarying, &varying[p*vev], 1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
} // end namespace OPENSUBDIV_VERSION
|
||||
} // end namespace OpenSubdiv
|
||||
|
@ -99,6 +99,10 @@ void computeVertexB(const VertexDescriptor *vdesc, float *vertex, float * varyin
|
||||
|
||||
void computeLoopVertexB(const VertexDescriptor *vdesc, float *vertex, float * varying, const int *V_ITa, const int *V_IT, const float *V_W, int offset, int start, int end);
|
||||
|
||||
void computeBilinearEdge(const VertexDescriptor *vdesc, float *vertex, float * varying, const int *E_IT, int offset, int start, int end);
|
||||
|
||||
void computeBilinearVertex(const VertexDescriptor *vdesc, float *vertex, float * varying, const int *V_ITa, int offset, int start, int end);
|
||||
|
||||
}
|
||||
|
||||
} // end namespace OPENSUBDIV_VERSION
|
||||
|
@ -121,6 +121,11 @@ OsdMesh::Create(OsdHbrMesh *hbrMesh, int level, const std::string &kernel) {
|
||||
// catmark
|
||||
_dispatcher->UpdateTable(OsdKernelDispatcher::F_IT, cctable->Get_F_IT());
|
||||
_dispatcher->UpdateTable(OsdKernelDispatcher::F_ITa, cctable->Get_F_ITa());
|
||||
} else if ( const FarBilinearSubdivisionTables<OsdVertex> * btable =
|
||||
dynamic_cast<const FarBilinearSubdivisionTables<OsdVertex>*>(table) ) {
|
||||
// bilinear
|
||||
_dispatcher->UpdateTable(OsdKernelDispatcher::F_IT, btable->Get_F_IT());
|
||||
_dispatcher->UpdateTable(OsdKernelDispatcher::F_ITa, btable->Get_F_ITa());
|
||||
} else {
|
||||
// XXX for glsl shader...
|
||||
_dispatcher->CopyTable(OsdKernelDispatcher::F_IT, 0, NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user