EntityNode* LTree::generate() { std::string rule = prop.rules[prop.startRule]; rule = evalRule(rule, prop.iterations - 1); EntityNode *modelData = new EntityNode(); modelData->vertices = new std::vector<Verts*>(); GLuint woodtex; glGenTextures(1, &woodtex); glBindTexture(GL_TEXTURE_2D, woodtex); int w, h; unsigned char *img = SOIL_load_image("Resources/Textures/treebark.jpg", &w, &h, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, img); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); modelData->drawData.texture = new Texture(woodtex); std::vector<CylinderMesh*>* raw = draw(rule); for( int i = 0; i < raw->size(); ++i ) { Verts *mesh = (*raw)[i]->ExportGLTriangleStrip(); modelData->vertices->push_back(mesh); } return modelData; }
std::string LTree::evalRule(std::string &rule, int iteration) { if (iteration > 0) { for (std::size_t i = 0; i < rule.length(); ++i) { if (prop.rules.count(rule[i])) { char key = rule[i]; rule.replace(i, 1, prop.rules[key]); int len = prop.rules[key].length() - 1; i += len; } } rule = evalRule(rule, iteration - 1); } return rule; }
/** * Evaluates each rule of the list */ static Tree evalRuleList(Tree rules, Tree env) { //cerr << "evalRuleList "<< *rules << " in " << *env << endl; if (isNil(rules)) return gGlobal->nil; else return cons(evalRule(hd(rules), env), evalRuleList(tl(rules), env)); }