mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2024-09-19 22:30:05 +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
|
void
|
||||||
OsdCpuKernelDispatcher::ApplyBilinearFaceVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
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
|
void
|
||||||
OsdCpuKernelDispatcher::ApplyBilinearEdgeVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
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
|
void
|
||||||
OsdCpuKernelDispatcher::ApplyBilinearVertexVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
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
|
void
|
||||||
OsdCpuKernelDispatcher::ApplyCatmarkFaceVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
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_VERSION
|
||||||
} // end namespace OpenSubdiv
|
} // 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 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
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
@ -121,6 +121,11 @@ OsdMesh::Create(OsdHbrMesh *hbrMesh, int level, const std::string &kernel) {
|
|||||||
// catmark
|
// catmark
|
||||||
_dispatcher->UpdateTable(OsdKernelDispatcher::F_IT, cctable->Get_F_IT());
|
_dispatcher->UpdateTable(OsdKernelDispatcher::F_IT, cctable->Get_F_IT());
|
||||||
_dispatcher->UpdateTable(OsdKernelDispatcher::F_ITa, cctable->Get_F_ITa());
|
_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 {
|
} else {
|
||||||
// XXX for glsl shader...
|
// XXX for glsl shader...
|
||||||
_dispatcher->CopyTable(OsdKernelDispatcher::F_IT, 0, NULL);
|
_dispatcher->CopyTable(OsdKernelDispatcher::F_IT, 0, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user