示例#1
0
static void mikk_compute_tangents(
    const BL::Mesh &b_mesh, const char *layer_name, Mesh *mesh, bool need_sign, bool active_render)
{
  /* Create tangent attributes. */
  AttributeSet &attributes = (mesh->subd_faces.size()) ? mesh->subd_attributes : mesh->attributes;
  Attribute *attr;
  ustring name;
  if (layer_name != NULL) {
    name = ustring((string(layer_name) + ".tangent").c_str());
  }
  else {
    name = ustring("orco.tangent");
  }
  if (active_render) {
    attr = attributes.add(ATTR_STD_UV_TANGENT, name);
  }
  else {
    attr = attributes.add(name, TypeDesc::TypeVector, ATTR_ELEMENT_CORNER);
  }
  float3 *tangent = attr->data_float3();
  /* Create bitangent sign attribute. */
  float *tangent_sign = NULL;
  if (need_sign) {
    Attribute *attr_sign;
    ustring name_sign;
    if (layer_name != NULL) {
      name_sign = ustring((string(layer_name) + ".tangent_sign").c_str());
    }
    else {
      name_sign = ustring("orco.tangent_sign");
    }

    if (active_render) {
      attr_sign = attributes.add(ATTR_STD_UV_TANGENT_SIGN, name_sign);
    }
    else {
      attr_sign = attributes.add(name_sign, TypeDesc::TypeFloat, ATTR_ELEMENT_CORNER);
    }
    tangent_sign = attr_sign->data_float();
  }
  /* Setup userdata. */
  MikkUserData userdata(b_mesh, layer_name, mesh, tangent, tangent_sign);
  /* Setup interface. */
  SMikkTSpaceInterface sm_interface;
  memset(&sm_interface, 0, sizeof(sm_interface));
  sm_interface.m_getNumFaces = mikk_get_num_faces;
  sm_interface.m_getNumVerticesOfFace = mikk_get_num_verts_of_face;
  sm_interface.m_getPosition = mikk_get_position;
  sm_interface.m_getTexCoord = mikk_get_texture_coordinate;
  sm_interface.m_getNormal = mikk_get_normal;
  sm_interface.m_setTSpaceBasic = mikk_set_tangent_space;
  /* Setup context. */
  SMikkTSpaceContext context;
  memset(&context, 0, sizeof(context));
  context.m_pUserData = &userdata;
  context.m_pInterface = &sm_interface;
  /* Compute tangents. */
  genTangSpaceDefault(&context);
}
示例#2
0
文件: utils.c 项目: stetre/moonassimp
int freeuserdata(lua_State *L, void *ptr)
    {
    ud_t *ud = userdata(ptr);
    if(!ud || !IsValid(ud))
        return 0; /* already deleted */
    CancelValid(ud);
    udata_free(L, ptr);
    return 1;
    }
示例#3
0
文件: mesh.c 项目: stetre/moonassimp
static int Material(lua_State *L)
    {
#define scene ud->scene
    mesh_t *mesh = checkmesh(L, 1);
    ud_t *ud = userdata(mesh);
    if(mesh->mMaterialIndex >= scene->mNumMaterials)
        return unexpected(L);   
    pushmaterial(L, scene->mMaterials[mesh->mMaterialIndex]);
    return 1;
#undef scene
    }
示例#4
0
int main(int argc, char **argv)
{
    int retStat = 0;

    g_print("Starting client test v%s...\n", CLIENT_TEST_VERSION);

    if (argc < 2)
    {
        g_print("usage: %s play <url> | sanity <url> | secfil <url> | userdata <url>\n", argv[0]);
        return -1;
    }

    if (strcmp(argv[1], "sanity") == 0)
    {
        if (argc < 3)
        {
            g_print("usage: %s sanity <url>\n", argv[0]);
            return -1;
        }
        retStat = sanity(argv[2]);

    }
    else if (strcmp(argv[1], "play") == 0)
    {
        if (argc < 3)
        {
            g_print("usage: %s play <url>\n", argv[0]);
            return -1;
        }
        retStat = play(argv[2]);
    }    
    else if (strcmp(argv[1], "secfil") == 0)
    {
        if (argc < 3)
        {
            g_print("usage: %s secfil <url>\n", argv[0]);
            return -1;
        }
        retStat = secfil(argv[2]);
    }
    else if (strcmp(argv[1], "userdata") == 0)
    {
        if (argc < 3)
        {
            g_print("usage: %s userdata <url>\n", argv[0]);
            return -1;
        }
        retStat = userdata(argv[2]);
    }

    return retStat;
}
示例#5
0
std::vector<Dimension> MrsidReader::getDefaultDimensions()
{
    std::vector<Dimension> output;

    Dimension x("X", dimension::Float, 8);
    x.setUUID("8c54ff0c-234f-43a2-8959-d9681ad1dea3");
    x.setNamespace(s_getName());
    output.push_back(x);

    Dimension y("Y", dimension::Float, 8);
    y.setUUID("9cee971b-2505-40cd-b7e9-f32c399afac7");
    y.setNamespace(s_getName());
    output.push_back(y);

    Dimension z("Z", dimension::Float, 8);
    z.setUUID("89dc4e36-6166-4bc8-bf95-5660657b0ea6");
    z.setNamespace(s_getName());
    output.push_back(z);

    Dimension t("Time", dimension::Float, 8);
    t.setUUID("3aea2826-4a6e-4c1b-ae27-7b2f24763ce1");
    t.setNamespace(s_getName());
    output.push_back(t);

    Dimension blue("Blue", dimension::UnsignedInteger, 2);
    blue.setUUID("f69977e3-23e8-4483-91b6-14cad981e9fd");
    blue.setNamespace(s_getName());
    output.push_back(blue);

    Dimension red("Red", dimension::UnsignedInteger, 2);
    red.setUUID("40a02a80-c399-42f0-a587-a286635b446e");
    red.setNamespace(s_getName());
    output.push_back(red);

    Dimension green("Green", dimension::UnsignedInteger, 2);
    green.setUUID("b329df2d-44f1-4f35-8993-d183dacaa1ff");
    green.setNamespace(s_getName());
    output.push_back(green);

    Dimension cls("Classification", dimension::UnsignedInteger, 1);
    cls.setUUID("ba1e2af8-6dfd-46a7-972a-ecc00f68914d");
    cls.setNamespace(s_getName());
    output.push_back(cls);

    Dimension edge("EdgeOfFlightLine", dimension::UnsignedInteger, 1);
    edge.setUUID("daed3bfc-650d-4265-93a7-d8093cbd75a0");
    edge.setNamespace(s_getName());
    output.push_back(edge);

    Dimension intensity("Intensity", dimension::UnsignedInteger, 2);
    intensity.setUUID("a43332a8-26b3-4609-a2b1-ddfda30e0565");
    intensity.setNamespace(s_getName());
    output.push_back(intensity);

    Dimension num_returns("NumberOfReturns", dimension::UnsignedInteger, 1);
    num_returns.setUUID("fa7c5d56-fb2b-4f81-9126-f183000c3cd8");
    num_returns.setNamespace(s_getName());
    output.push_back(num_returns);

    Dimension return_no("ReturnNumber", dimension::UnsignedInteger, 1);
    return_no.setUUID("e38cc121-8d26-482a-8920-c5599b2cdd19");
    return_no.setNamespace(s_getName());
    output.push_back(return_no);

    Dimension scan_angle("ScanAngleRank", dimension::UnsignedInteger, 1);
    scan_angle.setUUID("5d816875-10a5-4048-ad9d-fd3b8d065a6a");
    scan_angle.setNamespace(s_getName());
    output.push_back(scan_angle);

    Dimension scan_dir("ScanDirectionFlag", dimension::UnsignedInteger, 1);
    scan_dir.setUUID("d1054379-8bf6-4685-abfc-1f0ec37aa819");
    scan_dir.setNamespace(s_getName());
    output.push_back(scan_dir);

    Dimension ptsource("PointSourceId", dimension::UnsignedInteger, 2);
    ptsource.setUUID("be6e71af-b2f7-4107-a902-96e2fb71343f");
    ptsource.setNamespace(s_getName());
    output.push_back(ptsource);

    Dimension userdata("UserData", dimension::UnsignedInteger, 1);
    userdata.setUUID("551ca4be-cb6e-47a4-93a9-e403e9a06a8a");
    userdata.setNamespace(s_getName());
    output.push_back(userdata);

    return output;
}
示例#6
0
static void mikk_compute_tangents(BL::Mesh& b_mesh,
                                  BL::MeshTextureFaceLayer *b_layer,
                                  Mesh *mesh,
                                  const vector<int>& nverts,
                                  const vector<int>& face_flags,
                                  bool need_sign,
                                  bool active_render)
{
	/* setup userdata */
	MikkUserData userdata(b_mesh, b_layer, nverts.size());

	/* setup interface */
	SMikkTSpaceInterface sm_interface;
	memset(&sm_interface, 0, sizeof(sm_interface));
	sm_interface.m_getNumFaces = mikk_get_num_faces;
	sm_interface.m_getNumVerticesOfFace = mikk_get_num_verts_of_face;
	sm_interface.m_getPosition = mikk_get_position;
	sm_interface.m_getTexCoord = mikk_get_texture_coordinate;
	sm_interface.m_getNormal = mikk_get_normal;
	sm_interface.m_setTSpaceBasic = mikk_set_tangent_space;

	/* setup context */
	SMikkTSpaceContext context;
	memset(&context, 0, sizeof(context));
	context.m_pUserData = &userdata;
	context.m_pInterface = &sm_interface;

	/* compute tangents */
	genTangSpaceDefault(&context);

	/* create tangent attributes */
	Attribute *attr;
	ustring name;
	if(b_layer != NULL)
		name = ustring((string(b_layer->name().c_str()) + ".tangent").c_str());
	else
		name = ustring("orco.tangent");

	if(active_render)
		attr = mesh->attributes.add(ATTR_STD_UV_TANGENT, name);
	else
		attr = mesh->attributes.add(name, TypeDesc::TypeVector, ATTR_ELEMENT_CORNER);

	float3 *tangent = attr->data_float3();

	/* create bitangent sign attribute */
	float *tangent_sign = NULL;

	if(need_sign) {
		Attribute *attr_sign;
		ustring name_sign;
		if(b_layer != NULL)
			name_sign = ustring((string(b_layer->name().c_str()) + ".tangent_sign").c_str());
		else
			name_sign = ustring("orco.tangent_sign");

		if(active_render)
			attr_sign = mesh->attributes.add(ATTR_STD_UV_TANGENT_SIGN, name_sign);
		else
			attr_sign = mesh->attributes.add(name_sign, TypeDesc::TypeFloat, ATTR_ELEMENT_CORNER);

		tangent_sign = attr_sign->data_float();
	}

	for(int i = 0; i < nverts.size(); i++) {
		int tri_a[3], tri_b[3];
		face_split_tri_indices(nverts[i], face_flags[i], tri_a, tri_b);

		tangent[0] = float4_to_float3(userdata.tangent[i*4 + tri_a[0]]);
		tangent[1] = float4_to_float3(userdata.tangent[i*4 + tri_a[1]]);
		tangent[2] = float4_to_float3(userdata.tangent[i*4 + tri_a[2]]);
		tangent += 3;

		if(tangent_sign) {
			tangent_sign[0] = userdata.tangent[i*4 + tri_a[0]].w;
			tangent_sign[1] = userdata.tangent[i*4 + tri_a[1]].w;
			tangent_sign[2] = userdata.tangent[i*4 + tri_a[2]].w;
			tangent_sign += 3;
		}

		if(nverts[i] == 4) {
			tangent[0] = float4_to_float3(userdata.tangent[i*4 + tri_b[0]]);
			tangent[1] = float4_to_float3(userdata.tangent[i*4 + tri_b[1]]);
			tangent[2] = float4_to_float3(userdata.tangent[i*4 + tri_b[2]]);
			tangent += 3;

			if(tangent_sign) {
				tangent_sign[0] = userdata.tangent[i*4 + tri_b[0]].w;
				tangent_sign[1] = userdata.tangent[i*4 + tri_b[1]].w;
				tangent_sign[2] = userdata.tangent[i*4 + tri_b[2]].w;
				tangent_sign += 3;
			}
		}
	}
}