void Runtime::initResList() { for (int i = 1; i <= 4; i++) { std::string rID = "R"; rID.append(std::to_string(i)); ResCtrlBlk rcb(rID,i); resources.push_back(rcb); } }
bool MakePurchase(ProductInterface *product, IntCB result_cb) { static jmethodID mid = CheckNotNull (jni->env->GetMethodID(jni->purchases_class, "makePurchase", "(Ljava/lang/String;Lcom/lucidfusionlabs/core/NativeIntCB;)Z")); if (!product) return false; LocalJNIObject rcb(jni->env, result_cb ? JNI::ToNativeIntCB(jni->env, move(result_cb)) : nullptr); LocalJNIString pid(jni->env, JNI::ToJString(jni->env, product->id)); return jni->env->CallBooleanMethod(impl.v, mid, pid.v, rcb.v); }
int main(int argc,char **argv) { scanner_t *fn; if(argc!=2){ fprintf(stderr,"usage: %s scanner.so\n",argv[0]); exit(1); } #ifdef HAVE_DLOPEN const char *fname = argv[1]; char *name = strdup(fname); char *cc = strrchr(name,'.'); if(cc){ cc[0] = 0; } else { fprintf(stderr,"%s: cannot strip extension\n",name); exit(1); } if(!dlopen_preflight(fname)){ err(1,"dlopen_preflight - cannot open %s: %s",fname,dlerror()); } void *lib=dlopen(fname, RTLD_LAZY); if(lib==0) errx(1,"dlopen: %s\n",dlerror()); fn=(scanner_t *)dlsym(lib, name); if(fn==0) errx(1,"dlsym: %s\n",dlerror()); #else #ifdef HAVE_LOADLIBRARY /* Use Win32 LoadLibrary function */ /* See http://msdn.microsoft.com/en-us/library/ms686944(v=vs.85).aspx */ const char *fname = "hello.DLL"; HINSTANCE hinstLib = LoadLibrary(TEXT(fname)); if(hinstLib==0) errx(1,"LoadLibrary(%s) failed",fname); MYPROC fn = (MYPROC)GetProcAddress(hinstLib,"hello"); if(fn==0) errx(1,"GetProcAddress(%s) failed","hello"); #endif #endif uint8_t buf[100]; pos0_t p0(""); sbuf_t sbuf(p0,buf,sizeof(buf),sizeof(buf),false); feature_recorder_set fs(0); scanner_params sp(scanner_params::startup,sbuf,fs); recursion_control_block rcb(0,"STAND",true); scanner_info si; sp.info = &si; (*fn)(sp,rcb); std::cout << "Loaded scanner '" << si.name << "' by " << si.author << "\n"; dlclose(lib); return 0; }
int main(int argc,char **argv) { if(argc!=2){ fprintf(stderr,"usage: %s scanner.so\n",argv[0]); fprintf(stderr,"type 'make plugins' to make available plugins\n"); exit(1); } /* Strip extension and path */ std::string fname = argv[1]; scanner_t *fn=0; std::string name = fname; size_t dot = name.rfind('.'); if(dot==std::string::npos){ fprintf(stderr,"%s: cannot strip extension\n",name.c_str()); exit(1); } name = name.substr(0,dot); /* Strip dir */ size_t slash = name.rfind('.'); if(slash!=std::string::npos){ name = name.substr(slash+1); } #ifdef HAVE_DLOPEN if(fname.find('.')==std::string::npos){ fname = "./" + fname; // fedora requires a complete path name } #ifdef HAVE_DLOPEN_PREFLIGHT if(!dlopen_preflight(fname.c_str())){ fprintf(stderr,"dlopen_preflight - cannot open %s: %s",fname.c_str(),dlerror()); exit(1); } #endif void *lib=dlopen(fname.c_str(), RTLD_LAZY); if(lib==0){ fprintf(stderr,"fname=%s\n",fname.c_str()); fprintf(stderr,"dlopen: %s\n",dlerror()); exit(1); } fn=(scanner_t *)dlsym(lib, name.c_str()); if(fn==0){ fprintf(stderr,"dlsym: %s\n",dlerror()); exit(1); } #endif #ifdef HAVE_LOADLIBRARY /* Use Win32 LoadLibrary function */ /* See http://msdn.microsoft.com/en-us/library/ms686944(v=vs.85).aspx */ HINSTANCE hinstLib = LoadLibrary(TEXT(fname.c_str())); if(hinstLib==0){ fprintf(stderr,"LoadLibrary(%s) failed",fname.c_str()); exit(1); } MYPROC fn = (MYPROC)GetProcAddress(hinstLib,name.c_str()); if(fn==0){ fprintf(stderr,"GetProcAddress(%s) failed",name.c_str()); exit(1); } #endif feature_recorder_set fs(0,my_hasher,feature_recorder_set::NO_INPUT,feature_recorder_set::NO_OUTDIR); uint8_t buf[100]; pos0_t p0(""); sbuf_t sbuf(p0,buf,sizeof(buf),sizeof(buf),false); scanner_params sp(scanner_params::PHASE_STARTUP,sbuf,fs); recursion_control_block rcb(0,"STAND"); scanner_info si; sp.info = &si; (*fn)(sp,rcb); std::cout << "Loaded scanner '" << si.name << "' by " << si.author << "\n"; #ifdef HAVE_DLOPEN dlclose(lib); #endif return 0; }
void CollisionWorld::RayTestSingle(const SimdTransform& rayFromTrans,const SimdTransform& rayToTrans, CollisionObject* collisionObject, const CollisionShape* collisionShape, const SimdTransform& colObjWorldTransform, RayResultCallback& resultCallback) { SphereShape pointShape(0.0f); if (collisionShape->IsConvex()) { ConvexCast::CastResult castResult; castResult.m_fraction = 1.f;//?? ConvexShape* convexShape = (ConvexShape*) collisionShape; VoronoiSimplexSolver simplexSolver; SubsimplexConvexCast convexCaster(&pointShape,convexShape,&simplexSolver); //GjkConvexCast convexCaster(&pointShape,convexShape,&simplexSolver); //ContinuousConvexCollision convexCaster(&pointShape,convexShape,&simplexSolver,0); if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult)) { //add hit if (castResult.m_normal.length2() > 0.0001f) { castResult.m_normal.normalize(); if (castResult.m_fraction < resultCallback.m_closestHitFraction) { CollisionWorld::LocalRayResult localRayResult ( collisionObject, 0, castResult.m_normal, castResult.m_fraction ); resultCallback.AddSingleResult(localRayResult); } } } } else { if (collisionShape->IsConcave()) { TriangleMeshShape* triangleMesh = (TriangleMeshShape*)collisionShape; SimdTransform worldTocollisionObject = colObjWorldTransform.inverse(); SimdVector3 rayFromLocal = worldTocollisionObject * rayFromTrans.getOrigin(); SimdVector3 rayToLocal = worldTocollisionObject * rayToTrans.getOrigin(); //ConvexCast::CastResult struct BridgeTriangleRaycastCallback : public TriangleRaycastCallback { CollisionWorld::RayResultCallback* m_resultCallback; CollisionObject* m_collisionObject; TriangleMeshShape* m_triangleMesh; BridgeTriangleRaycastCallback( const SimdVector3& from,const SimdVector3& to, CollisionWorld::RayResultCallback* resultCallback, CollisionObject* collisionObject,TriangleMeshShape* triangleMesh): TriangleRaycastCallback(from,to), m_resultCallback(resultCallback), m_collisionObject(collisionObject), m_triangleMesh(triangleMesh) { } virtual float ReportHit(const SimdVector3& hitNormalLocal, float hitFraction, int partId, int triangleIndex ) { CollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = partId; shapeInfo.m_triangleIndex = triangleIndex; CollisionWorld::LocalRayResult rayResult (m_collisionObject, &shapeInfo, hitNormalLocal, hitFraction); return m_resultCallback->AddSingleResult(rayResult); } }; BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh); rcb.m_hitFraction = resultCallback.m_closestHitFraction; SimdVector3 rayAabbMinLocal = rayFromLocal; rayAabbMinLocal.setMin(rayToLocal); SimdVector3 rayAabbMaxLocal = rayFromLocal; rayAabbMaxLocal.setMax(rayToLocal); triangleMesh->ProcessAllTriangles(&rcb,rayAabbMinLocal,rayAabbMaxLocal); } else { //todo: use AABB tree or other BVH acceleration structure! if (collisionShape->IsCompound()) { const CompoundShape* compoundShape = static_cast<const CompoundShape*>(collisionShape); int i=0; for (i=0;i<compoundShape->GetNumChildShapes();i++) { SimdTransform childTrans = compoundShape->GetChildTransform(i); const CollisionShape* childCollisionShape = compoundShape->GetChildShape(i); SimdTransform childWorldTrans = colObjWorldTransform * childTrans; RayTestSingle(rayFromTrans,rayToTrans, collisionObject, childCollisionShape, childWorldTrans, resultCallback); } } } } }
void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const btTransform& rayFromTrans,const btTransform& rayToTrans, btCollisionObject* collisionObject, const btCollisionShape* collisionShape, const btTransform& colObjWorldTransform, RayResultCallback& resultCallback,short int collisionFilterMask) { if (collisionShape->isConvex()) { btConvexCast::CastResult castResult; castResult.m_fraction = btScalar(1.);//?? btConvexShape* convexShape = (btConvexShape*) collisionShape; btVoronoiSimplexSolver simplexSolver; #define USE_SUBSIMPLEX_CONVEX_CAST 1 #ifdef USE_SUBSIMPLEX_CONVEX_CAST btSubsimplexConvexCast convexCaster(castShape,convexShape,&simplexSolver); #else //btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver); //btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0); #endif //#USE_SUBSIMPLEX_CONVEX_CAST if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult)) { //add hit if (castResult.m_normal.length2() > btScalar(0.0001)) { if (castResult.m_fraction < resultCallback.m_closestHitFraction) { #ifdef USE_SUBSIMPLEX_CONVEX_CAST //rotate normal into worldspace castResult.m_normal = rayFromTrans.getBasis() * castResult.m_normal; #endif //USE_SUBSIMPLEX_CONVEX_CAST castResult.m_normal.normalize(); btCollisionWorld::LocalRayResult localRayResult ( collisionObject, 0, castResult.m_normal, castResult.m_fraction ); bool normalInWorldSpace = true; resultCallback.AddSingleResult(localRayResult, normalInWorldSpace); } } } } else { if (collisionShape->isConcave()) { btTriangleMeshShape* triangleMesh = (btTriangleMeshShape*)collisionShape; btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btVector3 rayFromLocal = worldTocollisionObject * rayFromTrans.getOrigin(); btVector3 rayToLocal = worldTocollisionObject * rayToTrans.getOrigin(); //ConvexCast::CastResult struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback { btCollisionWorld::RayResultCallback* m_resultCallback; btCollisionObject* m_collisionObject; btTriangleMeshShape* m_triangleMesh; BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh): btTriangleRaycastCallback(from,to), m_resultCallback(resultCallback), m_collisionObject(collisionObject), m_triangleMesh(triangleMesh) { } virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex ) { btCollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = partId; shapeInfo.m_triangleIndex = triangleIndex; btCollisionWorld::LocalRayResult rayResult (m_collisionObject, &shapeInfo, hitNormalLocal, hitFraction); bool normalInWorldSpace = false; return m_resultCallback->AddSingleResult(rayResult,normalInWorldSpace); } }; BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh); rcb.m_hitFraction = resultCallback.m_closestHitFraction; btVector3 rayAabbMinLocal = rayFromLocal; rayAabbMinLocal.setMin(rayToLocal); btVector3 rayAabbMaxLocal = rayFromLocal; rayAabbMaxLocal.setMax(rayToLocal); triangleMesh->processAllTriangles(&rcb,rayAabbMinLocal,rayAabbMaxLocal); } else { //todo: use AABB tree or other BVH acceleration structure! if (collisionShape->isCompound()) { const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(collisionShape); int i=0; for (i=0;i<compoundShape->getNumChildShapes();i++) { btTransform childTrans = compoundShape->getChildTransform(i); const btCollisionShape* childCollisionShape = compoundShape->getChildShape(i); btTransform childWorldTrans = colObjWorldTransform * childTrans; objectQuerySingle(castShape, rayFromTrans,rayToTrans, collisionObject, childCollisionShape, childWorldTrans, resultCallback, collisionFilterMask); } } } } }
void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans, btCollisionObject* collisionObject, const btCollisionShape* collisionShape, const btTransform& colObjWorldTransform, RayResultCallback& resultCallback) { btSphereShape pointShape(btScalar(0.0)); pointShape.setMargin(0.f); const btConvexShape* castShape = &pointShape; if (collisionShape->isConvex()) { // BT_PROFILE("rayTestConvex"); btConvexCast::CastResult castResult; castResult.m_fraction = resultCallback.m_closestHitFraction; btConvexShape* convexShape = (btConvexShape*) collisionShape; btVoronoiSimplexSolver simplexSolver; #define USE_SUBSIMPLEX_CONVEX_CAST 1 #ifdef USE_SUBSIMPLEX_CONVEX_CAST btSubsimplexConvexCast convexCaster(castShape,convexShape,&simplexSolver); #else //btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver); //btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0); #endif //#USE_SUBSIMPLEX_CONVEX_CAST if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult)) { //add hit if (castResult.m_normal.length2() > btScalar(0.0001)) { if (castResult.m_fraction < resultCallback.m_closestHitFraction) { #ifdef USE_SUBSIMPLEX_CONVEX_CAST //rotate normal into worldspace castResult.m_normal = rayFromTrans.getBasis() * castResult.m_normal; #endif //USE_SUBSIMPLEX_CONVEX_CAST castResult.m_normal.normalize(); btCollisionWorld::LocalRayResult localRayResult ( collisionObject, 0, castResult.m_normal, castResult.m_fraction ); bool normalInWorldSpace = true; resultCallback.addSingleResult(localRayResult, normalInWorldSpace); } } } } else { if (collisionShape->isConcave()) { // BT_PROFILE("rayTestConcave"); if (collisionShape->getShapeType()==TRIANGLE_MESH_SHAPE_PROXYTYPE) { ///optimized version for btBvhTriangleMeshShape btBvhTriangleMeshShape* triangleMesh = (btBvhTriangleMeshShape*)collisionShape; btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btVector3 rayFromLocal = worldTocollisionObject * rayFromTrans.getOrigin(); btVector3 rayToLocal = worldTocollisionObject * rayToTrans.getOrigin(); //ConvexCast::CastResult struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback { btCollisionWorld::RayResultCallback* m_resultCallback; btCollisionObject* m_collisionObject; btTriangleMeshShape* m_triangleMesh; BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh): btTriangleRaycastCallback(from,to), m_resultCallback(resultCallback), m_collisionObject(collisionObject), m_triangleMesh(triangleMesh) { } virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex ) { btCollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = partId; shapeInfo.m_triangleIndex = triangleIndex; btCollisionWorld::LocalRayResult rayResult (m_collisionObject, &shapeInfo, hitNormalLocal, hitFraction); bool normalInWorldSpace = false; return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace); } }; BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh); rcb.m_hitFraction = resultCallback.m_closestHitFraction; triangleMesh->performRaycast(&rcb,rayFromLocal,rayToLocal); } else { //generic (slower) case btConcaveShape* concaveShape = (btConcaveShape*)collisionShape; btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btVector3 rayFromLocal = worldTocollisionObject * rayFromTrans.getOrigin(); btVector3 rayToLocal = worldTocollisionObject * rayToTrans.getOrigin(); //ConvexCast::CastResult struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback { btCollisionWorld::RayResultCallback* m_resultCallback; btCollisionObject* m_collisionObject; btConcaveShape* m_triangleMesh; BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape* triangleMesh): btTriangleRaycastCallback(from,to), m_resultCallback(resultCallback), m_collisionObject(collisionObject), m_triangleMesh(triangleMesh) { } virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex ) { btCollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = partId; shapeInfo.m_triangleIndex = triangleIndex; btCollisionWorld::LocalRayResult rayResult (m_collisionObject, &shapeInfo, hitNormalLocal, hitFraction); bool normalInWorldSpace = false; return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace); } }; BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,concaveShape); rcb.m_hitFraction = resultCallback.m_closestHitFraction; btVector3 rayAabbMinLocal = rayFromLocal; rayAabbMinLocal.setMin(rayToLocal); btVector3 rayAabbMaxLocal = rayFromLocal; rayAabbMaxLocal.setMax(rayToLocal); concaveShape->processAllTriangles(&rcb,rayAabbMinLocal,rayAabbMaxLocal); } } else { // BT_PROFILE("rayTestCompound"); ///@todo: use AABB tree or other BVH acceleration structure, see btDbvt if (collisionShape->isCompound()) { const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(collisionShape); int i=0; for (i=0;i<compoundShape->getNumChildShapes();i++) { btTransform childTrans = compoundShape->getChildTransform(i); const btCollisionShape* childCollisionShape = compoundShape->getChildShape(i); btTransform childWorldTrans = colObjWorldTransform * childTrans; // replace collision shape so that callback can determine the triangle btCollisionShape* saveCollisionShape = collisionObject->getCollisionShape(); collisionObject->internalSetTemporaryCollisionShape((btCollisionShape*)childCollisionShape); rayTestSingle(rayFromTrans,rayToTrans, collisionObject, childCollisionShape, childWorldTrans, resultCallback); // restore collisionObject->internalSetTemporaryCollisionShape(saveCollisionShape); } } } } }
void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans, btCollisionObject* collisionObject, const btCollisionShape* collisionShape, const btTransform& colObjWorldTransform, RayResultCallback& resultCallback) { btSphereShape pointShape(btScalar(0.0)); pointShape.setMargin(0.f); const btConvexShape* castShape = &pointShape; if (collisionShape->isConvex()) { // BT_PROFILE("rayTestConvex"); btConvexCast::CastResult castResult; castResult.m_fraction = resultCallback.m_closestHitFraction; btConvexShape* convexShape = (btConvexShape*) collisionShape; btVoronoiSimplexSolver simplexSolver; #define USE_SUBSIMPLEX_CONVEX_CAST 1 #ifdef USE_SUBSIMPLEX_CONVEX_CAST btSubsimplexConvexCast convexCaster(castShape,convexShape,&simplexSolver); #else //btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver); //btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0); #endif //#USE_SUBSIMPLEX_CONVEX_CAST if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult)) { //add hit if (castResult.m_normal.length2() > btScalar(0.0001)) { if (castResult.m_fraction < resultCallback.m_closestHitFraction) { #ifdef USE_SUBSIMPLEX_CONVEX_CAST //rotate normal into worldspace castResult.m_normal = rayFromTrans.getBasis() * castResult.m_normal; #endif //USE_SUBSIMPLEX_CONVEX_CAST castResult.m_normal.normalize(); btCollisionWorld::LocalRayResult localRayResult ( collisionObject, 0, castResult.m_normal, castResult.m_fraction ); bool normalInWorldSpace = true; resultCallback.addSingleResult(localRayResult, normalInWorldSpace); } } } } else { if (collisionShape->isConcave()) { // BT_PROFILE("rayTestConcave"); if (collisionShape->getShapeType()==TRIANGLE_MESH_SHAPE_PROXYTYPE) { ///optimized version for btBvhTriangleMeshShape btBvhTriangleMeshShape* triangleMesh = (btBvhTriangleMeshShape*)collisionShape; btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btVector3 rayFromLocal = worldTocollisionObject * rayFromTrans.getOrigin(); btVector3 rayToLocal = worldTocollisionObject * rayToTrans.getOrigin(); //ConvexCast::CastResult struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback { btCollisionWorld::RayResultCallback* m_resultCallback; btCollisionObject* m_collisionObject; btTriangleMeshShape* m_triangleMesh; btTransform m_colObjWorldTransform; BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh,const btTransform& colObjWorldTransform): //@BP Mod btTriangleRaycastCallback(from,to, resultCallback->m_flags), m_resultCallback(resultCallback), m_collisionObject(collisionObject), m_triangleMesh(triangleMesh), m_colObjWorldTransform(colObjWorldTransform) { } virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex ) { btCollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = partId; shapeInfo.m_triangleIndex = triangleIndex; btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal; btCollisionWorld::LocalRayResult rayResult (m_collisionObject, &shapeInfo, hitNormalWorld, hitFraction); bool normalInWorldSpace = true; return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace); } }; BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh,colObjWorldTransform); rcb.m_hitFraction = resultCallback.m_closestHitFraction; triangleMesh->performRaycast(&rcb,rayFromLocal,rayToLocal); } else { //generic (slower) case btConcaveShape* concaveShape = (btConcaveShape*)collisionShape; btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btVector3 rayFromLocal = worldTocollisionObject * rayFromTrans.getOrigin(); btVector3 rayToLocal = worldTocollisionObject * rayToTrans.getOrigin(); //ConvexCast::CastResult struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback { btCollisionWorld::RayResultCallback* m_resultCallback; btCollisionObject* m_collisionObject; btConcaveShape* m_triangleMesh; btTransform m_colObjWorldTransform; BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape* triangleMesh, const btTransform& colObjWorldTransform): //@BP Mod btTriangleRaycastCallback(from,to, resultCallback->m_flags), m_resultCallback(resultCallback), m_collisionObject(collisionObject), m_triangleMesh(triangleMesh), m_colObjWorldTransform(colObjWorldTransform) { } virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex ) { btCollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = partId; shapeInfo.m_triangleIndex = triangleIndex; btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal; btCollisionWorld::LocalRayResult rayResult (m_collisionObject, &shapeInfo, hitNormalWorld, hitFraction); bool normalInWorldSpace = true; return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace); } }; BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,concaveShape, colObjWorldTransform); rcb.m_hitFraction = resultCallback.m_closestHitFraction; btVector3 rayAabbMinLocal = rayFromLocal; rayAabbMinLocal.setMin(rayToLocal); btVector3 rayAabbMaxLocal = rayFromLocal; rayAabbMaxLocal.setMax(rayToLocal); concaveShape->processAllTriangles(&rcb,rayAabbMinLocal,rayAabbMaxLocal); } } else { // BT_PROFILE("rayTestCompound"); if (collisionShape->isCompound()) { struct LocalInfoAdder2 : public RayResultCallback { RayResultCallback* m_userCallback; int m_i; LocalInfoAdder2 (int i, RayResultCallback *user) : m_userCallback(user), m_i(i) { m_closestHitFraction = m_userCallback->m_closestHitFraction; } virtual bool needsCollision(btBroadphaseProxy* p) const { return m_userCallback->needsCollision(p); } virtual btScalar addSingleResult (btCollisionWorld::LocalRayResult &r, bool b) { btCollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = -1; shapeInfo.m_triangleIndex = m_i; if (r.m_localShapeInfo == NULL) r.m_localShapeInfo = &shapeInfo; const btScalar result = m_userCallback->addSingleResult(r, b); m_closestHitFraction = m_userCallback->m_closestHitFraction; return result; } }; struct RayTester : btDbvt::ICollide { btCollisionObject* m_collisionObject; const btCompoundShape* m_compoundShape; const btTransform& m_colObjWorldTransform; const btTransform& m_rayFromTrans; const btTransform& m_rayToTrans; RayResultCallback& m_resultCallback; RayTester(btCollisionObject* collisionObject, const btCompoundShape* compoundShape, const btTransform& colObjWorldTransform, const btTransform& rayFromTrans, const btTransform& rayToTrans, RayResultCallback& resultCallback): m_collisionObject(collisionObject), m_compoundShape(compoundShape), m_colObjWorldTransform(colObjWorldTransform), m_rayFromTrans(rayFromTrans), m_rayToTrans(rayToTrans), m_resultCallback(resultCallback) { } void Process(int i) { const btCollisionShape* childCollisionShape = m_compoundShape->getChildShape(i); const btTransform& childTrans = m_compoundShape->getChildTransform(i); btTransform childWorldTrans = m_colObjWorldTransform * childTrans; // replace collision shape so that callback can determine the triangle btCollisionShape* saveCollisionShape = m_collisionObject->getCollisionShape(); m_collisionObject->internalSetTemporaryCollisionShape((btCollisionShape*)childCollisionShape); LocalInfoAdder2 my_cb(i, &m_resultCallback); rayTestSingle( m_rayFromTrans, m_rayToTrans, m_collisionObject, childCollisionShape, childWorldTrans, my_cb); // restore m_collisionObject->internalSetTemporaryCollisionShape(saveCollisionShape); } void Process(const btDbvtNode* leaf) { Process(leaf->dataAsInt); } }; const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(collisionShape); const btDbvt* dbvt = compoundShape->getDynamicAabbTree(); RayTester rayCB( collisionObject, compoundShape, colObjWorldTransform, rayFromTrans, rayToTrans, resultCallback); #ifndef DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION if (dbvt) { btVector3 localRayFrom = colObjWorldTransform.inverseTimes(rayFromTrans).getOrigin(); btVector3 localRayTo = colObjWorldTransform.inverseTimes(rayToTrans).getOrigin(); btDbvt::rayTest(dbvt->m_root, localRayFrom , localRayTo, rayCB); } else #endif //DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION { for (int i = 0, n = compoundShape->getNumChildShapes(); i < n; ++i) { rayCB.Process(i); } } } } } }
/** * This functions runs in infinite blocking loop until there is no fd in * pfdset. It calls corresponding r/w handler if there is event on the fd. * * Before the callback is called, we set the flag to busy status; If other * thread(now rte_vhost_driver_unregister) calls fdset_del concurrently, it * will wait until the flag is reset to zero(which indicates the callback is * finished), then it could free the context after fdset_del. */ void fdset_event_dispatch(struct fdset *pfdset) { fd_set rfds, wfds; int i, maxfds; struct fdentry *pfdentry; int num = MAX_FDS; fd_cb rcb, wcb; void *dat; int fd; int remove1, remove2; int ret; if (pfdset == NULL) return; while (1) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; FD_ZERO(&rfds); FD_ZERO(&wfds); pthread_mutex_lock(&pfdset->fd_mutex); maxfds = fdset_fill(&rfds, &wfds, pfdset); pthread_mutex_unlock(&pfdset->fd_mutex); /* * When select is blocked, other threads might unregister * listenfds from and register new listenfds into fdset. * When select returns, the entries for listenfds in the fdset * might have been updated. It is ok if there is unwanted call * for new listenfds. */ ret = select(maxfds + 1, &rfds, &wfds, NULL, &tv); if (ret <= 0) continue; for (i = 0; i < num; i++) { remove1 = remove2 = 0; pthread_mutex_lock(&pfdset->fd_mutex); pfdentry = &pfdset->fd[i]; fd = pfdentry->fd; rcb = pfdentry->rcb; wcb = pfdentry->wcb; dat = pfdentry->dat; pfdentry->busy = 1; pthread_mutex_unlock(&pfdset->fd_mutex); if (fd >= 0 && FD_ISSET(fd, &rfds) && rcb) rcb(fd, dat, &remove1); if (fd >= 0 && FD_ISSET(fd, &wfds) && wcb) wcb(fd, dat, &remove2); pfdentry->busy = 0; /* * fdset_del needs to check busy flag. * We don't allow fdset_del to be called in callback * directly. */ /* * When we are to clean up the fd from fdset, * because the fd is closed in the cb, * the old fd val could be reused by when creates new * listen fd in another thread, we couldn't call * fd_set_del. */ if (remove1 || remove2) fdset_del_slot(pfdset, i); } } }
/** * This functions runs in infinite blocking loop until there is no fd in * pfdset. It calls corresponding r/w handler if there is event on the fd. * * Before the callback is called, we set the flag to busy status; If other * thread(now rte_vhost_driver_unregister) calls fdset_del concurrently, it * will wait until the flag is reset to zero(which indicates the callback is * finished), then it could free the context after fdset_del. */ void * fdset_event_dispatch(void *arg) { int i; struct pollfd *pfd; struct fdentry *pfdentry; fd_cb rcb, wcb; void *dat; int fd, numfds; int remove1, remove2; int need_shrink; struct fdset *pfdset = arg; int val; if (pfdset == NULL) return NULL; while (1) { /* * When poll is blocked, other threads might unregister * listenfds from and register new listenfds into fdset. * When poll returns, the entries for listenfds in the fdset * might have been updated. It is ok if there is unwanted call * for new listenfds. */ pthread_mutex_lock(&pfdset->fd_mutex); numfds = pfdset->num; pthread_mutex_unlock(&pfdset->fd_mutex); val = poll(pfdset->rwfds, numfds, 1000 /* millisecs */); if (val < 0) continue; need_shrink = 0; for (i = 0; i < numfds; i++) { pthread_mutex_lock(&pfdset->fd_mutex); pfdentry = &pfdset->fd[i]; fd = pfdentry->fd; pfd = &pfdset->rwfds[i]; if (fd < 0) { need_shrink = 1; pthread_mutex_unlock(&pfdset->fd_mutex); continue; } if (!pfd->revents) { pthread_mutex_unlock(&pfdset->fd_mutex); continue; } remove1 = remove2 = 0; rcb = pfdentry->rcb; wcb = pfdentry->wcb; dat = pfdentry->dat; pfdentry->busy = 1; pthread_mutex_unlock(&pfdset->fd_mutex); if (rcb && pfd->revents & (POLLIN | FDPOLLERR)) rcb(fd, dat, &remove1); if (wcb && pfd->revents & (POLLOUT | FDPOLLERR)) wcb(fd, dat, &remove2); pfdentry->busy = 0; /* * fdset_del needs to check busy flag. * We don't allow fdset_del to be called in callback * directly. */ /* * When we are to clean up the fd from fdset, * because the fd is closed in the cb, * the old fd val could be reused by when creates new * listen fd in another thread, we couldn't call * fd_set_del. */ if (remove1 || remove2) { pfdentry->fd = -1; need_shrink = 1; } } if (need_shrink) fdset_shrink(pfdset); } return NULL; }
status_t QCameraStream_preview::processPreviewFrame(mm_camera_ch_data_buf_t *frame) { ALOGV("%s",__func__); int err = 0; int msgType = 0; camera_memory_t *data = NULL; camera_frame_metadata_t *metadata = NULL; Mutex::Autolock lock(mStopCallbackLock); if(!mActive) { ALOGE("Preview Stopped. Returning callback"); return NO_ERROR; } if(mHalCamCtrl==NULL) { ALOGE("%s: X: HAL control object not set",__func__); /*Call buf done*/ return BAD_VALUE; } mHalCamCtrl->mCallbackLock.lock(); camera_data_timestamp_callback rcb = mHalCamCtrl->mDataCbTimestamp; void *rdata = mHalCamCtrl->mCallbackCookie; mHalCamCtrl->mCallbackLock.unlock(); if (UNLIKELY(mHalCamCtrl->mDebugFps)) { mHalCamCtrl->debugShowPreviewFPS(); } //dumpFrameToFile(frame->def.frame); mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW); nsecs_t timeStamp = systemTime(); mHalCamCtrl->mPreviewMemoryLock.lock(); mNotifyBuffer[frame->def.idx] = *frame; // mzhu fix me, need to check meta data also. ALOGI("Enqueue buf handle %p\n", mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]); ALOGD("%s: camera call genlock_unlock", __FUNCTION__); if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx]) { if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t*) (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]))) { ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__); mHalCamCtrl->mPreviewMemoryLock.unlock(); return -EINVAL; } else { mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx] = BUFFER_UNLOCKED; } } else { ALOGE("%s: buffer to be enqueued is not locked", __FUNCTION__); mHalCamCtrl->mPreviewMemoryLock.unlock(); return -EINVAL; } err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow, (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]); if(err != 0) { ALOGE("%s: enqueue_buffer failed, err = %d", __func__, err); } buffer_handle_t *buffer_handle = NULL; int tmp_stride = 0; err = this->mPreviewWindow->dequeue_buffer(this->mPreviewWindow, &buffer_handle, &tmp_stride); if (err == NO_ERROR && buffer_handle != NULL) { err = this->mPreviewWindow->lock_buffer(this->mPreviewWindow, buffer_handle); ALOGD("%s: camera call genlock_lock", __FUNCTION__); if (GENLOCK_FAILURE == genlock_lock_buffer((native_handle_t*)(*buffer_handle), GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) { ALOGE("%s: genlock_lock_buffer(WRITE) failed", __FUNCTION__); mHalCamCtrl->mPreviewMemoryLock.unlock(); return -EINVAL; } for(int i = 0; i < mHalCamCtrl->mPreviewMemory.buffer_count; i++) { ALOGD("h1: %p h2: %p\n", mHalCamCtrl->mPreviewMemory.buffer_handle[i], buffer_handle); if(mHalCamCtrl->mPreviewMemory.buffer_handle[i] == buffer_handle) { mm_camera_ch_data_buf_t tmp_frame; mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_LOCKED; if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[i])) { ALOGD("BUF DONE FAILED"); mHalCamCtrl->mPreviewMemoryLock.unlock(); return BAD_VALUE; } break; } } } else ALOGE("%s: error in dequeue_buffer, enqueue_buffer idx = %d, no free buffer now", __func__, frame->def.idx); /* Save the last displayed frame. We'll be using it to fill the gap between when preview stops and postview start during snapshot.*/ mLastQueuedFrame = &(mDisplayStreamBuf.frame[frame->def.idx]); mHalCamCtrl->mPreviewMemoryLock.unlock(); mHalCamCtrl->mCallbackLock.lock(); camera_data_callback pcb = mHalCamCtrl->mDataCb; mHalCamCtrl->mCallbackLock.unlock(); ALOGD("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled); if (pcb != NULL) { //Sending preview callback if corresponding Msgs are enabled if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { msgType |= CAMERA_MSG_PREVIEW_FRAME; data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx]; } else { data = NULL; } if(msgType) { mStopCallbackLock.unlock(); pcb(msgType, data, 0, metadata, mHalCamCtrl->mCallbackCookie); } ALOGD("end of cb"); } if(rcb != NULL) { if (mHalCamCtrl->mStoreMetaDataInFrame) { mStopCallbackLock.unlock(); if(mHalCamCtrl->mStartRecording == true &&( mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME, mHalCamCtrl->mRecordingMemory.metadata_memory[frame->def.idx], 0, mHalCamCtrl->mCallbackCookie); } else { if(mHalCamCtrl->mStartRecording == true &&( mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) { mStopCallbackLock.unlock(); rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME, mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx], 0, mHalCamCtrl->mCallbackCookie); } } } /* Save the last displayed frame. We'll be using it to fill the gap between when preview stops and postview start during snapshot.*/ //mLastQueuedFrame = frame->def.frame; /* if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame)) { ALOGE("BUF DONE FAILED"); return BAD_VALUE; } */ return NO_ERROR; }