mirror of
https://github.com/bulletphysics/bullet3
synced 2025-01-10 17:30:12 +00:00
remove readblend, it will be replaced by Serialize
This commit is contained in:
parent
b010233e7b
commit
901ff7a4f8
@ -1032,7 +1032,7 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input)
|
|||||||
/*
|
/*
|
||||||
* JC patch. Skip the rigid body if it doesn't have any DOM
|
* JC patch. Skip the rigid body if it doesn't have any DOM
|
||||||
* node associated - e.g. because it was created directly, without
|
* node associated - e.g. because it was created directly, without
|
||||||
* the COLLADA file.
|
* the COLLADA file.
|
||||||
*/
|
*/
|
||||||
if(!domRigidBody)
|
if(!domRigidBody)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1 +1 @@
|
|||||||
SUBDIRS( glui iff ConvexDecomposition BulletColladaConverter LibXML COLLADA_DOM GIMPACTUtils )
|
SUBDIRS( glui ConvexDecomposition BulletColladaConverter LibXML COLLADA_DOM GIMPACTUtils )
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
|
|
||||||
Copyright (C) 2003-2006 Adam D. Moss (the "Author"). All Rights Reserved.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is fur-
|
|
||||||
nished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
|
|
||||||
NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
|
|
||||||
NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the Author of the
|
|
||||||
Software shall not be used in advertising or otherwise to promote the sale,
|
|
||||||
use or other dealings in this Software without prior written authorization
|
|
||||||
from the Author.
|
|
@ -1,36 +0,0 @@
|
|||||||
|
|
||||||
CC = gcc
|
|
||||||
COPTS = -O2 -Wall
|
|
||||||
|
|
||||||
#CC = gcc31
|
|
||||||
#COPTS = -O2 -Wall -ggdb -lm
|
|
||||||
|
|
||||||
#COPTS = -O3 -g -fno-inline-functions -ffast-math -pg -Wall
|
|
||||||
#COPTS = -ggdb -Wall
|
|
||||||
|
|
||||||
CFLAGS = $(COPTS) $(INCS) -lm
|
|
||||||
|
|
||||||
EXEC = testblend
|
|
||||||
|
|
||||||
OBJ_SRCS = testblend.c readblend.c
|
|
||||||
OBJ_OBJS = $(OBJ_SRCS:.c=.o)
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
${CC} ${CFLAGS} -c $< -o $@
|
|
||||||
|
|
||||||
all: $(EXEC)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(EXEC) *.o gmon.out
|
|
||||||
|
|
||||||
#dist:
|
|
||||||
# tar -hzvcf flynn-`cat VERSION`.tar.gz `cat MANIFEST`
|
|
||||||
# ls -la flynn-`cat VERSION`.tar.gz
|
|
||||||
|
|
||||||
#testdist:
|
|
||||||
# tar -zvcf flynn-testdir.tar.gz test
|
|
||||||
# ls -la flynn-testdir.tar.gz
|
|
||||||
|
|
||||||
$(EXEC): $(OBJ_OBJS)
|
|
||||||
$(CC) $(CFLAGS) $^ -o $@
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
ReadBlend, a data extraction API for Blender's .blend files
|
|
||||||
|
|
||||||
quick notes on the logical .blend file format as presented
|
|
||||||
by readblend:
|
|
||||||
|
|
||||||
|
|
||||||
BLENDFILE
|
|
||||||
|
|
|
||||||
|--BLENDFILE_VERSION
|
|
||||||
|
|
|
||||||
|--NUM_BLOCKS ... number of blocks in the file
|
|
||||||
|--BLOCK[NUM_BLOCKS] ... array of blocks
|
|
||||||
|
|
|
||||||
|--BLOCK_TAG ... general 'DATA', otherwise specialized type
|
|
||||||
|
|
|
||||||
|--OBJECT_TYPE ... the block is an array of objects of this type
|
|
||||||
|--OBJECT_COUNT ... this is the number of objects in the block
|
|
||||||
|--OBJECT[OBJECT_COUNT] ... array of objects
|
|
||||||
|
|
|
||||||
|--OBJECT
|
|
||||||
an OBJECT...
|
|
||||||
= ATOMIC type (uchar, float, etc)
|
|
||||||
or
|
|
||||||
= STRUCTURE (array of assorted OBJECTs, nested)
|
|
||||||
or
|
|
||||||
= POINTER (a reference to another BLOCK)
|
|
@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
|
||||||
# Visual Studio 2005
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReadBlend", "ReadBlend.vcproj", "{74CA6BF4-60C4-4FE6-BAB5-31F31FA2A0B3}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{74CA6BF4-60C4-4FE6-BAB5-31F31FA2A0B3}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{74CA6BF4-60C4-4FE6-BAB5-31F31FA2A0B3}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{74CA6BF4-60C4-4FE6-BAB5-31F31FA2A0B3}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{74CA6BF4-60C4-4FE6-BAB5-31F31FA2A0B3}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
@ -1,213 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="ReadBlend"
|
|
||||||
ProjectGUID="{74CA6BF4-60C4-4FE6-BAB5-31F31FA2A0B3}"
|
|
||||||
RootNamespace="ReadBlend"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="abs-file.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="readblend.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="readblend.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="testblend.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
|
||||||
>
|
|
||||||
</Filter>
|
|
||||||
<File
|
|
||||||
RelativePath=".\ReadMe.txt"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@ -1,260 +0,0 @@
|
|||||||
/*
|
|
||||||
* stdio/physfs abstraction layer 2004-02-06
|
|
||||||
*
|
|
||||||
* Adam D. Moss <adam@gimp.org> <aspirin@icculus.org>
|
|
||||||
*
|
|
||||||
* These wrapper macros and functions are designed to allow a program
|
|
||||||
* to perform file I/O with identical semantics and syntax regardless
|
|
||||||
* of whether PhysicsFS is being used or not.
|
|
||||||
*/
|
|
||||||
#ifndef _ABS_FILE_H
|
|
||||||
#define _ABS_FILE_H
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
|
|
||||||
typedef unsigned char uint8_t;
|
|
||||||
typedef unsigned long int uint64_t;
|
|
||||||
typedef unsigned int uint32_t;
|
|
||||||
typedef int int32_t;
|
|
||||||
typedef unsigned short uint16_t;
|
|
||||||
typedef short int16_t;
|
|
||||||
#else
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
PLEASE NOTE: This license applies to abs-file.h ONLY; The version of
|
|
||||||
PhysicsFS itself which you are using may have been released under a
|
|
||||||
license with additional restrictions.
|
|
||||||
|
|
||||||
Copyright (C) 2002-2004 Adam D. Moss (the "Author"). All Rights Reserved.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is fur-
|
|
||||||
nished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
|
|
||||||
NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
|
|
||||||
NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the Author of the
|
|
||||||
Software shall not be used in advertising or otherwise to promote the sale,
|
|
||||||
use or other dealings in this Software without prior written authorization
|
|
||||||
from the Author.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* API:
|
|
||||||
*
|
|
||||||
* Macro/function use like stdio equivalent...
|
|
||||||
* -------------- ----------------------------
|
|
||||||
* MY_FILETYPE FILE
|
|
||||||
* MY_OPEN_FOR_READ fopen(..., "rb")
|
|
||||||
* MY_READ fread(...)
|
|
||||||
* MY_GETC fgetc(...)
|
|
||||||
* MY_GETS fgets(...)
|
|
||||||
* MY_OPEN_FOR_WRITE fopen(..., "wb")
|
|
||||||
* MY_WRITE fwrite(...)
|
|
||||||
* MY_PUTC fputc(...)
|
|
||||||
* MY_PUTS fputs(...)
|
|
||||||
* MY_CLOSE fclose(...)
|
|
||||||
* MY_ATEOF feof(...)
|
|
||||||
* MY_TELL ftell(...)
|
|
||||||
* MY_SEEK fseek(..., SEEK_SET)
|
|
||||||
* MY_REWIND rewind(...)
|
|
||||||
* MY_SETBUFFER (not a standard for stdio, does nothing there)
|
|
||||||
* MY_FILELENGTH (not a standard for stdio, but implemented anyway)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Important DEFINEs:
|
|
||||||
*
|
|
||||||
* It is important to define these consistantly across the various
|
|
||||||
* compilation modules of your program if you wish to exchange file
|
|
||||||
* handles between them.
|
|
||||||
*
|
|
||||||
* USE_PHYSFS: Define USE_PHYSFS if PhysicsFS is being used; note that if
|
|
||||||
* you do intend to use PhysicsFS then you will still need to initialize
|
|
||||||
* PhysicsFS yourself and set up its search-paths.
|
|
||||||
*
|
|
||||||
* Optional DEFINEs:
|
|
||||||
*
|
|
||||||
* PHYSFS_DEFAULT_BUFFER_SIZE <bytes>: If set then abs-file.h sets the
|
|
||||||
* PhysicsFS buffer size to this value whenever you open a file. You
|
|
||||||
* may over-ride this on a per-filehandle basis by using the
|
|
||||||
* MY_SETBUFFER() macro (which simply does nothing when not using
|
|
||||||
* PhysicsFS). If you have not defined this value explicitly then
|
|
||||||
* abs-file.h will default to the same default buffer size as used by
|
|
||||||
* stdio if it can be determined, or 8192 bytes otherwise.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef PHYSFS_DEFAULT_BUFFER_SIZE
|
|
||||||
#ifdef BUFSIZ
|
|
||||||
#define PHYSFS_DEFAULT_BUFFER_SIZE BUFSIZ
|
|
||||||
#else
|
|
||||||
#define PHYSFS_DEFAULT_BUFFER_SIZE 8192
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_PHYSFS
|
|
||||||
|
|
||||||
#include <physfs.h>
|
|
||||||
#define MY_FILETYPE PHYSFS_file
|
|
||||||
#define MY_SETBUFFER(fp,size) PHYSFS_setBuffer(fp,size)
|
|
||||||
#define MY_READ(p,s,n,fp) PHYSFS_read(fp,p,s,n)
|
|
||||||
#define MY_WRITE(p,s,n,fp) PHYSFS_write(fp,p,s,n)
|
|
||||||
#if PHYSFS_DEFAULT_BUFFER_SIZE
|
|
||||||
static MY_FILETYPE* MY_OPEN_FOR_READ(const char *const filename)
|
|
||||||
{
|
|
||||||
MY_FILETYPE *const file = PHYSFS_openRead(filename);
|
|
||||||
if (file) {
|
|
||||||
MY_SETBUFFER(file, PHYSFS_DEFAULT_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
static MY_FILETYPE* MY_OPEN_FOR_WRITE(const char *const filename)
|
|
||||||
{
|
|
||||||
MY_FILETYPE *const file = PHYSFS_openWrite(filename);
|
|
||||||
if (file) {
|
|
||||||
MY_SETBUFFER(file, PHYSFS_DEFAULT_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define MY_OPEN_FOR_READ(fn) PHYSFS_openRead(fn)
|
|
||||||
#define MY_OPEN_FOR_WRITE(fn) PHYSFS_openWrite(fn)
|
|
||||||
#endif
|
|
||||||
static int MY_GETC(MY_FILETYPE *const fp) {
|
|
||||||
unsigned char c;
|
|
||||||
/*if (PHYSFS_eof(fp)) {
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
MY_READ(&c, 1, 1, fp);*/
|
|
||||||
if (MY_READ(&c, 1, 1, fp) != 1) {
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
static char * MY_GETS(char * const str, const int size,
|
|
||||||
MY_FILETYPE *const fp) {
|
|
||||||
int i = 0;
|
|
||||||
int c;
|
|
||||||
do {
|
|
||||||
if (i == size-1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c = MY_GETC(fp);
|
|
||||||
if (c == EOF) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
str[i++] = c;
|
|
||||||
} while (c != '\0' &&
|
|
||||||
c != -1 &&
|
|
||||||
c != '\n');
|
|
||||||
str[i] = '\0';
|
|
||||||
if (i == 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
static int MY_PUTC(int c, MY_FILETYPE *const fp) {
|
|
||||||
unsigned char cc = (unsigned char)c;
|
|
||||||
if (MY_WRITE(&cc, 1, 1, fp) != 1) {
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
return (int)cc;
|
|
||||||
}
|
|
||||||
static int MY_PUTS(const char *s, MY_FILETYPE *const fp) {
|
|
||||||
int i = 0;
|
|
||||||
while (s[i] != '\0') {
|
|
||||||
if (MY_PUTC(s[i], fp) == EOF) {
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
if (MY_PUTC('\n', fp) == EOF) {
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#define MY_CLOSE(fp) (0==PHYSFS_close(fp))
|
|
||||||
#define MY_ATEOF(fp) PHYSFS_eof(fp)
|
|
||||||
#define MY_TELL(fp) PHYSFS_tell(fp)
|
|
||||||
#define MY_SEEK(fp,o) (0==PHYSFS_seek(fp,o))
|
|
||||||
#define MY_REWIND(fp) MY_SEEK(fp,0)
|
|
||||||
#define MY_FILELENGTH(fp) PHYSFS_fileLength(fp)
|
|
||||||
|
|
||||||
#else /* !USE_PHYSFS */
|
|
||||||
|
|
||||||
//#define USE_POSIX_FILES 1
|
|
||||||
#ifdef USE_POSIX_FILES
|
|
||||||
#define MY_FILETYPE FILE
|
|
||||||
#define MY_READ(p,s,n,fp) fread(p,s,n,fp)
|
|
||||||
#define MY_WRITE(p,s,n,fp) fwrite(p,s,n,fp)
|
|
||||||
#define MY_OPEN_FOR_READ(n) fopen(n, "rb")
|
|
||||||
#define MY_OPEN_FOR_WRITE(n) fopen(n, "wb")
|
|
||||||
#define MY_GETC(fp) fgetc(fp)
|
|
||||||
#define MY_GETS(str,size,fp) fgets(str,size,fp)
|
|
||||||
#define MY_PUTC(c,fp) fputc(c,fp)
|
|
||||||
#define MY_PUTS(str,fp) fput(str,fp)
|
|
||||||
#define MY_CLOSE(fp) fclose(fp)
|
|
||||||
#define MY_ATEOF(fp) feof(fp)
|
|
||||||
#define MY_TELL(fp) ftell(fp)
|
|
||||||
#define MY_SEEK(fp,o) fseek(fp,o, SEEK_SET)
|
|
||||||
#define MY_REWIND(fp) rewind(fp)
|
|
||||||
#define MY_SETBUFFER(fp,size)
|
|
||||||
/* a TODO from ryan: "seeking to the end followed by an ftell() is probably
|
|
||||||
more portable, but you can also use fileno() to get a handle from a
|
|
||||||
(FILE *) to use with fstat()...on supported platforms, that is, most
|
|
||||||
platforms, this is probably faster." */
|
|
||||||
static long MY_FILELENGTH(FILE *fp) {
|
|
||||||
long currentpos = ftell(fp); /* save current cursor position */
|
|
||||||
long newpos;
|
|
||||||
fseek(fp, 0, SEEK_END); /* seek to end */
|
|
||||||
newpos = ftell(fp); /* find position of end -- this is the length */
|
|
||||||
fseek(fp, currentpos, SEEK_SET); /* restore previous cursor position */
|
|
||||||
return newpos;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MY_FILETYPE char
|
|
||||||
|
|
||||||
|
|
||||||
long MY_FILELENGTH(FILE *fp);
|
|
||||||
MY_FILETYPE* MY_OPEN_FOR_READ(const char *const filename);
|
|
||||||
int MY_GETC(MY_FILETYPE *const fp);
|
|
||||||
void MY_SEEK(MY_FILETYPE* fp,int pos);
|
|
||||||
#define MY_REWIND(fp) MY_SEEK(fp,0)
|
|
||||||
int MY_READ(unsigned char* dest,int size,int num,MY_FILETYPE* fp);
|
|
||||||
|
|
||||||
void MY_CLOSE(MY_FILETYPE* fp);
|
|
||||||
int MY_TELL(MY_FILETYPE* fp);
|
|
||||||
int MY_ATEOF(MY_FILETYPE* fp);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //USE_POSIX_FILES
|
|
||||||
|
|
||||||
#endif /* USE_PHYSFS */
|
|
||||||
|
|
||||||
#endif /* _ABS_FILE_H */
|
|
@ -1,87 +0,0 @@
|
|||||||
#ifndef BLEND_TYPE_H
|
|
||||||
#define BLEND_TYPE_H
|
|
||||||
#include "abs-file.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct _BlendField BlendField;
|
|
||||||
struct _BlendField {
|
|
||||||
char* field_bytes;
|
|
||||||
int field_bytes_count;
|
|
||||||
|
|
||||||
/* the offset into field_bytes at which each field of a
|
|
||||||
structure begins. this is so we can keep the data aligned
|
|
||||||
correctly for various architectures. a non-structure type
|
|
||||||
is equivalent to a structure with a single field.
|
|
||||||
*/
|
|
||||||
int* field_offsets;
|
|
||||||
int field_offsets_count;
|
|
||||||
};
|
|
||||||
struct _BlendBlock {
|
|
||||||
char tag[5];
|
|
||||||
uint32_t blender_pointer;
|
|
||||||
/*void* fixed_pointer;*/
|
|
||||||
|
|
||||||
int type_index;
|
|
||||||
/* a block is simply an array of its type as defined by type_index.
|
|
||||||
array_entries is an array of pointers to each entry in the block's
|
|
||||||
array.
|
|
||||||
*/
|
|
||||||
BlendField *array_entries;
|
|
||||||
int array_entries_count;
|
|
||||||
void* customData; /* for Link blocks, with custom data such as .jpg pictures etc */
|
|
||||||
int customDataSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _BlendBlock BlendBlock;
|
|
||||||
|
|
||||||
/* the types extracted from the Blender file */
|
|
||||||
typedef struct _BlendType BlendType;
|
|
||||||
struct _BlendType {
|
|
||||||
char* name;
|
|
||||||
int size;
|
|
||||||
|
|
||||||
int is_struct;
|
|
||||||
|
|
||||||
/* if is_struct... this defines the types of each of the structure fields */
|
|
||||||
int fieldtypes_count;
|
|
||||||
int* fieldtypes; /* type indices */
|
|
||||||
int fieldnames_count;
|
|
||||||
int* fieldnames; /* name indices */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* the opaque BlendFile structure */
|
|
||||||
typedef struct _BlendFile{
|
|
||||||
BlendType* types;
|
|
||||||
int types_count;
|
|
||||||
|
|
||||||
char* *names;
|
|
||||||
int names_count;
|
|
||||||
|
|
||||||
int* strc_indices;
|
|
||||||
int strc_indices_count;
|
|
||||||
|
|
||||||
BlendBlock *blocks;
|
|
||||||
int blocks_count;
|
|
||||||
|
|
||||||
int name_undef; /* index of the name we add specially for top blocks */
|
|
||||||
|
|
||||||
} BlendFile;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //BLEND_TYPE_H
|
|
File diff suppressed because it is too large
Load Diff
@ -1,492 +0,0 @@
|
|||||||
/***************************************************************
|
|
||||||
* readblend.h --
|
|
||||||
* ReadBlend, a data extraction API for Blender's .blend files
|
|
||||||
*
|
|
||||||
* (c) 2003 Adam D. Moss <adam@gimp.org> <aspirin@icculus.org>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* VERSION HISTORY
|
|
||||||
* 2003-04-05 : v1.0
|
|
||||||
* 2008-10-05 : v1.1-beta
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Blender files are 'curiously' structured and this is mirrored in
|
|
||||||
* the low-level data access API (the section labelled 'Low-level
|
|
||||||
* querying functions').
|
|
||||||
*
|
|
||||||
* The mid-level data access API (the section labelled 'Mid-level
|
|
||||||
* querying functions') tries to provide some handy utilities to
|
|
||||||
* ease your data-extraction pain, and finally the (partially written)
|
|
||||||
* high-level data access API incorporates semantic knowledge of Blender's
|
|
||||||
* useful high-level types such as Meshes and Materials to shield you
|
|
||||||
* from the full horror.
|
|
||||||
*/
|
|
||||||
#ifndef _READBLEND_H
|
|
||||||
#define _READBLEND_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
//#include <stdint.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdlib.h>//size_t for MSVC 6.0
|
|
||||||
|
|
||||||
//#include <cfloat>
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
#include "abs-file.h"
|
|
||||||
|
|
||||||
/* TODO: Doxygen me. */
|
|
||||||
|
|
||||||
|
|
||||||
#include "blendtype.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************/
|
|
||||||
/* .blend handle load/free functions */
|
|
||||||
/*************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/* Pass in an already-opened file handle; this function will then
|
|
||||||
examine the file to check that it is a Blender file and scan the
|
|
||||||
entire file to extract all vital information (quite expensive)
|
|
||||||
before any query operations can be performed. The resulting
|
|
||||||
.blend data handle is returned.
|
|
||||||
*/
|
|
||||||
|
|
||||||
BlendFile* blend_read(MY_FILETYPE* file);
|
|
||||||
|
|
||||||
|
|
||||||
/* Free all of the given BlendFile data (note: obviously, do not attempt
|
|
||||||
to extract data from a BlendFile which has been freed!) */
|
|
||||||
|
|
||||||
void blend_free(BlendFile* blend_file);
|
|
||||||
|
|
||||||
|
|
||||||
/********************************/
|
|
||||||
/* Public data querying types */
|
|
||||||
/********************************/
|
|
||||||
|
|
||||||
|
|
||||||
/* heed this enum well. */
|
|
||||||
typedef enum {
|
|
||||||
/* you're unlikely to encounter these in the wild. */
|
|
||||||
BLEND_OBJ_NULL,
|
|
||||||
BLEND_OBJ_OPAQUE,
|
|
||||||
|
|
||||||
/* these object types are fetchable as-is */
|
|
||||||
BLEND_OBJ_UCHAR8,
|
|
||||||
BLEND_OBJ_CHAR8,
|
|
||||||
BLEND_OBJ_USHORT16,
|
|
||||||
BLEND_OBJ_SHORT16,
|
|
||||||
BLEND_OBJ_ULONG32,
|
|
||||||
BLEND_OBJ_LONG32,
|
|
||||||
BLEND_OBJ_FLOAT,
|
|
||||||
BLEND_OBJ_DOUBLE,
|
|
||||||
BLEND_OBJ_POINTER,
|
|
||||||
|
|
||||||
/* you'll need to extract the fields from these individually */
|
|
||||||
BLEND_OBJ_STRUCT
|
|
||||||
} BlendObjType;
|
|
||||||
|
|
||||||
typedef void* BlendBlockPointer;
|
|
||||||
|
|
||||||
/* note: treat this as an opaque type and you'll live longer. */
|
|
||||||
typedef struct {
|
|
||||||
long type; long name; BlendBlockPointer block;
|
|
||||||
long entry_index; long field_index;
|
|
||||||
} BlendObject;
|
|
||||||
|
|
||||||
|
|
||||||
/* The callback type for passing to blend_foreach_block() (the callback
|
|
||||||
should return zero if it doesn't want to see any more blocks.) */
|
|
||||||
#define BLENDBLOCKCALLBACK_RETURN int
|
|
||||||
#define BLENDBLOCKCALLBACK_ARGS BlendBlockPointer block, \
|
|
||||||
BlendFile* blend_file, \
|
|
||||||
void* userdata
|
|
||||||
typedef BLENDBLOCKCALLBACK_RETURN(BlendBlockCallback)
|
|
||||||
(BLENDBLOCKCALLBACK_ARGS);
|
|
||||||
|
|
||||||
|
|
||||||
/********************************/
|
|
||||||
/* File info dumping functions */
|
|
||||||
/********************************/
|
|
||||||
|
|
||||||
/* these functions simply print dumps of information about the given
|
|
||||||
BlendFile. These are vital for familiarising yourself with the
|
|
||||||
structure of Blender's various scene objects if you're using the
|
|
||||||
low/mid-level APIs to construct queries to extract information about
|
|
||||||
specific types of objects that haven't been conveniently abstracted by
|
|
||||||
the high-level API yet. (That is, most of them right now, particularly
|
|
||||||
the more obscure or deprecated ones.) */
|
|
||||||
|
|
||||||
/* print out the size, field-types and field-names of all of the varieties
|
|
||||||
of types (atomic and struct) represented within this BlendFile. The
|
|
||||||
sizes are the in-file representations; the in-memory representations
|
|
||||||
are potentially subject to additional padding and conversions.
|
|
||||||
*/
|
|
||||||
void blend_dump_typedefs(BlendFile* bf);
|
|
||||||
|
|
||||||
/* For every top-level block of data in the file, print the block's
|
|
||||||
tag, its in-memory address, its type, and the number of entries of that
|
|
||||||
type. (Every pointer in a structure should point to one of these
|
|
||||||
in-memory block addresses because we convert from in-file pointers to
|
|
||||||
in-memory pointers automagically; a few in-file pointers within structures
|
|
||||||
do actually point somewhere into the middle of a block or nowhere, which we
|
|
||||||
don't currently support and silently convert to NULL.) Also, any structs
|
|
||||||
at the top-level with an id->name have that name printed out. */
|
|
||||||
void blend_dump_blocks(BlendFile* bf);
|
|
||||||
|
|
||||||
|
|
||||||
/********************************/
|
|
||||||
/* Low-level querying functions */
|
|
||||||
/********************************/
|
|
||||||
|
|
||||||
|
|
||||||
/* Calls the user-supplied callback function for every top-level
|
|
||||||
data block in the .blend file. You can use this to count blocks
|
|
||||||
(which is pretty pointless) or search for a particular block you're
|
|
||||||
interested in. */
|
|
||||||
void blend_foreach_block(BlendFile* blend_file,
|
|
||||||
BlendBlockCallback* func,
|
|
||||||
void* userdata);
|
|
||||||
|
|
||||||
/* Returns the tag-name ('IM', 'DATA', 'ME', etc) for the given
|
|
||||||
top-level data block. */
|
|
||||||
const char* blend_block_get_tagname(BlendFile* blend_file,
|
|
||||||
BlendBlockPointer block);
|
|
||||||
|
|
||||||
/* Returns the type of the given top-level data block in raw
|
|
||||||
string form ('uchar', 'float', 'MFace', 'Mesh', etc). */
|
|
||||||
const char* blend_block_get_typename(BlendFile* blend_file,
|
|
||||||
BlendBlockPointer block);
|
|
||||||
|
|
||||||
/* Translate a pointer from the file's raw data into a BlendBlockPointer
|
|
||||||
that you can query via the API. You will usually NOT need to ever
|
|
||||||
use this unless you're manually extracting pointers from opaque raw data
|
|
||||||
types. Returns NULL on failure or if the input pointer is really NULL. */
|
|
||||||
BlendBlockPointer blend_block_from_blendpointer(BlendFile *blend_file,
|
|
||||||
uint32_t blendpointer);
|
|
||||||
|
|
||||||
/* Returns the number of entries there are in the given top-level
|
|
||||||
data block (a top-level data block is like an array of entries of a specific
|
|
||||||
Blender type, this type usually being one of Blender's structs). */
|
|
||||||
int blend_block_get_entry_count(BlendFile* blend_file,
|
|
||||||
BlendBlockPointer block);
|
|
||||||
|
|
||||||
/* This gets an object handle on the Nth piece of data (in the range
|
|
||||||
0..TOTAL-1, where TOTAL is the figure returned by
|
|
||||||
blend_block_get_entry_count() ) in the given top-level block. */
|
|
||||||
BlendObject blend_block_get_object(BlendFile* blend_file,
|
|
||||||
BlendBlockPointer block,
|
|
||||||
int entry_index);
|
|
||||||
|
|
||||||
/* Returns a BlendObjType enum handy for checking that the general type
|
|
||||||
of the object you have a handle on is what you're expecting. */
|
|
||||||
BlendObjType blend_object_type(BlendFile* blend_file,
|
|
||||||
BlendObject obj);
|
|
||||||
|
|
||||||
/* Given a BlendObject of type BLEND_OBJ_STRUCT in 'obj', fill in the
|
|
||||||
BlendObject pointed to by 'result' with a handle to the named
|
|
||||||
field of that structure (note that the resulting data object might
|
|
||||||
itself be a structure!). 0 is returned on failure (i.e. this structure
|
|
||||||
does not have a field of the requested name, or you supplied an
|
|
||||||
object which is not a structure). */
|
|
||||||
int blend_object_structure_getfield(BlendFile* blend_file,
|
|
||||||
BlendObject *result,
|
|
||||||
BlendObject obj,
|
|
||||||
const char* field_name);
|
|
||||||
|
|
||||||
/* Gets the size (in elements) of an object which is a 1D or 2D array.
|
|
||||||
A non-array is equivalent to an array of size 1x1. A 1D array will
|
|
||||||
always have dim1 == 1. */
|
|
||||||
void blend_object_array_getdims(BlendFile* blend_file,
|
|
||||||
BlendObject obj,
|
|
||||||
int* dim1, int* dim2);
|
|
||||||
|
|
||||||
/* This fetches a piece of data from the .blend file in a format
|
|
||||||
suitable for your architecture (i.e. ints will be of proper size
|
|
||||||
and endianness, pointers are transformed to valid BlendBlockPointers
|
|
||||||
or NULL, etc) into the address pointed to by dest. It's up to you to
|
|
||||||
check that the data you're asking for will fit into the type you're
|
|
||||||
trying to put it in (use blend_object_type() and see the BlendObjType
|
|
||||||
enum to check that the object's type is the one you're expecting.)
|
|
||||||
|
|
||||||
Composite structures (BLEND_OBJ_STRUCT) are not handled atomically;
|
|
||||||
use blend_object_structure_getfield() to extract each named field from
|
|
||||||
a structure individually.
|
|
||||||
|
|
||||||
1 is returned on success. Failure occurs when you try to extract
|
|
||||||
data from a structure (see blend_object_structure_getfield()) or
|
|
||||||
an array (use blend_object_array_getdata()).
|
|
||||||
*/
|
|
||||||
int blend_object_getdata(BlendFile* blend_file,
|
|
||||||
void* dest, BlendObject obj);
|
|
||||||
|
|
||||||
/* This operates like blend_object_getdata() except that it is happy
|
|
||||||
to copy an item of data out of an array. The array is always treated
|
|
||||||
as two-dimensional (data[dimension1][dimension2]); if you're accessing
|
|
||||||
a one-dimensional array then simply specify dim_index_1 as 0.
|
|
||||||
(Indices are in the range 0..DIMSIZE-1.)
|
|
||||||
|
|
||||||
Similarly, plain non-array data can be fetched by specifying
|
|
||||||
dim_index_1 == dim_index_2 == 0. This makes
|
|
||||||
blend_object_array_getdata(bf, dest, obj, 0, 0) equivalent to
|
|
||||||
blend_object_getdata(bf, dest, obj) except that it is happy to
|
|
||||||
be called with an array, from which it will extract the first
|
|
||||||
element.
|
|
||||||
|
|
||||||
Like blend_object_getdata(), it will not fetch a structure (from
|
|
||||||
an array of structures; fortunately I've not seen a .blend file
|
|
||||||
featuring an array of structures so we'll bridge that API gap
|
|
||||||
when we come to it).
|
|
||||||
*/
|
|
||||||
int blend_object_array_getdata(BlendFile* blend_file,
|
|
||||||
void* dest, BlendObject obj,
|
|
||||||
int dim_index_1, int dim_index_2);
|
|
||||||
|
|
||||||
/********************************/
|
|
||||||
/* Mid-level querying functions */
|
|
||||||
/********************************/
|
|
||||||
|
|
||||||
typedef unsigned long BlendLayerMask;
|
|
||||||
|
|
||||||
/* extract a string from a char-array or uchar-array object, up to
|
|
||||||
max_chars in length including the \0 terminator. If the object is
|
|
||||||
a two-dimensional array then the first string is extracted. Returns
|
|
||||||
0 on failure.
|
|
||||||
*/
|
|
||||||
int blend_object_getstring(BlendFile* blend_file,
|
|
||||||
BlendObject obj,
|
|
||||||
char *dest, int max_chars);
|
|
||||||
|
|
||||||
/* Searches the file for a top-level object with the given ID name.
|
|
||||||
Typical ID names are 'OBCamera', 'MECircle.003', 'MAplastic', 'TEgrass' etc.
|
|
||||||
The first two characters of an ID name keep the namespaces separate,
|
|
||||||
so that a material (MA) with the name 'metal' is distinguishable from
|
|
||||||
a texture (TE) with the name 'metal'. That's a foible of Blender itself.
|
|
||||||
|
|
||||||
blend_object_get_by_IDname() returns 0 on failure. It only returns one
|
|
||||||
object of the given IDname; there should indeed be only one, as Blender
|
|
||||||
enforces this uniqueness.
|
|
||||||
*/
|
|
||||||
int blend_object_get_by_IDname(BlendFile* blend_file,
|
|
||||||
BlendObject *result,
|
|
||||||
const char* IDname);
|
|
||||||
/* get string from [obj].ID.name -- caller allocs/frees */
|
|
||||||
int blend_object_get_IDname(BlendFile* blend_file,
|
|
||||||
BlendObject obj,
|
|
||||||
char *dest, int max_chars);
|
|
||||||
|
|
||||||
/* returns !0 if the blender Object whose handle is objobj is a top-level
|
|
||||||
object -- that is, it's not a child of another Object. */
|
|
||||||
int blend_obj_is_rootobject(BlendFile *bf, BlendObject *objobj);
|
|
||||||
/* return the layers (bitmask) that an Object lives on. */
|
|
||||||
BlendLayerMask blend_obj_get_layermask(BlendFile *bf, BlendObject *objobj);
|
|
||||||
|
|
||||||
/* These functions can be a bit slow -- each one requires a linear scan
|
|
||||||
of the file's blocks. But they're handy... */
|
|
||||||
/* Return number of children that this Object has. Can be 0. */
|
|
||||||
int blend_obj_get_childcount(BlendFile *bf, BlendObject *objobj);
|
|
||||||
/* Gets child number childnum of the Object. childnum=0 returns
|
|
||||||
the first, childnum=1 returns the second, etc. */
|
|
||||||
BlendBlockPointer blend_obj_get_child(BlendFile *bf, BlendObject *objobj,
|
|
||||||
int childnum);
|
|
||||||
|
|
||||||
/*********************************/
|
|
||||||
/* High-level querying functions */
|
|
||||||
/*********************************/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int bone_id;
|
|
||||||
float weight;
|
|
||||||
} bDeformWeight;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
float xyz[3];
|
|
||||||
float cnormal[3]; /* cosmetic normal */
|
|
||||||
int mat;
|
|
||||||
bDeformWeight* deform_weights;
|
|
||||||
int deform_weights_count;
|
|
||||||
} bVert;
|
|
||||||
|
|
||||||
|
|
||||||
#define BVERT_HAS_CNORMAL(BV) ((BV)->cnormal[0] != 0.0f || \
|
|
||||||
(BV)->cnormal[1] != 0.0f || \
|
|
||||||
(BV)->cnormal[2] != 0.0f)
|
|
||||||
|
|
||||||
#define BFACE_FLAG_SMOOTH 0x01
|
|
||||||
|
|
||||||
typedef struct _bImage {
|
|
||||||
|
|
||||||
void* m_packedImagePtr;
|
|
||||||
int m_sizePackedImage;
|
|
||||||
char m_imagePathName [128];
|
|
||||||
|
|
||||||
int m_ok;
|
|
||||||
|
|
||||||
int m_xrep;
|
|
||||||
int m_yrep;
|
|
||||||
|
|
||||||
} bImage;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int v[4];
|
|
||||||
float rgba[4][4]; /* vertex colours */
|
|
||||||
float rgba2[4][4]; /* texture face colours (errrr...?) */
|
|
||||||
float uv[4][2];
|
|
||||||
bImage* m_image;
|
|
||||||
int mat;
|
|
||||||
unsigned char flags;
|
|
||||||
int m_flag;
|
|
||||||
int m_mode;
|
|
||||||
BlendBlockPointer image_id;
|
|
||||||
} bFace;
|
|
||||||
|
|
||||||
|
|
||||||
#define BFACE_HAS_TEXTURE(BF) ((BF)->image_id != NULL)
|
|
||||||
#define BFACE_IS_QUAD(BF) ((BF)->v[3] != 0)
|
|
||||||
#define BFACE_IS_TRI(BF) ((BF)->v[2] != 0 && (BF)->v[3] == 0)
|
|
||||||
#define BFACE_IS_LINE(BF) ((BF)->v[1] != 0 && (BF)->v[2] == 0)
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BTEX_AFFECT_COLOUR = 0x01,
|
|
||||||
BTEX_AFFECT_ALPHA = 0x02,
|
|
||||||
BTEX_AFFECT_EMIT = 0x04,
|
|
||||||
BTEX_AFFECT_NORMAL = 0x08,
|
|
||||||
BTEX_AFFECT_NEGNORM = 0x10,
|
|
||||||
BTEX_AFFECT_STENCIL = 0x20 /* not really an 'affect' in blender, but it is */
|
|
||||||
} bTexLayerAffects;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BTEX_BLEND_NORMAL, /* 'mix' */
|
|
||||||
BTEX_BLEND_MULTIPLY, /* 'mul' -- modulate. */
|
|
||||||
BTEX_BLEND_ADD,
|
|
||||||
BTEX_BLEND_SUB
|
|
||||||
} bTexLayerBlendmode;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BTEX_COORDS_NONE,
|
|
||||||
BTEX_COORDS_UV,
|
|
||||||
BTEX_COORDS_REFLECT
|
|
||||||
} bTexLayerCoordsType;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BIMG_FLAG_INTERPOLATE = 0x01, /* upsample */
|
|
||||||
BIMG_FLAG_ANTIALIAS = 0x02, /* downsample */
|
|
||||||
BIMG_FLAG_MIPMAP = 0x04 /* use mipmaps */
|
|
||||||
} bTexImageFlags;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *filename; /* image file name -- absolute path! -- NULL if not image. */
|
|
||||||
bTexLayerAffects affects_mask;
|
|
||||||
bTexLayerBlendmode blend_mode;
|
|
||||||
bTexLayerCoordsType coords_type;
|
|
||||||
/* Tex substruct */
|
|
||||||
int is_st_clamped; /* otherwise, repeat... (GL texwrap mode.) */
|
|
||||||
bTexImageFlags flags;
|
|
||||||
short Nflags, Ntype; /* not decoded yet */
|
|
||||||
short xrepeat, yrepeat; /* amounts to scale texcoords by, really */
|
|
||||||
} bTexLayer;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BMAT_FEATURE_VCOLLIGHT = 0x01,
|
|
||||||
BMAT_FEATURE_VCOLPAINT = 0x02,
|
|
||||||
BMAT_FEATURE_TEXFACE = 0x04,
|
|
||||||
BMAT_FEATURE_SHADELESS = 0x08,
|
|
||||||
BMAT_FEATURE_WIRE = 0x10 /* wireframe rendering */
|
|
||||||
} bMatFeatureMask;
|
|
||||||
|
|
||||||
#define BLENDER_MAX_TEX_LAYERS 8
|
|
||||||
typedef struct {
|
|
||||||
bTexLayer *tex_layer[BLENDER_MAX_TEX_LAYERS];
|
|
||||||
bMatFeatureMask feature_mask;
|
|
||||||
float colour_rgba[4]; /* main material colour */
|
|
||||||
float emit; /* emissive strength, 0..1 */
|
|
||||||
} bMaterial;
|
|
||||||
|
|
||||||
typedef float bMatrix[4][4];
|
|
||||||
|
|
||||||
typedef struct _bMesh{
|
|
||||||
bVert *vert;
|
|
||||||
int vert_count;
|
|
||||||
bFace *face;
|
|
||||||
int face_count;
|
|
||||||
bMaterial *material; /* or NULL if none */
|
|
||||||
} bMesh;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BOBJ_TYPE_UNKNOWN,
|
|
||||||
BOBJ_TYPE_NULL, /* indicates object has no data associated with it! */
|
|
||||||
BOBJ_TYPE_MESH,
|
|
||||||
BOBJ_TYPE_INVALID_MESH,
|
|
||||||
BOBJ_TYPE_CAMERA,
|
|
||||||
BOBJ_TYPE_LAMP
|
|
||||||
} bObjType;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BAQ_INCLUDE_CHILDREN = 0x0001
|
|
||||||
} bAcquireFlags;
|
|
||||||
|
|
||||||
typedef struct _bObj{
|
|
||||||
bObjType type;
|
|
||||||
char *name;
|
|
||||||
|
|
||||||
bMatrix transform; /* local transformation matrix */
|
|
||||||
bMatrix parentimat; /* parent's inverse transform matrix */
|
|
||||||
float scaling[3]; /* scaling component of transform */
|
|
||||||
float rotphr[3]; /* pitch/head/roll rotation component of transform (use for normals) */
|
|
||||||
float location[3]; /* location component of transform */
|
|
||||||
unsigned char transflags; /* NOT DECODED YET, RAW BYTE */
|
|
||||||
float mass;//used for rigid body dynamics
|
|
||||||
int gameflag; //used to detect object type (static, ghost, dynamic, rigid body, soft body)
|
|
||||||
int boundtype; //used to detect collision shape type
|
|
||||||
|
|
||||||
union {
|
|
||||||
void *dummy;
|
|
||||||
bMesh *mesh;
|
|
||||||
} data;
|
|
||||||
|
|
||||||
} bObj;
|
|
||||||
|
|
||||||
|
|
||||||
bObj *blend_alloc_obj(void);
|
|
||||||
void blend_init_obj(bObj *obj);
|
|
||||||
void blend_free_obj(bObj *obj);
|
|
||||||
void blend_free_obj_inner(bObj *obj);
|
|
||||||
void blend_acquire_obj_from_obj(BlendFile *bf, BlendObject *objobj,
|
|
||||||
bObj *outobj,
|
|
||||||
/* malloc'd BlendObject will be written here if pointer if non-NULL: */ BlendObject **outblendobject);
|
|
||||||
|
|
||||||
bMesh *blend_alloc_mesh(void);
|
|
||||||
void blend_init_mesh(bMesh *mesh);
|
|
||||||
void blend_free_mesh_inner(bMesh *mesh);
|
|
||||||
void blend_free_mesh(bMesh *mesh);
|
|
||||||
void blend_acquire_mesh(const char *fname, const char *want_name, bMesh *mesh);
|
|
||||||
void blend_acquire_mesh_from_obj(BlendFile *bf,
|
|
||||||
BlendObject *meobj,
|
|
||||||
bMesh *mesh);
|
|
||||||
/* apply transformation found in 'obj' to 'mesh' */
|
|
||||||
void blend_transform_mesh_from_obj(bMesh *mesh, bObj *obj);
|
|
||||||
|
|
||||||
bMaterial *blend_alloc_material(void);
|
|
||||||
void blend_init_material(bMaterial *mat);
|
|
||||||
void blend_free_material(bMaterial *mat);
|
|
||||||
void blend_acquire_material_from_obj(BlendFile *bf, BlendObject *meobj,
|
|
||||||
bMaterial *mat);
|
|
||||||
|
|
||||||
bTexLayer *blend_alloc_texlayer(void);
|
|
||||||
void blend_init_texlayer(bTexLayer *tl);
|
|
||||||
void blend_free_texlayer(bTexLayer *tl);
|
|
||||||
void blend_acquire_texlayer_from_obj(BlendFile *bf, BlendObject *tlobj,
|
|
||||||
bTexLayer *tl);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,173 +0,0 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "abs-file.h"
|
|
||||||
|
|
||||||
#include "readblend.h"
|
|
||||||
#include "blendtype.h"
|
|
||||||
|
|
||||||
#define MAX_MESHES 10
|
|
||||||
bMesh gMeshes[MAX_MESHES];
|
|
||||||
int gNumMesh = 0;
|
|
||||||
|
|
||||||
#define MAX_OBJECTS 10
|
|
||||||
bObj gObjects[MAX_OBJECTS];
|
|
||||||
int gNumObjects = 0;
|
|
||||||
|
|
||||||
void crawl(BlendFile* blend_file,
|
|
||||||
BlendObject obj)
|
|
||||||
{
|
|
||||||
BlendObject data_obj;
|
|
||||||
BlendObject data_obj2;
|
|
||||||
|
|
||||||
BlendBlock* tmpBlock=0;
|
|
||||||
|
|
||||||
{
|
|
||||||
const char* type_name = blend_file->types[obj.type].name;
|
|
||||||
if (strcmp(type_name,"Object")==0)
|
|
||||||
{
|
|
||||||
if (gNumObjects<MAX_OBJECTS)
|
|
||||||
{
|
|
||||||
blend_acquire_obj_from_obj(blend_file,&obj,&gObjects[gNumObjects],0);
|
|
||||||
gNumObjects++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(type_name,"Mesh")==0)
|
|
||||||
{
|
|
||||||
printf("object type_name = %s\n",type_name);
|
|
||||||
if (gNumMesh<MAX_MESHES)
|
|
||||||
{
|
|
||||||
blend_acquire_mesh_from_obj(blend_file, &obj, &gMeshes[gNumMesh]);
|
|
||||||
gNumMesh++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
///todo: compress those 4 lines into a one-liner, using a C++ wrapper
|
|
||||||
if (blend_object_structure_getfield(blend_file, &data_obj, obj, "curscene")) {
|
|
||||||
if (blend_object_type(blend_file, data_obj) == BLEND_OBJ_POINTER) {
|
|
||||||
if (blend_object_getdata(blend_file, &tmpBlock, data_obj)) {
|
|
||||||
BlendObject blscene= blend_block_get_object(blend_file,tmpBlock,0);
|
|
||||||
|
|
||||||
if (blend_object_structure_getfield(blend_file, &data_obj,blscene , "id"))
|
|
||||||
{
|
|
||||||
if (blend_object_type(blend_file, data_obj) == BLEND_OBJ_STRUCT)
|
|
||||||
{
|
|
||||||
if (blend_object_structure_getfield(blend_file, &data_obj2,data_obj , "name"))
|
|
||||||
{
|
|
||||||
char dest[19];
|
|
||||||
int max_chars=20;
|
|
||||||
|
|
||||||
if (blend_object_getstring(blend_file, data_obj2,
|
|
||||||
dest, max_chars))
|
|
||||||
{
|
|
||||||
printf("dest=%s\n",dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blend_object_structure_getfield(blend_file, &data_obj,blscene , "world")) {
|
|
||||||
if (blend_object_type(blend_file, data_obj) == BLEND_OBJ_POINTER) {
|
|
||||||
if (blend_object_getdata(blend_file, &tmpBlock, data_obj)) {
|
|
||||||
BlendObject blworld= blend_block_get_object(blend_file,tmpBlock,0);
|
|
||||||
|
|
||||||
if (blend_object_structure_getfield(blend_file, &data_obj, blworld, "gravity"))
|
|
||||||
{
|
|
||||||
printf("Scene with world and gravity\n");
|
|
||||||
if (blend_object_type(blend_file, data_obj) == BLEND_OBJ_FLOAT) {
|
|
||||||
float data1 = 123456.7;
|
|
||||||
if (blend_object_getdata(blend_file, &data1, data_obj))
|
|
||||||
fprintf(stderr, "gravity=(%f) ", data1);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "FETCH ERROR\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static BLENDBLOCKCALLBACK_RETURN
|
|
||||||
blockiter(BLENDBLOCKCALLBACK_ARGS) {
|
|
||||||
int i;
|
|
||||||
int entry_count = blend_block_get_entry_count(blend_file, block);
|
|
||||||
#if 0
|
|
||||||
const char* tagname = blend_block_get_tagname(blend_file, block);
|
|
||||||
const char* typename = blend_block_get_typename(blend_file, block);
|
|
||||||
fprintf(stderr, "block: tag=%s type=%s entries=%d ",
|
|
||||||
tagname, typename, entry_count);
|
|
||||||
#endif
|
|
||||||
for (i=0; i<entry_count; ++i) {
|
|
||||||
BlendObject obj = blend_block_get_object(blend_file, block, i);
|
|
||||||
crawl(blend_file, obj);
|
|
||||||
}
|
|
||||||
//fprintf(stderr, "\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
MY_FILETYPE *file;
|
|
||||||
BlendFile *bf;
|
|
||||||
int rtn = 0;
|
|
||||||
|
|
||||||
if (argc <= 1) {
|
|
||||||
fprintf(stderr, "specify filename on command line.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
file = MY_OPEN_FOR_READ(argv[1]);
|
|
||||||
|
|
||||||
if (!file) {
|
|
||||||
fprintf(stderr, "couldn't open file. :(\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bf = blend_read(file);
|
|
||||||
|
|
||||||
if (!bf) {
|
|
||||||
fprintf(stderr, "couldn't read blender file. :(\n");
|
|
||||||
rtn = -1;
|
|
||||||
goto closeit;
|
|
||||||
}
|
|
||||||
|
|
||||||
blend_dump_typedefs(bf);
|
|
||||||
|
|
||||||
// blend_dump_blocks(bf);
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
blend_foreach_block(bf, blockiter, NULL);
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
BlendObject obj;
|
|
||||||
char want_name[] = "IMmetalrock.jpg";
|
|
||||||
if (blend_object_get_by_IDname(bf,&obj, want_name)) {
|
|
||||||
fprintf(stderr, "got %s.\n", want_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
blend_free(bf);
|
|
||||||
|
|
||||||
closeit:
|
|
||||||
MY_CLOSE(file);
|
|
||||||
return rtn;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user