本文整理汇总了C++中VRTransformPtr::duplicate方法的典型用法代码示例。如果您正苦于以下问题:C++ VRTransformPtr::duplicate方法的具体用法?C++ VRTransformPtr::duplicate怎么用?C++ VRTransformPtr::duplicate使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VRTransformPtr
的用法示例。
在下文中一共展示了VRTransformPtr::duplicate方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: fillContainer
void FLogistics::fillContainer(shared_ptr<FContainer> c, int N, VRTransformPtr t) {
for (int i=0; i<N; i++) {
auto p = addProduct();
t = static_pointer_cast<VRTransform>(t->duplicate(true));
t->setVisible(true);
t->setPersistency(0);
p->setTransformation(t);
c->add( p );
}
}
示例2: FContainer
shared_ptr<FContainer> FLogistics::addContainer(VRTransformPtr t) {
if (t == 0) return 0;
auto c = shared_ptr<FContainer>(new FContainer());
t = static_pointer_cast<VRTransform>(t->duplicate(true));
t->setVisible(true);
t->setPersistency(0);
c->setTransformation(t);
objects[c->getID()] = c;
return c;
}
示例3: data
void VRNature::computeLODs3(map<OctreeNode*, VRLodLeafPtr>& leafs) {
// construct master material
auto mosaic1 = VRTextureMosaic::create();
auto mosaic2 = VRTextureMosaic::create();
int j = 0;
int k = 0;
int H = 0;
auto prepSprites = [&]( map<string, VRTreePtr>& templates ) {
for (auto tree : templates) {
if (!tree.second) continue;
int Hmax = 1;
auto sides = tree.second->getLodMaterials();
for (auto side : sides) Hmax = max(Hmax, side->getTexture(0)->getSize()[1]);
for (int i=0; i<sides.size(); i++) {
mosaic1->add( sides[i]->getTexture(0), Vec2i(512*i,H), Vec2i(i,j) );
mosaic2->add( sides[i]->getTexture(1), Vec2i(512*i,H), Vec2i(i,j) );
//sides[i]->getTexture(0)->write("test_"+toString(i)+".png");
}
H += Hmax;
j++;
}
};
auto updateUVs = [&]( map<string, VRTreePtr>& templates ) {
for (auto tree : templates) {
VRGeometryPtr tlod = dynamic_pointer_cast<VRGeometry>( tree.second->getLOD(0) );
VRGeoData data(tlod);
int N = 3;
for (int i=0; i<N; i++) { // update UV coordinates
Vec2i ID = Vec2i(i,k);
float i1 = i*1.0/N;
float i2 = (i+1)*1.0/N;
float j1 = mosaic1->getChunkPosition(ID)[1]/float(H);
float j2 = j1+mosaic1->getChunkSize(ID)[1]/float(H);
data.setTexCoord(4*i , Vec2d(i2,j1));
data.setTexCoord(4*i+1, Vec2d(i1,j1));
data.setTexCoord(4*i+2, Vec2d(i1,j2));
data.setTexCoord(4*i+3, Vec2d(i2,j2));
}
k++;
}
};
prepSprites(treeTemplates);
prepSprites(bushTemplates);
updateUVs(treeTemplates);
updateUVs(bushTemplates);
mosaic1->write("test.png");
auto m = VRMaterial::create("natureMosaic");
m->setVertexShader(VRTree::treeSprLODvp, "treeSprLODvp");
m->setFragmentShader(VRTree::treeSprLODdfp, "treeSprLODdfp", true);
m->setShaderParameter("tex0", 0);
m->setShaderParameter("tex1", 1);
m->setTexture(mosaic1, false, 0);
m->setTexture(mosaic2, false, 1);
trees->setMaterial(m);
VRGeoData treesData(trees);
cout << "treeRefs: " << treeRefs.size() << endl;
for (auto tree : treeRefs) {
auto tRef = tree.second;
VRTree* t = tree.first;
if (!tRef || !t) continue;
Vec3d offset = t->getWorldPosition();
VRTransformPtr tlod = tRef->getLOD(0);
VRGeometryPtr l = dynamic_pointer_cast<VRGeometry>( tlod->duplicate() );
VRGeoData other(l);
treesData.append(other, getMatrixTo(t->ptr()) );
}
treesData.apply(trees);
}
示例4:
void VRNature::computeLODs2(map<OctreeNode*, VRLodLeafPtr>& leafs) {
// get all trees and grass patches for each leaf layer
map<VRLodLeaf*, vector<VRTree*> > trees;
map<VRLodLeaf*, vector<VRGrassPatch*> > grass;
for (auto l : leafs) {
auto& leaf = l.second;
int lvl = leaf->getLevel();
if (lvl == 0) continue;
vector<void*> data = leaf->getOLeaf()->getAllData();
for (auto v : data) {
if (((VRObject*)v)->hasTag("tree")) trees[leaf.get()].push_back((VRTree*)v);
if (((VRObject*)v)->hasTag("grass")) grass[leaf.get()].push_back((VRGrassPatch*)v);
}
}
// create layer node geometries
for (auto l : leafs) {
auto& leaf = l.second;
leaf->reset();
int lvl = leaf->getLevel();
if (lvl == 0) continue;
bool doTrees = (trees.count(leaf.get()) >= 0);
bool doGrass = (grass.count(leaf.get()) >= 0);
Boundingbox bb;
if (doTrees) for (auto t : trees[leaf.get()]) bb.update( t->getWorldPosition() );
//if (doGrass) for (auto g : grass[leaf.get()]) bb.update( g->getWorldPosition() );
Vec3d pos = bb.center();
VRGeoData geo;
VRMaterialPtr m;
if (doTrees) for (auto t : trees[leaf.get()]) {
if (treeRefs.count(t) == 0) continue;
auto tRef = treeRefs[t];
if (!tRef || !t) continue;
Vec3d offset = t->getWorldPosition() - pos;
VRTransformPtr tlod = tRef->getLOD(0);
/*tRef->appendLOD(geo, lvl, offset);
m = tlod->getMaterial();*/
VRTransformPtr l = dynamic_pointer_cast<VRTransform>( tlod->duplicate() );
leaf->add( l, 1 );
l->setWorldPosition(t->getWorldPosition());
}
/*if (doGrass) for (auto g : grass[leaf.get()]) {
if (grassPatchRefs.count(g) == 0) continue;
auto gRef = grassPatchRefs[g];
if (!gRef || !g) continue;
Vec3d offset = g->getWorldPosition() - pos;
gRef->createLod(geoGrass, lvl, offset, g->getID());
}*/
/*VRGeometryPtr woods;
if (geo.size() > 0) {
woods = geo.asGeometry("woods");
if (m) woods->setMaterial(m);
//cout << "YAY: lod data: " << geo.size() << " " << woods << endl;
leaf->set( woods, 1 );
woods->setWorldPosition(pos);
woods->setDir(Vec3d(0,0,-1));
woods->setUp(Vec3d(0,1,0));
}*/
}
}