Ejemplo n.º 1
0
/** When this method is called, the writer must write the image.
 * \return The writer should return true, if writing succeeded, false otherwise.*/
bool DocumentImporter::writeImage(const COLLADAFW::Image *image)
{
	if (mImportStage != General)
		return true;
		
	const std::string& imagepath = image->getImageURI().toNativePath();

	char dir[FILE_MAX];
	char absolute_path[FILE_MAX];
	const char *workpath;

	BLI_split_dir_part(this->import_settings->filepath, dir, sizeof(dir));
	BLI_join_dirfile(absolute_path, sizeof(absolute_path), dir, imagepath.c_str());
	if (BLI_exists(absolute_path)) {
		workpath = absolute_path;
	} 
	else {
		// Maybe imagepath was already absolute ?
		if (!BLI_exists(imagepath.c_str())) {
			fprintf(stderr, "Image not found: %s.\n", imagepath.c_str() );
			return true;
		}
		workpath = imagepath.c_str();
	}

	Image *ima = BKE_image_load_exists(workpath);
	if (!ima) {
		fprintf(stderr, "Cannot create image: %s\n", workpath);
		return true;
	}
	this->uid_image_map[image->getUniqueId()] = ima;
	
	return true;
}
Ejemplo n.º 2
0
/* /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */
static MatItem *mat_livedb_add_mat_element(Main *bmain, bContext *C, bNodeTree *ntree, bNode *node_to, bNodeSocket *sock_to, MatItem **_item, char* file_path, float x_pos, float *y_pos)
{
    MatItem          *ptr;
    MatItem          *item = *_item;
    char             tex_file_name[1024];

    bNodeSocket             *sock;

    switch (item->type) {
        case MAT_LDB_VALUE_TYPE_EMPTY: {
            *_item = (MatItem*)((char*)item + item->size);
            break;
        }
        case MAT_LDB_VALUE_TYPE_FLINK: {
            ptr = (MatItem*) ((char*)item - item->uint_vector[0]);
            mat_livedb_add_mat_element(bmain, C, ntree, node_to, 0, &ptr, file_path, 0, 0);

            *_item = (MatItem*)((char*)item + item->size);
            break;
        }
        case MAT_LDB_VALUE_TYPE_NLINK: {
            bNode *linked_node = *((bNode**) ((MatItem*)((char*)item - item->uint_vector[0]))->data);

            connect_node(bmain, ntree, linked_node, node_to, sock_to);

            *_item = (MatItem*)((char*)item + item->size);
            break;
        }
        case MAT_LDB_VALUE_TYPE_NODE: {
            if(sock_to->type == SOCK_FLOAT && sock_to->default_value && !strcmp(item->data, "ShaderNodeOctFloatTex")) {
                item = (MatItem*)((char*)item + item->size);

                ((bNodeSocketValueFloat*)sock_to->default_value)->value = item->float_vector[0];

                *_item = (MatItem*)((char*)item + item->size);
            }
            else if(sock_to->type == SOCK_RGBA && sock_to->default_value && !strcmp(item->data, "ShaderNodeOctRGBSpectrumTex")) {
                item = (MatItem*)((char*)item + item->size);

                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[0] = item->float_vector[0];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[1] = item->float_vector[1];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[2] = item->float_vector[2];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[3] = item->float_vector[3];

                *_item = (MatItem*)((char*)item + item->size);
            }
            else {
                float   cur_y_pos;
                int     node_height     = U.widget_unit;
                bool    childs_present  = false;
                bNode   *node_fr        = nodeAddNode(C, ntree, item->data);

                connect_node(bmain, ntree, node_fr, node_to, sock_to);

                *_item = (MatItem*)((char*)item + item->size);
                ptr = *_item;

                *((bNode**)item->data) = node_fr;

                if(node_fr->type == SH_NODE_OCT_IMAGE_TEX || node_fr->type == SH_NODE_OCT_FLOAT_IMAGE_TEX || node_fr->type == SH_NODE_OCT_ALPHA_IMAGE_TEX) {
                    mat_livedb_add_mat_element(bmain, C, ntree, node_fr, 0, &ptr, file_path, 0, 0);
                    node_height += (U.widget_unit * 2.5);
                }

                node_fr->locx = x_pos - node_fr->width - LDB_NODES_H_GAP;
                node_fr->locy = cur_y_pos = *y_pos;

                for (sock = node_fr->inputs.first; sock; sock = sock->next) {
                    if(!sock) continue;
                    if(!childs_present) childs_present = true;
                    node_height += U.widget_unit;

                    mat_livedb_add_mat_element(bmain, C, ntree, node_fr, sock, &ptr, file_path, node_fr->locx, &cur_y_pos);
                }

                if(node_fr->type == SH_NODE_OCT_GRADIENT_TEX) {
                    mat_livedb_add_mat_element(bmain, C, ntree, node_fr, 0, &ptr, file_path, 0, 0);
                    node_height += (U.widget_unit * 2.5);
                }

                *_item = ptr;

                *y_pos -= (node_height + LDB_NODES_V_GAP);
                if(childs_present) *y_pos = (*y_pos < cur_y_pos ? *y_pos : cur_y_pos);
            }
            break;
        }
        case MAT_LDB_VALUE_TYPE_INT:
            if(sock_to->default_value)
                ((bNodeSocketValueInt*)sock_to->default_value)->value = item->int_vector[0];

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_INT2:
            if(sock_to->default_value) {
                ((bNodeSocketValueVector*)sock_to->default_value)->value[0] = item->int_vector[0];
                ((bNodeSocketValueVector*)sock_to->default_value)->value[1] = item->int_vector[1];
            }

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_INT3:
            if(sock_to->default_value) {
                ((bNodeSocketValueVector*)sock_to->default_value)->value[0] = item->int_vector[0];
                ((bNodeSocketValueVector*)sock_to->default_value)->value[1] = item->int_vector[1];
                ((bNodeSocketValueVector*)sock_to->default_value)->value[2] = item->int_vector[2];
            }

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_INT4:
            if(sock_to->default_value) {
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[0] = item->int_vector[0];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[1] = item->int_vector[1];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[2] = item->int_vector[2];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[3] = item->int_vector[3];
            }

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_FLOAT:
            if(sock_to->default_value)
                ((bNodeSocketValueFloat*)sock_to->default_value)->value = item->float_vector[0];

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_FLOAT2:
            if(sock_to->default_value) {
                ((bNodeSocketValueVector*)sock_to->default_value)->value[0] = item->float_vector[0];
                ((bNodeSocketValueVector*)sock_to->default_value)->value[1] = item->float_vector[1];
            }

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_FLOAT3:
            if(sock_to->default_value) {
                ((bNodeSocketValueVector*)sock_to->default_value)->value[0] = item->float_vector[0];
                ((bNodeSocketValueVector*)sock_to->default_value)->value[1] = item->float_vector[1];
                ((bNodeSocketValueVector*)sock_to->default_value)->value[2] = item->float_vector[2];
            }

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_FLOAT4:
            if(sock_to->default_value) {
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[0] = item->float_vector[0];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[1] = item->float_vector[1];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[2] = item->float_vector[2];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[3] = item->float_vector[3];
            }

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_BOOL:
            if(sock_to->default_value)
                ((bNodeSocketValueBoolean*)sock_to->default_value)->value = item->int_vector[0];

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_STRING:
            if(sock_to->default_value)
                strcpy(((bNodeSocketValueString*)sock_to->default_value)->value, item->data);

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_COLOR:
            if(sock_to->default_value) {
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[0] = item->float_vector[0];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[1] = item->float_vector[1];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[2] = item->float_vector[2];
                ((bNodeSocketValueRGBA*)sock_to->default_value)->value[3] = item->float_vector[3];
            }

            *_item = (MatItem*)((char*)item + item->size);
            break;
        case MAT_LDB_VALUE_TYPE_FILE: {
            char* file_name;
            FILE *file;
            struct Image *ima = (struct Image*)node_to->id;

            file_name = item->data + sizeof(uint32_t);

            if(file_name[0]) {
                strcpy(tex_file_name, file_path);
                strcat(tex_file_name, file_name);

                file = BLI_fopen(tex_file_name, "rb");
                if(!file) {
                    file = BLI_fopen(tex_file_name, "wb");
                    if(file) {
                        if(!fwrite(item->data + sizeof(uint32_t) + strlen(file_name) + 1, *((uint32_t*)item->data), 1, file)) {
                        }
                        fclose(file);
                    }
                }
                else fclose(file);
            }
            else tex_file_name[0] = 0;

            if(!ima)
                node_to->id = (struct ID*)BKE_image_load_exists(tex_file_name);

            *_item = (MatItem*)((char*)item + item->size);
            break;
        }
        case MAT_LDB_VALUE_TYPE_RAMP: {
            char* file_name;
            FILE *file;
            struct ColorBand *coba = (struct ColorBand*)node_to->storage;

            RampItem *ramp_item = (RampItem*)item->data;

            if(coba && ramp_item->pos_cnt > 1) {
                int i;
                coba->tot = ramp_item->pos_cnt;
                for(i = 0; i < ramp_item->pos_cnt; ++i) {
                    coba->data[i].pos   = ramp_item->pos_data[i * 4 + 0];
                    coba->data[i].r     = ramp_item->pos_data[i * 4 + 1];
                    coba->data[i].g     = ramp_item->pos_data[i * 4 + 2];
                    coba->data[i].b     = ramp_item->pos_data[i * 4 + 3];
                    coba->data[i].a     = 1.0;
                }
            }

            *_item = (MatItem*)((char*)item + item->size);
            break;
        }
        default:
            break;
    }
    return *_item;
} /* mat_livedb_add_mat_element */