155 lines
5.2 KiB
C++
155 lines
5.2 KiB
C++
// Copyright 2017 The Draco Authors.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
#ifndef DRACO_UNITY_DRACO_UNITY_PLUGIN_H_
|
|
#define DRACO_UNITY_DRACO_UNITY_PLUGIN_H_
|
|
|
|
#include "draco/attributes/geometry_attribute.h"
|
|
#include "draco/compression/config/compression_shared.h"
|
|
#include "draco/compression/decode.h"
|
|
#include "draco/core/draco_types.h"
|
|
|
|
#ifdef DRACO_UNITY_PLUGIN
|
|
|
|
// If compiling with Visual Studio.
|
|
#if defined(_MSC_VER)
|
|
#define EXPORT_API __declspec(dllexport)
|
|
#else
|
|
// Other platforms don't need this.
|
|
#define EXPORT_API
|
|
#endif // defined(_MSC_VER)
|
|
|
|
namespace draco {
|
|
|
|
extern "C" {
|
|
|
|
// Struct representing Draco attribute data within Unity.
|
|
struct EXPORT_API DracoData {
|
|
DracoData() : data_type(DT_INVALID), data(nullptr) {}
|
|
|
|
DataType data_type;
|
|
void *data;
|
|
};
|
|
|
|
// Struct representing a Draco attribute within Unity.
|
|
struct EXPORT_API DracoAttribute {
|
|
DracoAttribute()
|
|
: attribute_type(GeometryAttribute::INVALID),
|
|
data_type(DT_INVALID),
|
|
num_components(0),
|
|
unique_id(0),
|
|
private_attribute(nullptr) {}
|
|
|
|
GeometryAttribute::Type attribute_type;
|
|
DataType data_type;
|
|
int num_components;
|
|
int unique_id;
|
|
const void *private_attribute;
|
|
};
|
|
|
|
// Struct representing a Draco mesh within Unity.
|
|
struct EXPORT_API DracoMesh {
|
|
DracoMesh()
|
|
: num_faces(0),
|
|
num_vertices(0),
|
|
num_attributes(0),
|
|
private_mesh(nullptr) {}
|
|
|
|
int num_faces;
|
|
int num_vertices;
|
|
int num_attributes;
|
|
void *private_mesh;
|
|
};
|
|
|
|
// Release data associated with DracoMesh.
|
|
void EXPORT_API ReleaseDracoMesh(DracoMesh **mesh_ptr);
|
|
// Release data associated with DracoAttribute.
|
|
void EXPORT_API ReleaseDracoAttribute(DracoAttribute **attr_ptr);
|
|
// Release attribute data.
|
|
void EXPORT_API ReleaseDracoData(DracoData **data_ptr);
|
|
|
|
// Decodes compressed Draco mesh in |data| and returns |mesh|. On input, |mesh|
|
|
// must be null. The returned |mesh| must be released with ReleaseDracoMesh.
|
|
int EXPORT_API DecodeDracoMesh(char *data, unsigned int length,
|
|
DracoMesh **mesh);
|
|
|
|
// Returns |attribute| at |index| in |mesh|. On input, |attribute| must be
|
|
// null. The returned |attribute| must be released with ReleaseDracoAttribute.
|
|
bool EXPORT_API GetAttribute(const DracoMesh *mesh, int index,
|
|
DracoAttribute **attribute);
|
|
// Returns |attribute| of |type| at |index| in |mesh|. E.g. If the mesh has
|
|
// two texture coordinates then GetAttributeByType(mesh,
|
|
// AttributeType.TEX_COORD, 1, &attr); will return the second TEX_COORD
|
|
// attribute. On input, |attribute| must be null. The returned |attribute| must
|
|
// be released with ReleaseDracoAttribute.
|
|
bool EXPORT_API GetAttributeByType(const DracoMesh *mesh,
|
|
GeometryAttribute::Type type, int index,
|
|
DracoAttribute **attribute);
|
|
// Returns |attribute| with |unique_id| in |mesh|. On input, |attribute| must be
|
|
// null. The returned |attribute| must be released with ReleaseDracoAttribute.
|
|
bool EXPORT_API GetAttributeByUniqueId(const DracoMesh *mesh, int unique_id,
|
|
DracoAttribute **attribute);
|
|
// Returns the indices as well as the type of data in |indices|. On input,
|
|
// |indices| must be null. The returned |indices| must be released with
|
|
// ReleaseDracoData.
|
|
bool EXPORT_API GetMeshIndices(const DracoMesh *mesh, DracoData **indices);
|
|
// Returns the attribute data from attribute as well as the type of data in
|
|
// |data|. On input, |data| must be null. The returned |data| must be released
|
|
// with ReleaseDracoData.
|
|
bool EXPORT_API GetAttributeData(const DracoMesh *mesh,
|
|
const DracoAttribute *attribute,
|
|
DracoData **data);
|
|
|
|
// DracoToUnityMesh is deprecated.
|
|
struct EXPORT_API DracoToUnityMesh {
|
|
DracoToUnityMesh()
|
|
: num_faces(0),
|
|
indices(nullptr),
|
|
num_vertices(0),
|
|
position(nullptr),
|
|
has_normal(false),
|
|
normal(nullptr),
|
|
has_texcoord(false),
|
|
texcoord(nullptr),
|
|
has_color(false),
|
|
color(nullptr) {}
|
|
|
|
int num_faces;
|
|
int *indices;
|
|
int num_vertices;
|
|
float *position;
|
|
bool has_normal;
|
|
float *normal;
|
|
bool has_texcoord;
|
|
float *texcoord;
|
|
bool has_color;
|
|
float *color;
|
|
};
|
|
|
|
// ReleaseUnityMesh is deprecated.
|
|
void EXPORT_API ReleaseUnityMesh(DracoToUnityMesh **mesh_ptr);
|
|
|
|
// To use this function, you do not allocate memory for |tmp_mesh|, just
|
|
// define and pass a null pointer. Otherwise there will be memory leak.
|
|
// DecodeMeshForUnity is deprecated.
|
|
int EXPORT_API DecodeMeshForUnity(char *data, unsigned int length,
|
|
DracoToUnityMesh **tmp_mesh);
|
|
} // extern "C"
|
|
|
|
} // namespace draco
|
|
|
|
#endif // DRACO_UNITY_PLUGIN
|
|
|
|
#endif // DRACO_UNITY_DRACO_UNITY_PLUGIN_H_
|