Merge branch 'master' into blender2.8
This commit is contained in:
@@ -672,8 +672,9 @@ void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[4][4], floa
|
||||
psys->renderdata = data;
|
||||
|
||||
/* Hair can and has to be recalculated if everything isn't displayed. */
|
||||
if (psys->part->disp != 100 && psys->part->type == PART_HAIR)
|
||||
if (psys->part->disp != 100 && ELEM(psys->part->type, PART_HAIR, PART_FLUID)) {
|
||||
psys->recalc |= PSYS_RECALC_RESET;
|
||||
}
|
||||
}
|
||||
|
||||
void psys_render_restore(Object *ob, ParticleSystem *psys)
|
||||
@@ -746,7 +747,7 @@ void psys_render_restore(Object *ob, ParticleSystem *psys)
|
||||
|
||||
if (disp != render_disp) {
|
||||
/* Hair can and has to be recalculated if everything isn't displayed. */
|
||||
if (psys->part->type == PART_HAIR) {
|
||||
if (ELEM(psys->part->type, PART_HAIR, PART_FLUID)) {
|
||||
psys->recalc |= PSYS_RECALC_RESET;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -421,6 +421,185 @@ void GeometryExporter::createPolylist(short material_index,
|
||||
polylist.finish();
|
||||
}
|
||||
|
||||
void GeometryExporter::createPolylists(std::set<Image *> uv_images,
|
||||
bool has_uvs,
|
||||
bool has_color,
|
||||
Object *ob,
|
||||
Mesh *me,
|
||||
std::string& geom_id,
|
||||
std::vector<BCPolygonNormalsIndices>& norind)
|
||||
{
|
||||
std::set<Image *>::iterator uv_images_iter;
|
||||
for (uv_images_iter = uv_images.begin();
|
||||
uv_images_iter != uv_images.end();
|
||||
uv_images_iter++) {
|
||||
|
||||
Image *ima = *uv_images_iter;
|
||||
std::string imageid(id_name(ima));
|
||||
createPolylist(imageid, has_uvs,
|
||||
has_color,
|
||||
ob,
|
||||
me,
|
||||
geom_id,
|
||||
norind);
|
||||
}
|
||||
|
||||
/* We msut add an additional collector for the case when
|
||||
* some parts of the object are not textured at all.
|
||||
* The next call creates a polylist for all untextured polygons
|
||||
*/
|
||||
|
||||
createPolylist("", has_uvs,
|
||||
has_color,
|
||||
ob,
|
||||
me,
|
||||
geom_id,
|
||||
norind);
|
||||
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
* Export Meshes with UV Textures (export as materials, see also in
|
||||
* effectExporter and MaterialExporter)
|
||||
*
|
||||
* If imageid is the empty string, then collect only untextured polygons
|
||||
* =========================================================================== */
|
||||
void GeometryExporter::createPolylist(std::string imageid,
|
||||
bool has_uvs,
|
||||
bool has_color,
|
||||
Object *ob,
|
||||
Mesh *me,
|
||||
std::string& geom_id,
|
||||
std::vector<BCPolygonNormalsIndices>& norind)
|
||||
{
|
||||
|
||||
MPoly *mpolys = me->mpoly;
|
||||
MLoop *mloops = me->mloop;
|
||||
MTexPoly *mtpolys = me->mtpoly;
|
||||
|
||||
int totpolys = me->totpoly;
|
||||
|
||||
// <vcount>
|
||||
int i;
|
||||
int faces_in_polylist = 0;
|
||||
std::vector<unsigned long> vcount_list;
|
||||
bool is_triangulated = true;
|
||||
// count faces with this material
|
||||
for (i = 0; i < totpolys; i++) {
|
||||
MTexPoly *tp = &mtpolys[i];
|
||||
MPoly *p = &mpolys[i];
|
||||
|
||||
std::string tpageid = (tp->tpage) ? id_name(tp->tpage):"";
|
||||
if (tpageid == imageid) {
|
||||
faces_in_polylist++;
|
||||
vcount_list.push_back(p->totloop);
|
||||
if (p->totloop != 3) {
|
||||
is_triangulated = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// no faces using this imageid
|
||||
if (faces_in_polylist == 0) {
|
||||
if (imageid != "")
|
||||
fprintf(stderr, "%s: Image %s is not used.\n", id_name(ob).c_str(), imageid.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
COLLADASW::PrimitivesBase *facelist = getFacelist(is_triangulated, mSW);
|
||||
|
||||
// sets count attribute in <polylist>
|
||||
facelist->setCount(faces_in_polylist);
|
||||
|
||||
if (imageid != "") {
|
||||
// sets material name
|
||||
std::string material_id = get_material_id_from_id(imageid);
|
||||
std::ostringstream ostr;
|
||||
ostr << translate_id(material_id);
|
||||
facelist->setMaterial(ostr.str());
|
||||
}
|
||||
COLLADASW::InputList &til = facelist->getInputList();
|
||||
|
||||
// creates <input> in <polylist> for vertices
|
||||
COLLADASW::Input input1(COLLADASW::InputSemantic::VERTEX, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX), 0);
|
||||
|
||||
// creates <input> in <polylist> for normals
|
||||
COLLADASW::Input input2(COLLADASW::InputSemantic::NORMAL, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL), 1);
|
||||
|
||||
til.push_back(input1);
|
||||
til.push_back(input2);
|
||||
|
||||
// if mesh has uv coords writes <input> for TEXCOORD
|
||||
int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
|
||||
int active_uv_index = CustomData_get_active_layer_index(&me->fdata, CD_MTFACE) - 1;
|
||||
for (i = 0; i < num_layers; i++) {
|
||||
if (!this->export_settings->active_uv_only || i == active_uv_index) {
|
||||
|
||||
std::string uv_name(bc_get_uvlayer_name(me, i));
|
||||
std::string effective_id = geom_id; // (uv_name == "") ? geom_id : uv_name;
|
||||
std::string layer_id = makeTexcoordSourceId(
|
||||
effective_id,
|
||||
i, this->export_settings->active_uv_only);
|
||||
|
||||
/* Note: the third parameter denotes the offset of TEXCOORD in polylist elements
|
||||
For now this is always 2 (This may change sometime/maybe)
|
||||
*/
|
||||
COLLADASW::Input input3(COLLADASW::InputSemantic::TEXCOORD,
|
||||
makeUrl(layer_id),
|
||||
2, // this is only until we have optimized UV sets
|
||||
(this->export_settings->active_uv_only) ? 0 : i // only_active_uv exported -> we have only one set
|
||||
);
|
||||
til.push_back(input3);
|
||||
}
|
||||
}
|
||||
|
||||
int totlayer_mcol = CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL);
|
||||
if (totlayer_mcol > 0) {
|
||||
int map_index = 0;
|
||||
|
||||
for (int a = 0; a < totlayer_mcol; a++) {
|
||||
char *layer_name = bc_CustomData_get_layer_name(&me->ldata, CD_MLOOPCOL, a);
|
||||
COLLADASW::Input input4(COLLADASW::InputSemantic::COLOR,
|
||||
makeUrl(makeVertexColorSourceId(geom_id, layer_name)),
|
||||
(has_uvs) ? 3 : 2, // all color layers have same index order
|
||||
map_index // set number equals color map index
|
||||
);
|
||||
til.push_back(input4);
|
||||
map_index++;
|
||||
}
|
||||
}
|
||||
|
||||
// performs the actual writing
|
||||
prepareToAppendValues(is_triangulated, facelist, vcount_list);
|
||||
|
||||
// <p>
|
||||
int texindex = 0;
|
||||
for (i = 0; i < totpolys; i++) {
|
||||
MTexPoly *tp = &mtpolys[i];
|
||||
MPoly *p = &mpolys[i];
|
||||
int loop_count = p->totloop;
|
||||
std::string tpageid = (tp->tpage) ? id_name(tp->tpage) : "";
|
||||
if (tpageid == imageid) {
|
||||
MLoop *l = &mloops[p->loopstart];
|
||||
BCPolygonNormalsIndices normal_indices = norind[i];
|
||||
|
||||
for (int j = 0; j < loop_count; j++) {
|
||||
facelist->appendValues(l[j].v);
|
||||
facelist->appendValues(normal_indices[j]);
|
||||
if (has_uvs)
|
||||
facelist->appendValues(texindex + j);
|
||||
|
||||
if (has_color)
|
||||
facelist->appendValues(texindex + j);
|
||||
}
|
||||
}
|
||||
|
||||
texindex += loop_count;
|
||||
}
|
||||
|
||||
finishList(is_triangulated, facelist);
|
||||
delete facelist;
|
||||
}
|
||||
|
||||
// creates <source> for positions
|
||||
void GeometryExporter::createVertsSource(std::string geom_id, Mesh *me)
|
||||
|
||||
@@ -289,6 +289,13 @@ static int eyedropper_colorband_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
}
|
||||
|
||||
static int eyedropper_colorband_poll(bContext *C)
|
||||
{
|
||||
uiBut *but = UI_context_active_but_get(C);
|
||||
return (but && but->type == UI_BTYPE_COLORBAND);
|
||||
}
|
||||
|
||||
|
||||
void UI_OT_eyedropper_colorband(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
@@ -301,6 +308,7 @@ void UI_OT_eyedropper_colorband(wmOperatorType *ot)
|
||||
ot->modal = eyedropper_colorband_modal;
|
||||
ot->cancel = eyedropper_colorband_cancel;
|
||||
ot->exec = eyedropper_colorband_exec;
|
||||
ot->poll = eyedropper_colorband_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag = OPTYPE_BLOCKING | OPTYPE_INTERNAL;
|
||||
@@ -320,6 +328,7 @@ void UI_OT_eyedropper_colorband_point(wmOperatorType *ot)
|
||||
ot->modal = eyedropper_colorband_point_modal;
|
||||
ot->cancel = eyedropper_colorband_cancel;
|
||||
ot->exec = eyedropper_colorband_exec;
|
||||
ot->poll = eyedropper_colorband_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag = OPTYPE_BLOCKING | OPTYPE_INTERNAL;
|
||||
|
||||
Reference in New Issue
Block a user