static bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int vcol_num) { if(!(mesh && b_mesh && b_ob && CData)) return false; CData->curve_vcol.clear(); BL::Object::modifiers_iterator b_mod; for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (background ? b_mod->show_render() : b_mod->show_viewport())) { BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr); BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr); BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr); if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) { int totparts = b_psys.particles.length(); int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f); int totcurves = totchild; if(b_part.child_type() == 0 || totchild == 0) totcurves += totparts; if(totcurves == 0) continue; int pa_no = 0; if(!(b_part.child_type() == 0) && totchild != 0) pa_no = totparts; int num_add = (totparts+totchild - pa_no); CData->curve_vcol.reserve(CData->curve_vcol.size() + num_add); BL::ParticleSystem::particles_iterator b_pa; b_psys.particles.begin(b_pa); for(; pa_no < totparts+totchild; pa_no++) { /* Add vertex colors */ BL::Mesh::tessface_vertex_colors_iterator l; b_mesh->tessface_vertex_colors.begin(l); float3 vcol = make_float3(0.0f, 0.0f, 0.0f); if(b_mesh->tessface_vertex_colors.length()) b_psys.mcol_on_emitter(psmd, *b_pa, pa_no, vcol_num, &vcol.x); CData->curve_vcol.push_back_slow(vcol); if(pa_no < totparts && b_pa != b_psys.particles.end()) ++b_pa; } } } } return true; }
static void set_resolution(BL::Object *b_ob, BL::Scene *scene, bool render) { BL::Object::modifiers_iterator b_mod; for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && ((b_mod->show_viewport()) || (b_mod->show_render()))) { BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr); BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr); b_psys.set_resolution(*scene, *b_ob, (render)? 2: 1); } } }
static bool ObtainCacheParticleData( Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background) { int curvenum = 0; int keyno = 0; if (!(mesh && b_mesh && b_ob && CData)) return false; Transform tfm = get_transform(b_ob->matrix_world()); Transform itfm = transform_quick_inverse(tfm); BL::Object::modifiers_iterator b_mod; for (b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { if ((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (background ? b_mod->show_render() : b_mod->show_viewport())) { BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr); BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr); BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr); if ((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) { int shader = clamp(b_part.material() - 1, 0, mesh->used_shaders.size() - 1); int display_step = background ? b_part.render_step() : b_part.display_step(); int totparts = b_psys.particles.length(); int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.display_percentage() / 100.0f); int totcurves = totchild; if (b_part.child_type() == 0 || totchild == 0) totcurves += totparts; if (totcurves == 0) continue; int ren_step = (1 << display_step) + 1; if (b_part.kink() == BL::ParticleSettings::kink_SPIRAL) ren_step += b_part.kink_extra_steps(); CData->psys_firstcurve.push_back_slow(curvenum); CData->psys_curvenum.push_back_slow(totcurves); CData->psys_shader.push_back_slow(shader); float radius = b_part.radius_scale() * 0.5f; CData->psys_rootradius.push_back_slow(radius * b_part.root_radius()); CData->psys_tipradius.push_back_slow(radius * b_part.tip_radius()); CData->psys_shape.push_back_slow(b_part.shape()); CData->psys_closetip.push_back_slow(b_part.use_close_tip()); int pa_no = 0; if (!(b_part.child_type() == 0) && totchild != 0) pa_no = totparts; int num_add = (totparts + totchild - pa_no); CData->curve_firstkey.reserve(CData->curve_firstkey.size() + num_add); CData->curve_keynum.reserve(CData->curve_keynum.size() + num_add); CData->curve_length.reserve(CData->curve_length.size() + num_add); CData->curvekey_co.reserve(CData->curvekey_co.size() + num_add * ren_step); CData->curvekey_time.reserve(CData->curvekey_time.size() + num_add * ren_step); for (; pa_no < totparts + totchild; pa_no++) { int keynum = 0; CData->curve_firstkey.push_back_slow(keyno); float curve_length = 0.0f; float3 pcKey; for (int step_no = 0; step_no < ren_step; step_no++) { float nco[3]; b_psys.co_hair(*b_ob, pa_no, step_no, nco); float3 cKey = make_float3(nco[0], nco[1], nco[2]); cKey = transform_point(&itfm, cKey); if (step_no > 0) { const float step_length = len(cKey - pcKey); curve_length += step_length; } CData->curvekey_co.push_back_slow(cKey); CData->curvekey_time.push_back_slow(curve_length); pcKey = cKey; keynum++; } keyno += keynum; CData->curve_keynum.push_back_slow(keynum); CData->curve_length.push_back_slow(curve_length); curvenum++; } } } } return true; }
bool BlenderSync::fill_mesh_hair_data(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, int uv_num, int vcol_num) { if(!mesh || !b_mesh || !b_ob) return false; int cur_hair_idx = 0; int cur_vertex_idx = 0; Transform tfm = get_transform(b_ob->matrix_world()); Transform itfm = transform_quick_inverse(tfm); BL::Object::modifiers_iterator b_mod; size_t hair_points_size = 0, hair_thickness_size = 0, vert_per_hair_size = 0, hair_mat_indices_size = 0, hair_uvs_size = 0; for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { if(b_mod->type() == b_mod->type_PARTICLE_SYSTEM && (interactive ? b_mod->show_viewport() : b_mod->show_render())) { BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr); BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr); BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr); if(b_part.render_type() == BL::ParticleSettings::render_type_PATH && b_part.type() == BL::ParticleSettings::type_HAIR) { int draw_step = interactive ? b_part.draw_step() : b_part.render_step(); int ren_step = (int)powf(2.0f, (float)draw_step); int totparts = b_psys.particles.length(); int totchild = interactive ? (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f) : b_psys.child_particles.length(); int totcurves = totchild; if(b_part.child_type() == 0) totcurves += totparts; if(totcurves == 0) continue; hair_points_size += totcurves * (ren_step + 1); hair_thickness_size += totcurves * (ren_step + 1); vert_per_hair_size += totcurves; hair_mat_indices_size += totcurves; hair_uvs_size += totcurves; } } } if(hair_points_size == 0 || hair_thickness_size == 0 || vert_per_hair_size == 0 || hair_mat_indices_size == 0 || hair_uvs_size == 0) return true; mesh->hair_points.resize(hair_points_size); float3 *hair_points = &mesh->hair_points[0]; mesh->hair_thickness.resize(hair_thickness_size); float *hair_thickness = &mesh->hair_thickness[0]; mesh->vert_per_hair.resize(vert_per_hair_size); int *vert_per_hair = &mesh->vert_per_hair[0]; mesh->hair_mat_indices.resize(hair_mat_indices_size); int *hair_mat_indices = &mesh->hair_mat_indices[0]; mesh->hair_uvs.resize(hair_uvs_size); float2 *hair_uvs = &mesh->hair_uvs[0]; for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { if(b_mod->type() == b_mod->type_PARTICLE_SYSTEM && (interactive ? b_mod->show_viewport() : b_mod->show_render())) { BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr); BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr); BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr); if(b_part.render_type() == BL::ParticleSettings::render_type_PATH && b_part.type() == BL::ParticleSettings::type_HAIR) { int shader_idx = clamp(b_part.material() - 1, 0, mesh->used_shaders.size() - 1); int draw_step = interactive ? b_part.draw_step() : b_part.render_step(); int ren_step = (int)powf(2.0f, (float)draw_step); int totparts = b_psys.particles.length(); int totchild = interactive ? (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f) : b_psys.child_particles.length(); int totcurves = totchild; if(b_part.child_type() == 0) totcurves += totparts; if(totcurves == 0) continue; PointerRNA oct_settings = RNA_pointer_get(&b_part.ptr, "octane"); float root_width = get_float(oct_settings, "root_width"); float tip_width = get_float(oct_settings, "tip_width"); float width_step = (tip_width - root_width) / ren_step; int pa_no = 0; if(b_part.child_type() != 0) pa_no = totparts; BL::ParticleSystem::particles_iterator b_pa; b_psys.particles.begin(b_pa); for(; pa_no < (totparts + totchild); ++pa_no) { float3 prev_point; int vert_cnt = 0; float cur_width = root_width; for(int step_no = 0; step_no <= ren_step; step_no++) { float nco[3]; b_psys.co_hair(*b_ob, pa_no, step_no, nco); float3 cur_point = make_float3(nco[0], nco[1], nco[2]); cur_point = transform_point(&itfm, cur_point); if(step_no > 0) { float step_length = len(cur_point - prev_point); if(step_length == 0.0f) continue; } hair_points[cur_vertex_idx] = cur_point; hair_thickness[cur_vertex_idx] = cur_width; cur_width += width_step; prev_point = cur_point; ++cur_vertex_idx; ++vert_cnt; } vert_per_hair[cur_hair_idx] = vert_cnt; hair_mat_indices[cur_hair_idx] = shader_idx; // Add UVs BL::Mesh::tessface_uv_textures_iterator l; b_mesh->tessface_uv_textures.begin(l); float3 uv = make_float3(0.0f, 0.0f, 0.0f); if(b_mesh->tessface_uv_textures.length()) b_psys.uv_on_emitter(psmd, *b_pa, pa_no, uv_num, &uv.x); hair_uvs[cur_hair_idx].x = uv.x; hair_uvs[cur_hair_idx].y = uv.y; // Add vertex colors //BL::Mesh::tessface_vertex_colors_iterator l; //b_mesh->tessface_vertex_colors.begin(l); //float3 vcol = make_float3(0.0f, 0.0f, 0.0f); //if(b_mesh->tessface_vertex_colors.length()) // b_psys.mcol_on_emitter(psmd, *b_pa, pa_no, vcol_num, &vcol.x); //hair_colors[cur_hair_idx] = vcol; if(pa_no < totparts && b_pa != b_psys.particles.end()) ++b_pa; ++cur_hair_idx; } } } } return true; } //fill_mesh_hair_data()